From 12a2b14b5f641d514dce2c910fdb453b5935dbc7 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 10 Jul 2023 14:57:22 -0300 Subject: [PATCH 001/201] chore(ci): update yml --- .github/workflows/azure-webapps-dotnet-core.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 08b8208a..565833f2 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -1,13 +1,13 @@ name: Build and deploy ASP.Net Core app to an Azure Web App env: - AZURE_WEBAPP_NAME: GPIC-Staging-WebAPI # set this to the name of your Azure Web App - AZURE_WEBAPP_PACKAGE_PATH: 'src' # set this to the path to your web app project, defaults to the repository root - DOTNET_VERSION: '7.0' # set this to the .NET Core version to use + AZURE_WEBAPP_NAME: GPIC-Staging-WebAPI # set this to the name of your Azure Web App + AZURE_WEBAPP_PACKAGE_PATH: "src" # set this to the path to your web app project, defaults to the repository root + DOTNET_VERSION: "7.0" # set this to the .NET Core version to use on: push: - branches: [ "main" ] + branches: ["staging"] workflow_dispatch: permissions: @@ -51,7 +51,7 @@ jobs: runs-on: ubuntu-latest needs: build environment: - name: 'Development' + name: "Development" url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} steps: From 39b86e9b2dde9793841fafdc501d149619b86aa6 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 10 Jul 2023 14:58:55 -0300 Subject: [PATCH 002/201] chore(ci): update azure-webapps-dotnet-core.yml --- .github/workflows/azure-webapps-dotnet-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 565833f2..af22dc29 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -2,7 +2,7 @@ name: Build and deploy ASP.Net Core app to an Azure Web App env: AZURE_WEBAPP_NAME: GPIC-Staging-WebAPI # set this to the name of your Azure Web App - AZURE_WEBAPP_PACKAGE_PATH: "src" # set this to the path to your web app project, defaults to the repository root + AZURE_WEBAPP_PACKAGE_PATH: "./src" # set this to the path to your web app project, defaults to the repository root DOTNET_VERSION: "7.0" # set this to the .NET Core version to use on: From 25616c761c08490a42e71d2a078e9b8250e0d663 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 10 Jul 2023 15:04:25 -0300 Subject: [PATCH 003/201] chore(ci): fix yml --- .github/workflows/azure-webapps-dotnet-core.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index af22dc29..0653b1bf 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -34,16 +34,16 @@ jobs: ${{ runner.os }}-nuget- - name: Build with dotnet - run: dotnet build --configuration Release + run: dotnet build --configuration Release ${{env.DOTNET_ROOT}}/Infrastructure/WebAPI/WebAPI.csproj - name: dotnet publish - run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp + run: dotnet publish ${{env.DOTNET_ROOT}}/Infrastructure/WebAPI/WebAPI.csproj -c Release -o ${{env.DOTNET_ROOT}}/dist - name: Upload artifact for deployment job uses: actions/upload-artifact@v3 with: name: .net-app - path: ${{env.DOTNET_ROOT}}/myapp + path: ${{env.DOTNET_ROOT}}/dist deploy: permissions: From 862ea6e3c4ce91e9cc0f03f3656cf5754ac498d7 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 10 Jul 2023 15:07:08 -0300 Subject: [PATCH 004/201] chore(ci): modify build --- .github/workflows/azure-webapps-dotnet-core.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 0653b1bf..266d11ac 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -34,10 +34,10 @@ jobs: ${{ runner.os }}-nuget- - name: Build with dotnet - run: dotnet build --configuration Release ${{env.DOTNET_ROOT}}/Infrastructure/WebAPI/WebAPI.csproj + run: dotnet build -c Release ${{env.DOTNET_ROOT}}/Infrastructure/WebAPI/WebAPI.csproj - name: dotnet publish - run: dotnet publish ${{env.DOTNET_ROOT}}/Infrastructure/WebAPI/WebAPI.csproj -c Release -o ${{env.DOTNET_ROOT}}/dist + run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/dist - name: Upload artifact for deployment job uses: actions/upload-artifact@v3 From 62b9e19837a6e1d08732eb0351ebb35b7c7df945 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 10 Jul 2023 15:37:25 -0300 Subject: [PATCH 005/201] chore(ci): update yml again --- .../workflows/azure-webapps-dotnet-core.yml | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 266d11ac..2c3c2433 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -1,9 +1,10 @@ -name: Build and deploy ASP.Net Core app to an Azure Web App +name: Build and deploy .NET app to an Azure Web App env: - AZURE_WEBAPP_NAME: GPIC-Staging-WebAPI # set this to the name of your Azure Web App - AZURE_WEBAPP_PACKAGE_PATH: "./src" # set this to the path to your web app project, defaults to the repository root - DOTNET_VERSION: "7.0" # set this to the .NET Core version to use + AZURE_WEBAPP_NAME: GPIC-Staging-WebAPI + AZURE_WEBAPP_PACKAGE_PATH: "/dist" + DOTNET_VERSION: "7.0" + SOLUTION_PATH: "src/CopetSystem.API.sln" on: push: @@ -34,16 +35,16 @@ jobs: ${{ runner.os }}-nuget- - name: Build with dotnet - run: dotnet build -c Release ${{env.DOTNET_ROOT}}/Infrastructure/WebAPI/WebAPI.csproj + run: dotnet build ${{env.SOLUTION_PATH}} - name: dotnet publish - run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/dist + run: dotnet publish ${{env.SOLUTION_PATH}} -c Release -o ${{env.AZURE_WEBAPP_PACKAGE_PATH}} --no-build - name: Upload artifact for deployment job uses: actions/upload-artifact@v3 with: - name: .net-app - path: ${{env.DOTNET_ROOT}}/dist + name: published_web_app + path: ${{env.AZURE_WEBAPP_PACKAGE_PATH}} deploy: permissions: @@ -51,14 +52,14 @@ jobs: runs-on: ubuntu-latest needs: build environment: - name: "Development" + name: "Staging" url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} steps: - name: Download artifact from build job uses: actions/download-artifact@v3 with: - name: .net-app + name: published_web_app - name: Deploy to Azure Web App id: deploy-to-webapp From 5dbd675fde847e8860358ac7a6de77dc24466c9c Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 10 Jul 2023 15:44:32 -0300 Subject: [PATCH 006/201] chore(ci): another try --- .../workflows/azure-webapps-dotnet-core.yml | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 2c3c2433..96e4c0ab 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -1,14 +1,14 @@ -name: Build and deploy .NET app to an Azure Web App +name: Build and deploy ASP.Net Core app to an Azure Web App env: AZURE_WEBAPP_NAME: GPIC-Staging-WebAPI - AZURE_WEBAPP_PACKAGE_PATH: "/dist" + AZURE_WEBAPP_PACKAGE_PATH: "." DOTNET_VERSION: "7.0" - SOLUTION_PATH: "src/CopetSystem.API.sln" + PROJECT_PATH: "src/Infrastructure/WebAPI/WebAPI.csproj" on: push: - branches: ["staging"] + branches: ["main"] workflow_dispatch: permissions: @@ -35,16 +35,16 @@ jobs: ${{ runner.os }}-nuget- - name: Build with dotnet - run: dotnet build ${{env.SOLUTION_PATH}} + run: dotnet build ${{env.PROJECT_PATH}} --configuration Release - name: dotnet publish - run: dotnet publish ${{env.SOLUTION_PATH}} -c Release -o ${{env.AZURE_WEBAPP_PACKAGE_PATH}} --no-build + run: dotnet publish ${{env.PROJECT_PATH}} -c Release -o ${{env.DOTNET_ROOT}}/myapp - name: Upload artifact for deployment job uses: actions/upload-artifact@v3 with: - name: published_web_app - path: ${{env.AZURE_WEBAPP_PACKAGE_PATH}} + name: .net-app + path: ${{env.DOTNET_ROOT}}/myapp deploy: permissions: @@ -52,14 +52,14 @@ jobs: runs-on: ubuntu-latest needs: build environment: - name: "Staging" + name: "Development" url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} steps: - name: Download artifact from build job uses: actions/download-artifact@v3 with: - name: published_web_app + name: .net-app - name: Deploy to Azure Web App id: deploy-to-webapp From 03ca91890fa9a0d8bb92cbfa58615e58616fba31 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 10 Jul 2023 15:45:23 -0300 Subject: [PATCH 007/201] chore(ci): fixing branch --- .github/workflows/azure-webapps-dotnet-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 96e4c0ab..26542d09 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -8,7 +8,7 @@ env: on: push: - branches: ["main"] + branches: ["staging"] workflow_dispatch: permissions: From c86cc603e6f2408c2e6359738374d6d48ceec652 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 10 Jul 2023 15:57:59 -0300 Subject: [PATCH 008/201] feat(webapi): add version endpoint for tests --- .../WebAPI/Controllers/VersionController.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/Infrastructure/WebAPI/Controllers/VersionController.cs diff --git a/src/Infrastructure/WebAPI/Controllers/VersionController.cs b/src/Infrastructure/WebAPI/Controllers/VersionController.cs new file mode 100644 index 00000000..b2f7f1d1 --- /dev/null +++ b/src/Infrastructure/WebAPI/Controllers/VersionController.cs @@ -0,0 +1,18 @@ +using Microsoft.AspNetCore.Mvc; + +namespace WebAPI.Controllers +{ + /// + /// Controller de validação. + /// + [ApiController] + [Route("api/[controller]")] + public class Version : ControllerBase + { + /// + /// Retorna a versão da API. + /// + [HttpGet] + public IActionResult Get() => Ok(GetType()?.Assembly?.GetName()?.Version?.ToString() ?? "Versão não identificada."); + } +} \ No newline at end of file From 4c96d06b032b2f1cdefa161513158f518d427264 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 10 Jul 2023 16:43:30 -0300 Subject: [PATCH 009/201] chore(ci): set environment --- .github/workflows/azure-webapps-dotnet-core.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 26542d09..5f78cbb9 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -17,6 +17,7 @@ permissions: jobs: build: runs-on: ubuntu-latest + environment: STAGING steps: - uses: actions/checkout@v3 @@ -52,7 +53,7 @@ jobs: runs-on: ubuntu-latest needs: build environment: - name: "Development" + name: STAGING url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} steps: From bff332aa989f85aed287fd919fc75ae6111a35de Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 10 Jul 2023 16:49:07 -0300 Subject: [PATCH 010/201] feat(.env): add .env file verification --- src/Infrastructure/IoC/Utils/DotEnvSecrets.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs index 11993b09..fcd07b55 100644 --- a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs +++ b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs @@ -8,6 +8,10 @@ public DotEnvSecrets() // Caminho base para o arquivo appsettings.json var basePath = Path.GetDirectoryName(typeof(DotEnvSecrets).Assembly.Location); + // Verifica se arquivo .env existe + if (!File.Exists(Path.Combine(basePath!, ".env"))) + throw new FileNotFoundException("Arquivo .env não encontrado."); + // Carrega informações de ambiente (.env) DotNetEnv.Env.Load(Path.Combine(basePath!, ".env")); } From df11ebcf9e62273142a34ff93945c48d3f2532d8 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 10 Jul 2023 16:59:34 -0300 Subject: [PATCH 011/201] chore(ci): add .env file creation --- .github/workflows/azure-webapps-dotnet-core.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 5f78cbb9..ab8b3367 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -35,6 +35,18 @@ jobs: restore-keys: | ${{ runner.os }}-nuget- + - name: Create env + run: | + echo "AZURE_BLOB_STORAGE_CONNECTION_STRING=${{ secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING }} + \nAZURE_BLOB_STORAGE_CONTAINER_NAME=${{ secrets.AZURE_BLOB_STORAGE_CONTAINER_NAME }} + \nAZURE_POSTGRES_CONNECTION_STRING=${{ secrets.AZURE_POSTGRES_CONNECTION_STRING }} + \nJWT_AUDIENCE=${{ secrets.JWT_AUDIENCE }} + \nJWT_EXPIRE_IN=${{ secrets.JWT_EXPIRE_IN }} + \nJWT_ISSUER=${{ secrets.JWT_ISSUER }} + \nJWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }} + \nSMTP_EMAIL_PASSWORD=${{ secrets.SMTP_EMAIL_PASSWORD }} + \nSMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }}" > src/Infrastructure/WebAPI/.env + - name: Build with dotnet run: dotnet build ${{env.PROJECT_PATH}} --configuration Release From 289b01662a8e9c6edee7a02c873f7951d3158456 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 11 Jul 2023 12:17:28 -0300 Subject: [PATCH 012/201] feat(appsettings): add azure secret support --- .../IoC/DependencyDomainInjection.cs | 2 +- src/Infrastructure/IoC/DependencyInjection.cs | 20 +--- .../IoC/DependencyInjectionJWT.cs | 14 +-- src/Infrastructure/IoC/IoC.csproj | 10 ++ src/Infrastructure/IoC/Utils/DotEnvSecrets.cs | 35 ------- .../IoC/Utils/SettingsConfiguration.cs | 27 +++++- src/Infrastructure/IoC/Utils/UserSecret.cs | 34 +++++++ .../Services/AzureStorageService.cs | 6 +- src/Infrastructure/Services/IDotEnvSecrets.cs | 15 --- .../Services/TokenAuthenticationService.cs | 15 +-- src/Infrastructure/WebAPI/WebAPI.csproj | 1 + .../WebAPI/appsettings.development.json | 95 +------------------ src/Infrastructure/WebAPI/appsettings.json | 10 -- 13 files changed, 94 insertions(+), 190 deletions(-) delete mode 100644 src/Infrastructure/IoC/Utils/DotEnvSecrets.cs create mode 100644 src/Infrastructure/IoC/Utils/UserSecret.cs delete mode 100644 src/Infrastructure/Services/IDotEnvSecrets.cs diff --git a/src/Infrastructure/IoC/DependencyDomainInjection.cs b/src/Infrastructure/IoC/DependencyDomainInjection.cs index 0e0b57da..968fbe1f 100644 --- a/src/Infrastructure/IoC/DependencyDomainInjection.cs +++ b/src/Infrastructure/IoC/DependencyDomainInjection.cs @@ -18,7 +18,7 @@ public static IServiceCollection AddDomain(this IServiceCollection services) services.AddHttpContextAccessor(); services.AddScoped(); services.AddScoped(); -#if !DEBUG +#if DEBUG services.AddScoped(); #else services.AddScoped(); diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs index e2c1ed65..6d6e0938 100644 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ b/src/Infrastructure/IoC/DependencyInjection.cs @@ -3,16 +3,12 @@ using Infrastructure.IoC.Utils; using Infrastructure.Persistence.Context; using Infrastructure.Persistence.Repositories; -using Infrastructure.Services; using Infrastructure.Services.Email.Configs; using Infrastructure.Services.Email.Factories; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; using Serilog; namespace Infrastructure.IoC; @@ -24,20 +20,10 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi IConfiguration configuration = SettingsConfiguration.GetConfiguration(); services.AddSingleton(configuration); - // Carrega informações de ambiente (.env) - var dotEnvSecrets = new DotEnvSecrets(); - services.AddScoped(); - #region Inicialização do banco de dados -#if !DEBUG services.AddDbContext( o => o.UseNpgsql(configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); -#else - services.AddDbContext( - o => o.UseNpgsql(dotEnvSecrets.GetDatabaseConnectionString(), - b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); -#endif #endregion #region Serviço de Log  @@ -52,10 +38,12 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi #endregion #region Serviço de E-mail + var smtpConfig = new SmtpConfiguration(); configuration.GetSection("SmtpConfiguration").Bind(smtpConfig); - smtpConfig.Password = dotEnvSecrets.GetSmtpUserPassword(); - smtpConfig.Username = dotEnvSecrets.GetSmtpUserName(); + smtpConfig.Password = configuration.GetSection("SmtpConfiguration:Password").Value; + smtpConfig.Username = configuration.GetSection("SmtpConfiguration:Username").Value; + services.AddSingleton(); services.AddSingleton(sp => { diff --git a/src/Infrastructure/IoC/DependencyInjectionJWT.cs b/src/Infrastructure/IoC/DependencyInjectionJWT.cs index 59707ca3..dd289373 100644 --- a/src/Infrastructure/IoC/DependencyInjectionJWT.cs +++ b/src/Infrastructure/IoC/DependencyInjectionJWT.cs @@ -9,9 +9,11 @@ public static class DependencyInjectionJWT { public static IServiceCollection AddInfrastructureJWT(this IServiceCollection services) { - // Carrega informações de ambiente (.env) - var dotEnvSecrets = new DotEnvSecrets(); - services.AddSingleton(dotEnvSecrets); + // Carrega informações de ambiente (appsettings.json) + var configuration = SettingsConfiguration.GetConfiguration(); + var validIssuer = configuration.GetSection("Jwt:Issuer").Value; + var validAudience = configuration.GetSection("Jwt:Audience").Value; + var issuerSigningKey = configuration.GetSection("Jwt:Secret").Value; /// Informar o tipo de autenticação; /// Definir o modelo de desafio de autenticação. @@ -32,9 +34,9 @@ public static IServiceCollection AddInfrastructureJWT(this IServiceCollection se ValidateLifetime = true, ValidateIssuerSigningKey = true, /// Valores válidos - ValidIssuer = dotEnvSecrets.GetJwtIssuer(), - ValidAudience = dotEnvSecrets.GetJwtAudience(), - IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(dotEnvSecrets.GetJwtSecret())), + ValidIssuer = validIssuer, + ValidAudience = validAudience, + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(issuerSigningKey!)), /// Se não fizer isso ele vai inserir + 5min em cima /// do que foi definido na geração do Token. ClockSkew = TimeSpan.Zero diff --git a/src/Infrastructure/IoC/IoC.csproj b/src/Infrastructure/IoC/IoC.csproj index 446907af..140d720e 100644 --- a/src/Infrastructure/IoC/IoC.csproj +++ b/src/Infrastructure/IoC/IoC.csproj @@ -1,16 +1,20 @@ + net7.0 enable enable 0.0.1 + 79c87183-6835-4ae0-a335-44ce6534c967 + + @@ -23,9 +27,14 @@ + + + + + @@ -39,4 +48,5 @@ + \ No newline at end of file diff --git a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs deleted file mode 100644 index fcd07b55..00000000 --- a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Infrastructure.Services; - -namespace Infrastructure.IoC.Utils; -public class DotEnvSecrets : IDotEnvSecrets -{ - public DotEnvSecrets() - { - // Caminho base para o arquivo appsettings.json - var basePath = Path.GetDirectoryName(typeof(DotEnvSecrets).Assembly.Location); - - // Verifica se arquivo .env existe - if (!File.Exists(Path.Combine(basePath!, ".env"))) - throw new FileNotFoundException("Arquivo .env não encontrado."); - - // Carrega informações de ambiente (.env) - DotNetEnv.Env.Load(Path.Combine(basePath!, ".env")); - } - - public string GetBlobStorageConnectionString() => DotNetEnv.Env.GetString("AZURE_BLOB_STORAGE_CONNECTION_STRING"); - public string GetBlobStorageContainerName() => DotNetEnv.Env.GetString("AZURE_BLOB_STORAGE_CONTAINER_NAME"); - - public string GetDatabaseConnectionString() => DotNetEnv.Env.GetString("AZURE_POSTGRES_CONNECTION_STRING"); - - public string GetSmtpUserName() => DotNetEnv.Env.GetString("SMTP_EMAIL_USERNAME"); - - public string GetSmtpUserPassword() => DotNetEnv.Env.GetString("SMTP_EMAIL_PASSWORD"); - - public string GetJwtSecret() => DotNetEnv.Env.GetString("JWT_SECRET_KEY"); - - public string GetJwtIssuer() => DotNetEnv.Env.GetString("JWT_ISSUER"); - - public string GetJwtAudience() => DotNetEnv.Env.GetString("JWT_AUDIENCE"); - - public string GetJwtExpirationTime() => DotNetEnv.Env.GetString("JWT_EXPIRE_IN"); -} \ No newline at end of file diff --git a/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs b/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs index 281e4020..f178328f 100644 --- a/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs +++ b/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs @@ -1,3 +1,4 @@ +using Azure.Identity; using Microsoft.Extensions.Configuration; namespace Infrastructure.IoC.Utils; @@ -8,14 +9,34 @@ public static IConfiguration GetConfiguration() // Caminho base para o arquivo appsettings.json var basePath = Path.GetDirectoryName(typeof(SettingsConfiguration).Assembly.Location); - // Carrega informações de ambiente (.env) - DotNetEnv.Env.Load(Path.Combine(basePath!, ".env")); + // Cria um novo builder de configurações + var config = new ConfigurationBuilder() + .SetBasePath(basePath!) + .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) + .AddUserSecrets() + .AddEnvironmentVariables() + .Build(); + +#if DEBUG + return config; +#else + // Cria um novo builder de configurações + var builder = new ConfigurationBuilder(); + + // Adiciona configurações do Azure App Configuration + builder.AddAzureAppConfiguration(config.GetConnectionString("AppConfig")); + + // Adiciona configurações do Azure Key Vault + builder.AddAzureKeyVault(new Uri("https://gpickeyvault.vault.azure.net/"), + new DefaultAzureCredential()); // Retorna configurações - return new ConfigurationBuilder() + return builder .SetBasePath(basePath!) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) + .AddUserSecrets() .AddEnvironmentVariables() .Build(); +#endif } } \ No newline at end of file diff --git a/src/Infrastructure/IoC/Utils/UserSecret.cs b/src/Infrastructure/IoC/Utils/UserSecret.cs new file mode 100644 index 00000000..97b17653 --- /dev/null +++ b/src/Infrastructure/IoC/Utils/UserSecret.cs @@ -0,0 +1,34 @@ +namespace Infrastructure.IoC.Utils; +public class UserSecret +{ + public SmtpConfiguration? Smtp { get; set; } + public JwtConfiguration? Jwt { get; set; } + public StorageFileConfiguration? StorageFile { get; set; } + public ConnectionStringConfiguration? ConnectionString { get; set; } + + public class SmtpConfiguration + { + public string? Host { get; set; } + public int Port { get; set; } + public string? User { get; set; } + public string? Password { get; set; } + } + + public class JwtConfiguration + { + public string? Secret { get; set; } + public int Expiration { get; set; } + } + + public class StorageFileConfiguration + { + public string? ContainerName { get; set; } + public string? ConnectionString { get; set; } + } + + public class ConnectionStringConfiguration + { + public string? DefaultConnection { get; set; } + public string? AppConfig { get; set; } + } +} \ No newline at end of file diff --git a/src/Infrastructure/Services/AzureStorageService.cs b/src/Infrastructure/Services/AzureStorageService.cs index 2fd7e0eb..f1359363 100644 --- a/src/Infrastructure/Services/AzureStorageService.cs +++ b/src/Infrastructure/Services/AzureStorageService.cs @@ -13,14 +13,14 @@ public class AzureStorageService : IStorageFileService private readonly string?[] _allowedExtensions; private readonly long _maxFileSizeInBytes; - public AzureStorageService(IConfiguration configuration, IDotEnvSecrets dotEnvSecrets) + public AzureStorageService(IConfiguration configuration) { // Verifica se o container de armazenamento de arquivos foi configurado - _container = dotEnvSecrets.GetBlobStorageContainerName() + _container = configuration.GetSection("StorageFile:ContainerName").Value ?? throw new Exception("O container de armazenamento de arquivos não foi configurado."); // Verifica se a string de conexão foi configurada - _connectionString = dotEnvSecrets.GetBlobStorageConnectionString() + _connectionString = configuration.GetSection("StorageFile:ConnectionString").Value ?? throw new Exception("A string de conexão não foi configurada."); // Verifica se as extensões de arquivos permitidas foram configuradas diff --git a/src/Infrastructure/Services/IDotEnvSecrets.cs b/src/Infrastructure/Services/IDotEnvSecrets.cs deleted file mode 100644 index 2c869c86..00000000 --- a/src/Infrastructure/Services/IDotEnvSecrets.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Infrastructure.Services -{ - public interface IDotEnvSecrets - { - string GetDatabaseConnectionString(); - string GetBlobStorageConnectionString(); - string GetBlobStorageContainerName(); - string GetSmtpUserName(); - string GetSmtpUserPassword(); - string GetJwtSecret(); - string GetJwtIssuer(); - string GetJwtAudience(); - string GetJwtExpirationTime(); - } -} \ No newline at end of file diff --git a/src/Infrastructure/Services/TokenAuthenticationService.cs b/src/Infrastructure/Services/TokenAuthenticationService.cs index 36e92fa7..47cbc944 100644 --- a/src/Infrastructure/Services/TokenAuthenticationService.cs +++ b/src/Infrastructure/Services/TokenAuthenticationService.cs @@ -5,18 +5,19 @@ using Microsoft.IdentityModel.Tokens; using System.Text; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; namespace Infrastructure.Services; public class TokenAuthenticationService : ITokenAuthenticationService { #region Global Scope - private readonly IDotEnvSecrets _dotEnvSecrets; + private readonly IConfiguration _configuration; private readonly IHttpContextAccessor _httpContextAccessor; - public TokenAuthenticationService(IHttpContextAccessor httpContextAccessor, IDotEnvSecrets dotEnvSecrets) + public TokenAuthenticationService(IHttpContextAccessor httpContextAccessor, IConfiguration configuration) { _httpContextAccessor = httpContextAccessor; - _dotEnvSecrets = dotEnvSecrets; + _configuration = configuration; } #endregion @@ -44,22 +45,22 @@ public UserLoginOutput GenerateToken(Guid? id, string? userName, string? role) }; // Gerar chave privada para assinar o token - var privateKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_dotEnvSecrets.GetJwtSecret() + var privateKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration.GetSection("Jwt:Secret").Value ?? throw new Exception("Chave secreta não informada."))); // Gerar a assinatura digital var credentials = new SigningCredentials(privateKey, SecurityAlgorithms.HmacSha256); // Tempo de expiração do token - var expireIn = int.Parse(_dotEnvSecrets.GetJwtExpirationTime() ?? "10"); + var expireIn = int.Parse(_configuration.GetSection("Jwt:ExpireIn").Value ?? "10"); // Definir o tempo de expiração var expiration = DateTime.UtcNow.AddMinutes(expireIn); // Gerar o Token var token = new JwtSecurityToken( - issuer: _dotEnvSecrets.GetJwtIssuer() ?? throw new Exception("Emissor do token não informado."), - audience: _dotEnvSecrets.GetJwtAudience() ?? throw new Exception("Público do token não informado."), + issuer: _configuration.GetSection("Jwt:Issuer").Value ?? throw new Exception("Emissor do token não informado."), + audience: _configuration.GetSection("Jwt:Audience").Value ?? throw new Exception("Público do token não informado."), claims: claims, expires: expiration, signingCredentials: credentials); diff --git a/src/Infrastructure/WebAPI/WebAPI.csproj b/src/Infrastructure/WebAPI/WebAPI.csproj index ab416046..3090bef2 100644 --- a/src/Infrastructure/WebAPI/WebAPI.csproj +++ b/src/Infrastructure/WebAPI/WebAPI.csproj @@ -16,6 +16,7 @@ + diff --git a/src/Infrastructure/WebAPI/appsettings.development.json b/src/Infrastructure/WebAPI/appsettings.development.json index beabe56f..0967ef42 100644 --- a/src/Infrastructure/WebAPI/appsettings.development.json +++ b/src/Infrastructure/WebAPI/appsettings.development.json @@ -1,94 +1 @@ -{ - "ConnectionStrings": { - "DefaultConnection": "Server=localhost;Database=COPET_DB;Port=15432;User ID=copet-admin;password=Copet@123;Include Error Detail=true;" - }, - "Serilog": { - "Using": ["Serilog.Sinks.Console", "Serilog.Sinks.File"], - "MinimumLevel": { - "Default": "Information", - "Override": { - "Microsoft": "Warning", - "System": "Warning" - } - }, - "Filter": [ - { - "Name": "ByIncludingOnly", - "Args": { - "expression": "StartsWith(SourceContext, 'Infrastructure.WebAPI.')" - } - } - ], - "WriteTo": [ - { - "Name": "Console", - "Args": { - "outputTemplate": "[{Timestamp:HH:mm:ss}] {SourceContext} [{Level}] {Message}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "logs/copetsystem_logs_.log", - "rollingInterval": "Day", - "rollonFileSizeLimit": true, - "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog" - } - }, - { - "Name": "Seq", - "Args": { - "serverUrl": "http://localhost:5341", - "apiKey": "5nwFLI503IATAxkmzU4O" - } - } - ], - "Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"] - }, - "IpRateLimiting": { - "EnableEndpointRateLimiting": true, - "StackBlockedRequests": true, - "RealIpHeader": "X-Real-IP", - "ClientIdHeader": "X-ClientId" - }, - "IpRateLimitPolicies": { - "Default": { - "IpRules": [ - { - "IpAddress": "127.0.0.1", - "Rule": "1r/5s" - }, - { - "IpAddress": "::1", - "Rule": "1r/5s" - } - ], - "EndpointRules": [ - { - "Endpoint": "*", - "Rule": "10r/10s" - } - ] - } - }, - "StorageFile": { - "Directory": "./local-storage", - "AllowedExtensions": [".txt", ".pdf", ".doc", ".docx", ".png", ".jpg"], - "MaxFileSizeInBytes": 10485760, - "Folder": "Notices", - "StudentDocDirectory": "StudentDocs", - "ReportDirectory": "Reports" - }, - "Jwt": { - "SecretKey": "jwt_secret_key_gpic_webapi", - "ExpireIn": 60, - "Issuer": "gpic-webapi", - "Audience": "webapi.gpic.server" - }, - "SmtpConfiguration": { - "Server": "smtp.office365.com", - "Port": 587 - }, - "SmtpUsername": "${SMTP_EMAIL_USERNAME}", - "SmtpPassword": "${SMTP_EMAIL_PASSWORD}" -} +{} diff --git a/src/Infrastructure/WebAPI/appsettings.json b/src/Infrastructure/WebAPI/appsettings.json index 3d405741..4f6de4d3 100644 --- a/src/Infrastructure/WebAPI/appsettings.json +++ b/src/Infrastructure/WebAPI/appsettings.json @@ -1,7 +1,4 @@ { - "ConnectionStrings": { - "DefaultConnection": "Server=localhost;Database=COPET_DB;Port=15432;User ID=copet-admin;password=Copet@123;Include Error Detail=true;" - }, "Serilog": { "Using": ["Serilog.Sinks.Console", "Serilog.Sinks.File"], "MinimumLevel": { @@ -60,12 +57,5 @@ "StorageFile": { "AllowedExtensions": [".txt", ".pdf", ".doc", ".docx", ".png", ".jpg"], "MaxFileSizeInBytes": 10485760 - }, - "Jwt": { - "ExpireIn": 60 - }, - "SmtpConfiguration": { - "Server": "smtp.office365.com", - "Port": 587 } } From 00624c9f65f5ca1a312ac34885e3f564f891c239 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 11 Jul 2023 14:36:59 -0300 Subject: [PATCH 013/201] feat(ioc): add support to azure key vault --- .github/workflows/azure-webapps-dotnet-core.yml | 16 ++++++++-------- src/Infrastructure/IoC/IoC.csproj | 1 + .../IoC/Utils/SettingsConfiguration.cs | 17 +++++++++++++++-- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index ab8b3367..caa7bd93 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -38,14 +38,14 @@ jobs: - name: Create env run: | echo "AZURE_BLOB_STORAGE_CONNECTION_STRING=${{ secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING }} - \nAZURE_BLOB_STORAGE_CONTAINER_NAME=${{ secrets.AZURE_BLOB_STORAGE_CONTAINER_NAME }} - \nAZURE_POSTGRES_CONNECTION_STRING=${{ secrets.AZURE_POSTGRES_CONNECTION_STRING }} - \nJWT_AUDIENCE=${{ secrets.JWT_AUDIENCE }} - \nJWT_EXPIRE_IN=${{ secrets.JWT_EXPIRE_IN }} - \nJWT_ISSUER=${{ secrets.JWT_ISSUER }} - \nJWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }} - \nSMTP_EMAIL_PASSWORD=${{ secrets.SMTP_EMAIL_PASSWORD }} - \nSMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }}" > src/Infrastructure/WebAPI/.env + AZURE_BLOB_STORAGE_CONTAINER_NAME=${{ secrets.AZURE_BLOB_STORAGE_CONTAINER_NAME }} + AZURE_POSTGRES_CONNECTION_STRING=${{ secrets.AZURE_POSTGRES_CONNECTION_STRING }} + JWT_AUDIENCE=${{ secrets.JWT_AUDIENCE }} + JWT_EXPIRE_IN=${{ secrets.JWT_EXPIRE_IN }} + JWT_ISSUER=${{ secrets.JWT_ISSUER }} + JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }} + SMTP_EMAIL_PASSWORD=${{ secrets.SMTP_EMAIL_PASSWORD }} + SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }}" > src/Infrastructure/WebAPI/.env - name: Build with dotnet run: dotnet build ${{env.PROJECT_PATH}} --configuration Release diff --git a/src/Infrastructure/IoC/IoC.csproj b/src/Infrastructure/IoC/IoC.csproj index 140d720e..653e8a31 100644 --- a/src/Infrastructure/IoC/IoC.csproj +++ b/src/Infrastructure/IoC/IoC.csproj @@ -33,6 +33,7 @@ + diff --git a/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs b/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs index f178328f..2ec975a1 100644 --- a/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs +++ b/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using Azure.Identity; using Microsoft.Extensions.Configuration; @@ -26,9 +27,21 @@ public static IConfiguration GetConfiguration() // Adiciona configurações do Azure App Configuration builder.AddAzureAppConfiguration(config.GetConnectionString("AppConfig")); + // Recupera configurações do Azure Key Vault + var kvUrl = config.GetConnectionString("KeyVaultConfig:KVUrl"); + var tenantId = config.GetConnectionString("KeyVaultConfig:TenantId"); + var clientId = config.GetConnectionString("KeyVaultConfig:ClientId"); + var clientSecretId = config.GetConnectionString("KeyVaultConfig:ClientSecretId"); + + // Cria um novo cliente do Azure Key Vault + var client = new SecretClient( + new Uri(kvUrl), + new ClientSecretCredential(tenantId, clientId, clientSecretId)); + // Adiciona configurações do Azure Key Vault - builder.AddAzureKeyVault(new Uri("https://gpickeyvault.vault.azure.net/"), - new DefaultAzureCredential()); + builder.AddAzureKeyVault( + client, + new AddAzureKeyVaultConfigurationOptions()); // Retorna configurações return builder From ea565c551257b0c62cc1ddab996b9884b6b5efe7 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 11 Jul 2023 14:42:18 -0300 Subject: [PATCH 014/201] chore(.env): revert azure integration --- .../workflows/azure-webapps-dotnet-core.yml | 12 +++ .../IoC/DependencyDomainInjection.cs | 2 +- src/Infrastructure/IoC/DependencyInjection.cs | 2 +- .../WebAPI/appsettings.development.json | 95 +------------------ 4 files changed, 15 insertions(+), 96 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 5f78cbb9..caa7bd93 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -35,6 +35,18 @@ jobs: restore-keys: | ${{ runner.os }}-nuget- + - name: Create env + run: | + echo "AZURE_BLOB_STORAGE_CONNECTION_STRING=${{ secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING }} + AZURE_BLOB_STORAGE_CONTAINER_NAME=${{ secrets.AZURE_BLOB_STORAGE_CONTAINER_NAME }} + AZURE_POSTGRES_CONNECTION_STRING=${{ secrets.AZURE_POSTGRES_CONNECTION_STRING }} + JWT_AUDIENCE=${{ secrets.JWT_AUDIENCE }} + JWT_EXPIRE_IN=${{ secrets.JWT_EXPIRE_IN }} + JWT_ISSUER=${{ secrets.JWT_ISSUER }} + JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }} + SMTP_EMAIL_PASSWORD=${{ secrets.SMTP_EMAIL_PASSWORD }} + SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }}" > src/Infrastructure/WebAPI/.env + - name: Build with dotnet run: dotnet build ${{env.PROJECT_PATH}} --configuration Release diff --git a/src/Infrastructure/IoC/DependencyDomainInjection.cs b/src/Infrastructure/IoC/DependencyDomainInjection.cs index 0e0b57da..968fbe1f 100644 --- a/src/Infrastructure/IoC/DependencyDomainInjection.cs +++ b/src/Infrastructure/IoC/DependencyDomainInjection.cs @@ -18,7 +18,7 @@ public static IServiceCollection AddDomain(this IServiceCollection services) services.AddHttpContextAccessor(); services.AddScoped(); services.AddScoped(); -#if !DEBUG +#if DEBUG services.AddScoped(); #else services.AddScoped(); diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs index e2c1ed65..ce56212b 100644 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ b/src/Infrastructure/IoC/DependencyInjection.cs @@ -29,7 +29,7 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi services.AddScoped(); #region Inicialização do banco de dados -#if !DEBUG +#if DEBUG services.AddDbContext( o => o.UseNpgsql(configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); diff --git a/src/Infrastructure/WebAPI/appsettings.development.json b/src/Infrastructure/WebAPI/appsettings.development.json index beabe56f..0967ef42 100644 --- a/src/Infrastructure/WebAPI/appsettings.development.json +++ b/src/Infrastructure/WebAPI/appsettings.development.json @@ -1,94 +1 @@ -{ - "ConnectionStrings": { - "DefaultConnection": "Server=localhost;Database=COPET_DB;Port=15432;User ID=copet-admin;password=Copet@123;Include Error Detail=true;" - }, - "Serilog": { - "Using": ["Serilog.Sinks.Console", "Serilog.Sinks.File"], - "MinimumLevel": { - "Default": "Information", - "Override": { - "Microsoft": "Warning", - "System": "Warning" - } - }, - "Filter": [ - { - "Name": "ByIncludingOnly", - "Args": { - "expression": "StartsWith(SourceContext, 'Infrastructure.WebAPI.')" - } - } - ], - "WriteTo": [ - { - "Name": "Console", - "Args": { - "outputTemplate": "[{Timestamp:HH:mm:ss}] {SourceContext} [{Level}] {Message}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "logs/copetsystem_logs_.log", - "rollingInterval": "Day", - "rollonFileSizeLimit": true, - "formatter": "Serilog.Formatting.Json.JsonFormatter, Serilog" - } - }, - { - "Name": "Seq", - "Args": { - "serverUrl": "http://localhost:5341", - "apiKey": "5nwFLI503IATAxkmzU4O" - } - } - ], - "Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"] - }, - "IpRateLimiting": { - "EnableEndpointRateLimiting": true, - "StackBlockedRequests": true, - "RealIpHeader": "X-Real-IP", - "ClientIdHeader": "X-ClientId" - }, - "IpRateLimitPolicies": { - "Default": { - "IpRules": [ - { - "IpAddress": "127.0.0.1", - "Rule": "1r/5s" - }, - { - "IpAddress": "::1", - "Rule": "1r/5s" - } - ], - "EndpointRules": [ - { - "Endpoint": "*", - "Rule": "10r/10s" - } - ] - } - }, - "StorageFile": { - "Directory": "./local-storage", - "AllowedExtensions": [".txt", ".pdf", ".doc", ".docx", ".png", ".jpg"], - "MaxFileSizeInBytes": 10485760, - "Folder": "Notices", - "StudentDocDirectory": "StudentDocs", - "ReportDirectory": "Reports" - }, - "Jwt": { - "SecretKey": "jwt_secret_key_gpic_webapi", - "ExpireIn": 60, - "Issuer": "gpic-webapi", - "Audience": "webapi.gpic.server" - }, - "SmtpConfiguration": { - "Server": "smtp.office365.com", - "Port": 587 - }, - "SmtpUsername": "${SMTP_EMAIL_USERNAME}", - "SmtpPassword": "${SMTP_EMAIL_PASSWORD}" -} +{} From 6ba86be33dd5c9faf93012d25aaa5a9c525ab90a Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 11 Jul 2023 15:04:32 -0300 Subject: [PATCH 015/201] feat(ioc): update .env reading --- src/Infrastructure/IoC/DependencyDomainInjection.cs | 5 +---- src/Infrastructure/IoC/DependencyInjection.cs | 11 ++--------- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/Infrastructure/IoC/DependencyDomainInjection.cs b/src/Infrastructure/IoC/DependencyDomainInjection.cs index 968fbe1f..d844ac8d 100644 --- a/src/Infrastructure/IoC/DependencyDomainInjection.cs +++ b/src/Infrastructure/IoC/DependencyDomainInjection.cs @@ -18,11 +18,8 @@ public static IServiceCollection AddDomain(this IServiceCollection services) services.AddHttpContextAccessor(); services.AddScoped(); services.AddScoped(); -#if DEBUG - services.AddScoped(); -#else + // services.AddScoped(); services.AddScoped(); -#endif #endregion #region UseCases diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs index ea935f23..e11f9139 100644 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ b/src/Infrastructure/IoC/DependencyInjection.cs @@ -26,15 +26,9 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi services.AddScoped(); #region Inicialização do banco de dados -#if DEBUG - services.AddDbContext( - o => o.UseNpgsql(configuration.GetConnectionString("DefaultConnection"), - b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); -#else services.AddDbContext( o => o.UseNpgsql(dotEnvSecrets.GetDatabaseConnectionString(), b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); -#endif #endregion #region Serviço de Log  @@ -52,9 +46,8 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi var smtpConfig = new SmtpConfiguration(); configuration.GetSection("SmtpConfiguration").Bind(smtpConfig); - smtpConfig.Password = configuration.GetSection("SmtpConfiguration:Password").Value; - smtpConfig.Username = configuration.GetSection("SmtpConfiguration:Username").Value; - + smtpConfig.Password = dotEnvSecrets.GetSmtpUserPassword(); + smtpConfig.Username = dotEnvSecrets.GetSmtpUserName(); services.AddSingleton(); services.AddSingleton(sp => { From 854b4f5b45bedf33ad6687824785272304de5ead Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 11 Jul 2023 15:46:52 -0300 Subject: [PATCH 016/201] chore(ci): add .env test --- .github/workflows/azure-webapps-dotnet-core.yml | 3 ++- .gitignore | 1 + src/Infrastructure/IoC/Utils/DotEnvSecrets.cs | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index caa7bd93..433def9e 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -45,7 +45,8 @@ jobs: JWT_ISSUER=${{ secrets.JWT_ISSUER }} JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }} SMTP_EMAIL_PASSWORD=${{ secrets.SMTP_EMAIL_PASSWORD }} - SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }}" > src/Infrastructure/WebAPI/.env + SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }} + TEST_SECRETS=${{ secrets.TESTE }}" > src/Infrastructure/WebAPI/.env - name: Build with dotnet run: dotnet build ${{env.PROJECT_PATH}} --configuration Release diff --git a/.gitignore b/.gitignore index b19556e6..00ed621c 100644 --- a/.gitignore +++ b/.gitignore @@ -409,3 +409,4 @@ certificate/* RemoteFiles RemoteFiles/* src/Infrastructure/WebAPI/.env +thunder-tests \ No newline at end of file diff --git a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs index 11993b09..c85c3a10 100644 --- a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs +++ b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs @@ -10,6 +10,9 @@ public DotEnvSecrets() // Carrega informações de ambiente (.env) DotNetEnv.Env.Load(Path.Combine(basePath!, ".env")); + + // Testa se o arquivo .env foi carregado + Console.WriteLine(DotNetEnv.Env.GetString("TESTE")); } public string GetBlobStorageConnectionString() => DotNetEnv.Env.GetString("AZURE_BLOB_STORAGE_CONNECTION_STRING"); From 86db14d9fa92615fc7a94e9f613243debdba9935 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 11 Jul 2023 16:01:25 -0300 Subject: [PATCH 017/201] chore(ci): add dev mode config --- .github/workflows/azure-webapps-dotnet-core.yml | 1 + src/Infrastructure/WebAPI/Startup.cs | 3 +++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 433def9e..8a3afb34 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -5,6 +5,7 @@ env: AZURE_WEBAPP_PACKAGE_PATH: "." DOTNET_VERSION: "7.0" PROJECT_PATH: "src/Infrastructure/WebAPI/WebAPI.csproj" + ASPNETCORE_ENVIRONMENT: "Development" on: push: diff --git a/src/Infrastructure/WebAPI/Startup.cs b/src/Infrastructure/WebAPI/Startup.cs index 5c7a1f78..993f9687 100644 --- a/src/Infrastructure/WebAPI/Startup.cs +++ b/src/Infrastructure/WebAPI/Startup.cs @@ -44,6 +44,9 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) // Enable Swagger middleware for API documentation in development mode app.UseSwagger(); app.UseSwaggerUI(); + + // Show development mode message + Console.WriteLine("Development mode"); } // Enable HTTP Strict Transport Security (HSTS) headers for secure communication From 32b5ae9d83c494b2b5e1b07778c0f98e09283d18 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 12 Jul 2023 09:45:16 -0300 Subject: [PATCH 018/201] chore(ci): set environment variable --- .github/workflows/azure-webapps-dotnet-core.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 8a3afb34..2b529fd6 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -5,7 +5,6 @@ env: AZURE_WEBAPP_PACKAGE_PATH: "." DOTNET_VERSION: "7.0" PROJECT_PATH: "src/Infrastructure/WebAPI/WebAPI.csproj" - ASPNETCORE_ENVIRONMENT: "Development" on: push: @@ -49,6 +48,9 @@ jobs: SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }} TEST_SECRETS=${{ secrets.TESTE }}" > src/Infrastructure/WebAPI/.env + - name: Set environment variable + run: echo "ASPNETCORE_ENVIRONMENT=Development" >> $GITHUB_ENV + - name: Build with dotnet run: dotnet build ${{env.PROJECT_PATH}} --configuration Release From 25a2aa61e4e2cf8a03b7e130ac40140bd2cba6bb Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 12 Jul 2023 10:15:31 -0300 Subject: [PATCH 019/201] chore(ci): add dev env --- .github/workflows/azure-webapps-dotnet-core.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 2b529fd6..a7ec2785 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -5,6 +5,7 @@ env: AZURE_WEBAPP_PACKAGE_PATH: "." DOTNET_VERSION: "7.0" PROJECT_PATH: "src/Infrastructure/WebAPI/WebAPI.csproj" + ASPNETCORE_ENVIRONMENT: Development on: push: @@ -49,7 +50,7 @@ jobs: TEST_SECRETS=${{ secrets.TESTE }}" > src/Infrastructure/WebAPI/.env - name: Set environment variable - run: echo "ASPNETCORE_ENVIRONMENT=Development" >> $GITHUB_ENV + run: echo "ASPNETCORE_ENVIRONMENT=${{ env.ASPNETCORE_ENVIRONMENT }}" >> $GITHUB_ENV - name: Build with dotnet run: dotnet build ${{env.PROJECT_PATH}} --configuration Release From ef1e18edd1576b3abc2a84667301316ebbc7162a Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 12 Jul 2023 10:33:30 -0300 Subject: [PATCH 020/201] chore(ci): add swagger support with xml docs --- .github/workflows/azure-webapps-dotnet-core.yml | 3 +++ src/Infrastructure/WebAPI/WebAPI.csproj | 2 ++ 2 files changed, 5 insertions(+) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index a7ec2785..fa388c54 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -58,6 +58,9 @@ jobs: - name: dotnet publish run: dotnet publish ${{env.PROJECT_PATH}} -c Release -o ${{env.DOTNET_ROOT}}/myapp + - name: Copy XML documentation file + run: cp ${GITHUB_WORKSPACE}/${{env.PROJECT_PATH}}/bin/Release/net7.0/*.xml ${{env.DOTNET_ROOT}}/myapp/ + - name: Upload artifact for deployment job uses: actions/upload-artifact@v3 with: diff --git a/src/Infrastructure/WebAPI/WebAPI.csproj b/src/Infrastructure/WebAPI/WebAPI.csproj index ab416046..a0a88573 100644 --- a/src/Infrastructure/WebAPI/WebAPI.csproj +++ b/src/Infrastructure/WebAPI/WebAPI.csproj @@ -13,6 +13,8 @@ 4 bin\Debug\net7.0\Infrastructure.WebAPI.xml + bin\Release\net7.0\Infrastructure.WebAPI.xml + true From d18c5087f2c2bc2e6b3eb3e015a8f3364e4b04a7 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 12 Jul 2023 10:37:50 -0300 Subject: [PATCH 021/201] chore(ci): update config --- .github/workflows/azure-webapps-dotnet-core.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index fa388c54..a7ec2785 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -58,9 +58,6 @@ jobs: - name: dotnet publish run: dotnet publish ${{env.PROJECT_PATH}} -c Release -o ${{env.DOTNET_ROOT}}/myapp - - name: Copy XML documentation file - run: cp ${GITHUB_WORKSPACE}/${{env.PROJECT_PATH}}/bin/Release/net7.0/*.xml ${{env.DOTNET_ROOT}}/myapp/ - - name: Upload artifact for deployment job uses: actions/upload-artifact@v3 with: From 2eda9cfb0124f85af4bb5521a35a22a50f28534b Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 12 Jul 2023 10:47:37 -0300 Subject: [PATCH 022/201] chore(ci): add xml copy --- .github/workflows/azure-webapps-dotnet-core.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index a7ec2785..2083cb0d 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -5,6 +5,7 @@ env: AZURE_WEBAPP_PACKAGE_PATH: "." DOTNET_VERSION: "7.0" PROJECT_PATH: "src/Infrastructure/WebAPI/WebAPI.csproj" + WEBAPI_PATH: "src/Infrastructure/WebAPI/" ASPNETCORE_ENVIRONMENT: Development on: @@ -55,9 +56,12 @@ jobs: - name: Build with dotnet run: dotnet build ${{env.PROJECT_PATH}} --configuration Release - - name: dotnet publish + - name: Dotnet publish run: dotnet publish ${{env.PROJECT_PATH}} -c Release -o ${{env.DOTNET_ROOT}}/myapp + - name: Copy XML documentation file + run: cp ${{env.WEBAPI_PATH}}/bin/Release/net7.0/*.xml ${{env.DOTNET_ROOT}}/myapp/ + - name: Upload artifact for deployment job uses: actions/upload-artifact@v3 with: From 52c891b5d02d697efbc68ed5d3dd12047f22d5e9 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 12 Jul 2023 12:20:08 -0300 Subject: [PATCH 023/201] chore(ci): copy xml file in release mode --- .github/workflows/azure-webapps-dotnet-core.yml | 4 ++-- src/Infrastructure/WebAPI/WebAPI.csproj | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 2083cb0d..a15240df 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -54,13 +54,13 @@ jobs: run: echo "ASPNETCORE_ENVIRONMENT=${{ env.ASPNETCORE_ENVIRONMENT }}" >> $GITHUB_ENV - name: Build with dotnet - run: dotnet build ${{env.PROJECT_PATH}} --configuration Release + run: dotnet build ${{env.PROJECT_PATH}} --configuration Release -o ${{env.DOTNET_ROOT}}/dist - name: Dotnet publish run: dotnet publish ${{env.PROJECT_PATH}} -c Release -o ${{env.DOTNET_ROOT}}/myapp - name: Copy XML documentation file - run: cp ${{env.WEBAPI_PATH}}/bin/Release/net7.0/*.xml ${{env.DOTNET_ROOT}}/myapp/ + run: cp ${{env.DOTNET_ROOT}}/dist/*.xml ${{env.DOTNET_ROOT}}/myapp/ - name: Upload artifact for deployment job uses: actions/upload-artifact@v3 diff --git a/src/Infrastructure/WebAPI/WebAPI.csproj b/src/Infrastructure/WebAPI/WebAPI.csproj index a0a88573..ba7a0316 100644 --- a/src/Infrastructure/WebAPI/WebAPI.csproj +++ b/src/Infrastructure/WebAPI/WebAPI.csproj @@ -13,6 +13,10 @@ 4 bin\Debug\net7.0\Infrastructure.WebAPI.xml + true + + + 4 bin\Release\net7.0\Infrastructure.WebAPI.xml true From 45f494fe46cf9773563e8e1195d021dbb223c365 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 18 Jul 2023 19:27:55 -0300 Subject: [PATCH 024/201] refactor(domain): adjust exceptions and remove some mappers --- src/Domain/Entities/Notice.cs | 15 +++ src/Domain/Entities/Professor.cs | 3 +- src/Domain/Entities/Student.cs | 118 +++++++++++------- src/Domain/UseCases/Area/CreateArea.cs | 5 +- src/Domain/UseCases/Auth/ConfirmEmail.cs | 11 +- src/Domain/UseCases/Auth/ForgotPassword.cs | 8 +- src/Domain/UseCases/Auth/ResetPassword.cs | 20 ++- src/Domain/UseCases/Campus/CreateCampus.cs | 5 +- src/Domain/UseCases/Campus/DeleteCampus.cs | 4 +- src/Domain/UseCases/Campus/GetCampusById.cs | 4 +- src/Domain/UseCases/Campus/UpdateCampus.cs | 7 +- src/Domain/UseCases/Course/CreateCourse.cs | 5 +- src/Domain/UseCases/Course/DeleteCourse.cs | 4 +- src/Domain/UseCases/Course/GetCourseById.cs | 4 +- src/Domain/UseCases/Course/UpdateCourse.cs | 10 +- .../UseCases/MainArea/CreateMainArea.cs | 5 +- .../UseCases/MainArea/DeleteMainArea.cs | 4 +- .../UseCases/MainArea/GetMainAreaById.cs | 4 +- .../UseCases/MainArea/UpdateMainArea.cs | 5 +- src/Domain/UseCases/Notice/CreateNotice.cs | 2 +- src/Domain/UseCases/Notice/GetNoticeById.cs | 4 +- .../UseCases/Professor/CreateProfessor.cs | 24 ++-- .../UseCases/Professor/DeleteProfessor.cs | 15 ++- .../UseCases/Professor/GetProfessorById.cs | 5 +- .../UseCases/Professor/UpdateProfessor.cs | 8 +- .../UseCases/ProgramType/CreateProgramType.cs | 2 +- .../UseCases/ProgramType/DeleteProgramType.cs | 4 +- .../ProgramType/GetProgramTypeById.cs | 5 +- .../UseCases/ProgramType/UpdateProgramType.cs | 18 ++- src/Domain/UseCases/Student/CreateStudent.cs | 55 +++++--- src/Domain/UseCases/Student/DeleteStudent.cs | 16 +-- src/Domain/UseCases/Student/GetStudentById.cs | 5 +- src/Domain/UseCases/Student/UpdateStudent.cs | 11 +- src/Domain/UseCases/SubArea/CreateSubArea.cs | 19 +-- src/Domain/UseCases/SubArea/DeleteSubArea.cs | 4 +- .../UseCases/SubArea/GetSubAreasByArea.cs | 4 - src/Domain/UseCases/SubArea/UpdateSubArea.cs | 5 +- .../TypeAssistance/CreateTypeAssistance.cs | 4 +- .../TypeAssistance/DeleteTypeAssistance.cs | 4 +- .../TypeAssistance/GetTypeAssistanceById.cs | 5 +- .../TypeAssistance/UpdateTypeAssistance.cs | 18 ++- src/Domain/UseCases/User/ActivateUser.cs | 6 +- src/Domain/UseCases/User/DeactivateUser.cs | 6 +- src/Domain/UseCases/User/GetUserById.cs | 6 +- src/Domain/UseCases/User/UpdateUser.cs | 2 +- 45 files changed, 275 insertions(+), 223 deletions(-) diff --git a/src/Domain/Entities/Notice.cs b/src/Domain/Entities/Notice.cs index 4f6f4659..e8b32ffa 100644 --- a/src/Domain/Entities/Notice.cs +++ b/src/Domain/Entities/Notice.cs @@ -115,6 +115,21 @@ public int? SendingDocumentationDeadline #endregion #region Constructors + public Notice(DateTime? startDate, + DateTime? finalDate, + DateTime? appealStartDate, + DateTime? appealFinalDate, + int? suspensionYears, + int? sendingDocumentationDeadline) + { + StartDate = startDate; + FinalDate = finalDate; + AppealStartDate = appealStartDate; + AppealFinalDate = appealFinalDate; + SuspensionYears = suspensionYears; + SendingDocumentationDeadline = sendingDocumentationDeadline; + } + /// /// Constructor to dbcontext EF instancing. /// diff --git a/src/Domain/Entities/Professor.cs b/src/Domain/Entities/Professor.cs index c9b206dd..d42965ab 100644 --- a/src/Domain/Entities/Professor.cs +++ b/src/Domain/Entities/Professor.cs @@ -63,11 +63,10 @@ public Guid? UserId #endregion #region Constructors - public Professor(string? siapeEnrollment, long identifyLattes, Guid? userId) + public Professor(string? siapeEnrollment, long identifyLattes) { SIAPEEnrollment = siapeEnrollment; IdentifyLattes = identifyLattes; - UserId = userId; } /// diff --git a/src/Domain/Entities/Student.cs b/src/Domain/Entities/Student.cs index 92df1456..1e11fe62 100644 --- a/src/Domain/Entities/Student.cs +++ b/src/Domain/Entities/Student.cs @@ -10,6 +10,9 @@ namespace Domain.Entities public class Student : Entity { #region Properties + /// + /// Data de Nascimento + /// private DateTime _birthDate; public DateTime BirthDate { @@ -17,13 +20,16 @@ public DateTime BirthDate set { EntityExceptionValidation.When(value == default, - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required("Data de Nascimento")); EntityExceptionValidation.When(value >= DateTime.Now, - ExceptionMessageFactory.LessThan(nameof(value), DateTime.Now.ToString("dd/MM/yyyy"))); + ExceptionMessageFactory.LessThan("Data de Nascimento", DateTime.Now.ToString("dd/MM/yyyy"))); _birthDate = value; } } + /// + /// RG + /// private long _rg; public long RG { @@ -31,41 +37,42 @@ public long RG set { EntityExceptionValidation.When(value <= 0, - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required("RG")); _rg = value; } } - private string? _issuingAgency; /// /// Órgão emissor da identidade /// + private string? _issuingAgency; public string? IssuingAgency { get { return _issuingAgency; } set { EntityExceptionValidation.When(string.IsNullOrEmpty(value), - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required("Órgão emissor da identidade")); EntityExceptionValidation.When(value?.Length > 50, - ExceptionMessageFactory.MaxLength(nameof(value), 50)); + ExceptionMessageFactory.MaxLength("Órgão emissor da identidade", 50)); _issuingAgency = value; } } - private DateTime _dispatchDate; /// /// Data Expedição da identidade /// + private DateTime _dispatchDate; public DateTime DispatchDate { get { return _dispatchDate; } set { EntityExceptionValidation.When(value == default, - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required("Data Expedição da identidade")); EntityExceptionValidation.When(value >= DateTime.Now, - ExceptionMessageFactory.LessThan(nameof(value), DateTime.Now.ToString("dd/MM/yyyy"))); + ExceptionMessageFactory.LessThan("Data Expedição da identidade", + DateTime.Now.ToString("dd/MM/yyyy"))); _dispatchDate = value; } } @@ -80,47 +87,50 @@ public EGender? Gender set { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required("Sexo")); EntityExceptionValidation.When(!Enum.TryParse(value.ToString(), out var _), - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid("Sexo")); _gender = value; } } - private ERace? _race; /// /// Cor/Raça: Branca, Preta, Parda, Amarela, Indígena, Não declarado, Não dispõe da informação /// + private ERace? _race; public ERace? Race { get { return _race; } set { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required("Cor/Raça")); EntityExceptionValidation.When(!Enum.TryParse(value.ToString(), out var _), - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid("Cor/Raça")); _race = value; } } - private string? _homeAddress; /// /// Endereço Residencial (Rua, Avenida, N.º, complemento, bairro) /// + private string? _homeAddress; public string? HomeAddress { get { return _homeAddress; } set { EntityExceptionValidation.When(string.IsNullOrEmpty(value), - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required("Endereço Residencial")); EntityExceptionValidation.When(value?.Length > 300, - ExceptionMessageFactory.MaxLength(nameof(value), 300)); + ExceptionMessageFactory.MaxLength("Endereço Residencial", 300)); _homeAddress = value; } } + /// + /// Cidade + /// private string? _city; public string? City { @@ -128,13 +138,16 @@ public string? City set { EntityExceptionValidation.When(string.IsNullOrEmpty(value), - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required("Cidade")); EntityExceptionValidation.When(value?.Length > 50, - ExceptionMessageFactory.MaxLength(nameof(value), 50)); + ExceptionMessageFactory.MaxLength("Cidade", 50)); _city = value; } } + /// + /// Estado + /// private string? _uf; public string? UF { @@ -142,13 +155,16 @@ public string? UF set { EntityExceptionValidation.When(string.IsNullOrEmpty(value), - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required("Estado")); EntityExceptionValidation.When(value?.Length != 2, - ExceptionMessageFactory.WithLength(nameof(value), 2)); + ExceptionMessageFactory.WithLength("Estado", 2)); _uf = value; } } + /// + /// CEP + /// private long _cep; public long CEP { @@ -156,11 +172,14 @@ public long CEP set { EntityExceptionValidation.When(value <= 0, - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid("CEP")); _cep = value; } } + /// + /// DDD Telefone + /// private int? _phoneDDD; public int? PhoneDDD { @@ -169,11 +188,14 @@ public int? PhoneDDD { if (value == null) return; EntityExceptionValidation.When(value <= 0, - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid("DDD Telefo")); _phoneDDD = value; } } + /// + /// Telefone + /// private long? _phone; public long? Phone { @@ -182,11 +204,14 @@ public long? Phone { if (value == null) return; EntityExceptionValidation.When(value <= 0, - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid("Telefone")); _phone = value; } } + /// + /// DDD Celular + /// private int? _cellPhoneDDD; public int? CellPhoneDDD { @@ -195,11 +220,14 @@ public int? CellPhoneDDD { if (value == null) return; EntityExceptionValidation.When(value <= 0, - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid("DDD Celular")); _cellPhoneDDD = value; } } + /// + /// Celular + /// private long? _cellPhone; public long? CellPhone { @@ -208,11 +236,14 @@ public long? CellPhone { if (value == null) return; EntityExceptionValidation.When(value <= 0, - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid("Celular")); _cellPhone = value; } } + /// + /// ID do Campus + /// private Guid? _campusId; public Guid? CampusId { @@ -220,11 +251,14 @@ public Guid? CampusId set { EntityExceptionValidation.When(value == null || value == Guid.Empty, - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required("Campus")); _campusId = value; } } + /// + /// ID do Curso + /// private Guid? _courseId; public Guid? CourseId { @@ -232,22 +266,22 @@ public Guid? CourseId set { EntityExceptionValidation.When(value == null || value == Guid.Empty, - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required("Curso")); _courseId = value; } } - private string? _startYear; /// /// Ano de entrada / Semestre /// + private string? _startYear; public string? StartYear { get { return _startYear; } set { EntityExceptionValidation.When(string.IsNullOrEmpty(value), - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required("Ano de entrada / Semestre")); _startYear = value; } } @@ -255,15 +289,15 @@ public string? StartYear /// /// Tipo de Bolsa de Assistência Estudantil do aluno /// - private Guid? _TypeAssistanceId; + private Guid? _typeAssistanceId; public Guid? TypeAssistanceId { - get { return _TypeAssistanceId; } + get { return _typeAssistanceId; } set { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(value))); - _TypeAssistanceId = value; + ExceptionMessageFactory.Required("Tipo de Bolsa de Assistência Estudantil do aluno")); + _typeAssistanceId = value; } } @@ -278,7 +312,7 @@ public Guid? UserId { { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required("Usuário")); _userId = value; } } @@ -294,13 +328,13 @@ public Guid? UserId public Student( DateTime birthDate, long rg, - string issuingAgency, + string? issuingAgency, DateTime dispatchDate, EGender? gender, ERace? race, - string homeAddress, - string city, - string uf, + string? homeAddress, + string? city, + string? uf, long cep, int? phoneDDD, long? phone, @@ -308,9 +342,8 @@ public Student( long? cellPhone, Guid? campusId, Guid? courseId, - string startYear, - Guid? studentAssistanceProgramId, - Guid? userId) + string? startYear, + Guid? studentAssistanceProgramId) { BirthDate = birthDate; RG = rg; @@ -330,7 +363,6 @@ public Student( CourseId = courseId; StartYear = startYear; TypeAssistanceId = studentAssistanceProgramId; - UserId = userId; } /// diff --git a/src/Domain/UseCases/Area/CreateArea.cs b/src/Domain/UseCases/Area/CreateArea.cs index 3b74e89d..c6475abd 100644 --- a/src/Domain/UseCases/Area/CreateArea.cs +++ b/src/Domain/UseCases/Area/CreateArea.cs @@ -32,8 +32,11 @@ public async Task Execute(CreateAreaInput model) var area = await _mainAreaRepository.GetById(model.MainAreaId); UseCaseException.BusinessRuleViolation(area?.DeletedAt != null, "The informed Main Area is inactive."); + // Mapeia input para entidade + var newEntity = new Entities.Area(model.MainAreaId, model.Name, model.Code); + // Cria nova área - entity = await _areaRepository.Create(_mapper.Map(model)); + entity = await _areaRepository.Create(newEntity); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Auth/ConfirmEmail.cs b/src/Domain/UseCases/Auth/ConfirmEmail.cs index e9bba2b8..be4bed93 100644 --- a/src/Domain/UseCases/Auth/ConfirmEmail.cs +++ b/src/Domain/UseCases/Auth/ConfirmEmail.cs @@ -1,5 +1,6 @@ using Domain.Interfaces.Repositories; using Domain.Interfaces.UseCases; +using Domain.Validation; namespace Domain.UseCases { @@ -13,19 +14,17 @@ public class ConfirmEmail : IConfirmEmail public async Task Execute(string? email, string? token) { // Verifica se o email é nulo - if (string.IsNullOrEmpty(email)) - throw new ArgumentNullException(nameof(email), "Email não informado."); + UseCaseException.NotInformedParam(string.IsNullOrEmpty(email), nameof(email)); // Verifica se o token é nulo - else if (string.IsNullOrEmpty(token)) - throw new ArgumentNullException(nameof(token), "Token não informado."); + UseCaseException.NotInformedParam(string.IsNullOrEmpty(token), nameof(token)); // Busca usuário pelo email informado var user = await _userRepository.GetUserByEmail(email) - ?? throw new Exception("Usuário não encontrado."); + ?? throw UseCaseException.NotFoundEntityByParams(nameof(Entities.User)); // Confirma usuário - user.ConfirmUserEmail(token); + user.ConfirmUserEmail(token!); // Atualiza usuário await _userRepository.Update(user); diff --git a/src/Domain/UseCases/Auth/ForgotPassword.cs b/src/Domain/UseCases/Auth/ForgotPassword.cs index ba4ae43b..ef819e64 100644 --- a/src/Domain/UseCases/Auth/ForgotPassword.cs +++ b/src/Domain/UseCases/Auth/ForgotPassword.cs @@ -1,6 +1,7 @@ using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; using Domain.Interfaces.UseCases; +using Domain.Validation; namespace Domain.UseCases { @@ -19,12 +20,11 @@ public ForgotPassword(IUserRepository userRepository, IEmailService emailService public async Task Execute(string? email) { // Verifica se o email é nulo - if (string.IsNullOrEmpty(email)) - throw new ArgumentNullException(nameof(email), "Email não informado."); + UseCaseException.NotInformedParam(string.IsNullOrEmpty(email), nameof(email)); // Busca usuário pelo email var user = await _userRepository.GetUserByEmail(email) - ?? throw new Exception("Nenhum usuário encontrado para o email informado."); + ?? throw UseCaseException.NotFoundEntityByParams(nameof(Entities.User)); // Gera token de recuperação de senha user.GenerateResetPasswordToken(); @@ -37,7 +37,7 @@ public async Task Execute(string? email) // Verifica se o token foi gerado if (string.IsNullOrEmpty(user.ResetPasswordToken)) - throw new Exception("Token não gerado."); + throw UseCaseException.BusinessRuleViolation("Token não gerado."); // Retorna token return "Token de recuperação gerado e enviado por e-mail com sucesso."; diff --git a/src/Domain/UseCases/Auth/ResetPassword.cs b/src/Domain/UseCases/Auth/ResetPassword.cs index cf2ebf85..c616c038 100644 --- a/src/Domain/UseCases/Auth/ResetPassword.cs +++ b/src/Domain/UseCases/Auth/ResetPassword.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; +using Domain.Validation; namespace Domain.UseCases { @@ -20,31 +21,28 @@ public ResetPassword(IUserRepository userRepository, IHashService hashService) public async Task Execute(UserResetPasswordInput input) { // Verifica se o id do usuário é nulo - if (input.Id == null) - throw new ArgumentNullException(nameof(input.Id), "Id do usuário não informado."); + UseCaseException.NotInformedParam(input.Id == null, nameof(input.Id)); // Verifica se a senha é nula - else if (input.Password == null) - throw new ArgumentNullException(nameof(input.Password), "Senha não informada."); + UseCaseException.NotInformedParam(input.Password == null, nameof(input.Password)); // Verifica se o token é nulo - else if (input.Token == null) - throw new ArgumentNullException(nameof(input.Token), "Token não informado."); + UseCaseException.NotInformedParam(input.Token == null, nameof(input.Token)); // Busca o usuário pelo id var entity = await _userRepository.GetById(input.Id) - ?? throw new Exception("Nenhum usuário encontrato para o id informado."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); // Verifica se o token de validação é nulo if (string.IsNullOrEmpty(entity.ResetPasswordToken)) - throw new Exception("Solicitação de atualização de senha não permitido."); + throw UseCaseException.BusinessRuleViolation("Solicitação de atualização de senha não permitido."); // Verifica se o token de validação é igual ao token informado - input.Password = _hashService.HashPassword(input.Password); + input.Password = _hashService.HashPassword(input.Password!); // Atualiza a senha do usuário - if (!entity.UpdatePassword(input.Password, input.Token)) - throw new Exception("Token de validação inválido."); + if (!entity.UpdatePassword(input.Password, input.Token!)) + throw UseCaseException.BusinessRuleViolation("Token de validação inválido."); // Salva as alterações await _userRepository.Update(entity); diff --git a/src/Domain/UseCases/Campus/CreateCampus.cs b/src/Domain/UseCases/Campus/CreateCampus.cs index 9832872d..4d38545d 100644 --- a/src/Domain/UseCases/Campus/CreateCampus.cs +++ b/src/Domain/UseCases/Campus/CreateCampus.cs @@ -26,10 +26,11 @@ public async Task Execute(CreateCampusInput input) // Verifica se já existe um edital para o período indicado var entity = await _repository.GetCampusByName(input.Name!); if (entity != null) - throw new Exception("Já existe um Campus para o nome informado."); + throw UseCaseException.BusinessRuleViolation("Já existe um Campus para o nome informado."); // Cria entidade - entity = await _repository.Create(_mapper.Map(input)); + var newEntity = new Entities.Campus(input.Name); + entity = await _repository.Create(newEntity); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Campus/DeleteCampus.cs b/src/Domain/UseCases/Campus/DeleteCampus.cs index cf519a90..94cb8c3e 100644 --- a/src/Domain/UseCases/Campus/DeleteCampus.cs +++ b/src/Domain/UseCases/Campus/DeleteCampus.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -20,8 +21,7 @@ public DeleteCampus(ICampusRepository repository, IMapper mapper) public async Task Execute(Guid? id) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade var model = await _repository.Delete(id); diff --git a/src/Domain/UseCases/Campus/GetCampusById.cs b/src/Domain/UseCases/Campus/GetCampusById.cs index 1b6ba351..deec7aeb 100644 --- a/src/Domain/UseCases/Campus/GetCampusById.cs +++ b/src/Domain/UseCases/Campus/GetCampusById.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -19,8 +20,7 @@ public GetCampusById(ICampusRepository repository, IMapper mapper) public async Task Execute(Guid? id) { - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); var entity = await _repository.GetById(id); return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Campus/UpdateCampus.cs b/src/Domain/UseCases/Campus/UpdateCampus.cs index 016f7697..f939df47 100644 --- a/src/Domain/UseCases/Campus/UpdateCampus.cs +++ b/src/Domain/UseCases/Campus/UpdateCampus.cs @@ -21,8 +21,7 @@ public UpdateCampus(ICampusRepository repository, IMapper mapper) public async Task Execute(Guid? id, UpdateCampusInput input) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se nome foi informado UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); @@ -32,11 +31,11 @@ public async Task Execute(Guid? id, UpdateCampusInput // Verifica se a entidade foi excluída if (entity.DeletedAt != null) - throw new Exception("O Campus informado já foi excluído."); + throw UseCaseException.BusinessRuleViolation("O Campus informado já foi excluído."); // Verifica se o nome já está sendo usado if (!string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) && await _repository.GetCampusByName(input.Name!) != null) - throw new Exception("Já existe um Campus para o nome informado."); + throw UseCaseException.BusinessRuleViolation("Já existe um Campus para o nome informado."); // Atualiza atributos permitidos entity.Name = input.Name; diff --git a/src/Domain/UseCases/Course/CreateCourse.cs b/src/Domain/UseCases/Course/CreateCourse.cs index 705fd617..a264d3ec 100644 --- a/src/Domain/UseCases/Course/CreateCourse.cs +++ b/src/Domain/UseCases/Course/CreateCourse.cs @@ -26,10 +26,11 @@ public async Task Execute(CreateCourseInput input) // Verifica se já existe um edital para o período indicado var entity = await _repository.GetCourseByName(input.Name!); if (entity != null) - throw new Exception("Já existe um Curso para o nome informado."); + throw UseCaseException.BusinessRuleViolation("Já existe um Curso para o nome informado."); // Cria entidade - entity = await _repository.Create(_mapper.Map(input)); + var newEntity = new Entities.Course(input.Name); + entity = await _repository.Create(newEntity); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Course/DeleteCourse.cs b/src/Domain/UseCases/Course/DeleteCourse.cs index 8d84b694..0729bd2f 100644 --- a/src/Domain/UseCases/Course/DeleteCourse.cs +++ b/src/Domain/UseCases/Course/DeleteCourse.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -20,8 +21,7 @@ public DeleteCourse(ICourseRepository repository, IMapper mapper) public async Task Execute(Guid? id) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade var model = await _repository.Delete(id); diff --git a/src/Domain/UseCases/Course/GetCourseById.cs b/src/Domain/UseCases/Course/GetCourseById.cs index 956a29c5..af82ad43 100644 --- a/src/Domain/UseCases/Course/GetCourseById.cs +++ b/src/Domain/UseCases/Course/GetCourseById.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -19,8 +20,7 @@ public GetCourseById(ICourseRepository repository, IMapper mapper) public async Task Execute(Guid? id) { - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); var entity = await _repository.GetById(id); return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Course/UpdateCourse.cs b/src/Domain/UseCases/Course/UpdateCourse.cs index 4e27b259..78c66f2f 100644 --- a/src/Domain/UseCases/Course/UpdateCourse.cs +++ b/src/Domain/UseCases/Course/UpdateCourse.cs @@ -21,22 +21,22 @@ public UpdateCourse(ICourseRepository repository, IMapper mapper) public async Task Execute(Guid? id, UpdateCourseInput input) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se nome foi informado UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - var entity = await _repository.GetById(id) ?? throw new Exception("Curso não encontrado."); + var entity = await _repository.GetById(id) ?? + throw UseCaseException.NotFoundEntityById(nameof(Entities.Course)); // Verifica se a entidade foi excluída if (entity.DeletedAt != null) - throw new Exception("O Curso informado já foi excluído."); + throw UseCaseException.BusinessRuleViolation("O Curso informado já foi excluído."); // Verifica se o nome já está sendo usado if (!string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) && await _repository.GetCourseByName(input.Name!) != null) - throw new Exception("Já existe um Curso para o nome informado."); + throw UseCaseException.BusinessRuleViolation("Já existe um Curso para o nome informado."); // Atualiza atributos permitidos entity.Name = input.Name; diff --git a/src/Domain/UseCases/MainArea/CreateMainArea.cs b/src/Domain/UseCases/MainArea/CreateMainArea.cs index 9e17b19b..d55218b9 100644 --- a/src/Domain/UseCases/MainArea/CreateMainArea.cs +++ b/src/Domain/UseCases/MainArea/CreateMainArea.cs @@ -4,6 +4,7 @@ using Domain.Interfaces.Repositories; using System.Threading.Tasks; using System; +using Domain.Validation; namespace Domain.UseCases { @@ -24,9 +25,9 @@ public async Task Execute(CreateMainAreaInput input) // Validação de código da Área var entity = await _repository.GetByCode(input.Code); if (entity != null) - throw new Exception($"Já existe uma Área Principal para o código {input.Code}"); + throw UseCaseException.BusinessRuleViolation($"Já existe uma Área Principal para o código {input.Code}"); - entity = await _repository.Create(_mapper.Map(input)); + entity = await _repository.Create(_mapper.Map(input)); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/MainArea/DeleteMainArea.cs b/src/Domain/UseCases/MainArea/DeleteMainArea.cs index 01b305f4..17a0598b 100644 --- a/src/Domain/UseCases/MainArea/DeleteMainArea.cs +++ b/src/Domain/UseCases/MainArea/DeleteMainArea.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -20,8 +21,7 @@ public DeleteMainArea(IMainAreaRepository repository, IMapper mapper) public async Task Execute(Guid? id) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade var model = await _repository.Delete(id); diff --git a/src/Domain/UseCases/MainArea/GetMainAreaById.cs b/src/Domain/UseCases/MainArea/GetMainAreaById.cs index bf6e3f7f..eb153864 100644 --- a/src/Domain/UseCases/MainArea/GetMainAreaById.cs +++ b/src/Domain/UseCases/MainArea/GetMainAreaById.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -19,8 +20,7 @@ public GetMainAreaById(IMainAreaRepository repository, IMapper mapper) public async Task Execute(Guid? id) { - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); var entity = await _repository.GetById(id); return _mapper.Map(entity); diff --git a/src/Domain/UseCases/MainArea/UpdateMainArea.cs b/src/Domain/UseCases/MainArea/UpdateMainArea.cs index 76b69e66..7cc6552c 100644 --- a/src/Domain/UseCases/MainArea/UpdateMainArea.cs +++ b/src/Domain/UseCases/MainArea/UpdateMainArea.cs @@ -2,8 +2,6 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; -using System.Threading.Tasks; -using System; namespace Domain.UseCases { @@ -22,7 +20,8 @@ public UpdateMainArea(IMainAreaRepository repository, IMapper mapper) public async Task Execute(Guid? id, UpdateMainAreaInput input) { // Recupera entidade que será atualizada - var entity = await _repository.GetById(id) ?? throw new Exception("Área Principal não encontrada."); + var entity = await _repository.GetById(id) + ?? throw Validation.UseCaseException.BusinessRuleViolation("Área Principal não encontrada."); // Atualiza atributos permitidos entity.Name = input.Name; diff --git a/src/Domain/UseCases/Notice/CreateNotice.cs b/src/Domain/UseCases/Notice/CreateNotice.cs index d0628195..a93054cd 100644 --- a/src/Domain/UseCases/Notice/CreateNotice.cs +++ b/src/Domain/UseCases/Notice/CreateNotice.cs @@ -24,7 +24,7 @@ public CreateNotice(INoticeRepository repository, IStorageFileService storageFil public async Task Execute(CreateNoticeInput input) { // Mapeia input para entidade - var entity = _mapper.Map(input); + var entity = new Entities.Notice(input.StartDate, input.FinalDate, input.AppealStartDate, input.AppealFinalDate, input.SuspensionYears, input.SendingDocumentationDeadline); // Verifica se já existe um edital para o período indicado var projectFound = await _repository.GetNoticeByPeriod((DateTime)input.StartDate!, (DateTime)input.FinalDate!); diff --git a/src/Domain/UseCases/Notice/GetNoticeById.cs b/src/Domain/UseCases/Notice/GetNoticeById.cs index 9ff99060..68c146fd 100644 --- a/src/Domain/UseCases/Notice/GetNoticeById.cs +++ b/src/Domain/UseCases/Notice/GetNoticeById.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -19,8 +20,7 @@ public GetNoticeById(INoticeRepository repository, IMapper mapper) public async Task Execute(Guid? id) { - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); var entity = await _repository.GetById(id); return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Professor/CreateProfessor.cs b/src/Domain/UseCases/Professor/CreateProfessor.cs index f1e99284..333a44b9 100644 --- a/src/Domain/UseCases/Professor/CreateProfessor.cs +++ b/src/Domain/UseCases/Professor/CreateProfessor.cs @@ -3,6 +3,7 @@ using AutoMapper; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; +using Domain.Validation; namespace Domain.UseCases { @@ -31,41 +32,36 @@ public CreateProfessor(IProfessorRepository professorRepository, public async Task Execute(CreateProfessorInput input) { // Realiza o map da entidade e a validação dos campos informados - var entity = _mapper.Map(input); + var entity = new Entities.Professor(input.SIAPEEnrollment, input.IdentifyLattes); // Verifica se a senha é nula - if (string.IsNullOrEmpty(input.Password)) - throw new Exception("Senha não informada."); + UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Password), nameof(input.Password)); // Verifica se já existe um usuário com o e-mail informado var user = await _userRepository.GetUserByEmail(input.Email); - if (user != null) - throw new Exception("Já existe um usuário com o e-mail informado."); + UseCaseException.BusinessRuleViolation(user != null, "Já existe um usuário com o e-mail informado."); // Verifica se já existe um usuário com o CPF informado user = await _userRepository.GetUserByCPF(input.CPF); - if (user != null) - throw new Exception("Já existe um usuário com o CPF informado."); + UseCaseException.BusinessRuleViolation(user != null, "Já existe um usuário com o CPF informado."); // Gera hash da senha - input.Password = _hashService.HashPassword(input.Password); + input.Password = _hashService.HashPassword(input.Password!); // Cria usuário user = new Entities.User(input.Name, input.Email, input.Password, input.CPF, Entities.Enums.ERole.PROFESSOR); // Adiciona usuário no banco user = await _userRepository.Create(user); - if (user == null) - throw new Exception("Não foi possível criar o usuário."); + UseCaseException.BusinessRuleViolation(user == null, "Não foi possível criar o usuário."); // Adiciona professor no banco - entity.UserId = user.Id; + entity.UserId = user?.Id; entity = await _professorRepository.Create(entity); - if (entity == null) - throw new Exception("Não foi possível criar o professor."); + UseCaseException.BusinessRuleViolation(entity == null, "Não foi possível criar o professor."); // Envia e-mail de confirmação - await _emailService.SendConfirmationEmail(user.Email, user.Name, user.ValidationCode); + await _emailService.SendConfirmationEmail(user?.Email, user?.Name, user?.ValidationCode); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Professor/DeleteProfessor.cs b/src/Domain/UseCases/Professor/DeleteProfessor.cs index a8b9c0d9..3644d355 100644 --- a/src/Domain/UseCases/Professor/DeleteProfessor.cs +++ b/src/Domain/UseCases/Professor/DeleteProfessor.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -22,25 +23,23 @@ public DeleteProfessor(IProfessorRepository professorRepository, IUserRepository public async Task Execute(Guid? id) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se o professor existe var professor = await _professorRepository.GetById(id) - ?? throw new Exception("Professor não encontrado para o Id informado."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Professor)); // Verifica se o usuário existe _ = await _userRepository.GetById(professor.UserId) - ?? throw new Exception("Usuário não encontrado para o Id informado."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); // Remove o professor professor = await _professorRepository.Delete(id); - if (professor == null) - throw new Exception("O professor não pôde ser removido."); + UseCaseException.BusinessRuleViolation(professor == null, "O professor não pôde ser removido."); // Remove o usuário - _ = await _userRepository.Delete(professor.UserId) - ?? throw new Exception("O usuário não pôde ser removido."); + _ = await _userRepository.Delete(professor?.UserId) + ?? throw UseCaseException.BusinessRuleViolation("O usuário não pôde ser removido."); // Retorna o professor removido return _mapper.Map(professor); diff --git a/src/Domain/UseCases/Professor/GetProfessorById.cs b/src/Domain/UseCases/Professor/GetProfessorById.cs index 84e76574..0eaa8d6d 100644 --- a/src/Domain/UseCases/Professor/GetProfessorById.cs +++ b/src/Domain/UseCases/Professor/GetProfessorById.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -19,9 +20,7 @@ public GetProfessorById(IProfessorRepository repository, IMapper mapper) public async Task Execute(Guid? id) { - if (id == null) - throw new ArgumentNullException(nameof(id)); - + UseCaseException.NotInformedParam(id is null, nameof(id)); var entity = await _repository.GetById(id); return _mapper.Map(entity); } diff --git a/src/Domain/UseCases/Professor/UpdateProfessor.cs b/src/Domain/UseCases/Professor/UpdateProfessor.cs index a104b440..46d292ec 100644 --- a/src/Domain/UseCases/Professor/UpdateProfessor.cs +++ b/src/Domain/UseCases/Professor/UpdateProfessor.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -20,16 +21,15 @@ public UpdateProfessor(IProfessorRepository professorRepository, IMapper mapper) public async Task Execute(Guid? id, UpdateProfessorInput input) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Recupera entidade que será atualizada var professor = await _professorRepository.GetById(id) - ?? throw new Exception("Nenhum professor encontrado para o Id informado."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Professor)); // Verifica se a entidade foi excluída if (professor.DeletedAt != null) - throw new Exception("O professor informado já foi excluído."); + throw UseCaseException.BusinessRuleViolation("O professor informado já foi excluído."); // Atualiza atributos permitidos professor.IdentifyLattes = input.IdentifyLattes; diff --git a/src/Domain/UseCases/ProgramType/CreateProgramType.cs b/src/Domain/UseCases/ProgramType/CreateProgramType.cs index 0b723758..fa163062 100644 --- a/src/Domain/UseCases/ProgramType/CreateProgramType.cs +++ b/src/Domain/UseCases/ProgramType/CreateProgramType.cs @@ -26,7 +26,7 @@ public async Task Execute(CreateProgramTypeInput // Verifica se já existe um tipo de programa com o nome indicado var entity = await _repository.GetProgramTypeByName(input.Name!); if (entity != null) - throw new Exception("Já existe um Tipo de Programa para o nome informado."); + throw UseCaseException.BusinessRuleViolation("Já existe um Tipo de Programa para o nome informado."); // Cria entidade entity = await _repository.Create(_mapper.Map(input)); diff --git a/src/Domain/UseCases/ProgramType/DeleteProgramType.cs b/src/Domain/UseCases/ProgramType/DeleteProgramType.cs index 04b3df95..7fb85cbe 100644 --- a/src/Domain/UseCases/ProgramType/DeleteProgramType.cs +++ b/src/Domain/UseCases/ProgramType/DeleteProgramType.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -20,8 +21,7 @@ public DeleteProgramType(IProgramTypeRepository repository, IMapper mapper) public async Task Execute(Guid? id) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade var model = await _repository.Delete(id); diff --git a/src/Domain/UseCases/ProgramType/GetProgramTypeById.cs b/src/Domain/UseCases/ProgramType/GetProgramTypeById.cs index fac8ff55..f7a04ac9 100644 --- a/src/Domain/UseCases/ProgramType/GetProgramTypeById.cs +++ b/src/Domain/UseCases/ProgramType/GetProgramTypeById.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -19,9 +20,7 @@ public GetProgramTypeById(IProgramTypeRepository repository, IMapper mapper) public async Task Execute(Guid? id) { - if (id == null) - throw new ArgumentNullException(nameof(id)); - + UseCaseException.NotInformedParam(id is null, nameof(id)); var entity = await _repository.GetById(id); return _mapper.Map(entity); } diff --git a/src/Domain/UseCases/ProgramType/UpdateProgramType.cs b/src/Domain/UseCases/ProgramType/UpdateProgramType.cs index eab37dd2..bcb1e692 100644 --- a/src/Domain/UseCases/ProgramType/UpdateProgramType.cs +++ b/src/Domain/UseCases/ProgramType/UpdateProgramType.cs @@ -21,25 +21,23 @@ public UpdateProgramType(IProgramTypeRepository repository, IMapper mapper) public async Task Execute(Guid? id, UpdateProgramTypeInput input) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se nome foi informado UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - var entity = await _repository.GetById(id) ?? throw new Exception("Tipo de Programa não encontrado."); + var entity = await _repository.GetById(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); // Verifica se a entidade foi excluída - if (entity.DeletedAt != null) - throw new Exception("O Tipo de Programa informado já foi excluído."); + UseCaseException.BusinessRuleViolation(entity.DeletedAt != null, "O Tipo de Programa informado já foi excluído."); // Verifica se o nome já está sendo usado - if (!string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) - && await _repository.GetProgramTypeByName(input.Name!) != null) - { - throw new Exception("Já existe um Tipo de Programa para o nome informado."); - } + UseCaseException.BusinessRuleViolation( + !string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) + && await _repository.GetProgramTypeByName(input.Name!) != null, + "Já existe um Tipo de Programa para o nome informado."); // Atualiza atributos permitidos entity.Name = input.Name; diff --git a/src/Domain/UseCases/Student/CreateStudent.cs b/src/Domain/UseCases/Student/CreateStudent.cs index 9792e540..6c044dc2 100644 --- a/src/Domain/UseCases/Student/CreateStudent.cs +++ b/src/Domain/UseCases/Student/CreateStudent.cs @@ -3,6 +3,8 @@ using AutoMapper; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; +using Domain.Validation; +using Domain.Entities.Enums; namespace Domain.UseCases { @@ -37,51 +39,68 @@ public CreateStudent(IStudentRepository studentRepository, public async Task Execute(CreateStudentInput input) { // Realiza o map da entidade e a validação dos campos informados - var entity = _mapper.Map(input); + // var entity = _mapper.Map(input); + var entity = new Entities.Student(input.BirthDate, + input.RG, + input.IssuingAgency, + input.DispatchDate, + (EGender)input.Gender, + (ERace)input.Race, + input.HomeAddress, + input.City, + input.UF, + input.CEP, + input.PhoneDDD, + input.Phone, + input.CellPhoneDDD, + input.CellPhone, + input.CampusId, + input.CourseId, + input.StartYear, + input.TypeAssistanceId); // Verifica se já existe um usuário com o e-mail informado var user = await _userRepository.GetUserByEmail(input.Email); - if (user != null) - throw new Exception("Já existe um usuário com o e-mail informado."); + UseCaseException.BusinessRuleViolation(user != null, + "Já existe um usuário com o e-mail informado."); // Verifica se já existe um usuário com o CPF informado user = await _userRepository.GetUserByCPF(input.CPF); - if (user != null) - throw new Exception("Já existe um usuário com o CPF informado."); + UseCaseException.BusinessRuleViolation(user != null, + "Já existe um usuário com o CPF informado."); // Verifica se curso informado existe var course = await _courseRepository.GetById(input.CourseId); - if (course == null || course.DeletedAt != null) - throw new Exception("Curso informado não existe."); + UseCaseException.BusinessRuleViolation(course == null || course.DeletedAt != null, + "Curso informado não existe."); // Verifica se campus informado existe var campus = await _campusRepository.GetById(input.CampusId); - if (campus == null || campus.DeletedAt != null) - throw new Exception("Campus informado não existe."); + UseCaseException.BusinessRuleViolation(campus == null || campus.DeletedAt != null, + "Campus informado não existe."); // Verifica se a senha é nula - if (string.IsNullOrEmpty(input.Password)) - throw new Exception("Senha não informada."); + UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Password), nameof(input.Password)); // Gera hash da senha - input.Password = _hashService.HashPassword(input.Password); + input.Password = _hashService.HashPassword(input.Password!); // Cria usuário user = new Entities.User(input.Name, input.Email, input.Password, input.CPF, Entities.Enums.ERole.STUDENT); // Adiciona usuário no banco user = await _userRepository.Create(user); - if (user == null) - throw new Exception("Não foi possível criar o usuário."); + UseCaseException.BusinessRuleViolation(user == null, + "Não foi possível criar o usuário."); // Adiciona estudante no banco - entity.UserId = user.Id; + entity.UserId = user?.Id; entity = await _studentRepository.Create(entity); - if (entity == null) - throw new Exception("Não foi possível criar o estudante."); + UseCaseException.BusinessRuleViolation(entity == null, + "Não foi possível criar o estudante."); // Envia e-mail de confirmação - await _emailService.SendConfirmationEmail(user.Email, user.Name, user.ValidationCode); + await _emailService.SendConfirmationEmail(user?.Email, user?.Name, user?.ValidationCode); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Student/DeleteStudent.cs b/src/Domain/UseCases/Student/DeleteStudent.cs index dc293766..0ae94d32 100644 --- a/src/Domain/UseCases/Student/DeleteStudent.cs +++ b/src/Domain/UseCases/Student/DeleteStudent.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -22,22 +23,23 @@ public DeleteStudent(IStudentRepository studentRepository, IUserRepository userR public async Task Execute(Guid? id) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se o estudante existe - var student = await _studentRepository.GetById(id) ?? throw new Exception("Estudante não encontrado para o Id informado."); + var student = await _studentRepository.GetById(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); // Verifica se o usuário existe - _ = await _userRepository.GetById(student.UserId) ?? throw new Exception("Usuário não encontrado para o Id informado."); + _ = await _userRepository.GetById(student.UserId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); // Remove o estudante student = await _studentRepository.Delete(id); - if (student == null) - throw new Exception("O estudante não pôde ser removido."); + UseCaseException.BusinessRuleViolation(student == null, "O estudante não pôde ser removido."); // Remove o usuário - _ = await _userRepository.Delete(student.UserId) ?? throw new Exception("O usuário não pôde ser removido."); + _ = await _userRepository.Delete(student?.UserId) + ?? throw UseCaseException.BusinessRuleViolation("O usuário não pôde ser removido."); // Retorna o estudante removido return _mapper.Map(student); diff --git a/src/Domain/UseCases/Student/GetStudentById.cs b/src/Domain/UseCases/Student/GetStudentById.cs index 66149626..1f70b0e2 100644 --- a/src/Domain/UseCases/Student/GetStudentById.cs +++ b/src/Domain/UseCases/Student/GetStudentById.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -19,9 +20,7 @@ public GetStudentById(IStudentRepository repository, IMapper mapper) public async Task Execute(Guid? id) { - if (id == null) - throw new ArgumentNullException(nameof(id)); - + UseCaseException.NotInformedParam(id is null, nameof(id)); var entity = await _repository.GetById(id); return _mapper.Map(entity); } diff --git a/src/Domain/UseCases/Student/UpdateStudent.cs b/src/Domain/UseCases/Student/UpdateStudent.cs index cfdc5ced..ff599bd1 100644 --- a/src/Domain/UseCases/Student/UpdateStudent.cs +++ b/src/Domain/UseCases/Student/UpdateStudent.cs @@ -3,6 +3,7 @@ using AutoMapper; using Domain.Interfaces.Repositories; using Domain.Entities.Enums; +using Domain.Validation; namespace Domain.UseCases { @@ -21,15 +22,15 @@ public UpdateStudent(IStudentRepository studentRepository, IMapper mapper) public async Task Execute(Guid? id, UpdateStudentInput input) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Recupera entidade que será atualizada - var student = await _studentRepository.GetById(id) ?? throw new Exception("Nenhum estudante encontrado para o Id informado."); + var student = await _studentRepository.GetById(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); // Verifica se a entidade foi excluída - if (student.DeletedAt != null) - throw new Exception("O estudante informado já foi excluído."); + UseCaseException.BusinessRuleViolation(student.DeletedAt != null, + "O estudante informado já foi excluído."); // Atualiza atributos permitidos student.BirthDate = input.BirthDate; diff --git a/src/Domain/UseCases/SubArea/CreateSubArea.cs b/src/Domain/UseCases/SubArea/CreateSubArea.cs index eb29d6a3..74ed154a 100644 --- a/src/Domain/UseCases/SubArea/CreateSubArea.cs +++ b/src/Domain/UseCases/SubArea/CreateSubArea.cs @@ -2,8 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; -using System.Threading.Tasks; -using System; +using Domain.Validation; namespace Domain.UseCases { @@ -24,17 +23,19 @@ public CreateSubArea(ISubAreaRepository subAreaRepository, IAreaRepository areaR public async Task Execute(CreateSubAreaInput input) { var entity = await _subAreaRepository.GetByCode(input.Code); - if (entity != null) - throw new Exception($"Já existe uma Subárea para o código {input.Code}"); + UseCaseException.BusinessRuleViolation(entity != null, + "Já existe uma Subárea para o código informado."); // Verifica id da área - if (input.AreaId == null) - throw new Exception("O Id da Área não pode ser vazio."); + UseCaseException.NotInformedParam(input.AreaId == null, nameof(input.AreaId)); // Valida se existe área - var area = await _areaRepository.GetById(input.AreaId) ?? throw new Exception("A Área informada não existe."); - if (area.DeletedAt != null) - throw new Exception("A Área informada está inativa."); + var area = await _areaRepository.GetById(input.AreaId) + ?? throw UseCaseException.NotFoundEntityByParams(nameof(Entities.Area)); + + // Verifica se área está ativa + UseCaseException.BusinessRuleViolation(area.DeletedAt != null, + "A Área informada está inativa."); // Cria nova área entity = await _subAreaRepository.Create(_mapper.Map(input)); diff --git a/src/Domain/UseCases/SubArea/DeleteSubArea.cs b/src/Domain/UseCases/SubArea/DeleteSubArea.cs index b72b100e..eb59ca28 100644 --- a/src/Domain/UseCases/SubArea/DeleteSubArea.cs +++ b/src/Domain/UseCases/SubArea/DeleteSubArea.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -20,8 +21,7 @@ public DeleteSubArea(ISubAreaRepository subAreaRepository, IMapper mapper) public async Task Execute(Guid? id) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade var model = await _repository.Delete(id); diff --git a/src/Domain/UseCases/SubArea/GetSubAreasByArea.cs b/src/Domain/UseCases/SubArea/GetSubAreasByArea.cs index e4553c78..dbe2b07c 100644 --- a/src/Domain/UseCases/SubArea/GetSubAreasByArea.cs +++ b/src/Domain/UseCases/SubArea/GetSubAreasByArea.cs @@ -2,10 +2,6 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; -using System.Threading.Tasks; -using System.Linq; -using System; -using System.Collections.Generic; namespace Domain.UseCases { diff --git a/src/Domain/UseCases/SubArea/UpdateSubArea.cs b/src/Domain/UseCases/SubArea/UpdateSubArea.cs index c140fc43..f199668f 100644 --- a/src/Domain/UseCases/SubArea/UpdateSubArea.cs +++ b/src/Domain/UseCases/SubArea/UpdateSubArea.cs @@ -2,8 +2,6 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; -using System.Threading.Tasks; -using System; namespace Domain.UseCases { @@ -22,7 +20,8 @@ public UpdateSubArea(ISubAreaRepository subAreaRepository, IMapper mapper) public async Task Execute(Guid? id, UpdateSubAreaInput input) { // Recupera entidade que será atualizada - var entity = await _subAreaRepository.GetById(id) ?? throw new Exception("Subárea não encontrada."); + var entity = await _subAreaRepository.GetById(id) + ?? throw Validation.UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); // Atualiza atributos permitidos entity.Name = input.Name; diff --git a/src/Domain/UseCases/TypeAssistance/CreateTypeAssistance.cs b/src/Domain/UseCases/TypeAssistance/CreateTypeAssistance.cs index 312c7a5a..0cafad1d 100644 --- a/src/Domain/UseCases/TypeAssistance/CreateTypeAssistance.cs +++ b/src/Domain/UseCases/TypeAssistance/CreateTypeAssistance.cs @@ -25,8 +25,8 @@ public async Task Execute(CreateTypeAssistance // Verifica se já existe um tipo de programa com o nome indicado var entity = await _repository.GetTypeAssistanceByName(input.Name!); - if (entity != null) - throw new Exception("Já existe um Tipo de Programa para o nome informado."); + UseCaseException.BusinessRuleViolation(entity != null, + "Já existe um Tipo de Programa para o nome informado."); // Cria entidade entity = await _repository.Create(_mapper.Map(input)); diff --git a/src/Domain/UseCases/TypeAssistance/DeleteTypeAssistance.cs b/src/Domain/UseCases/TypeAssistance/DeleteTypeAssistance.cs index 31ff6faf..851ab13a 100644 --- a/src/Domain/UseCases/TypeAssistance/DeleteTypeAssistance.cs +++ b/src/Domain/UseCases/TypeAssistance/DeleteTypeAssistance.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -20,8 +21,7 @@ public DeleteTypeAssistance(ITypeAssistanceRepository repository, IMapper mapper public async Task Execute(Guid? id) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade var model = await _repository.Delete(id); diff --git a/src/Domain/UseCases/TypeAssistance/GetTypeAssistanceById.cs b/src/Domain/UseCases/TypeAssistance/GetTypeAssistanceById.cs index eb687bb8..fa4caca8 100644 --- a/src/Domain/UseCases/TypeAssistance/GetTypeAssistanceById.cs +++ b/src/Domain/UseCases/TypeAssistance/GetTypeAssistanceById.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -19,9 +20,7 @@ public GetTypeAssistanceById(ITypeAssistanceRepository repository, IMapper mappe public async Task Execute(Guid? id) { - if (id == null) - throw new ArgumentNullException(nameof(id)); - + UseCaseException.NotInformedParam(id is null, nameof(id)); var entity = await _repository.GetById(id); return _mapper.Map(entity); } diff --git a/src/Domain/UseCases/TypeAssistance/UpdateTypeAssistance.cs b/src/Domain/UseCases/TypeAssistance/UpdateTypeAssistance.cs index ebd5314f..88438c4f 100644 --- a/src/Domain/UseCases/TypeAssistance/UpdateTypeAssistance.cs +++ b/src/Domain/UseCases/TypeAssistance/UpdateTypeAssistance.cs @@ -21,26 +21,24 @@ public UpdateTypeAssistance(ITypeAssistanceRepository repository, IMapper mapper public async Task Execute(Guid? id, UpdateTypeAssistanceInput input) { // Verifica se o id foi informado - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se nome foi informado UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada var entity = await _repository.GetById(id) - ?? throw new Exception("Bolsa de Assistência não encontrado."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.TypeAssistance)); // Verifica se a entidade foi excluída - if (entity.DeletedAt != null) - throw new Exception("O Bolsa de Assistência informado já foi excluído."); + UseCaseException.BusinessRuleViolation(entity.DeletedAt != null, + "O Bolsa de Assistência informado já foi excluído."); // Verifica se o nome já está sendo usado - if (!string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) - && await _repository.GetTypeAssistanceByName(input.Name!) != null) - { - throw new Exception("Já existe um Bolsa de Assistência para o nome informado."); - } + UseCaseException.BusinessRuleViolation( + !string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) + && await _repository.GetTypeAssistanceByName(input.Name!) != null, + "Já existe um Bolsa de Assistência para o nome informado."); // Atualiza atributos permitidos entity.Name = input.Name; diff --git a/src/Domain/UseCases/User/ActivateUser.cs b/src/Domain/UseCases/User/ActivateUser.cs index f134b6d8..06fe6d7c 100644 --- a/src/Domain/UseCases/User/ActivateUser.cs +++ b/src/Domain/UseCases/User/ActivateUser.cs @@ -2,6 +2,7 @@ using Domain.Contracts.User; using Domain.Interfaces.Repositories; using Domain.Interfaces.UseCases; +using Domain.Validation; namespace Domain.UseCases { @@ -20,12 +21,11 @@ public ActivateUser(IUserRepository repository, IMapper mapper) public async Task Execute(Guid? id) { // Verifica se id é nulo - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Encontra usuário pelo Id e o ativa var user = await _repository.GetById(id) - ?? throw new Exception("Nenhum usuário encontrato para o id informado."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); user.ActivateEntity(); // Atualiza usuário diff --git a/src/Domain/UseCases/User/DeactivateUser.cs b/src/Domain/UseCases/User/DeactivateUser.cs index 749cb60a..a661b49b 100644 --- a/src/Domain/UseCases/User/DeactivateUser.cs +++ b/src/Domain/UseCases/User/DeactivateUser.cs @@ -2,6 +2,7 @@ using Domain.Contracts.User; using Domain.Interfaces.Repositories; using Domain.Interfaces.UseCases; +using Domain.Validation; namespace Domain.UseCases { @@ -20,12 +21,11 @@ public DeactivateUser(IUserRepository repository, IMapper mapper) public async Task Execute(Guid? id) { // Verifica se id é nulo - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Encontra usuário pelo Id e o desativa var user = await _repository.GetById(id) - ?? throw new Exception("Nenhum usuário encontrato para o id informado."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); user.DeactivateEntity(); // Atualiza usuário diff --git a/src/Domain/UseCases/User/GetUserById.cs b/src/Domain/UseCases/User/GetUserById.cs index 9dd611ad..b4940668 100644 --- a/src/Domain/UseCases/User/GetUserById.cs +++ b/src/Domain/UseCases/User/GetUserById.cs @@ -2,6 +2,7 @@ using Domain.Contracts.User; using Domain.Interfaces.Repositories; using Domain.Interfaces.UseCases; +using Domain.Validation; namespace Domain.UseCases { @@ -20,12 +21,11 @@ public GetUserById(IUserRepository repository, IMapper mapper) public async Task Execute(Guid? id) { // Verifica se o id informado é nulo - if (id == null) - throw new ArgumentNullException(nameof(id)); + UseCaseException.NotInformedParam(id is null, nameof(id)); // Busca usuário pelo id informado var entity = await _repository.GetById(id) - ?? throw new Exception("Nenhum usuário encontrato para o id informado."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); // Retorna usuário encontrado return _mapper.Map(entity); diff --git a/src/Domain/UseCases/User/UpdateUser.cs b/src/Domain/UseCases/User/UpdateUser.cs index 6389fbdf..45885a47 100644 --- a/src/Domain/UseCases/User/UpdateUser.cs +++ b/src/Domain/UseCases/User/UpdateUser.cs @@ -31,7 +31,7 @@ public async Task Execute(UserUpdateInput input) // Busca usuário pelo id informado var user = await _repository.GetById(userClaims.Id) - ?? throw new Exception("Nenhum usuário encontrato para o id informado."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); // Atualiza atributos permitidos user.Name = input.Name; From 82a5af5593d48244b3b92d5f53dff98bb895fe61 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 18 Jul 2023 19:45:19 -0300 Subject: [PATCH 025/201] fix(adapters): adjust GetSubAreasByArea return --- src/Adapters/Interfaces/ISubAreaPresenterController.cs | 2 +- .../PresenterController/SubAreaPresenterController.cs | 4 ++-- src/Domain/UseCases/Area/GetAreasByMainArea.cs | 2 -- src/Domain/UseCases/SubArea/GetSubAreasByArea.cs | 2 ++ 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Adapters/Interfaces/ISubAreaPresenterController.cs b/src/Adapters/Interfaces/ISubAreaPresenterController.cs index a4379b22..e6f1ab6f 100644 --- a/src/Adapters/Interfaces/ISubAreaPresenterController.cs +++ b/src/Adapters/Interfaces/ISubAreaPresenterController.cs @@ -4,5 +4,5 @@ namespace Adapters.Interfaces; public interface ISubAreaPresenterController : IGenericCRUDPresenterController { - Task> GetSubAreasByArea(Guid? areaId, int skip, int take); + Task> GetSubAreasByArea(Guid? areaId, int skip, int take); } diff --git a/src/Adapters/PresenterController/SubAreaPresenterController.cs b/src/Adapters/PresenterController/SubAreaPresenterController.cs index f6d9f52f..6d9e56c3 100755 --- a/src/Adapters/PresenterController/SubAreaPresenterController.cs +++ b/src/Adapters/PresenterController/SubAreaPresenterController.cs @@ -54,10 +54,10 @@ public async Task GetById(Guid? id) return _mapper.Map(result); } - public async Task> GetSubAreasByArea(Guid? areaId, int skip, int take) + public async Task> GetSubAreasByArea(Guid? areaId, int skip, int take) { var result = await _getSubAreasByArea.Execute(areaId, skip, take); - return _mapper.Map>(result); + return _mapper.Map>(result); } public async Task Update(Guid? id, IRequest request) diff --git a/src/Domain/UseCases/Area/GetAreasByMainArea.cs b/src/Domain/UseCases/Area/GetAreasByMainArea.cs index 55114ba6..a5855f8e 100644 --- a/src/Domain/UseCases/Area/GetAreasByMainArea.cs +++ b/src/Domain/UseCases/Area/GetAreasByMainArea.cs @@ -20,9 +20,7 @@ public GetAreasByMainArea(IAreaRepository repository, IMapper mapper) public async Task> Execute(Guid? mainAreaId, int skip, int take) { - // Verifica se mainAreaId foi informado. UseCaseException.NotInformedParam(mainAreaId is null, nameof(mainAreaId)); - var entities = await _repository.GetAreasByMainArea(mainAreaId, skip, take); return _mapper.Map>(entities).AsQueryable(); } diff --git a/src/Domain/UseCases/SubArea/GetSubAreasByArea.cs b/src/Domain/UseCases/SubArea/GetSubAreasByArea.cs index dbe2b07c..33a849c6 100644 --- a/src/Domain/UseCases/SubArea/GetSubAreasByArea.cs +++ b/src/Domain/UseCases/SubArea/GetSubAreasByArea.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Validation; namespace Domain.UseCases { @@ -19,6 +20,7 @@ public GetSubAreasByArea(ISubAreaRepository subAreaRepository, IMapper mapper) public async Task> Execute(Guid? areaId, int skip, int take) { + UseCaseException.NotInformedParam(areaId is null, nameof(areaId)); var entities = await _subAreaRepository.GetSubAreasByArea(areaId, skip, take); return _mapper.Map>(entities).AsQueryable(); } From 3febd1f85464445197b95e01ef38b16f3c2234fa Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 18 Jul 2023 19:57:35 -0300 Subject: [PATCH 026/201] fix(usecases): adjust notice creation --- src/Domain/UseCases/Notice/CreateNotice.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Domain/UseCases/Notice/CreateNotice.cs b/src/Domain/UseCases/Notice/CreateNotice.cs index a93054cd..c8e72005 100644 --- a/src/Domain/UseCases/Notice/CreateNotice.cs +++ b/src/Domain/UseCases/Notice/CreateNotice.cs @@ -32,7 +32,11 @@ public async Task Execute(CreateNoticeInput input) // Salva arquivo no repositório e atualiza atributo DocUrl if (input.File != null) - input.DocUrl = await _storageFileService.UploadFileAsync(input.File); + entity.DocUrl = await _storageFileService.UploadFileAsync(input.File); + + // Atualiza descrição do edital + if (input.Description != null) + entity.Description = input.Description; // Cria entidade entity = await _repository.Create(entity); From abb9dec6e4d966c7ad0dd2069502eff5f842f5c2 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 18 Jul 2023 19:58:11 -0300 Subject: [PATCH 027/201] refactor(usecases): translate some exception msgs --- .../StudentDocuments/CreateStudentDocuments.cs | 10 +++++----- .../StudentDocuments/UpdateStudentDocuments.cs | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Domain/UseCases/StudentDocuments/CreateStudentDocuments.cs b/src/Domain/UseCases/StudentDocuments/CreateStudentDocuments.cs index 5569bd6b..0b895f33 100644 --- a/src/Domain/UseCases/StudentDocuments/CreateStudentDocuments.cs +++ b/src/Domain/UseCases/StudentDocuments/CreateStudentDocuments.cs @@ -40,7 +40,7 @@ public async Task Execute(CreateStudentDocum { // Verifica se já há documentos para o projeto informado var documents = await _studentDocumentRepository.GetByProjectId(input.ProjectId!); - UseCaseException.BusinessRuleViolation(documents is null, "Student documents already exist for the indicated project."); + UseCaseException.BusinessRuleViolation(documents is null, "Já existem documentos do aluno para o projeto indicado."); // Verifica se o projeto existe var project = await _projectRepository.GetById(input.ProjectId!); @@ -49,7 +49,7 @@ public async Task Execute(CreateStudentDocum // Verifica se o projeto se encontra em situação de submissão de documentos UseCaseException.BusinessRuleViolation( project?.Status != Entities.Enums.EProjectStatus.DocumentAnalysis, - "The project is not in the documents presentation phase."); + "O projeto não está na fase de apresentação de documentos."); // Cria entidade a partir do input informado var entity = new Entities.StudentDocuments(input.ProjectId, input.AgencyNumber, input.AccountNumber); @@ -59,7 +59,7 @@ public async Task Execute(CreateStudentDocum { // Verifica se foi informado a autorização dos pais UseCaseException.BusinessRuleViolation(input.ParentalAuthorization is null, - "Parental authorization must be provided for underage students."); + "A autorização dos pais deve ser fornecida para alunos menores de idade."); // Salva autorização dos pais entity.ParentalAuthorization = await TryToSaveFileInCloud(input.ParentalAuthorization!); @@ -88,12 +88,12 @@ private async Task TryToSaveFileInCloud(IFormFile file) _urlFiles.Add(url); return url; } - catch + catch (Exception ex) { // Caso dê erro, remove da nuvem os arquivos que foram salvos foreach (var url in _urlFiles) await _storageFileService.DeleteFile(url); - throw; + throw UseCaseException.BusinessRuleViolation($"Erro ao salvar arquivos na nuvem.\n{ex}"); } } } diff --git a/src/Domain/UseCases/StudentDocuments/UpdateStudentDocuments.cs b/src/Domain/UseCases/StudentDocuments/UpdateStudentDocuments.cs index 10a6d8c8..4705dbcc 100644 --- a/src/Domain/UseCases/StudentDocuments/UpdateStudentDocuments.cs +++ b/src/Domain/UseCases/StudentDocuments/UpdateStudentDocuments.cs @@ -42,7 +42,7 @@ public async Task Execute(Guid? id, UpdateSt UseCaseException.BusinessRuleViolation( studentDocuments!.Project?.Status != Entities.Enums.EProjectStatus.DocumentAnalysis || studentDocuments!.Project?.Status != Entities.Enums.EProjectStatus.Pending, - "The project is not in the documents presentation phase."); + "O projeto não está na fase de apresentação de documentos."); // Atualiza entidade a partir do input informado studentDocuments!.AgencyNumber = input.AgencyNumber; @@ -79,9 +79,9 @@ private async Task TryToSaveFileInCloud(IFormFile file, string? url) if (file is null) return; await _storageFileService.UploadFileAsync(file, url); } - catch + catch (Exception ex) { - throw; + throw UseCaseException.BusinessRuleViolation($"Erro ao salvar arquivos na nuvem.\n{ex}"); } } } From f1b4110da9a4f35e94f313b9314853ae503ef680 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 18 Jul 2023 20:32:07 -0300 Subject: [PATCH 028/201] fix(entity): update assistance type name --- README.md | 44 ------------- docs/readme.md | 7 +- .../CreateTypeAssistanceRequest.cs | 5 ++ .../DetailedReadTypeAssistanceResponse.cs | 5 ++ .../ResumedReadTypeAssistanceResponse.cs | 5 ++ .../UpdateTypeAssistanceRequest.cs | 5 ++ .../Student/DetailedReadStudentResponse.cs | 2 +- .../CreateTypeAssistanceRequest.cs | 5 -- .../DetailedReadTypeAssistanceResponse.cs | 5 -- .../ResumedReadTypeAssistanceResponse.cs | 5 -- .../UpdateTypeAssistanceRequest.cs | 5 -- .../ITypeAssistancePresenterController.cs | 2 +- .../Mappings/TypeAssistanceMappings.cs | 16 ++--- .../TypeAssistancePresenterController.cs | 64 +++++++++---------- ...nitTests.cs => AssistanceTypeUnitTests.cs} | 22 +++---- .../BaseAssistanceTypeContract.cs} | 4 +- .../CreateAssistanceTypeInput.cs | 6 ++ .../DetailedReadAssistanceTypeOutput.cs | 8 +++ .../ResumedReadAssistanceTypeOutput.cs | 7 ++ .../UpdateAssistanceTypeInput.cs | 7 ++ .../Contracts/Project/BaseProjectContract.cs | 18 +++--- .../Contracts/Project/OpenProjectInput.cs | 2 +- .../Contracts/Student/BaseStudentContract.cs | 2 +- .../CreateTypeAssistanceInput.cs | 6 -- .../DetailedReadTypeAssistanceOutput.cs | 8 --- .../ResumedReadTypeAssistanceOutput.cs | 7 -- .../UpdateTypeAssistanceInput.cs | 7 -- .../{TypeAssistance.cs => AssistanceType.cs} | 8 +-- src/Domain/Entities/Student.cs | 12 ++-- .../Repositories/IAssistanceTypeRepository.cs | 10 +++ .../Repositories/ITypeAssistanceRepository.cs | 10 --- .../AssistanceType/ICreateAssistanceType.cs | 9 +++ .../AssistanceType/IDeleteAssistanceType.cs | 9 +++ .../AssistanceType/IGetAssistanceTypeById.cs | 9 +++ .../AssistanceType/IGetAssistanceTypes.cs | 9 +++ .../AssistanceType/IUpdateAssistanceType.cs | 9 +++ .../TypeAssistance/ICreateTypeAssistance.cs | 9 --- .../TypeAssistance/IDeleteTypeAssistance.cs | 9 --- .../TypeAssistance/IGetTypeAssistanceById.cs | 9 --- .../TypeAssistance/IGetTypeAssistances.cs | 9 --- .../TypeAssistance/IUpdateTypeAssistance.cs | 9 --- src/Domain/Mappings/AssistanceTypeMappings.cs | 17 +++++ src/Domain/Mappings/TypeAssistanceMappings.cs | 17 ----- .../CreateAssistanceType.cs} | 16 ++--- .../DeleteAssistanceType.cs} | 12 ++-- .../GetAssistanceTypeById.cs} | 12 ++-- .../GetAssistanceTypes.cs} | 12 ++-- .../UpdateAssistanceType.cs} | 16 ++--- src/Domain/UseCases/Project/CancelProject.cs | 7 +- src/Domain/UseCases/Student/CreateStudent.cs | 2 +- src/Domain/UseCases/Student/UpdateStudent.cs | 2 +- .../IoC/DependencyAdaptersInjection.cs | 4 +- .../IoC/DependencyDomainInjection.cs | 18 +++--- src/Infrastructure/IoC/DependencyInjection.cs | 2 +- .../Context/ApplicationDbContext.cs | 8 +-- ...tion.cs => AssistanceTypeConfiguration.cs} | 6 +- .../ProjectConfiguration.cs | 2 +- .../StudentConfiguration.cs | 4 +- src/Infrastructure/Persistence/README.md | 45 +++++++++++++ ...ository.cs => AssistanceTypeRepository.cs} | 20 +++--- ...tanceSeeder.cs => AssistanceTypeSeeder.cs} | 8 +-- .../Persistence/Seeds/Seeder.cs | 2 +- ...troller.cs => AssistanceTypeController.cs} | 26 ++++---- 63 files changed, 333 insertions(+), 334 deletions(-) create mode 100644 src/Adapters/Gateways/AssistanceType/CreateTypeAssistanceRequest.cs create mode 100644 src/Adapters/Gateways/AssistanceType/DetailedReadTypeAssistanceResponse.cs create mode 100644 src/Adapters/Gateways/AssistanceType/ResumedReadTypeAssistanceResponse.cs create mode 100644 src/Adapters/Gateways/AssistanceType/UpdateTypeAssistanceRequest.cs delete mode 100644 src/Adapters/Gateways/TypeAssistance/CreateTypeAssistanceRequest.cs delete mode 100644 src/Adapters/Gateways/TypeAssistance/DetailedReadTypeAssistanceResponse.cs delete mode 100644 src/Adapters/Gateways/TypeAssistance/ResumedReadTypeAssistanceResponse.cs delete mode 100644 src/Adapters/Gateways/TypeAssistance/UpdateTypeAssistanceRequest.cs rename src/Domain.Tests/Entities/{TypeAssistanceUnitTests.cs => AssistanceTypeUnitTests.cs} (86%) rename src/Domain/Contracts/{TypeAssistance/BaseTypeAssistanceContract.cs => AssistanceType/BaseAssistanceTypeContract.cs} (64%) create mode 100644 src/Domain/Contracts/AssistanceType/CreateAssistanceTypeInput.cs create mode 100644 src/Domain/Contracts/AssistanceType/DetailedReadAssistanceTypeOutput.cs create mode 100644 src/Domain/Contracts/AssistanceType/ResumedReadAssistanceTypeOutput.cs create mode 100644 src/Domain/Contracts/AssistanceType/UpdateAssistanceTypeInput.cs delete mode 100644 src/Domain/Contracts/TypeAssistance/CreateTypeAssistanceInput.cs delete mode 100644 src/Domain/Contracts/TypeAssistance/DetailedReadTypeAssistanceOutput.cs delete mode 100644 src/Domain/Contracts/TypeAssistance/ResumedReadTypeAssistanceOutput.cs delete mode 100644 src/Domain/Contracts/TypeAssistance/UpdateTypeAssistanceInput.cs rename src/Domain/Entities/{TypeAssistance.cs => AssistanceType.cs} (89%) create mode 100644 src/Domain/Interfaces/Repositories/IAssistanceTypeRepository.cs delete mode 100644 src/Domain/Interfaces/Repositories/ITypeAssistanceRepository.cs create mode 100644 src/Domain/Interfaces/UseCases/AssistanceType/ICreateAssistanceType.cs create mode 100644 src/Domain/Interfaces/UseCases/AssistanceType/IDeleteAssistanceType.cs create mode 100644 src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypeById.cs create mode 100644 src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypes.cs create mode 100644 src/Domain/Interfaces/UseCases/AssistanceType/IUpdateAssistanceType.cs delete mode 100644 src/Domain/Interfaces/UseCases/TypeAssistance/ICreateTypeAssistance.cs delete mode 100644 src/Domain/Interfaces/UseCases/TypeAssistance/IDeleteTypeAssistance.cs delete mode 100644 src/Domain/Interfaces/UseCases/TypeAssistance/IGetTypeAssistanceById.cs delete mode 100644 src/Domain/Interfaces/UseCases/TypeAssistance/IGetTypeAssistances.cs delete mode 100644 src/Domain/Interfaces/UseCases/TypeAssistance/IUpdateTypeAssistance.cs create mode 100644 src/Domain/Mappings/AssistanceTypeMappings.cs delete mode 100644 src/Domain/Mappings/TypeAssistanceMappings.cs rename src/Domain/UseCases/{TypeAssistance/CreateTypeAssistance.cs => AssistanceType/CreateAssistanceType.cs} (65%) rename src/Domain/UseCases/{TypeAssistance/DeleteTypeAssistance.cs => AssistanceType/DeleteAssistanceType.cs} (64%) rename src/Domain/UseCases/{TypeAssistance/GetTypeAssistanceById.cs => AssistanceType/GetAssistanceTypeById.cs} (59%) rename src/Domain/UseCases/{TypeAssistance/GetTypeAssistances.cs => AssistanceType/GetAssistanceTypes.cs} (53%) rename src/Domain/UseCases/{TypeAssistance/UpdateTypeAssistance.cs => AssistanceType/UpdateAssistanceType.cs} (76%) rename src/Infrastructure/Persistence/EntitiesConfiguration/{TypeAssistanceConfiguration.cs => AssistanceTypeConfiguration.cs} (74%) create mode 100644 src/Infrastructure/Persistence/README.md rename src/Infrastructure/Persistence/Repositories/{TypeAssistanceRepository.cs => AssistanceTypeRepository.cs} (68%) rename src/Infrastructure/Persistence/Seeds/{TypeAssistanceSeeder.cs => AssistanceTypeSeeder.cs} (78%) rename src/Infrastructure/WebAPI/Controllers/{TypeAssistanceController.cs => AssistanceTypeController.cs} (84%) diff --git a/README.md b/README.md index c7de7194..d09a04b7 100644 --- a/README.md +++ b/README.md @@ -2,50 +2,6 @@ Restful API created in .NET 7.0.0 to support SPA. -## DataBase - PostgreSQL - -Para levantar o banco de dados é necessário executar o comando abaixo na pasta raiz: - -```bash -cd docker -docker compose up -d -``` - -Em seguida, é preciso acessar o pgAdmin através da rota abaixo: - -- [PGAdmin](http://localhost:16543/browser) - -E criar um servidor utilizando as informações de _host_, _username_, _password_ e _database_ que estão informadas no arquivo docker-compose.yaml utilizado. -Exemplo: - -- **host**: copet-system-db -- **username**: copet-admin -- **password**: Copet@123 -- **database**: COPET_DB -- **port**: 5432 - -## Migrations - -Criando as Migrations iniciais para criação das tabelas do banco de dados: - -```bash -cd src/Infrastructure/WebAPI -dotnet ef migrations add Initialize --project ../Persistence/Persistence.csproj -``` - -Executando as Migrations: - -```bash -dotnet ef database update -``` - -Removendo as Migrations: - -```bash -cd src/Infrastructure/WebAPI -dotnet ef migrations remove --project ../Persistence/Persistence.csproj -``` - ## Execução com Dotnet Comandos para execução do projeto .NET utilizando CLI: diff --git a/docs/readme.md b/docs/readme.md index 4ef3585a..9694a792 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -1,12 +1,9 @@ # Copet System ## COPET - COORDENADORIA DE PESQUISA E ESTUDOS TECNOLÓGICOS + - Sistema de controle de projetos de iniciação científica ## Exemplo de Certificado -- Pasta certificate -## Execução do Docker Compose -``` -docker-compose up -d -``` \ No newline at end of file +- Pasta certificate diff --git a/src/Adapters/Gateways/AssistanceType/CreateTypeAssistanceRequest.cs b/src/Adapters/Gateways/AssistanceType/CreateTypeAssistanceRequest.cs new file mode 100644 index 00000000..63a23c0d --- /dev/null +++ b/src/Adapters/Gateways/AssistanceType/CreateTypeAssistanceRequest.cs @@ -0,0 +1,5 @@ +using Adapters.Gateways.Base; +using Domain.Contracts.AssistanceType; + +namespace Adapters.Gateways.AssistanceType; +public class CreateAssistanceTypeRequest : CreateAssistanceTypeInput, IRequest { } \ No newline at end of file diff --git a/src/Adapters/Gateways/AssistanceType/DetailedReadTypeAssistanceResponse.cs b/src/Adapters/Gateways/AssistanceType/DetailedReadTypeAssistanceResponse.cs new file mode 100644 index 00000000..c50dcaa0 --- /dev/null +++ b/src/Adapters/Gateways/AssistanceType/DetailedReadTypeAssistanceResponse.cs @@ -0,0 +1,5 @@ +using Adapters.Gateways.Base; +using Domain.Contracts.AssistanceType; + +namespace Adapters.Gateways.AssistanceType; +public class DetailedReadAssistanceTypeResponse : DetailedReadAssistanceTypeOutput, IResponse { } \ No newline at end of file diff --git a/src/Adapters/Gateways/AssistanceType/ResumedReadTypeAssistanceResponse.cs b/src/Adapters/Gateways/AssistanceType/ResumedReadTypeAssistanceResponse.cs new file mode 100644 index 00000000..b301f451 --- /dev/null +++ b/src/Adapters/Gateways/AssistanceType/ResumedReadTypeAssistanceResponse.cs @@ -0,0 +1,5 @@ +using Adapters.Gateways.Base; +using Domain.Contracts.AssistanceType; + +namespace Adapters.Gateways.AssistanceType; +public class ResumedReadAssistanceTypeResponse : ResumedReadAssistanceTypeOutput, IResponse { } \ No newline at end of file diff --git a/src/Adapters/Gateways/AssistanceType/UpdateTypeAssistanceRequest.cs b/src/Adapters/Gateways/AssistanceType/UpdateTypeAssistanceRequest.cs new file mode 100644 index 00000000..15f9f440 --- /dev/null +++ b/src/Adapters/Gateways/AssistanceType/UpdateTypeAssistanceRequest.cs @@ -0,0 +1,5 @@ +using Adapters.Gateways.Base; +using Domain.Contracts.AssistanceType; + +namespace Adapters.Gateways.AssistanceType; +public class UpdateAssistanceTypeRequest : UpdateAssistanceTypeInput, IRequest { } \ No newline at end of file diff --git a/src/Adapters/Gateways/Student/DetailedReadStudentResponse.cs b/src/Adapters/Gateways/Student/DetailedReadStudentResponse.cs index e4e95e6c..20a9d01f 100644 --- a/src/Adapters/Gateways/Student/DetailedReadStudentResponse.cs +++ b/src/Adapters/Gateways/Student/DetailedReadStudentResponse.cs @@ -27,7 +27,7 @@ public class DetailedReadStudentResponse : IResponse public Guid? CampusId { get; set; } public Guid? CourseId { get; set; } public string? StartYear { get; set; } - public Guid? TypeAssistanceId { get; set; } + public Guid? AssistanceTypeId { get; set; } #endregion #region Optional Properties diff --git a/src/Adapters/Gateways/TypeAssistance/CreateTypeAssistanceRequest.cs b/src/Adapters/Gateways/TypeAssistance/CreateTypeAssistanceRequest.cs deleted file mode 100644 index ccb1ad37..00000000 --- a/src/Adapters/Gateways/TypeAssistance/CreateTypeAssistanceRequest.cs +++ /dev/null @@ -1,5 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.Contracts.TypeAssistance; - -namespace Adapters.Gateways.TypeAssistance; -public class CreateTypeAssistanceRequest : CreateTypeAssistanceInput, IRequest { } \ No newline at end of file diff --git a/src/Adapters/Gateways/TypeAssistance/DetailedReadTypeAssistanceResponse.cs b/src/Adapters/Gateways/TypeAssistance/DetailedReadTypeAssistanceResponse.cs deleted file mode 100644 index 646b09a5..00000000 --- a/src/Adapters/Gateways/TypeAssistance/DetailedReadTypeAssistanceResponse.cs +++ /dev/null @@ -1,5 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.Contracts.TypeAssistance; - -namespace Adapters.Gateways.TypeAssistance; -public class DetailedReadTypeAssistanceResponse : DetailedReadTypeAssistanceOutput, IResponse { } \ No newline at end of file diff --git a/src/Adapters/Gateways/TypeAssistance/ResumedReadTypeAssistanceResponse.cs b/src/Adapters/Gateways/TypeAssistance/ResumedReadTypeAssistanceResponse.cs deleted file mode 100644 index a5302e93..00000000 --- a/src/Adapters/Gateways/TypeAssistance/ResumedReadTypeAssistanceResponse.cs +++ /dev/null @@ -1,5 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.Contracts.TypeAssistance; - -namespace Adapters.Gateways.TypeAssistance; -public class ResumedReadTypeAssistanceResponse : ResumedReadTypeAssistanceOutput, IResponse { } \ No newline at end of file diff --git a/src/Adapters/Gateways/TypeAssistance/UpdateTypeAssistanceRequest.cs b/src/Adapters/Gateways/TypeAssistance/UpdateTypeAssistanceRequest.cs deleted file mode 100644 index 404174b8..00000000 --- a/src/Adapters/Gateways/TypeAssistance/UpdateTypeAssistanceRequest.cs +++ /dev/null @@ -1,5 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.Contracts.TypeAssistance; - -namespace Adapters.Gateways.TypeAssistance; -public class UpdateTypeAssistanceRequest : UpdateTypeAssistanceInput, IRequest { } \ No newline at end of file diff --git a/src/Adapters/Interfaces/ITypeAssistancePresenterController.cs b/src/Adapters/Interfaces/ITypeAssistancePresenterController.cs index 38b302a0..cc0b4c97 100644 --- a/src/Adapters/Interfaces/ITypeAssistancePresenterController.cs +++ b/src/Adapters/Interfaces/ITypeAssistancePresenterController.cs @@ -1,4 +1,4 @@ using Adapters.Interfaces.Base; namespace Adapters.Interfaces; -public interface ITypeAssistancePresenterController : IGenericCRUDPresenterController { } \ No newline at end of file +public interface IAssistanceTypePresenterController : IGenericCRUDPresenterController { } \ No newline at end of file diff --git a/src/Adapters/Mappings/TypeAssistanceMappings.cs b/src/Adapters/Mappings/TypeAssistanceMappings.cs index 5f417cf0..3be08cb0 100755 --- a/src/Adapters/Mappings/TypeAssistanceMappings.cs +++ b/src/Adapters/Mappings/TypeAssistanceMappings.cs @@ -1,17 +1,17 @@ using AutoMapper; -using Adapters.Gateways.TypeAssistance; -using Domain.Contracts.TypeAssistance; +using Adapters.Gateways.AssistanceType; +using Domain.Contracts.AssistanceType; namespace Adapters.Mappings { - public class TypeAssistanceMappings : Profile + public class AssistanceTypeMappings : Profile { - public TypeAssistanceMappings() + public AssistanceTypeMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Adapters/PresenterController/TypeAssistancePresenterController.cs b/src/Adapters/PresenterController/TypeAssistancePresenterController.cs index a76f0ae9..7939d9ff 100755 --- a/src/Adapters/PresenterController/TypeAssistancePresenterController.cs +++ b/src/Adapters/PresenterController/TypeAssistancePresenterController.cs @@ -1,70 +1,70 @@ using Adapters.Gateways.Base; -using Adapters.Gateways.TypeAssistance; +using Adapters.Gateways.AssistanceType; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.TypeAssistance; +using Domain.Contracts.AssistanceType; using Domain.Interfaces.UseCases; namespace Adapters.PresenterController { - public class TypeAssistancePresenterController : ITypeAssistancePresenterController + public class AssistanceTypePresenterController : IAssistanceTypePresenterController { #region Global Scope - private readonly ICreateTypeAssistance _createTypeAssistance; - private readonly IUpdateTypeAssistance _updateTypeAssistance; - private readonly IDeleteTypeAssistance _deleteTypeAssistance; - private readonly IGetTypeAssistances _getTypeAssistances; - private readonly IGetTypeAssistanceById _getTypeAssistanceById; + private readonly ICreateAssistanceType _createAssistanceType; + private readonly IUpdateAssistanceType _updateAssistanceType; + private readonly IDeleteAssistanceType _deleteAssistanceType; + private readonly IGetAssistanceTypes _getAssistanceTypes; + private readonly IGetAssistanceTypeById _getAssistanceTypeById; private readonly IMapper _mapper; - public TypeAssistancePresenterController(ICreateTypeAssistance createTypeAssistance, - IUpdateTypeAssistance updateTypeAssistance, - IDeleteTypeAssistance deleteTypeAssistance, - IGetTypeAssistances getTypeAssistances, - IGetTypeAssistanceById getTypeAssistanceById, + public AssistanceTypePresenterController(ICreateAssistanceType createAssistanceType, + IUpdateAssistanceType updateAssistanceType, + IDeleteAssistanceType deleteAssistanceType, + IGetAssistanceTypes getAssistanceTypes, + IGetAssistanceTypeById getAssistanceTypeById, IMapper mapper) { - _createTypeAssistance = createTypeAssistance; - _updateTypeAssistance = updateTypeAssistance; - _deleteTypeAssistance = deleteTypeAssistance; - _getTypeAssistances = getTypeAssistances; - _getTypeAssistanceById = getTypeAssistanceById; + _createAssistanceType = createAssistanceType; + _updateAssistanceType = updateAssistanceType; + _deleteAssistanceType = deleteAssistanceType; + _getAssistanceTypes = getAssistanceTypes; + _getAssistanceTypeById = getAssistanceTypeById; _mapper = mapper; } #endregion public async Task Create(IRequest request) { - var dto = request as CreateTypeAssistanceRequest; - var input = _mapper.Map(dto); - var result = await _createTypeAssistance.Execute(input); - return _mapper.Map(result); + var dto = request as CreateAssistanceTypeRequest; + var input = _mapper.Map(dto); + var result = await _createAssistanceType.Execute(input); + return _mapper.Map(result); } public async Task Delete(Guid? id) { - var result = await _deleteTypeAssistance.Execute(id); - return _mapper.Map(result); + var result = await _deleteAssistanceType.Execute(id); + return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - var result = await _getTypeAssistances.Execute(skip, take); - return _mapper.Map>(result); + var result = await _getAssistanceTypes.Execute(skip, take); + return _mapper.Map>(result); } public async Task GetById(Guid? id) { - var result = await _getTypeAssistanceById.Execute(id); - return _mapper.Map(result); + var result = await _getAssistanceTypeById.Execute(id); + return _mapper.Map(result); } public async Task Update(Guid? id, IRequest request) { - var dto = request as UpdateTypeAssistanceRequest; - var input = _mapper.Map(dto); - var result = await _updateTypeAssistance.Execute(id, input); - return _mapper.Map(result); + var dto = request as UpdateAssistanceTypeRequest; + var input = _mapper.Map(dto); + var result = await _updateAssistanceType.Execute(id, input); + return _mapper.Map(result); } } } \ No newline at end of file diff --git a/src/Domain.Tests/Entities/TypeAssistanceUnitTests.cs b/src/Domain.Tests/Entities/AssistanceTypeUnitTests.cs similarity index 86% rename from src/Domain.Tests/Entities/TypeAssistanceUnitTests.cs rename to src/Domain.Tests/Entities/AssistanceTypeUnitTests.cs index 1dbbbb65..8e45d6f5 100644 --- a/src/Domain.Tests/Entities/TypeAssistanceUnitTests.cs +++ b/src/Domain.Tests/Entities/AssistanceTypeUnitTests.cs @@ -6,16 +6,16 @@ namespace Domain.Tests.Entities { - public class TypeAssistanceUnitTests + public class AssistanceTypeUnitTests { - private TypeAssistance MockValidTypeAssistance() => - new TypeAssistance(Guid.NewGuid(), "Scholarship Name", "Scholarship Description"); + private AssistanceType MockValidAssistanceType() => + new AssistanceType(Guid.NewGuid(), "Scholarship Name", "Scholarship Description"); [Fact] public void SetName_ValidName_SetsName() { // Arrange - var scholarship = MockValidTypeAssistance(); + var scholarship = MockValidAssistanceType(); var name = "Scholarship Name"; // Act @@ -29,7 +29,7 @@ public void SetName_ValidName_SetsName() public void SetName_NullOrEmptyName_ThrowsException() { // Arrange - var scholarship = MockValidTypeAssistance(); + var scholarship = MockValidAssistanceType(); // Act & Assert Assert.Throws(() => scholarship.Name = null); @@ -40,7 +40,7 @@ public void SetName_NullOrEmptyName_ThrowsException() public void SetName_TooShortName_ThrowsException() { // Arrange - var scholarship = MockValidTypeAssistance(); + var scholarship = MockValidAssistanceType(); // Act & Assert Assert.Throws(() => scholarship.Name = "AB"); @@ -50,7 +50,7 @@ public void SetName_TooShortName_ThrowsException() public void SetName_TooLongName_ThrowsException() { // Arrange - var scholarship = MockValidTypeAssistance(); + var scholarship = MockValidAssistanceType(); // Act & Assert Assert.Throws(() => scholarship.Name = new string('A', 1500)); @@ -60,7 +60,7 @@ public void SetName_TooLongName_ThrowsException() public void SetDescription_ValidDescription_SetsDescription() { // Arrange - var scholarship = MockValidTypeAssistance(); + var scholarship = MockValidAssistanceType(); var description = "Scholarship Description"; // Act @@ -74,7 +74,7 @@ public void SetDescription_ValidDescription_SetsDescription() public void SetDescription_NullOrEmptyDescription_ThrowsException() { // Arrange - var scholarship = MockValidTypeAssistance(); + var scholarship = MockValidAssistanceType(); // Act & Assert Assert.Throws(() => scholarship.Description = null); @@ -85,7 +85,7 @@ public void SetDescription_NullOrEmptyDescription_ThrowsException() public void SetDescription_TooShortDescription_ThrowsException() { // Arrange - var scholarship = MockValidTypeAssistance(); + var scholarship = MockValidAssistanceType(); // Act & Assert Assert.Throws(() => scholarship.Description = "AB"); @@ -95,7 +95,7 @@ public void SetDescription_TooShortDescription_ThrowsException() public void SetDescription_TooLongDescription_ThrowsException() { // Arrange - var scholarship = MockValidTypeAssistance(); + var scholarship = MockValidAssistanceType(); // Act & Assert Assert.Throws(() => scholarship.Description = "K5SYFiBmSfsadfsaBtfdsgfsdQkwCPPXKaTqoVtz7WF0LpFMG6hCu5sk8dBEbrhNDrBrd8WVt3vNp8uzhkck3nrYPVCMHvnDRnmdqlWRScH8yUYzoeLsiTvnROfHFm0GCsIltVcGiOBE6rkHCgjFCFJiSAdnBJOj54Godr0lRXRWBb8iIthDiPIvVKmtfRzH61ojFjezbENdzGgJisDzjg8zEogLia5D5cJKhGPGAgXsl1lDlFy2H8RvMZGwNg9UFyvRnRo6MYkxGLw6TemiwLBR99z5A3tEWUi9VVRhZpqWDvDYpEP4YaLfyTVcmPiHOtLxTMvkmSmWH3Z6O7uH69KJYLu2BqrNTe60bdu1Gvsk12N4LLT1aMmm2o679oqgxUAjws3PCchl2oHnDoX8qe5LywOuSanuknRUpRNnmcLNgbIxlrlPbFPxgokg3jt80dFi8KmyFQFV1p9sBBlr4V1i64ToundA5R7SLh7lNwpR9DuyzT90FgQs8ZYXlkspolRSLFV8ohYfHomvX2GanuJ4LXgkBnOtERsHQYhD9yqDphAgaeVMkfeUhsNyn3PGW0alcQ1WHaS3HllN2g0aMz6UUjn7JzEXwfUl7WO0muT4MfFKUh1mED5wgANs5nt65DVc1AWLkLXd0RNUILwRIDydtr4QrkeMJUpXx3DFX2w5eTjmY69dNCct8gEnOGZ2F4YhveYVPgNcAABMBKri8AutNxPoPvEDk36sYqMEFsHpM9i5gHQtwtRe8HiGmvneeEGUAK7wsyJG7FBHXjU2Rvcxd2uLq24AEJOO6TABzePdNeqrh2y9h08p0ZTIGih9gT7rOXcURfJ2zn6pKY0CHOrQhaSK9xgBOgExdCRFI4mtMoIrlAJL8OLYDlckR1YalMv2ypWzHPUkVkXob3MrbfD0F5MTNZocl7VAwf0xAGsKgae4JrfK8iS3E3ZyfyYw29Qu4vUMRY6VxK1GY02z1wJpNiI0LjkiOHlL3rYxD9YeOkJLOCq382bMdy5A0NJkqSiWrqkK3z733iOSKp1PQ8zIUCkhTvX1Zig3OPRISAKaHt4hqkU8NpEtwXyjGYM7LaUNfecztIUnAkIswrsJYcErFDEQvnIbcAMCTZgwynhU06FxBKyDQc4rY2AeEnFOkE9pvleIO3VEDWgfNgAv5oCzn8U2JKTyuAHRXf0xoGOAsw23NVwaVROVpkP4uYUyVLLePOiSmiGiHz2fjH4TdLtvRjQvmT40eXB7dAxbOVjZcIwwP4Pi6Kq04Eb70kJbpckEGPPYfLewJdhiAnmiIgDBVn7tgIY9RmknnaDANuZiZNiRCO9Il63KtrlW8o3RZdI1lW3mSIQkFOVIx7JICtB6WDBTonZbYZ6zqcB1ut1efAkoTKnEsO2jWz2QOpoLMP7NVThFcEjt7lruRy3SPsZxwnAmsaQywXztsHxHod5KrRqxhuuVjt2nWGutyal7vw0qjIV8ugDATYS4Nq2hOBnK5t94HeTavgTrN8nx24"); diff --git a/src/Domain/Contracts/TypeAssistance/BaseTypeAssistanceContract.cs b/src/Domain/Contracts/AssistanceType/BaseAssistanceTypeContract.cs similarity index 64% rename from src/Domain/Contracts/TypeAssistance/BaseTypeAssistanceContract.cs rename to src/Domain/Contracts/AssistanceType/BaseAssistanceTypeContract.cs index 55a7957a..d317bb34 100644 --- a/src/Domain/Contracts/TypeAssistance/BaseTypeAssistanceContract.cs +++ b/src/Domain/Contracts/AssistanceType/BaseAssistanceTypeContract.cs @@ -1,8 +1,8 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.TypeAssistance +namespace Domain.Contracts.AssistanceType { - public abstract class BaseTypeAssistanceContract + public abstract class BaseAssistanceTypeContract { [Required] public string? Name { get; set; } diff --git a/src/Domain/Contracts/AssistanceType/CreateAssistanceTypeInput.cs b/src/Domain/Contracts/AssistanceType/CreateAssistanceTypeInput.cs new file mode 100644 index 00000000..b461f3c0 --- /dev/null +++ b/src/Domain/Contracts/AssistanceType/CreateAssistanceTypeInput.cs @@ -0,0 +1,6 @@ +namespace Domain.Contracts.AssistanceType +{ + public class CreateAssistanceTypeInput : BaseAssistanceTypeContract + { + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/AssistanceType/DetailedReadAssistanceTypeOutput.cs b/src/Domain/Contracts/AssistanceType/DetailedReadAssistanceTypeOutput.cs new file mode 100644 index 00000000..045735ab --- /dev/null +++ b/src/Domain/Contracts/AssistanceType/DetailedReadAssistanceTypeOutput.cs @@ -0,0 +1,8 @@ +namespace Domain.Contracts.AssistanceType +{ + public class DetailedReadAssistanceTypeOutput : BaseAssistanceTypeContract + { + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/AssistanceType/ResumedReadAssistanceTypeOutput.cs b/src/Domain/Contracts/AssistanceType/ResumedReadAssistanceTypeOutput.cs new file mode 100644 index 00000000..5b77df67 --- /dev/null +++ b/src/Domain/Contracts/AssistanceType/ResumedReadAssistanceTypeOutput.cs @@ -0,0 +1,7 @@ +namespace Domain.Contracts.AssistanceType +{ + public class ResumedReadAssistanceTypeOutput : BaseAssistanceTypeContract + { + public Guid? Id { get; set; } + } +} diff --git a/src/Domain/Contracts/AssistanceType/UpdateAssistanceTypeInput.cs b/src/Domain/Contracts/AssistanceType/UpdateAssistanceTypeInput.cs new file mode 100644 index 00000000..f2e7dc21 --- /dev/null +++ b/src/Domain/Contracts/AssistanceType/UpdateAssistanceTypeInput.cs @@ -0,0 +1,7 @@ +namespace Domain.Contracts.AssistanceType +{ + public class UpdateAssistanceTypeInput : BaseAssistanceTypeContract + { + public Guid? Id { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Project/BaseProjectContract.cs b/src/Domain/Contracts/Project/BaseProjectContract.cs index fde77263..d2a45e7f 100644 --- a/src/Domain/Contracts/Project/BaseProjectContract.cs +++ b/src/Domain/Contracts/Project/BaseProjectContract.cs @@ -8,7 +8,7 @@ public abstract class BaseProjectContract public string? KeyWord2 { get; set; } public string? KeyWord3 { get; set; } public bool IsScholarshipCandidate { get; set; } - public bool IsProductivityFellow { get; set; } + // public bool IsProductivityFellow { get; set; } public string? Objective { get; set; } public string? Methodology { get; set; } public string? ExpectedResults { get; set; } @@ -41,14 +41,14 @@ public abstract class BaseProjectContract public int? SoftwareRegistration { get; set; } #endregion - #region Critérios de Avaliação - public int? APIndex { get; set; } - public int? Qualification { get; set; } - public int? ProjectProposalObjectives { get; set; } - public int? AcademicScientificProductionCoherence { get; set; } - public int? ProposalMethodologyAdaptation { get; set; } - public int? EffectiveContributionToResearch { get; set; } - #endregion + // #region Critérios de Avaliação + // public int? APIndex { get; set; } + // public int? Qualification { get; set; } + // public int? ProjectProposalObjectives { get; set; } + // public int? AcademicScientificProductionCoherence { get; set; } + // public int? ProposalMethodologyAdaptation { get; set; } + // public int? EffectiveContributionToResearch { get; set; } + // #endregion #region Resultados da Avaliação public int? Status { get; set; } diff --git a/src/Domain/Contracts/Project/OpenProjectInput.cs b/src/Domain/Contracts/Project/OpenProjectInput.cs index 05d0565d..bf0f54bd 100644 --- a/src/Domain/Contracts/Project/OpenProjectInput.cs +++ b/src/Domain/Contracts/Project/OpenProjectInput.cs @@ -8,7 +8,7 @@ public class OpenProjectInput public string? KeyWord2 { get; set; } public string? KeyWord3 { get; set; } public bool IsScholarshipCandidate { get; set; } - public bool IsProductivityFellow { get; set; } + public bool IsProductivityFellow { get; set; } // Manter? public string? Objective { get; set; } public string? Methodology { get; set; } public string? ExpectedResults { get; set; } diff --git a/src/Domain/Contracts/Student/BaseStudentContract.cs b/src/Domain/Contracts/Student/BaseStudentContract.cs index 0ff884bb..2d2af17b 100644 --- a/src/Domain/Contracts/Student/BaseStudentContract.cs +++ b/src/Domain/Contracts/Student/BaseStudentContract.cs @@ -32,7 +32,7 @@ public abstract class BaseStudentContract [Required] public string? StartYear { get; set; } [Required] - public Guid? TypeAssistanceId { get; set; } + public Guid? AssistanceTypeId { get; set; } #endregion #region Optional Properties diff --git a/src/Domain/Contracts/TypeAssistance/CreateTypeAssistanceInput.cs b/src/Domain/Contracts/TypeAssistance/CreateTypeAssistanceInput.cs deleted file mode 100644 index 3da6b10d..00000000 --- a/src/Domain/Contracts/TypeAssistance/CreateTypeAssistanceInput.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Domain.Contracts.TypeAssistance -{ - public class CreateTypeAssistanceInput : BaseTypeAssistanceContract - { - } -} \ No newline at end of file diff --git a/src/Domain/Contracts/TypeAssistance/DetailedReadTypeAssistanceOutput.cs b/src/Domain/Contracts/TypeAssistance/DetailedReadTypeAssistanceOutput.cs deleted file mode 100644 index 52c91549..00000000 --- a/src/Domain/Contracts/TypeAssistance/DetailedReadTypeAssistanceOutput.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Domain.Contracts.TypeAssistance -{ - public class DetailedReadTypeAssistanceOutput : BaseTypeAssistanceContract - { - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } - } -} \ No newline at end of file diff --git a/src/Domain/Contracts/TypeAssistance/ResumedReadTypeAssistanceOutput.cs b/src/Domain/Contracts/TypeAssistance/ResumedReadTypeAssistanceOutput.cs deleted file mode 100644 index 8dcffc0c..00000000 --- a/src/Domain/Contracts/TypeAssistance/ResumedReadTypeAssistanceOutput.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Domain.Contracts.TypeAssistance -{ - public class ResumedReadTypeAssistanceOutput : BaseTypeAssistanceContract - { - public Guid? Id { get; set; } - } -} diff --git a/src/Domain/Contracts/TypeAssistance/UpdateTypeAssistanceInput.cs b/src/Domain/Contracts/TypeAssistance/UpdateTypeAssistanceInput.cs deleted file mode 100644 index 224985e9..00000000 --- a/src/Domain/Contracts/TypeAssistance/UpdateTypeAssistanceInput.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Domain.Contracts.TypeAssistance -{ - public class UpdateTypeAssistanceInput : BaseTypeAssistanceContract - { - public Guid? Id { get; set; } - } -} \ No newline at end of file diff --git a/src/Domain/Entities/TypeAssistance.cs b/src/Domain/Entities/AssistanceType.cs similarity index 89% rename from src/Domain/Entities/TypeAssistance.cs rename to src/Domain/Entities/AssistanceType.cs index 02bd908e..8a960ea1 100644 --- a/src/Domain/Entities/TypeAssistance.cs +++ b/src/Domain/Entities/AssistanceType.cs @@ -6,7 +6,7 @@ namespace Domain.Entities /// /// Tipo de Bolsa de Assistência Estudantil /// - public class TypeAssistance : Entity + public class AssistanceType : Entity { private string? _name; public string? Name @@ -40,13 +40,13 @@ public string? Description } } - public TypeAssistance(string? name, string? description) + public AssistanceType(string? name, string? description) { Name = name; Description = description; } - public TypeAssistance(Guid? id, string? name, string? description) + public AssistanceType(Guid? id, string? name, string? description) { Id = id; Name = name; @@ -56,6 +56,6 @@ public TypeAssistance(Guid? id, string? name, string? description) /// /// Constructor to dbcontext EF instancing. /// - public TypeAssistance() { } + public AssistanceType() { } } } \ No newline at end of file diff --git a/src/Domain/Entities/Student.cs b/src/Domain/Entities/Student.cs index 1e11fe62..4b2659ad 100644 --- a/src/Domain/Entities/Student.cs +++ b/src/Domain/Entities/Student.cs @@ -289,15 +289,15 @@ public string? StartYear /// /// Tipo de Bolsa de Assistência Estudantil do aluno /// - private Guid? _typeAssistanceId; - public Guid? TypeAssistanceId + private Guid? _assistanceTypeId; + public Guid? AssistanceTypeId { - get { return _typeAssistanceId; } + get { return _assistanceTypeId; } set { EntityExceptionValidation.When(value == null, ExceptionMessageFactory.Required("Tipo de Bolsa de Assistência Estudantil do aluno")); - _typeAssistanceId = value; + _assistanceTypeId = value; } } @@ -321,7 +321,7 @@ public Guid? UserId public virtual User? User { get; } public virtual Campus? Campus { get; } public virtual Course? Course { get; } - public virtual TypeAssistance? TypeAssistance { get; } + public virtual AssistanceType? AssistanceType { get; } #endregion #region Constructors @@ -362,7 +362,7 @@ public Student( CampusId = campusId; CourseId = courseId; StartYear = startYear; - TypeAssistanceId = studentAssistanceProgramId; + AssistanceTypeId = studentAssistanceProgramId; } /// diff --git a/src/Domain/Interfaces/Repositories/IAssistanceTypeRepository.cs b/src/Domain/Interfaces/Repositories/IAssistanceTypeRepository.cs new file mode 100644 index 00000000..4be71919 --- /dev/null +++ b/src/Domain/Interfaces/Repositories/IAssistanceTypeRepository.cs @@ -0,0 +1,10 @@ +using Domain.Entities; +using Domain.Interfaces.Repositories.Bases; + +namespace Domain.Interfaces.Repositories +{ + public interface IAssistanceTypeRepository : IGenericCRUDRepository + { + Task GetAssistanceTypeByName(string name); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/ITypeAssistanceRepository.cs b/src/Domain/Interfaces/Repositories/ITypeAssistanceRepository.cs deleted file mode 100644 index f0576d70..00000000 --- a/src/Domain/Interfaces/Repositories/ITypeAssistanceRepository.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Domain.Entities; -using Domain.Interfaces.Repositories.Bases; - -namespace Domain.Interfaces.Repositories -{ - public interface ITypeAssistanceRepository : IGenericCRUDRepository - { - Task GetTypeAssistanceByName(string name); - } -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/AssistanceType/ICreateAssistanceType.cs b/src/Domain/Interfaces/UseCases/AssistanceType/ICreateAssistanceType.cs new file mode 100644 index 00000000..dd709fd5 --- /dev/null +++ b/src/Domain/Interfaces/UseCases/AssistanceType/ICreateAssistanceType.cs @@ -0,0 +1,9 @@ +using Domain.Contracts.AssistanceType; + +namespace Domain.Interfaces.UseCases +{ + public interface ICreateAssistanceType + { + Task Execute(CreateAssistanceTypeInput model); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/AssistanceType/IDeleteAssistanceType.cs b/src/Domain/Interfaces/UseCases/AssistanceType/IDeleteAssistanceType.cs new file mode 100644 index 00000000..d031e29e --- /dev/null +++ b/src/Domain/Interfaces/UseCases/AssistanceType/IDeleteAssistanceType.cs @@ -0,0 +1,9 @@ +using Domain.Contracts.AssistanceType; + +namespace Domain.Interfaces.UseCases +{ + public interface IDeleteAssistanceType + { + Task Execute(Guid? id); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypeById.cs b/src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypeById.cs new file mode 100644 index 00000000..92ddd8b5 --- /dev/null +++ b/src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypeById.cs @@ -0,0 +1,9 @@ +using Domain.Contracts.AssistanceType; + +namespace Domain.Interfaces.UseCases +{ + public interface IGetAssistanceTypeById + { + Task Execute(Guid? id); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypes.cs b/src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypes.cs new file mode 100644 index 00000000..b9e0193c --- /dev/null +++ b/src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypes.cs @@ -0,0 +1,9 @@ +using Domain.Contracts.AssistanceType; + +namespace Domain.Interfaces.UseCases +{ + public interface IGetAssistanceTypes + { + Task> Execute(int skip, int take); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/AssistanceType/IUpdateAssistanceType.cs b/src/Domain/Interfaces/UseCases/AssistanceType/IUpdateAssistanceType.cs new file mode 100644 index 00000000..cb158535 --- /dev/null +++ b/src/Domain/Interfaces/UseCases/AssistanceType/IUpdateAssistanceType.cs @@ -0,0 +1,9 @@ +using Domain.Contracts.AssistanceType; + +namespace Domain.Interfaces.UseCases +{ + public interface IUpdateAssistanceType + { + Task Execute(Guid? id, UpdateAssistanceTypeInput model); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/TypeAssistance/ICreateTypeAssistance.cs b/src/Domain/Interfaces/UseCases/TypeAssistance/ICreateTypeAssistance.cs deleted file mode 100644 index c7bbfd69..00000000 --- a/src/Domain/Interfaces/UseCases/TypeAssistance/ICreateTypeAssistance.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Domain.Contracts.TypeAssistance; - -namespace Domain.Interfaces.UseCases -{ - public interface ICreateTypeAssistance - { - Task Execute(CreateTypeAssistanceInput model); - } -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/TypeAssistance/IDeleteTypeAssistance.cs b/src/Domain/Interfaces/UseCases/TypeAssistance/IDeleteTypeAssistance.cs deleted file mode 100644 index ad9d065f..00000000 --- a/src/Domain/Interfaces/UseCases/TypeAssistance/IDeleteTypeAssistance.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Domain.Contracts.TypeAssistance; - -namespace Domain.Interfaces.UseCases -{ - public interface IDeleteTypeAssistance - { - Task Execute(Guid? id); - } -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/TypeAssistance/IGetTypeAssistanceById.cs b/src/Domain/Interfaces/UseCases/TypeAssistance/IGetTypeAssistanceById.cs deleted file mode 100644 index 3178c843..00000000 --- a/src/Domain/Interfaces/UseCases/TypeAssistance/IGetTypeAssistanceById.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Domain.Contracts.TypeAssistance; - -namespace Domain.Interfaces.UseCases -{ - public interface IGetTypeAssistanceById - { - Task Execute(Guid? id); - } -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/TypeAssistance/IGetTypeAssistances.cs b/src/Domain/Interfaces/UseCases/TypeAssistance/IGetTypeAssistances.cs deleted file mode 100644 index f1636f2a..00000000 --- a/src/Domain/Interfaces/UseCases/TypeAssistance/IGetTypeAssistances.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Domain.Contracts.TypeAssistance; - -namespace Domain.Interfaces.UseCases -{ - public interface IGetTypeAssistances - { - Task> Execute(int skip, int take); - } -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/TypeAssistance/IUpdateTypeAssistance.cs b/src/Domain/Interfaces/UseCases/TypeAssistance/IUpdateTypeAssistance.cs deleted file mode 100644 index fa18d3f9..00000000 --- a/src/Domain/Interfaces/UseCases/TypeAssistance/IUpdateTypeAssistance.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Domain.Contracts.TypeAssistance; - -namespace Domain.Interfaces.UseCases -{ - public interface IUpdateTypeAssistance - { - Task Execute(Guid? id, UpdateTypeAssistanceInput model); - } -} \ No newline at end of file diff --git a/src/Domain/Mappings/AssistanceTypeMappings.cs b/src/Domain/Mappings/AssistanceTypeMappings.cs new file mode 100644 index 00000000..49cb3dbc --- /dev/null +++ b/src/Domain/Mappings/AssistanceTypeMappings.cs @@ -0,0 +1,17 @@ +using AutoMapper; +using Domain.Contracts.AssistanceType; +using Domain.Entities; + +namespace Domain.Mappings +{ + public class AssistanceTypeMappings : Profile + { + public AssistanceTypeMappings() + { + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + } + } +} \ No newline at end of file diff --git a/src/Domain/Mappings/TypeAssistanceMappings.cs b/src/Domain/Mappings/TypeAssistanceMappings.cs deleted file mode 100644 index 4ded6947..00000000 --- a/src/Domain/Mappings/TypeAssistanceMappings.cs +++ /dev/null @@ -1,17 +0,0 @@ -using AutoMapper; -using Domain.Contracts.TypeAssistance; -using Domain.Entities; - -namespace Domain.Mappings -{ - public class TypeAssistanceMappings : Profile - { - public TypeAssistanceMappings() - { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Domain/UseCases/TypeAssistance/CreateTypeAssistance.cs b/src/Domain/UseCases/AssistanceType/CreateAssistanceType.cs similarity index 65% rename from src/Domain/UseCases/TypeAssistance/CreateTypeAssistance.cs rename to src/Domain/UseCases/AssistanceType/CreateAssistanceType.cs index 0cafad1d..f6c3875f 100644 --- a/src/Domain/UseCases/TypeAssistance/CreateTypeAssistance.cs +++ b/src/Domain/UseCases/AssistanceType/CreateAssistanceType.cs @@ -1,4 +1,4 @@ -using Domain.Contracts.TypeAssistance; +using Domain.Contracts.AssistanceType; using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; @@ -6,33 +6,33 @@ namespace Domain.UseCases { - public class CreateTypeAssistance : ICreateTypeAssistance + public class CreateAssistanceType : ICreateAssistanceType { #region Global Scope - private readonly ITypeAssistanceRepository _repository; + private readonly IAssistanceTypeRepository _repository; private readonly IMapper _mapper; - public CreateTypeAssistance(ITypeAssistanceRepository repository, IMapper mapper) + public CreateAssistanceType(IAssistanceTypeRepository repository, IMapper mapper) { _repository = repository; _mapper = mapper; } #endregion - public async Task Execute(CreateTypeAssistanceInput input) + public async Task Execute(CreateAssistanceTypeInput input) { // Verifica se nome foi informado UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Verifica se já existe um tipo de programa com o nome indicado - var entity = await _repository.GetTypeAssistanceByName(input.Name!); + var entity = await _repository.GetAssistanceTypeByName(input.Name!); UseCaseException.BusinessRuleViolation(entity != null, "Já existe um Tipo de Programa para o nome informado."); // Cria entidade - entity = await _repository.Create(_mapper.Map(input)); + entity = await _repository.Create(_mapper.Map(input)); // Salva entidade no banco - return _mapper.Map(entity); + return _mapper.Map(entity); } } } \ No newline at end of file diff --git a/src/Domain/UseCases/TypeAssistance/DeleteTypeAssistance.cs b/src/Domain/UseCases/AssistanceType/DeleteAssistanceType.cs similarity index 64% rename from src/Domain/UseCases/TypeAssistance/DeleteTypeAssistance.cs rename to src/Domain/UseCases/AssistanceType/DeleteAssistanceType.cs index 851ab13a..f8047562 100644 --- a/src/Domain/UseCases/TypeAssistance/DeleteTypeAssistance.cs +++ b/src/Domain/UseCases/AssistanceType/DeleteAssistanceType.cs @@ -1,4 +1,4 @@ -using Domain.Contracts.TypeAssistance; +using Domain.Contracts.AssistanceType; using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; @@ -6,19 +6,19 @@ namespace Domain.UseCases { - public class DeleteTypeAssistance : IDeleteTypeAssistance + public class DeleteAssistanceType : IDeleteAssistanceType { #region Global Scope - private readonly ITypeAssistanceRepository _repository; + private readonly IAssistanceTypeRepository _repository; private readonly IMapper _mapper; - public DeleteTypeAssistance(ITypeAssistanceRepository repository, IMapper mapper) + public DeleteAssistanceType(IAssistanceTypeRepository repository, IMapper mapper) { _repository = repository; _mapper = mapper; } #endregion - public async Task Execute(Guid? id) + public async Task Execute(Guid? id) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); @@ -27,7 +27,7 @@ public async Task Execute(Guid? id) var model = await _repository.Delete(id); // Retorna o tipo de programa removido - return _mapper.Map(model); + return _mapper.Map(model); } } } \ No newline at end of file diff --git a/src/Domain/UseCases/TypeAssistance/GetTypeAssistanceById.cs b/src/Domain/UseCases/AssistanceType/GetAssistanceTypeById.cs similarity index 59% rename from src/Domain/UseCases/TypeAssistance/GetTypeAssistanceById.cs rename to src/Domain/UseCases/AssistanceType/GetAssistanceTypeById.cs index fa4caca8..1fb2cbf8 100644 --- a/src/Domain/UseCases/TypeAssistance/GetTypeAssistanceById.cs +++ b/src/Domain/UseCases/AssistanceType/GetAssistanceTypeById.cs @@ -1,4 +1,4 @@ -using Domain.Contracts.TypeAssistance; +using Domain.Contracts.AssistanceType; using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; @@ -6,23 +6,23 @@ namespace Domain.UseCases { - public class GetTypeAssistanceById : IGetTypeAssistanceById + public class GetAssistanceTypeById : IGetAssistanceTypeById { #region Global Scope - private readonly ITypeAssistanceRepository _repository; + private readonly IAssistanceTypeRepository _repository; private readonly IMapper _mapper; - public GetTypeAssistanceById(ITypeAssistanceRepository repository, IMapper mapper) + public GetAssistanceTypeById(IAssistanceTypeRepository repository, IMapper mapper) { _repository = repository; _mapper = mapper; } #endregion - public async Task Execute(Guid? id) + public async Task Execute(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); var entity = await _repository.GetById(id); - return _mapper.Map(entity); + return _mapper.Map(entity); } } } \ No newline at end of file diff --git a/src/Domain/UseCases/TypeAssistance/GetTypeAssistances.cs b/src/Domain/UseCases/AssistanceType/GetAssistanceTypes.cs similarity index 53% rename from src/Domain/UseCases/TypeAssistance/GetTypeAssistances.cs rename to src/Domain/UseCases/AssistanceType/GetAssistanceTypes.cs index e9558c2f..13ef147b 100644 --- a/src/Domain/UseCases/TypeAssistance/GetTypeAssistances.cs +++ b/src/Domain/UseCases/AssistanceType/GetAssistanceTypes.cs @@ -1,26 +1,26 @@ -using Domain.Contracts.TypeAssistance; +using Domain.Contracts.AssistanceType; using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; namespace Domain.UseCases { - public class GetTypeAssistances : IGetTypeAssistances + public class GetAssistanceTypes : IGetAssistanceTypes { #region Global Scope - private readonly ITypeAssistanceRepository _repository; + private readonly IAssistanceTypeRepository _repository; private readonly IMapper _mapper; - public GetTypeAssistances(ITypeAssistanceRepository repository, IMapper mapper) + public GetAssistanceTypes(IAssistanceTypeRepository repository, IMapper mapper) { _repository = repository; _mapper = mapper; } #endregion - public async Task> Execute(int skip, int take) + public async Task> Execute(int skip, int take) { var entities = await _repository.GetAll(skip, take); - return _mapper.Map>(entities).AsQueryable(); + return _mapper.Map>(entities).AsQueryable(); } } } \ No newline at end of file diff --git a/src/Domain/UseCases/TypeAssistance/UpdateTypeAssistance.cs b/src/Domain/UseCases/AssistanceType/UpdateAssistanceType.cs similarity index 76% rename from src/Domain/UseCases/TypeAssistance/UpdateTypeAssistance.cs rename to src/Domain/UseCases/AssistanceType/UpdateAssistanceType.cs index 88438c4f..d6f530d7 100644 --- a/src/Domain/UseCases/TypeAssistance/UpdateTypeAssistance.cs +++ b/src/Domain/UseCases/AssistanceType/UpdateAssistanceType.cs @@ -1,4 +1,4 @@ -using Domain.Contracts.TypeAssistance; +using Domain.Contracts.AssistanceType; using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; @@ -6,19 +6,19 @@ namespace Domain.UseCases { - public class UpdateTypeAssistance : IUpdateTypeAssistance + public class UpdateAssistanceType : IUpdateAssistanceType { #region Global Scope - private readonly ITypeAssistanceRepository _repository; + private readonly IAssistanceTypeRepository _repository; private readonly IMapper _mapper; - public UpdateTypeAssistance(ITypeAssistanceRepository repository, IMapper mapper) + public UpdateAssistanceType(IAssistanceTypeRepository repository, IMapper mapper) { _repository = repository; _mapper = mapper; } #endregion - public async Task Execute(Guid? id, UpdateTypeAssistanceInput input) + public async Task Execute(Guid? id, UpdateAssistanceTypeInput input) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); @@ -28,7 +28,7 @@ public async Task Execute(Guid? id, UpdateType // Recupera entidade que será atualizada var entity = await _repository.GetById(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.TypeAssistance)); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.AssistanceType)); // Verifica se a entidade foi excluída UseCaseException.BusinessRuleViolation(entity.DeletedAt != null, @@ -37,7 +37,7 @@ public async Task Execute(Guid? id, UpdateType // Verifica se o nome já está sendo usado UseCaseException.BusinessRuleViolation( !string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) - && await _repository.GetTypeAssistanceByName(input.Name!) != null, + && await _repository.GetAssistanceTypeByName(input.Name!) != null, "Já existe um Bolsa de Assistência para o nome informado."); // Atualiza atributos permitidos @@ -46,7 +46,7 @@ public async Task Execute(Guid? id, UpdateType // Salva entidade atualizada no banco var model = await _repository.Update(entity); - return _mapper.Map(model); + return _mapper.Map(model); } } } \ No newline at end of file diff --git a/src/Domain/UseCases/Project/CancelProject.cs b/src/Domain/UseCases/Project/CancelProject.cs index 8bcfbb97..7fcb3e40 100644 --- a/src/Domain/UseCases/Project/CancelProject.cs +++ b/src/Domain/UseCases/Project/CancelProject.cs @@ -27,14 +27,15 @@ public async Task Execute(Guid? id, string? observatio ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Verifica se o projeto já não foi cancelado ou está encerrado - UseCaseException.BusinessRuleViolation(project.Status != EProjectStatus.Canceled || project.Status != EProjectStatus.Closed, - "Project already canceled or terminated."); + UseCaseException.BusinessRuleViolation( + project.Status == EProjectStatus.Canceled || project.Status == EProjectStatus.Closed, + "Projeto já cancelado ou encerrado."); // Atualiza informações de cancelamento do projeto project.Status = EProjectStatus.Canceled; project.StatusDescription = EProjectStatus.Canceled.GetDescription(); project.CancellationReason = observation; - project.CancellationDate = DateTime.Now; + project.CancellationDate = DateTime.UtcNow; // Atualiza projeto project = await _projectRepository.Update(project); diff --git a/src/Domain/UseCases/Student/CreateStudent.cs b/src/Domain/UseCases/Student/CreateStudent.cs index 6c044dc2..93205c42 100644 --- a/src/Domain/UseCases/Student/CreateStudent.cs +++ b/src/Domain/UseCases/Student/CreateStudent.cs @@ -57,7 +57,7 @@ public async Task Execute(CreateStudentInput input) input.CampusId, input.CourseId, input.StartYear, - input.TypeAssistanceId); + input.AssistanceTypeId); // Verifica se já existe um usuário com o e-mail informado var user = await _userRepository.GetUserByEmail(input.Email); diff --git a/src/Domain/UseCases/Student/UpdateStudent.cs b/src/Domain/UseCases/Student/UpdateStudent.cs index ff599bd1..ca3fdc73 100644 --- a/src/Domain/UseCases/Student/UpdateStudent.cs +++ b/src/Domain/UseCases/Student/UpdateStudent.cs @@ -48,7 +48,7 @@ public async Task Execute(Guid? id, UpdateStudentInpu student.RG = input.RG; student.StartYear = input.StartYear; student.UF = input.UF; - student.TypeAssistanceId = input.TypeAssistanceId; + student.AssistanceTypeId = input.AssistanceTypeId; // Enums student.Race = (ERace)input.Race; diff --git a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs index 10c6a514..2e0b4268 100644 --- a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs +++ b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs @@ -10,6 +10,7 @@ public static IServiceCollection AddAdapters(this IServiceCollection services) { #region PresenterControllers services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -19,7 +20,6 @@ public static IServiceCollection AddAdapters(this IServiceCollection services) services.AddScoped(); // services.AddScoped(); services.AddScoped(); - services.AddScoped(); // services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -28,6 +28,7 @@ public static IServiceCollection AddAdapters(this IServiceCollection services) #region Gateways Mappers services.AddAutoMapper(typeof(AreaMappings)); + services.AddAutoMapper(typeof(AssistanceTypeMappings)); services.AddAutoMapper(typeof(AuthMappings)); services.AddAutoMapper(typeof(CampusMappings)); services.AddAutoMapper(typeof(CourseMappings)); @@ -37,7 +38,6 @@ public static IServiceCollection AddAdapters(this IServiceCollection services) services.AddAutoMapper(typeof(ProgramTypeMappings)); services.AddAutoMapper(typeof(ProjectEvaluationMapping)); services.AddAutoMapper(typeof(ProjectMappings)); - services.AddAutoMapper(typeof(TypeAssistanceMappings)); services.AddAutoMapper(typeof(StudentDocumentsMappings)); services.AddAutoMapper(typeof(StudentMappings)); services.AddAutoMapper(typeof(SubAreaMappings)); diff --git a/src/Infrastructure/IoC/DependencyDomainInjection.cs b/src/Infrastructure/IoC/DependencyDomainInjection.cs index d844ac8d..4df6911e 100644 --- a/src/Infrastructure/IoC/DependencyDomainInjection.cs +++ b/src/Infrastructure/IoC/DependencyDomainInjection.cs @@ -31,6 +31,14 @@ public static IServiceCollection AddDomain(this IServiceCollection services) services.AddScoped(); #endregion + #region AssistanceType + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion + #region Auth services.AddScoped(); services.AddScoped(); @@ -111,14 +119,6 @@ public static IServiceCollection AddDomain(this IServiceCollection services) services.AddScoped(); #endregion - #region TypeAssistance - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - #region StudentDocuments // services.AddScoped(); // services.AddScoped(); @@ -149,6 +149,7 @@ public static IServiceCollection AddDomain(this IServiceCollection services) #region Contract Mappers services.AddAutoMapper(typeof(AreaMappings)); + services.AddAutoMapper(typeof(AssistanceTypeMappings)); services.AddAutoMapper(typeof(CampusMappings)); services.AddAutoMapper(typeof(CourseMappings)); services.AddAutoMapper(typeof(MainAreaMappings)); @@ -157,7 +158,6 @@ public static IServiceCollection AddDomain(this IServiceCollection services) services.AddAutoMapper(typeof(ProgramTypeMappings)); services.AddAutoMapper(typeof(ProjectEvaluationMappings)); services.AddAutoMapper(typeof(ProjectMappings)); - services.AddAutoMapper(typeof(TypeAssistanceMappings)); services.AddAutoMapper(typeof(StudentDocumentsMappings)); services.AddAutoMapper(typeof(StudentMappings)); services.AddAutoMapper(typeof(SubAreaMappings)); diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs index e11f9139..43860517 100644 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ b/src/Infrastructure/IoC/DependencyInjection.cs @@ -58,6 +58,7 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi #region Repositórios services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -65,7 +66,6 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs index 65f9be81..858d564f 100644 --- a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs +++ b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs @@ -18,7 +18,7 @@ public class ApplicationDbContext : DbContext public ApplicationDbContext(DbContextOptions options) : base(options) { Areas = Set(); - AssistanceScholarships = Set(); + AssistanceScholarships = Set(); Campuses = Set(); Courses = Set(); MainAreas = Set(); @@ -26,14 +26,14 @@ public ApplicationDbContext(DbContextOptions options) : ba Professors = Set(); Projects = Set(); ProgramTypes = Set(); - TypeAssistances = Set(); + AssistanceTypes = Set(); Students = Set(); SubAreas = Set(); Users = Set(); } public DbSet Areas { get; set; } - public DbSet AssistanceScholarships { get; set; } + public DbSet AssistanceScholarships { get; set; } public DbSet Campuses { get; set; } public DbSet Courses { get; set; } public DbSet MainAreas { get; set; } @@ -41,7 +41,7 @@ public ApplicationDbContext(DbContextOptions options) : ba public DbSet Professors { get; set; } public DbSet Projects { get; set; } public DbSet ProgramTypes { get; set; } - public DbSet TypeAssistances { get; set; } + public DbSet AssistanceTypes { get; set; } public DbSet Students { get; set; } public DbSet SubAreas { get; set; } public DbSet Users { get; set; } diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/TypeAssistanceConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/AssistanceTypeConfiguration.cs similarity index 74% rename from src/Infrastructure/Persistence/EntitiesConfiguration/TypeAssistanceConfiguration.cs rename to src/Infrastructure/Persistence/EntitiesConfiguration/AssistanceTypeConfiguration.cs index 03d63775..cf810954 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/TypeAssistanceConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/AssistanceTypeConfiguration.cs @@ -4,11 +4,11 @@ namespace Infrastructure.Persistence.EntitiesConfiguration { - public class TypeAssistanceConfiguration : IEntityTypeConfiguration + public class AssistanceTypeConfiguration : IEntityTypeConfiguration { - public void Configure(EntityTypeBuilder builder) + public void Configure(EntityTypeBuilder builder) { - builder.ToTable("TypeAssistances"); + builder.ToTable("AssistanceTypes"); builder.HasKey(t => t.Id); builder.Property(p => p.Id).ValueGeneratedOnAdd(); builder.Property(p => p.Name).HasMaxLength(300).IsRequired(); diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs index d9657568..bfc5c127 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs @@ -38,7 +38,7 @@ public void Configure(EntityTypeBuilder builder) builder.Property(p => p.PatentLetter).HasDefaultValue(0); builder.Property(p => p.PatentDeposit).HasDefaultValue(0); builder.Property(p => p.SoftwareRegistration).HasDefaultValue(0); - builder.Property(p => p.StudentId).IsRequired(); + builder.Property(p => p.StudentId); builder.Property(p => p.ProgramTypeId).IsRequired(); builder.Property(p => p.ProfessorId).IsRequired(); builder.Property(p => p.SubAreaId).IsRequired(); diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/StudentConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/StudentConfiguration.cs index 8f04e84a..d9563e42 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/StudentConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/StudentConfiguration.cs @@ -47,7 +47,7 @@ public void Configure(EntityTypeBuilder builder) .IsRequired(); builder.Property(p => p.StartYear) .IsRequired(); - builder.Property(p => p.TypeAssistanceId) + builder.Property(p => p.AssistanceTypeId) .IsRequired(); builder.Property(p => p.UserId) .IsRequired(); @@ -56,7 +56,7 @@ public void Configure(EntityTypeBuilder builder) builder.HasOne(a => a.User).WithOne().HasForeignKey(a => a.UserId); builder.HasOne(a => a.Campus).WithMany().HasForeignKey(a => a.CampusId); builder.HasOne(a => a.Course).WithMany().HasForeignKey(a => a.CourseId); - builder.HasOne(a => a.TypeAssistance).WithMany().HasForeignKey(a => a.TypeAssistanceId); + builder.HasOne(a => a.AssistanceType).WithMany().HasForeignKey(a => a.AssistanceTypeId); builder.HasQueryFilter(x => x.DeletedAt == null); } diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md new file mode 100644 index 00000000..fa48abaa --- /dev/null +++ b/src/Infrastructure/Persistence/README.md @@ -0,0 +1,45 @@ +# Infraestructure.Persistence + +## DataBase - PostgreSQL + +Para levantar o banco de dados é necessário executar o comando abaixo na pasta raiz: + +```bash +cd docker +docker compose up -d +``` + +Em seguida, é preciso acessar o pgAdmin através da rota abaixo: + +- [PGAdmin](http://localhost:16543/browser) + +E criar um servidor utilizando as informações de _host_, _username_, _password_ e _database_ que estão informadas no arquivo docker-compose.yaml utilizado. +Exemplo: + +- **host**: copet-system-db +- **username**: copet-admin +- **password**: Copet@123 +- **database**: COPET_DB +- **port**: 5432 + +## Migrations + +Criando as Migrations para criação e atualização das tabelas do banco de dados: + +```bash +cd src/Infrastructure/WebAPI +dotnet ef migrations add UpdateAssistanceType --project ../Persistence/Persistence.csproj +``` + +Executando as Migrations: + +```bash +dotnet ef database update +``` + +Removendo as Migrations: + +```bash +cd src/Infrastructure/WebAPI +dotnet ef migrations remove --project ../Persistence/Persistence.csproj +``` diff --git a/src/Infrastructure/Persistence/Repositories/TypeAssistanceRepository.cs b/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs similarity index 68% rename from src/Infrastructure/Persistence/Repositories/TypeAssistanceRepository.cs rename to src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs index baace1bd..9ae9e69d 100644 --- a/src/Infrastructure/Persistence/Repositories/TypeAssistanceRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs @@ -5,35 +5,35 @@ namespace Infrastructure.Persistence.Repositories { - public class TypeAssistanceRepository : ITypeAssistanceRepository + public class AssistanceTypeRepository : IAssistanceTypeRepository { #region Global Scope private readonly ApplicationDbContext _context; - public TypeAssistanceRepository(ApplicationDbContext context) => _context = context; + public AssistanceTypeRepository(ApplicationDbContext context) => _context = context; #endregion #region Public Methods - public async Task Create(TypeAssistance model) + public async Task Create(AssistanceType model) { _context.Add(model); await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) => await _context.TypeAssistances + public async Task> GetAll(int skip, int take) => await _context.AssistanceTypes .Skip(skip) .Take(take) .AsAsyncEnumerable() .OrderBy(x => x.Name) .ToListAsync(); - public async Task GetById(Guid? id) => - await _context.TypeAssistances + public async Task GetById(Guid? id) => + await _context.AssistanceTypes .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id); - public async Task Delete(Guid? id) + public async Task Delete(Guid? id) { var model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); @@ -41,17 +41,17 @@ public async Task Delete(Guid? id) return await Update(model); } - public async Task Update(TypeAssistance model) + public async Task Update(AssistanceType model) { _context.Update(model); await _context.SaveChangesAsync(); return model; } - public async Task GetTypeAssistanceByName(string name) + public async Task GetAssistanceTypeByName(string name) { string loweredName = name.ToLower(); - var entities = await _context.TypeAssistances + var entities = await _context.AssistanceTypes .Where(x => x.Name!.ToLower() == loweredName) .AsAsyncEnumerable() .ToListAsync(); diff --git a/src/Infrastructure/Persistence/Seeds/TypeAssistanceSeeder.cs b/src/Infrastructure/Persistence/Seeds/AssistanceTypeSeeder.cs similarity index 78% rename from src/Infrastructure/Persistence/Seeds/TypeAssistanceSeeder.cs rename to src/Infrastructure/Persistence/Seeds/AssistanceTypeSeeder.cs index 71bf4ceb..444b6b54 100644 --- a/src/Infrastructure/Persistence/Seeds/TypeAssistanceSeeder.cs +++ b/src/Infrastructure/Persistence/Seeds/AssistanceTypeSeeder.cs @@ -3,7 +3,7 @@ namespace Persistence.Seeds { - public static class TypeAssistanceSeeder + public static class AssistanceTypeSeeder { public static void Seed(MigrationBuilder builder) { @@ -12,16 +12,16 @@ public static void Seed(MigrationBuilder builder) foreach (string lines in File.ReadAllLines(file)) { parts = lines.Split(';'); - AddTypeAssistance(builder, new TypeAssistance(Guid.NewGuid(), parts[0], parts[1])); + AddAssistanceType(builder, new AssistanceType(Guid.NewGuid(), parts[0], parts[1])); } } - private static void AddTypeAssistance(MigrationBuilder builder, TypeAssistance sas) + private static void AddAssistanceType(MigrationBuilder builder, AssistanceType sas) { if (sas?.Id == null || sas?.Name == null) return; builder.InsertData( - table: "TypeAssistances", + table: "AssistanceTypes", columns: new[] { "Id", "DeletedAt", "Name", "Description" }, values: new object[,] { diff --git a/src/Infrastructure/Persistence/Seeds/Seeder.cs b/src/Infrastructure/Persistence/Seeds/Seeder.cs index b75bbfc3..22d26c8a 100644 --- a/src/Infrastructure/Persistence/Seeds/Seeder.cs +++ b/src/Infrastructure/Persistence/Seeds/Seeder.cs @@ -10,7 +10,7 @@ public static void Seed(MigrationBuilder migrationBuilder) CampusesSeeder.Seed(migrationBuilder); CoursesSeeder.Seed(migrationBuilder); ProgramTypesSeeder.Seed(migrationBuilder); - TypeAssistanceSeeder.Seed(migrationBuilder); + AssistanceTypeSeeder.Seed(migrationBuilder); UserSeeder.Seed(migrationBuilder); } } diff --git a/src/Infrastructure/WebAPI/Controllers/TypeAssistanceController.cs b/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs similarity index 84% rename from src/Infrastructure/WebAPI/Controllers/TypeAssistanceController.cs rename to src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs index ae870ca4..1a9f86cb 100644 --- a/src/Infrastructure/WebAPI/Controllers/TypeAssistanceController.cs +++ b/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs @@ -1,4 +1,4 @@ -using Adapters.Gateways.TypeAssistance; +using Adapters.Gateways.AssistanceType; using Adapters.Interfaces; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -11,17 +11,17 @@ namespace Infrastructure.WebAPI.Controllers [ApiController] [Route("Api/[controller]")] [Authorize] - public class TypeAssistanceController : ControllerBase + public class AssistanceTypeController : ControllerBase { #region Global Scope - private readonly ITypeAssistancePresenterController _service; - private readonly ILogger _logger; + private readonly IAssistanceTypePresenterController _service; + private readonly ILogger _logger; /// /// Construtor do Controller de Bolsa de Assistência. /// /// /// - public TypeAssistanceController(ITypeAssistancePresenterController service, ILogger logger) + public AssistanceTypeController(IAssistanceTypePresenterController service, ILogger logger) { _service = service; _logger = logger; @@ -36,7 +36,7 @@ public TypeAssistanceController(ITypeAssistancePresenterController service, ILog /// Retorna bolsa de assistência correspondente [HttpGet("{id}")] [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetById(Guid? id) + public async Task> GetById(Guid? id) { if (id == null) { @@ -66,7 +66,7 @@ public async Task> GetById(Guid /// Retorna todas as bolsas de assitência ativas [HttpGet] [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetAll(int skip = 0, int take = 50) + public async Task>> GetAll(int skip = 0, int take = 50) { var models = await _service.GetAll(skip, take); if (models == null) @@ -88,11 +88,11 @@ public async Task>> [HttpPost] [ProducesResponseType(StatusCodes.Status200OK)] [Authorize(Roles = "ADMIN")] - public async Task> Create([FromBody] CreateTypeAssistanceRequest request) + public async Task> Create([FromBody] CreateAssistanceTypeRequest request) { try { - var model = await _service.Create(request) as DetailedReadTypeAssistanceResponse; + var model = await _service.Create(request) as DetailedReadAssistanceTypeResponse; _logger.LogInformation("Bolsa de Assistência criado: {id}", model?.Id); return Ok(model); } @@ -111,11 +111,11 @@ public async Task> Create([From /// Retorna bolsa de assistência atualizado [HttpPut("{id}")] [Authorize(Roles = "ADMIN")] - public async Task> Update(Guid? id, [FromBody] UpdateTypeAssistanceRequest request) + public async Task> Update(Guid? id, [FromBody] UpdateAssistanceTypeRequest request) { try { - var model = await _service.Update(id, request) as DetailedReadTypeAssistanceResponse; + var model = await _service.Update(id, request) as DetailedReadAssistanceTypeResponse; _logger.LogInformation("Bolsa de Assistência atualizado: {id}", model?.Id); return Ok(model); } @@ -134,7 +134,7 @@ public async Task> Update(Guid? /// Retorna bolsa de assistência removido [HttpDelete("{id}")] [Authorize(Roles = "ADMIN")] - public async Task> Delete(Guid? id) + public async Task> Delete(Guid? id) { if (id == null) { @@ -145,7 +145,7 @@ public async Task> Delete(Guid? try { - var model = await _service.Delete(id.Value) as DetailedReadTypeAssistanceResponse; + var model = await _service.Delete(id.Value) as DetailedReadAssistanceTypeResponse; _logger.LogInformation("Bolsa de Assistência removido: {id}", model?.Id); return Ok(model); } From 3aebb17bc04c4a2d529d80af4cff3500e1f14059 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 18 Jul 2023 20:49:45 -0300 Subject: [PATCH 029/201] fix: adjust project usecases --- .../Contracts/Project/OpenProjectInput.cs | 2 +- src/Domain/UseCases/Project/SubmitProject.cs | 36 ++++----- src/Domain/UseCases/Project/UpdateProject.cs | 75 +++++++++---------- 3 files changed, 55 insertions(+), 58 deletions(-) diff --git a/src/Domain/Contracts/Project/OpenProjectInput.cs b/src/Domain/Contracts/Project/OpenProjectInput.cs index bf0f54bd..00a38935 100644 --- a/src/Domain/Contracts/Project/OpenProjectInput.cs +++ b/src/Domain/Contracts/Project/OpenProjectInput.cs @@ -8,7 +8,7 @@ public class OpenProjectInput public string? KeyWord2 { get; set; } public string? KeyWord3 { get; set; } public bool IsScholarshipCandidate { get; set; } - public bool IsProductivityFellow { get; set; } // Manter? + // public bool IsProductivityFellow { get; set; } // Manter? public string? Objective { get; set; } public string? Methodology { get; set; } public string? ExpectedResults { get; set; } diff --git a/src/Domain/UseCases/Project/SubmitProject.cs b/src/Domain/UseCases/Project/SubmitProject.cs index fabcba45..a497bc73 100644 --- a/src/Domain/UseCases/Project/SubmitProject.cs +++ b/src/Domain/UseCases/Project/SubmitProject.cs @@ -33,28 +33,28 @@ public async Task Execute(Guid? projectId) if (project.Status == EProjectStatus.Opened) { // Verifica se todos os campos do projeto foram preenchidos - UseCaseException.NotInformedParam(project.WorkType1 is null, nameof(project.WorkType1)); - UseCaseException.NotInformedParam(project.WorkType2 is null, nameof(project.WorkType2)); - UseCaseException.NotInformedParam(project.IndexedConferenceProceedings is null, nameof(project.IndexedConferenceProceedings)); - UseCaseException.NotInformedParam(project.NotIndexedConferenceProceedings is null, nameof(project.NotIndexedConferenceProceedings)); - UseCaseException.NotInformedParam(project.CompletedBook is null, nameof(project.CompletedBook)); - UseCaseException.NotInformedParam(project.OrganizedBook is null, nameof(project.OrganizedBook)); - UseCaseException.NotInformedParam(project.BookChapters is null, nameof(project.BookChapters)); - UseCaseException.NotInformedParam(project.BookTranslations is null, nameof(project.BookTranslations)); - UseCaseException.NotInformedParam(project.ParticipationEditorialCommittees is null, nameof(project.ParticipationEditorialCommittees)); - UseCaseException.NotInformedParam(project.FullComposerSoloOrchestraAllTracks is null, nameof(project.FullComposerSoloOrchestraAllTracks)); - UseCaseException.NotInformedParam(project.FullComposerSoloOrchestraCompilation is null, nameof(project.FullComposerSoloOrchestraCompilation)); - UseCaseException.NotInformedParam(project.ChamberOrchestraInterpretation is null, nameof(project.ChamberOrchestraInterpretation)); - UseCaseException.NotInformedParam(project.IndividualAndCollectiveArtPerformances is null, nameof(project.IndividualAndCollectiveArtPerformances)); - UseCaseException.NotInformedParam(project.ScientificCulturalArtisticCollectionsCuratorship is null, nameof(project.ScientificCulturalArtisticCollectionsCuratorship)); - UseCaseException.NotInformedParam(project.PatentLetter is null, nameof(project.PatentLetter)); - UseCaseException.NotInformedParam(project.PatentDeposit is null, nameof(project.PatentDeposit)); - UseCaseException.NotInformedParam(project.SoftwareRegistration is null, nameof(project.SoftwareRegistration)); + project.WorkType1 ??= 0; + project.WorkType2 ??= 0; + project.IndexedConferenceProceedings ??= 0; + project.NotIndexedConferenceProceedings ??= 0; + project.CompletedBook ??= 0; + project.OrganizedBook ??= 0; + project.BookChapters ??= 0; + project.BookTranslations ??= 0; + project.ParticipationEditorialCommittees ??= 0; + project.FullComposerSoloOrchestraAllTracks ??= 0; + project.FullComposerSoloOrchestraCompilation ??= 0; + project.ChamberOrchestraInterpretation ??= 0; + project.IndividualAndCollectiveArtPerformances ??= 0; + project.ScientificCulturalArtisticCollectionsCuratorship ??= 0; + project.PatentLetter ??= 0; + project.PatentDeposit ??= 0; + project.SoftwareRegistration ??= 0; // Altera o status do projeto para submetido project.Status = EProjectStatus.Submitted; project.StatusDescription = EProjectStatus.Submitted.GetDescription(); - project.SubmissionDate = DateTime.Now; + project.SubmissionDate = DateTime.UtcNow; // Salva alterações no banco de dados await _projectRepository.Update(project); diff --git a/src/Domain/UseCases/Project/UpdateProject.cs b/src/Domain/UseCases/Project/UpdateProject.cs index 23504ee3..ae8fc026 100644 --- a/src/Domain/UseCases/Project/UpdateProject.cs +++ b/src/Domain/UseCases/Project/UpdateProject.cs @@ -46,28 +46,25 @@ public async Task Execute(Guid? id, UpdateProjectInput // Verifica se o projeto está aberto if (project!.Status == EProjectStatus.Opened) { - // Mapeia input para entidade e realiza validação dos campos informados - var entity = _mapper.Map(input); - // Verifica se a nova Subárea existe - if (entity.SubAreaId != project.SubAreaId) + if (input.SubAreaId != project.SubAreaId) { - _ = await _subAreaRepository.GetById(entity.SubAreaId) + _ = await _subAreaRepository.GetById(input.SubAreaId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); } // Verifica se o novo Tipo de Programa existe - if (entity.ProgramTypeId != project.ProgramTypeId) + if (input.ProgramTypeId != project.ProgramTypeId) { - _ = await _programTypeRepository.GetById(entity.ProgramTypeId) + _ = await _programTypeRepository.GetById(input.ProgramTypeId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); } // Caso tenha sido informado algum aluno no processo de abertura do projeto - if (entity.StudentId.HasValue && entity.StudentId != project.StudentId) + if (input.StudentId.HasValue && input.StudentId != project.StudentId) { // Verifica se o aluno existe - var student = await _studentRepository.GetById(entity.StudentId) + var student = await _studentRepository.GetById(input.StudentId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); // Verifica se o aluno já está em um projeto @@ -76,38 +73,38 @@ public async Task Execute(Guid? id, UpdateProjectInput } // Atualiza campos permitidos - project.Title = entity.Title; - project.KeyWord1 = entity.KeyWord1; - project.KeyWord2 = entity.KeyWord2; - project.KeyWord3 = entity.KeyWord3; - project.IsScholarshipCandidate = entity.IsScholarshipCandidate; - project.Objective = entity.Objective; - project.Methodology = entity.Methodology; - project.ExpectedResults = entity.ExpectedResults; - project.ActivitiesExecutionSchedule = entity.ActivitiesExecutionSchedule; - project.WorkType1 = entity.WorkType1; - project.WorkType2 = entity.WorkType2; - project.IndexedConferenceProceedings = entity.IndexedConferenceProceedings; - project.NotIndexedConferenceProceedings = entity.NotIndexedConferenceProceedings; - project.CompletedBook = entity.CompletedBook; - project.OrganizedBook = entity.OrganizedBook; - project.BookChapters = entity.BookChapters; - project.BookTranslations = entity.BookTranslations; - project.ParticipationEditorialCommittees = entity.ParticipationEditorialCommittees; - project.FullComposerSoloOrchestraAllTracks = entity.FullComposerSoloOrchestraAllTracks; - project.FullComposerSoloOrchestraCompilation = entity.FullComposerSoloOrchestraCompilation; - project.ChamberOrchestraInterpretation = entity.ChamberOrchestraInterpretation; - project.IndividualAndCollectiveArtPerformances = entity.IndividualAndCollectiveArtPerformances; - project.ScientificCulturalArtisticCollectionsCuratorship = entity.ScientificCulturalArtisticCollectionsCuratorship; - project.PatentLetter = entity.PatentLetter; - project.PatentDeposit = entity.PatentDeposit; - project.SoftwareRegistration = entity.SoftwareRegistration; - project.ProgramTypeId = entity.ProgramTypeId; - project.StudentId = entity.StudentId; - project.SubAreaId = entity.SubAreaId; + project.Title = input.Title; + project.KeyWord1 = input.KeyWord1; + project.KeyWord2 = input.KeyWord2; + project.KeyWord3 = input.KeyWord3; + project.IsScholarshipCandidate = input.IsScholarshipCandidate; + project.Objective = input.Objective; + project.Methodology = input.Methodology; + project.ExpectedResults = input.ExpectedResults; + project.ActivitiesExecutionSchedule = input.ActivitiesExecutionSchedule; + project.WorkType1 = input.WorkType1; + project.WorkType2 = input.WorkType2; + project.IndexedConferenceProceedings = input.IndexedConferenceProceedings; + project.NotIndexedConferenceProceedings = input.NotIndexedConferenceProceedings; + project.CompletedBook = input.CompletedBook; + project.OrganizedBook = input.OrganizedBook; + project.BookChapters = input.BookChapters; + project.BookTranslations = input.BookTranslations; + project.ParticipationEditorialCommittees = input.ParticipationEditorialCommittees; + project.FullComposerSoloOrchestraAllTracks = input.FullComposerSoloOrchestraAllTracks; + project.FullComposerSoloOrchestraCompilation = input.FullComposerSoloOrchestraCompilation; + project.ChamberOrchestraInterpretation = input.ChamberOrchestraInterpretation; + project.IndividualAndCollectiveArtPerformances = input.IndividualAndCollectiveArtPerformances; + project.ScientificCulturalArtisticCollectionsCuratorship = input.ScientificCulturalArtisticCollectionsCuratorship; + project.PatentLetter = input.PatentLetter; + project.PatentDeposit = input.PatentDeposit; + project.SoftwareRegistration = input.SoftwareRegistration; + project.ProgramTypeId = input.ProgramTypeId; + project.StudentId = input.StudentId; + project.SubAreaId = input.SubAreaId; // Atualiza o projeto - project = await _projectRepository.Update(entity); + await _projectRepository.Update(project); // Mapeia o projeto para o retorno e retorna return _mapper.Map(project); From 507313e7d880fdc1ad6cbcf931687fbc715f7b92 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 19 Jul 2023 22:22:18 -0300 Subject: [PATCH 030/201] feat(webapi): add project evaluation controller --- .../Contracts/Project/BaseProjectContract.cs | 11 +- src/Domain/Entities/Notice.cs | 2 +- src/Domain/Entities/Project.cs | 5 + .../EvaluateAppealProject.cs | 9 +- .../EvaluateSubmissionProject.cs | 22 ++-- .../IoC/DependencyAdaptersInjection.cs | 2 +- .../IoC/DependencyDomainInjection.cs | 6 +- src/Infrastructure/IoC/DependencyInjection.cs | 1 + .../Context/ApplicationDbContext.cs | 2 + .../ProjectConfiguration.cs | 1 + .../ProjectEvaluationConfiguration.cs | 69 +++++++++++ src/Infrastructure/Persistence/README.md | 2 +- .../ProjectEvaluationRepository.cs | 53 ++++++++ .../ProjectEvaluationController.cs | 113 ++++++++++++++++++ 14 files changed, 270 insertions(+), 28 deletions(-) create mode 100644 src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs create mode 100644 src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs create mode 100644 src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs diff --git a/src/Domain/Contracts/Project/BaseProjectContract.cs b/src/Domain/Contracts/Project/BaseProjectContract.cs index d2a45e7f..3ad5cfb0 100644 --- a/src/Domain/Contracts/Project/BaseProjectContract.cs +++ b/src/Domain/Contracts/Project/BaseProjectContract.cs @@ -8,7 +8,6 @@ public abstract class BaseProjectContract public string? KeyWord2 { get; set; } public string? KeyWord3 { get; set; } public bool IsScholarshipCandidate { get; set; } - // public bool IsProductivityFellow { get; set; } public string? Objective { get; set; } public string? Methodology { get; set; } public string? ExpectedResults { get; set; } @@ -41,15 +40,6 @@ public abstract class BaseProjectContract public int? SoftwareRegistration { get; set; } #endregion - // #region Critérios de Avaliação - // public int? APIndex { get; set; } - // public int? Qualification { get; set; } - // public int? ProjectProposalObjectives { get; set; } - // public int? AcademicScientificProductionCoherence { get; set; } - // public int? ProposalMethodologyAdaptation { get; set; } - // public int? EffectiveContributionToResearch { get; set; } - // #endregion - #region Resultados da Avaliação public int? Status { get; set; } public string? StatusDescription { get; set; } @@ -71,6 +61,7 @@ public abstract class BaseProjectContract public DateTime? RessubmitionDate { get; set; } public DateTime? CancellationDate { get; set; } public string? CancellationReason { get; set; } + public DateTime SendingDocumentationDeadline { get; set; } #endregion } } \ No newline at end of file diff --git a/src/Domain/Entities/Notice.cs b/src/Domain/Entities/Notice.cs index e8b32ffa..a820d5e1 100644 --- a/src/Domain/Entities/Notice.cs +++ b/src/Domain/Entities/Notice.cs @@ -88,7 +88,7 @@ public int? SuspensionYears private int? _sendingDocumentationDeadline; /// - /// Prazo para envio da documentação. + /// Prazo para envio da documentação em dias. /// public int? SendingDocumentationDeadline { diff --git a/src/Domain/Entities/Project.cs b/src/Domain/Entities/Project.cs index 522bd3fa..93e47558 100644 --- a/src/Domain/Entities/Project.cs +++ b/src/Domain/Entities/Project.cs @@ -519,6 +519,11 @@ private set /// Razão de cancelamento do projeto, preenchido pelo professor. /// public string? CancellationReason { get; set; } + + /// + /// Data limite para envio de documentos. + /// + public DateTime SendingDocumentationDeadline { get; set; } #endregion #endregion diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs index 14614655..7acadd2c 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs @@ -58,10 +58,12 @@ public async Task Execute(EvaluateAppealProjectInput "Notice isn't in the appeal stage."); // Verifica se o status da avaliação foi informado. - UseCaseException.NotInformedParam(input.AppealEvaluationStatus is null, nameof(input.AppealEvaluationStatus)); + UseCaseException.NotInformedParam(input.AppealEvaluationStatus is null, + nameof(input.AppealEvaluationStatus)); // Verifica se descrição da avaliação foi informada. - UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.AppealEvaluationDescription), nameof(input.AppealEvaluationDescription)); + UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.AppealEvaluationDescription), + nameof(input.AppealEvaluationDescription)); // Atualiza a avaliação do recurso. projectEvaluation!.AppealEvaluatorId = user.Id; @@ -74,11 +76,12 @@ public async Task Execute(EvaluateAppealProjectInput // Atualiza avaliação do projeto. await _projectEvaluationRepository.Update(projectEvaluation); - // TODO: Se projeto foi aceito, adiciona prazo para envio da documentação. + // Se projeto foi aceito, adiciona prazo para envio da documentação. if ((EProjectStatus)input.AppealEvaluationStatus == EProjectStatus.Accepted) { project.Status = EProjectStatus.DocumentAnalysis; project.StatusDescription = EProjectStatus.DocumentAnalysis.GetDescription(); + project.SendingDocumentationDeadline = DateTime.Now.AddDays(project.Notice?.SendingDocumentationDeadline ?? 30); } else { diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs index aba0bc92..b82479df 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -34,13 +34,14 @@ public async Task Execute(EvaluateSubmissionProjectIn var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Verifica se o usuário logado é um avaliador. - UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN.GetDescription() || user.Role != ERole.PROFESSOR.GetDescription(), - "User is not an evaluator."); + UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN.GetDescription() + || user.Role != ERole.PROFESSOR.GetDescription(), + "O usuário não é um avaliador."); // Verifica se já existe alguma avaliação para o projeto. var projectEvaluation = await _projectEvaluationRepository.GetByProjectId(input.ProjectId); UseCaseException.BusinessRuleViolation(projectEvaluation != null, - "Project already evaluated."); + "Projeto já avaliado."); // Busca projeto pelo Id. var project = await _projectRepository.GetById(input.ProjectId) @@ -48,21 +49,23 @@ public async Task Execute(EvaluateSubmissionProjectIn // Verifica se o avaliador é o professor orientador do projeto. UseCaseException.BusinessRuleViolation(project.ProfessorId == user.Id, - "Evaluator is the project advisor."); + "Avaliador é o orientador do projeto."); // Verifica se o projeto está na fase de submissão. UseCaseException.BusinessRuleViolation(project.Status != EProjectStatus.Submitted, - "Project is not in the submission phase."); + "O projeto não está em fase de submissão."); // Verifica se o edital ainda está aberto. UseCaseException.BusinessRuleViolation(project.Notice?.StartDate > DateTime.Now || project.Notice?.FinalDate < DateTime.Now, - "Notice is closed."); + "Edital encerrado."); // Verifica se o status da avaliação foi informado. - UseCaseException.NotInformedParam(input.SubmissionEvaluationStatus is null, nameof(input.SubmissionEvaluationStatus)); + UseCaseException.NotInformedParam(input.SubmissionEvaluationStatus is null, + nameof(input.SubmissionEvaluationStatus)); // Verifica se a descrição da avaliação foi informada. - UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.SubmissionEvaluationDescription), nameof(input.SubmissionEvaluationDescription)); + UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.SubmissionEvaluationDescription), + nameof(input.SubmissionEvaluationDescription)); // Atribui informações de avaliação. input.SubmissionEvaluationDate = DateTime.Now; @@ -74,11 +77,12 @@ public async Task Execute(EvaluateSubmissionProjectIn // Adiciona avaliação do projeto. await _projectEvaluationRepository.Create(projectEvaluation); - // TODO: Se projeto foi aceito, adiciona prazo para envio da documentação. + // Se projeto foi aceito, adiciona prazo para envio da documentação. if (projectEvaluation.SubmissionEvaluationStatus == EProjectStatus.Accepted) { project.Status = EProjectStatus.DocumentAnalysis; project.StatusDescription = EProjectStatus.DocumentAnalysis.GetDescription(); + project.SendingDocumentationDeadline = DateTime.Now.AddDays(project.Notice?.SendingDocumentationDeadline ?? 30); } else { diff --git a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs index 2e0b4268..1d086c78 100644 --- a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs +++ b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs @@ -18,7 +18,7 @@ public static IServiceCollection AddAdapters(this IServiceCollection services) services.AddScoped(); services.AddScoped(); services.AddScoped(); - // services.AddScoped(); + services.AddScoped(); services.AddScoped(); // services.AddScoped(); services.AddScoped(); diff --git a/src/Infrastructure/IoC/DependencyDomainInjection.cs b/src/Infrastructure/IoC/DependencyDomainInjection.cs index 4df6911e..b12739ea 100644 --- a/src/Infrastructure/IoC/DependencyDomainInjection.cs +++ b/src/Infrastructure/IoC/DependencyDomainInjection.cs @@ -106,9 +106,9 @@ public static IServiceCollection AddDomain(this IServiceCollection services) #endregion #region ProjectEvaluation - // services.AddScoped(); - // services.AddScoped(); - // services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); #endregion #region Student diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs index 43860517..c8c2a0c6 100644 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ b/src/Infrastructure/IoC/DependencyInjection.cs @@ -66,6 +66,7 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs index 858d564f..eeeb6528 100644 --- a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs +++ b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs @@ -25,6 +25,7 @@ public ApplicationDbContext(DbContextOptions options) : ba Notices = Set(); Professors = Set(); Projects = Set(); + ProjectEvaluations = Set(); ProgramTypes = Set(); AssistanceTypes = Set(); Students = Set(); @@ -40,6 +41,7 @@ public ApplicationDbContext(DbContextOptions options) : ba public DbSet Notices { get; set; } public DbSet Professors { get; set; } public DbSet Projects { get; set; } + public DbSet ProjectEvaluations { get; set; } public DbSet ProgramTypes { get; set; } public DbSet AssistanceTypes { get; set; } public DbSet Students { get; set; } diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs index bfc5c127..a5a50202 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs @@ -50,6 +50,7 @@ public void Configure(EntityTypeBuilder builder) builder.Property(p => p.ResubmissionDate); builder.Property(p => p.CancellationDate); builder.Property(p => p.CancellationReason); + builder.Property(p => p.SendingDocumentationDeadline); builder.Property(p => p.DeletedAt); builder.HasOne(a => a.Student) diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs new file mode 100644 index 00000000..989afdd4 --- /dev/null +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs @@ -0,0 +1,69 @@ +using Domain.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Persistence.EntitiesConfiguration +{ + public class ProjectEvaluationConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("ProjectEvaluations"); + builder.HasKey(t => t.Id); + builder.Property(p => p.Id).ValueGeneratedOnAdd(); + + builder.Property(p => p.IsProductivityFellow).IsRequired(); + builder.Property(p => p.SubmissionEvaluationStatus).IsRequired(); + builder.Property(p => p.SubmissionEvaluationDate).IsRequired(); + builder.Property(p => p.SubmissionEvaluationDescription).IsRequired(); + builder.Property(p => p.AppealEvaluationStatus); + builder.Property(p => p.AppealEvaluationDate); + builder.Property(p => p.AppealEvaluationDescription); + builder.Property(p => p.DocumentsEvaluationDate); + builder.Property(p => p.DocumentsEvaluationDescription); + + builder.Property(p => p.FoundWorkType1).HasDefaultValue(0); + builder.Property(p => p.FoundWorkType2).HasDefaultValue(0); + builder.Property(p => p.FoundIndexedConferenceProceedings).HasDefaultValue(0); + builder.Property(p => p.FoundNotIndexedConferenceProceedings).HasDefaultValue(0); + builder.Property(p => p.FoundCompletedBook).HasDefaultValue(0); + builder.Property(p => p.FoundOrganizedBook).HasDefaultValue(0); + builder.Property(p => p.FoundBookChapters).HasDefaultValue(0); + builder.Property(p => p.FoundBookTranslations).HasDefaultValue(0); + builder.Property(p => p.FoundParticipationEditorialCommittees).HasDefaultValue(0); + builder.Property(p => p.FoundFullComposerSoloOrchestraAllTracks).HasDefaultValue(0); + builder.Property(p => p.FoundFullComposerSoloOrchestraCompilation).HasDefaultValue(0); + builder.Property(p => p.FoundChamberOrchestraInterpretation).HasDefaultValue(0); + builder.Property(p => p.FoundIndividualAndCollectiveArtPerformances).HasDefaultValue(0); + builder.Property(p => p.FoundScientificCulturalArtisticCollectionsCuratorship).HasDefaultValue(0); + builder.Property(p => p.FoundPatentLetter).HasDefaultValue(0); + builder.Property(p => p.FoundPatentDeposit).HasDefaultValue(0); + builder.Property(p => p.FoundSoftwareRegistration).HasDefaultValue(0); + builder.Property(p => p.APIndex).HasDefaultValue(0); + + builder.Property(p => p.Qualification).IsRequired(); + builder.Property(p => p.ProjectProposalObjectives).IsRequired(); + builder.Property(p => p.AcademicScientificProductionCoherence).IsRequired(); + builder.Property(p => p.ProposalMethodologyAdaptation).IsRequired(); + builder.Property(p => p.EffectiveContributionToResearch).IsRequired(); + + builder.Property(p => p.ProjectId).IsRequired(); + builder.Property(p => p.SubmissionEvaluatorId).IsRequired(); + builder.Property(p => p.AppealEvaluatorId); + builder.Property(p => p.DocumentsEvaluatorId); + + builder.HasOne(a => a.Project) + .WithOne() + .HasForeignKey(a => a.ProjectId); + builder.HasOne(a => a.SubmissionEvaluator) + .WithMany() + .HasForeignKey(a => a.SubmissionEvaluatorId); + builder.HasOne(a => a.AppealEvaluator) + .WithMany() + .HasForeignKey(a => a.AppealEvaluatorId); + builder.HasOne(a => a.DocumentsEvaluator) + .WithMany() + .HasForeignKey(a => a.DocumentsEvaluatorId); + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index fa48abaa..aea32d1c 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add UpdateAssistanceType --project ../Persistence/Persistence.csproj +dotnet ef migrations add UpdateProjectEvaluation --project ../Persistence/Persistence.csproj ``` Executando as Migrations: diff --git a/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs new file mode 100644 index 00000000..2099a8fc --- /dev/null +++ b/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs @@ -0,0 +1,53 @@ +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Infrastructure.Persistence.Context; +using Microsoft.EntityFrameworkCore; + +namespace Infrastructure.Persistence.Repositories +{ + public class ProjectEvaluationRepository : IProjectEvaluationRepository + { + private readonly ApplicationDbContext _context; + public ProjectEvaluationRepository(ApplicationDbContext context) => _context = context; + + public async Task Create(ProjectEvaluation model) + { + _context.Add(model); + await _context.SaveChangesAsync(); + return model; + } + + public async Task GetById(Guid? id) + { + return await _context.ProjectEvaluations + .Include(x => x.ProjectId) + .Include(x => x.SubmissionEvaluatorId) + .Include(x => x.AppealEvaluatorId) + .Include(x => x.DocumentsEvaluatorId) + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.Id == id) + ?? throw new Exception($"Nenhuma avaliação encontrada para o id {id}"); + } + + public async Task GetByProjectId(Guid? projectId) + { + return await _context.ProjectEvaluations + .Include(x => x.ProjectId) + .Include(x => x.SubmissionEvaluatorId) + .Include(x => x.AppealEvaluatorId) + .Include(x => x.DocumentsEvaluatorId) + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.ProjectId == projectId) + ?? throw new Exception($"Nenhuma avaliação encontrada para o ProjectId {projectId}"); + } + + public async Task Update(ProjectEvaluation model) + { + _context.Update(model); + await _context.SaveChangesAsync(); + return model; + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs b/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs new file mode 100644 index 00000000..6ce4dd3a --- /dev/null +++ b/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs @@ -0,0 +1,113 @@ +using Adapters.Gateways.Project; +using Adapters.Gateways.ProjectEvaluation; +using Adapters.Interfaces; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Infrastructure.WebAPI.Controllers +{ + /// + /// Controller de projetos. + /// + [ApiController] + [Route("api/[controller]")] + [Authorize] + public class ProjectEvaluationController : ControllerBase + { + #region Global Scope + private readonly IProjectEvaluationPresenterController _service; + private readonly ILogger _logger; + + /// + /// Construtor do Controller de projetos. + /// + /// + /// + public ProjectEvaluationController( + IProjectEvaluationPresenterController service, + ILogger logger) + { + _service = service; + _logger = logger; + } + #endregion + + /// + /// Busca avaliação do projeto pelo id do projeto. + /// + /// + /// Avaliação do projeto correspondente + /// Retorna avaliação do projeto correspondente + /// Nenhum avaliação do projeto encontrado. + [HttpGet("{projectId}")] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task> GetEvaluationByProjectId(Guid? projectId) + { + if (projectId == null) + { + const string msg = "O id informado não pode ser nulo."; + _logger.LogWarning(msg); + return BadRequest(msg); + } + + try + { + var model = await _service.GetEvaluationByProjectId(projectId); + _logger.LogInformation("Avaliação do projeto encontrado para o id {id}.", projectId); + return Ok(model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return NotFound(ex.Message); + } + } + + /// + /// Realiza a avaliação da submissão de um projeto. + /// + /// + /// Projeto correspondente + /// Retorna avaliação do projeto correspondente + [HttpPost("submission")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Roles = "ADMIN, PROFESSOR")] + public async Task> EvaluateSubmissionProject([FromBody] EvaluateSubmissionProjectRequest request) + { + try + { + var model = await _service.EvaluateSubmissionProject(request); + _logger.LogInformation("Avaliação da submissão do projeto {id} realizada.", model?.Id); + return Ok(model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); + } + } + + /// + /// Realiza a avaliação do recurso de um projeto. + /// + /// + /// Projeto correspondente + /// Retorna avaliação do projeto correspondente + [HttpPut("appeal")] + [Authorize(Roles = "ADMIN")] + public async Task> EvaluateAppealProjectRequest([FromBody] EvaluateAppealProjectRequest request) + { + try + { + var model = await _service.EvaluateAppealProject(request); + _logger.LogInformation("Avaliação do recurso do projeto {id} realizada.", model?.Id); + return Ok(model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); + } + } + } +} \ No newline at end of file From adbfa515d0aaa53b49aee51a21c9b2cd16d59e93 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 20 Jul 2023 14:46:12 -0300 Subject: [PATCH 031/201] fix(tests): adjust unit and integration tests --- src/Domain.Tests/Entities/NoticeUnitTests.cs | 8 +- .../Entities/ProjectEvaluationUnitTests.cs | 6 +- src/Domain.Tests/Entities/ProjectUnitTests.cs | 12 +- src/Domain.Tests/Entities/StudentUnitTests.cs | 11 +- src/Domain.Tests/Entities/UserUnitTests.cs | 455 +++++++++--------- .../UseCases/Area/CreateAreaTests.cs | 4 + src/Domain/Entities/Area.cs | 14 +- src/Domain/UseCases/Area/CreateArea.cs | 14 +- .../Validation/ExceptionMessageFactory.cs | 16 +- 9 files changed, 268 insertions(+), 272 deletions(-) diff --git a/src/Domain.Tests/Entities/NoticeUnitTests.cs b/src/Domain.Tests/Entities/NoticeUnitTests.cs index 07e2825a..d6011896 100644 --- a/src/Domain.Tests/Entities/NoticeUnitTests.cs +++ b/src/Domain.Tests/Entities/NoticeUnitTests.cs @@ -15,7 +15,7 @@ public void SetStartDate_ValidStartDate_SetsStartDate() { // Arrange var notice = MockValidNotice(); - var startDate = DateTime.Now; + var startDate = DateTime.UtcNow; // Act notice.StartDate = startDate; @@ -39,7 +39,7 @@ public void SetFinalDate_ValidFinalDate_SetsFinalDate() { // Arrange var notice = MockValidNotice(); - var finalDate = DateTime.Now; + var finalDate = DateTime.UtcNow; // Act notice.FinalDate = finalDate; @@ -63,7 +63,7 @@ public void SetAppealStartDate_ValidAppealStartDate_SetsAppealStartDate() { // Arrange var notice = MockValidNotice(); - var appealStartDate = DateTime.Now; + var appealStartDate = DateTime.UtcNow; // Act notice.AppealStartDate = appealStartDate; @@ -87,7 +87,7 @@ public void SetAppealFinalDate_ValidAppealFinalDate_SetsAppealFinalDate() { // Arrange var notice = MockValidNotice(); - var appealFinalDate = DateTime.Now; + var appealFinalDate = DateTime.UtcNow; // Act notice.AppealFinalDate = appealFinalDate; diff --git a/src/Domain.Tests/Entities/ProjectEvaluationUnitTests.cs b/src/Domain.Tests/Entities/ProjectEvaluationUnitTests.cs index 7ec0cdf2..04361991 100644 --- a/src/Domain.Tests/Entities/ProjectEvaluationUnitTests.cs +++ b/src/Domain.Tests/Entities/ProjectEvaluationUnitTests.cs @@ -16,15 +16,15 @@ private ProjectEvaluation MockValidProjectEvaluation() ProjectId = Guid.NewGuid(), IsProductivityFellow = true, SubmissionEvaluatorId = Guid.NewGuid(), - SubmissionEvaluationDate = DateTime.Now, + SubmissionEvaluationDate = DateTime.UtcNow, SubmissionEvaluationStatus = EProjectStatus.Pending, SubmissionEvaluationDescription = "Submission evaluation description", AppealEvaluatorId = Guid.NewGuid(), - AppealEvaluationDate = DateTime.Now, + AppealEvaluationDate = DateTime.UtcNow, AppealEvaluationStatus = EProjectStatus.Accepted, AppealEvaluationDescription = "Appeal evaluation description", DocumentsEvaluatorId = Guid.NewGuid(), - DocumentsEvaluationDate = DateTime.Now, + DocumentsEvaluationDate = DateTime.UtcNow, DocumentsEvaluationDescription = "Documents evaluation description", FoundWorkType1 = 1, FoundWorkType2 = 2, diff --git a/src/Domain.Tests/Entities/ProjectUnitTests.cs b/src/Domain.Tests/Entities/ProjectUnitTests.cs index d3639c49..31ea0fcf 100644 --- a/src/Domain.Tests/Entities/ProjectUnitTests.cs +++ b/src/Domain.Tests/Entities/ProjectUnitTests.cs @@ -494,17 +494,17 @@ public void SetStatusDescription_ValidStatusDescription_SetsStatusDescription() } [Fact] - public void SetAppealDescription_ValidAppealDescription_SetsAppealDescription() + public void SetAppealObservation_ValidAppealObservation_SetsAppealObservation() { // Arrange var project = MockValidProject(); var appealDescription = "Sample appeal description."; // Act - project.AppealDescription = appealDescription; + project.AppealObservation = appealDescription; // Assert - project.AppealDescription.Should().Be(appealDescription); + project.AppealObservation.Should().Be(appealDescription); } [Fact] @@ -512,7 +512,7 @@ public void SetSubmissionDate_ValidSubmissionDate_SetsSubmissionDate() { // Arrange var project = MockValidProject(); - var submissionDate = new DateTime(2023, 5, 30); + var submissionDate = DateTime.UtcNow; // Act project.SubmissionDate = submissionDate; @@ -526,7 +526,7 @@ public void SetResubmissionDate_ValidResubmissionDate_SetsResubmissionDate() { // Arrange var project = MockValidProject(); - var resubmissionDate = new DateTime(2023, 6, 10); + var resubmissionDate = DateTime.UtcNow; // Act project.ResubmissionDate = resubmissionDate; @@ -540,7 +540,7 @@ public void SetCancellationDate_ValidCancellationDate_SetsCancellationDate() { // Arrange var project = MockValidProject(); - var cancellationDate = new DateTime(2023, 6, 15); + var cancellationDate = DateTime.UtcNow; // Act project.CancellationDate = cancellationDate; diff --git a/src/Domain.Tests/Entities/StudentUnitTests.cs b/src/Domain.Tests/Entities/StudentUnitTests.cs index 162f6e98..ebccc9f5 100644 --- a/src/Domain.Tests/Entities/StudentUnitTests.cs +++ b/src/Domain.Tests/Entities/StudentUnitTests.cs @@ -27,8 +27,7 @@ public class StudentUnitTests campusId: Guid.NewGuid(), courseId: Guid.NewGuid(), startYear: "2022", - studentAssistanceProgramId: Guid.NewGuid(), - userId: Guid.NewGuid() + studentAssistanceProgramId: Guid.NewGuid() ); [Fact] @@ -36,7 +35,7 @@ public void SetBirthDate_ValidDate_SetsBirthDate() { // Arrange var student = MockValidStudent(); - var birthDate = DateTime.Now.AddDays(-1); + var birthDate = DateTime.UtcNow.AddDays(-1); // Act student.BirthDate = birthDate; @@ -62,7 +61,7 @@ public void SetBirthDate_FutureDate_ThrowsException() var student = MockValidStudent(); // Act & Assert - Assert.Throws(() => student.BirthDate = DateTime.Now.AddDays(1)); + Assert.Throws(() => student.BirthDate = DateTime.UtcNow.AddDays(1)); } [Fact] @@ -129,7 +128,7 @@ public void SetDispatchDate_ValidDate_SetsDispatchDate() { // Arrange var student = MockValidStudent(); - var dispatchDate = DateTime.Now.AddDays(-1); + var dispatchDate = DateTime.UtcNow.AddDays(-1); // Act student.DispatchDate = dispatchDate; @@ -155,7 +154,7 @@ public void SetDispatchDate_FutureDate_ThrowsException() var student = MockValidStudent(); // Act & Assert - Assert.Throws(() => student.DispatchDate = DateTime.Now.AddDays(1)); + Assert.Throws(() => student.DispatchDate = DateTime.UtcNow.AddDays(1)); } [Fact] diff --git a/src/Domain.Tests/Entities/UserUnitTests.cs b/src/Domain.Tests/Entities/UserUnitTests.cs index d56da493..fb4105ae 100644 --- a/src/Domain.Tests/Entities/UserUnitTests.cs +++ b/src/Domain.Tests/Entities/UserUnitTests.cs @@ -1,265 +1,258 @@ -using Domain.Entities; +using System; +using System.Reflection; +using Domain.Entities; using Domain.Entities.Enums; using Domain.Validation; -using FluentAssertions; using Xunit; -namespace Domain.Tests.Entities; -public class UserUniTests +namespace Domain.Tests.Entities { - [Fact(DisplayName = "Create User With Valid State")] - public void CreateUser_WithValidParameters_ResultObjectValidState() + public class UserUnitTests { - Action action = () => new User("User Name", "username@gmail.com", "123456", "15162901784", ERole.ADMIN, null); - action.Should() - .NotThrow(); - } + private User _user; + private User MockValidUser() + { + if (_user == null) + _user = InvokeInternalConstructor("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); + return _user; + } - #region Name Tests - [Fact] - public void CreateUser_ShortNameValue_DomainExceptionShortName() - { - Action action = () => new User("Us", "username@gmail.com", "123456", "15162901784", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.MinLength("name", 3)); - } + [Fact] + public void TestInternalConstructor() + { + // Arrange + var name = "John Doe"; + var email = "john.doe@example.com"; + var password = "strongpassword"; + var cpf = "92114660087"; + var role = ERole.ADMIN; - [Fact] - public void CreateUser_BigNameValue_DomainExceptionBigName() - { - Action action = () => new User("frttcgyxukstpasvqpbhqmsbjjvolqsrbfkaiptymddeegoedgodnxtlotplntqitreugkiernzsjmganfdjxcyagoqrzmadqffbsvehnblaovkzclijojbbrustwczcilguchcmrfswjjwquyjbhwgdtnwysdxuymmaibjwvnpvemjxpdkirtjezwyifnrmngoodufstmndqcgawzlvqazxfhdhrtcditryoiczqabbpdhqgwqzukrenvvezlwiciwbprebrxuiytnumvupvoqtdfnbmoxrrgalrudecdugkfblogserwipsrbcqtmotleqarahfqxokfqmrsorjuofatcvsd", "username@gmail.com", "123456", "15162901784", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.MaxLength("name", 300)); - } + // Act + var user = InvokeInternalConstructor(name, email, password, cpf, role); - [Fact] - public void CreateUser_MissingNameValue_DomainExceptionRequiredName() - { - Action action = () => new User(string.Empty, "username@gmail.com", "123456", "15162901784", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.Required("name")); - } + // Assert + Assert.Equal(name, user.Name); + Assert.Equal(email, user.Email); + Assert.Equal(password, user.Password); + Assert.Equal(cpf, user.CPF); + Assert.Equal(role, user.Role); + } - [Fact] - public void CreateUser_WithNullNameValue_DomainExceptionInvalidName() - { - Action action = () => new User(null, "username@gmail.com", "123456", "15162901784", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.Required("name")); - } + private T InvokeInternalConstructor(params object[] args) + { + var constructor = typeof(T).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, CallingConventions.Any, args.Select(a => a?.GetType()).ToArray(), null); + if (constructor == null) + throw new InvalidOperationException("Internal constructor not found."); - [Fact] - public void UpdateUserName_WithValidParameters_ResultObjectValidState() - { - var model = new User("User Name", "username@gmail.com", "123456", "15162901784", ERole.ADMIN, null); - Action action = () => model.Name = "Teste Name"; - action.Should() - .NotThrow(); - } + return (T)constructor.Invoke(args); + } - [Fact] - public void UpdateUserName_WithInvalidParameters_ResultObjectValidState() - { - var model = new User("User Name", "username@gmail.com", "123456", "15162901784", ERole.ADMIN, null); - Action action = () => model.Name = string.Empty; - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.Required("name")); - } - #endregion + [Fact] + public void SetName_ValidName_SetsName() + { + // Arrange + var user = MockValidUser(); + var name = "John Doe Updated"; - #region Email Tests - [Fact] - public void CreateUser_MissingEmailValue_DomainExceptionRequiredEmail() - { - Action action = () => new User("User Name", string.Empty, "123456", "15162901784", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.Required("email")); - } + // Act + user.Name = name; - [Fact] - public void CreateUser_BigEmailValue_DomainExceptionBigEmail() - { - Action action = () => new User("User Name", "frttcgyxukstpasvqpbhqmsbjjvolqsrbfkaiptymddeegoedgodnxtlotplntqitreugkiernzsjmganfdjxcyagoqrzmadqffbsvehnblaovkzclijojbbrustwczcilguchcmrfswjjwquyjbhwgdtnwysdxuymmaibjwvnpvemjxpdkirtjezwyifnrmngoodufstmndqcgawzlvqazxfhdhrtcditryoiczqabbpdhqgwqzukrenvvezlwiciwbprebrxuiytnumvupvoqtdfnbmoxrrgalrudecdugkfblogserwipsrbcqtmotleqarahfqxokfqmrsorjuofatcvsd", "123456", "15162901784", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.MaxLength("email", 300)); - } + // Assert + Assert.Equal(name, user.Name); + } - [Fact] - public void CreateUser_WithNullEmailValue_DomainExceptionRequiredEmail() - { - Action action = () => new User("User Name", null, "123456", "15162901784", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.Required("email")); - } + [Fact] + public void SetName_NullOrEmptyName_ThrowsException() + { + // Arrange + var user = MockValidUser(); - [Fact] - public void CreateUser_WithInvalidEmailValue_DomainExceptionInvalidEmail() - { - Action action = () => new User("User Name", "aaaa-bbbb", "123456", "15162901784", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.InvalidEmail("email")); - } - #endregion + // Act & Assert + Assert.Throws(() => user.Name = null); + Assert.Throws(() => user.Name = string.Empty); + } - #region Password Tests - [Fact] - public void CreateUser_ShortPasswordValue_DomainExceptionShortPassword() - { - Action action = () => new User("User Name", "username@gmail.com", "123", "15162901784", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.MinLength("password", 6)); - } + [Fact] + public void SetName_TooShortName_ThrowsException() + { + // Arrange + var user = MockValidUser(); - [Fact] - public void CreateUser_BigPasswordValue_DomainExceptionBigPassword() - { - Action action = () => new User("User Name", "username@gmail.com", "frttcgyxukstpasvqpbhqmsbjjvolqsrbfkaiptymddeegoedgodnxtlotplntqitreugkiernzsjmganfdjxcyagoqrzmadqffbsvehnblaovkzclijojbbrustwczcilguchcmrfswjjwquyjbhwgdtnwysdxuymmaibjwvnpvemjxpdkirtjezwyifnrmngoodufstmndqcgawzlvqazxfhdhrtcditryoiczqabbpdhqgwqzukrenvvezlwiciwbprebrxuiytnumvupvoqtdfnbmoxrrgalrudecdugkfblogserwipsrbcqtmotleqarahfqxokfqmrsorjuofatcvsd", "15162901784", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.MaxLength("password", 300)); - } + // Act & Assert + Assert.Throws(() => user.Name = "AB"); + } - [Fact] - public void CreateUser_MissingPasswordValue_DomainExceptionRequiredPassword() - { - Action action = () => new User("User Name", "username@gmail.com", string.Empty, "15162901784", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.Required("password")); - } + [Fact] + public void SetName_TooLongName_ThrowsException() + { + // Arrange + var user = MockValidUser(); - [Fact] - public void CreateUser_WithNullPasswordValue_DomainExceptionInvalidPassword() - { - Action action = () => new User("User Name", "username@gmail.com", null, "15162901784", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.Required("password")); - } + // Act & Assert + Assert.Throws(() => user.Name = new string('A', 500)); + } - [Fact] - public void UpdateUserPassword_WithValidParameters_ResultObjectValidState() - { - var model = new User("User Name", "username@gmail.com", "123456", "15162901784", ERole.ADMIN, null); - Action action = () => model.Password = "987654321"; - action.Should() - .NotThrow(); - } + [Fact] + public void SetEmail_ValidEmail_SetsEmail() + { + // Arrange + var user = MockValidUser(); + var email = "john.doe.updated@example.com"; - [Fact] - public void UpdateUserPassword_WithInvalidParameters_ResultObjectValidState() - { - var model = new User("User Name", "username@gmail.com", "123456", "15162901784", ERole.ADMIN, null); - Action action = () => model.Password = string.Empty; - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.Required("password")); - } - #endregion + // Act + user.Email = email; - #region CPF Tests - [Fact] - public void CreateUser_ShortCpfValue_DomainExceptionShortCpf() - { - Action action = () => new User("User Name", "username@gmail.com", "123456", "1516290178", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.WithLength("cpf", 11)); - } + // Assert + Assert.Equal(email, user.Email); + } - [Fact] - public void CreateUser_BigCpfValue_DomainExceptionBigCpf() - { - Action action = () => new User("User Name", "username@gmail.com", "123456", "151629017840", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.WithLength("cpf", 11)); - } + [Fact] + public void SetEmail_NullOrEmptyEmail_ThrowsException() + { + // Arrange + var user = MockValidUser(); - [Fact] - public void CreateUser_MissingCpfValue_DomainExceptionRequiredCpf() - { - Action action = () => new User("User Name", "username@gmail.com", "123456", string.Empty, ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.Required("cpf")); - } + // Act & Assert + Assert.Throws(() => user.Email = null); + Assert.Throws(() => user.Email = string.Empty); + } - [Fact] - public void CreateUser_WithNullCpfValue_DomainExceptionInvalidCpf() - { - Action action = () => new User("User Name", "username@gmail.com", "123456", null, ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.Required("cpf")); - } + [Fact] + public void SetEmail_InvalidEmail_ThrowsException() + { + // Arrange + var user = MockValidUser(); - [Fact] - public void CreateUser_WithInvalidCpfValue_DomainExceptionInvalidCpf() - { - Action action = () => new User("User Name", "username@gmail.com", "123456", "12345678911", ERole.ADMIN, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.InvalidCpf()); - } + // Act & Assert + Assert.Throws(() => user.Email = "invalid-email"); + } - [Fact] - public void UpdateUserCpf_WithValidParameters_ResultObjectValidState() - { - var model = new User("User Name", "username@gmail.com", "123456", "15162901784", ERole.ADMIN, null); - Action action = () => model.CPF = "15162901784"; - action.Should() - .NotThrow(); - } + [Fact] + public void SetEmail_TooLongEmail_ThrowsEntityExceptionValidation() + { + // Arrange + var user = MockValidUser(); + var longEmail = new string('a', 300) + "@example.com"; - [Fact] - public void UpdateUserCpf_WithInvalidParameters_ResultObjectValidState() - { - var model = new User("User Name", "username@gmail.com", "123456", "15162901784", ERole.ADMIN, null); - Action action = () => model.CPF = string.Empty; - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.Required("cpf")); - } - #endregion + // Act & Assert + var ex = Assert.Throws(() => user.Email = longEmail); + // Assert.Equal("email", ex.PropertyName); // Ensure that the correct property triggered the exception + Assert.Contains("email", ex.Message); // Ensure that the exception message contains the property name + } - #region Role Tests - [Fact] - public void CreateUser_WithNullRoleValue_DomainExceptionInvalidRole() - { - Action action = () => new User("User Name", "username@gmail.com", "123456", "15162901784", null, null); - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.Required("role")); - } + [Fact] + public void SetPassword_ValidPassword_SetsPassword() + { + // Arrange + var user = MockValidUser(); + var password = "new-strong-password"; - [Fact] - public void UpdateUserRole_WithValidParameters_ResultObjectValidState() - { - var model = new User("User Name", "username@gmail.com", "123456", "15162901784", ERole.ADMIN, null); - Action action = () => model.Role = ERole.STUDENT; - action.Should() - .NotThrow(); - } + // Act + user.Password = password; - [Fact] - public void UpdateUserRole_WithInvalidParameters_ResultObjectValidState() - { - var model = new User("User Name", "username@gmail.com", "123456", "15162901784", ERole.ADMIN, null); - Action action = () => model.Role = null; - action.Should() - .Throw() - .WithMessage(ExceptionMessageFactory.Required("role")); + // Assert + Assert.Equal(password, user.Password); + } + + [Fact] + public void SetPassword_NullOrEmptyPassword_ThrowsException() + { + // Arrange + var user = MockValidUser(); + + // Act & Assert + Assert.Throws(() => user.Password = null); + Assert.Throws(() => user.Password = string.Empty); + } + + [Fact] + public void SetPassword_TooShortPassword_ThrowsException() + { + // Arrange + var user = MockValidUser(); + + // Act & Assert + Assert.Throws(() => user.Password = "abc12"); + } + + [Fact] + public void SetPassword_TooLongPassword_ThrowsException() + { + // Arrange + var user = MockValidUser(); + var longPassword = new string('a', 400); + + // Act & Assert + Assert.Throws(() => user.Password = longPassword); + } + + [Fact] + public void SetCPF_ValidCPF_SetsCPF() + { + // Arrange + var user = MockValidUser(); + var cpf = "58247313065"; + + // Act + user.CPF = cpf; + + // Assert + Assert.Equal(cpf, user.CPF); + } + + [Fact] + public void SetCPF_NullOrEmptyCPF_ThrowsException() + { + // Arrange + var user = MockValidUser(); + + // Act & Assert + Assert.Throws(() => user.CPF = null); + Assert.Throws(() => user.CPF = string.Empty); + } + + [Fact] + public void SetCPF_InvalidCPF_ThrowsException() + { + // Arrange + var user = MockValidUser(); + + // Act & Assert + Assert.Throws(() => user.CPF = "123.456.789-00"); + } + + [Fact] + public void SetCPF_InvalidLengthCPF_ThrowsException() + { + // Arrange + var user = MockValidUser(); + + // Act & Assert + Assert.Throws(() => user.CPF = "123456789012"); + } + + [Fact] + public void SetRole_ValidRole_SetsRole() + { + // Arrange + var user = MockValidUser(); + var role = ERole.ADMIN; + + // Act + user.Role = role; + + // Assert + Assert.Equal(role, user.Role); + } + + [Fact] + public void SetRole_NullRole_ThrowsException() + { + // Arrange + var user = MockValidUser(); + + // Act & Assert + Assert.Throws(() => user.Role = null); + } } - #endregion } \ No newline at end of file diff --git a/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs b/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs index 832e00b0..5f7fcdb0 100644 --- a/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs +++ b/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs @@ -42,6 +42,7 @@ public async Task Execute_WithValidInput_ShouldCreateArea() // Arrange var input = new CreateAreaInput { + Name = "Area Name", Code = "areaCode0", MainAreaId = Guid.NewGuid(), }; @@ -72,6 +73,7 @@ public void Execute_WithExistingCode_ShouldThrowException() // Arrange var input = new CreateAreaInput { + Name = "Area Name", Code = "existingCode2", MainAreaId = Guid.NewGuid(), }; @@ -94,6 +96,7 @@ public void Execute_WithMissingMainAreaId_ShouldThrowException() // Arrange var input = new CreateAreaInput { + Name = "Area Name", Code = "areaCode1", MainAreaId = null, }; @@ -112,6 +115,7 @@ public void Execute_WithInactiveMainArea_ShouldThrowException() // Arrange var input = new CreateAreaInput { + Name = "Area Name", Code = "areaCode2", MainAreaId = Guid.NewGuid(), }; diff --git a/src/Domain/Entities/Area.cs b/src/Domain/Entities/Area.cs index 2b59a7a6..024ce7a1 100644 --- a/src/Domain/Entities/Area.cs +++ b/src/Domain/Entities/Area.cs @@ -16,7 +16,7 @@ public Guid? MainAreaId set { EntityExceptionValidation.When(!value.HasValue, - ExceptionMessageFactory.Invalid("mainAreaId")); + ExceptionMessageFactory.Invalid("Id da Área Principal")); _mainAreaId = value; } } @@ -27,11 +27,11 @@ public string? Code set { EntityExceptionValidation.When(string.IsNullOrEmpty(value), - ExceptionMessageFactory.Required("code")); + ExceptionMessageFactory.Required("Código")); EntityExceptionValidation.When(value?.Length < 3, - ExceptionMessageFactory.MinLength("code", 3)); + ExceptionMessageFactory.MinLength("Código", 3)); EntityExceptionValidation.When(value?.Length > 100, - ExceptionMessageFactory.MaxLength("code", 100)); + ExceptionMessageFactory.MaxLength("Código", 100)); _code = value; } } @@ -42,11 +42,11 @@ public string? Name set { EntityExceptionValidation.When(string.IsNullOrEmpty(value), - ExceptionMessageFactory.Required("name")); + ExceptionMessageFactory.Required("Nome")); EntityExceptionValidation.When(value?.Length < 3, - ExceptionMessageFactory.MinLength("name", 3)); + ExceptionMessageFactory.MinLength("Nome", 3)); EntityExceptionValidation.When(value?.Length > 300, - ExceptionMessageFactory.MaxLength("name", 300)); + ExceptionMessageFactory.MaxLength("Nome", 300)); _name = value; } } diff --git a/src/Domain/UseCases/Area/CreateArea.cs b/src/Domain/UseCases/Area/CreateArea.cs index c6475abd..c79762a4 100644 --- a/src/Domain/UseCases/Area/CreateArea.cs +++ b/src/Domain/UseCases/Area/CreateArea.cs @@ -20,20 +20,20 @@ public CreateArea(IAreaRepository areaRepository, IMainAreaRepository mainAreaRe } #endregion - public async Task Execute(CreateAreaInput model) + public async Task Execute(CreateAreaInput input) { - var entity = await _areaRepository.GetByCode(model.Code); - UseCaseException.BusinessRuleViolation(entity != null, $"There is already a Main Area for the code {model.Code}."); + var entity = await _areaRepository.GetByCode(input.Code); + UseCaseException.BusinessRuleViolation(entity != null, $"Já existe uma área principal para o código {input.Code}."); // Verifica id da área princial - UseCaseException.NotInformedParam(model.MainAreaId == null, nameof(model.MainAreaId)); + UseCaseException.NotInformedParam(input.MainAreaId == null, nameof(input.MainAreaId)); // Valida se existe área principal - var area = await _mainAreaRepository.GetById(model.MainAreaId); - UseCaseException.BusinessRuleViolation(area?.DeletedAt != null, "The informed Main Area is inactive."); + var area = await _mainAreaRepository.GetById(input.MainAreaId); + UseCaseException.BusinessRuleViolation(area?.DeletedAt != null, "A Área Principal informada está inativa."); // Mapeia input para entidade - var newEntity = new Entities.Area(model.MainAreaId, model.Name, model.Code); + var newEntity = new Entities.Area(input.MainAreaId, input.Code, input.Name); // Cria nova área entity = await _areaRepository.Create(newEntity); diff --git a/src/Domain/Validation/ExceptionMessageFactory.cs b/src/Domain/Validation/ExceptionMessageFactory.cs index d790a8b2..6593ecff 100644 --- a/src/Domain/Validation/ExceptionMessageFactory.cs +++ b/src/Domain/Validation/ExceptionMessageFactory.cs @@ -1,12 +1,12 @@ namespace Domain.Validation; public static class ExceptionMessageFactory { - public static string MinLength(string prop, int length) => $"The value of ({prop}) is too short. The minimum length is {length} characters."; - public static string MaxLength(string prop, int length) => $"The value of ({prop}) is too long. The maximum length is {length} characters."; - public static string WithLength(string prop, int length) => $"Invalid value for ({prop}). The number of characters should be {length}."; - public static string Required(string prop) => $"Invalid value for ({prop}). {prop} must be provided."; - public static string Invalid(string prop) => $"Invalid value for ({prop})."; - public static string InvalidEmail(string prop) => $"Invalid value for ({prop}). The provided email is not valid."; - public static string InvalidCpf() => "Invalid CPF value. The number sequence is not a valid CPF according to government logic."; - public static string LessThan(string prop, string value) => $"The value of ({prop}) cannot be less than {value}."; + public static string MinLength(string prop, int length) => $"O valor de ({prop}) é muito curto. O comprimento mínimo é de {length} caracteres."; + public static string MaxLength(string prop, int length) => $"O valor de ({prop}) é muito longo. O comprimento máximo é de {length} caracteres."; + public static string WithLength(string prop, int length) => $"Valor inválido para ({prop}). O número de caracteres deve ser {length}."; + public static string Required(string prop) => $"Valor inválido para ({prop}). {prop} deve ser fornecido."; + public static string Invalid(string prop) => $"Valor inválido para ({prop})."; + public static string InvalidEmail(string prop) => $"Valor inválido para ({prop}). O email fornecido não é válido."; + public static string InvalidCpf() => "Valor de CPF inválido. A sequência numérica não é um CPF válido de acordo com a lógica do governo."; + public static string LessThan(string prop, string value) => $"O valor de ({prop}) não pode ser menor que {value}."; } \ No newline at end of file From 256ec14e22ef3b4dcd04f7cd4b3082877fab127e Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 20 Jul 2023 14:47:05 -0300 Subject: [PATCH 032/201] refactor(domain): change datetime now to utcnow --- src/Domain/Entities/Primitives/Entity.cs | 3 +- src/Domain/Entities/Project.cs | 28 ++++++++++++++++--- src/Domain/Entities/ProjectEvaluation.cs | 16 +++++++++-- src/Domain/Entities/Student.cs | 12 ++++---- src/Domain/Entities/StudentDocuments.cs | 2 +- src/Domain/UseCases/Project/AppealProject.cs | 2 +- src/Domain/UseCases/Project/OpenProject.cs | 2 +- .../EvaluateAppealProject.cs | 6 ++-- .../EvaluateSubmissionProject.cs | 6 ++-- .../CreateStudentDocuments.cs | 2 +- 10 files changed, 54 insertions(+), 25 deletions(-) diff --git a/src/Domain/Entities/Primitives/Entity.cs b/src/Domain/Entities/Primitives/Entity.cs index 4ac7f0dd..e691e479 100644 --- a/src/Domain/Entities/Primitives/Entity.cs +++ b/src/Domain/Entities/Primitives/Entity.cs @@ -1,5 +1,4 @@ -using System; -namespace Domain.Entities.Primitives +namespace Domain.Entities.Primitives { public abstract class Entity { diff --git a/src/Domain/Entities/Project.cs b/src/Domain/Entities/Project.cs index 93e47558..2427ff70 100644 --- a/src/Domain/Entities/Project.cs +++ b/src/Domain/Entities/Project.cs @@ -503,17 +503,32 @@ private set /// /// Data de submissão do projeto na plataforma. /// - public DateTime? SubmissionDate { get; set; } + private DateTime? _submissionDate; + public DateTime? SubmissionDate + { + get { return _submissionDate; } + set { _submissionDate = value.HasValue ? value.Value.ToUniversalTime() : null; } + } /// /// Data de ressubmissão do projeto na plataforma. /// - public DateTime? ResubmissionDate { get; set; } + private DateTime? _resubmissionDate; + public DateTime? ResubmissionDate + { + get { return _resubmissionDate; } + set { _resubmissionDate = value.HasValue ? value.Value.ToUniversalTime() : null; } + } /// /// Data de cancelamento do projeto. /// - public DateTime? CancellationDate { get; set; } + private DateTime? _cancellationDate; + public DateTime? CancellationDate + { + get { return _cancellationDate; } + set { _cancellationDate = value.HasValue ? value.Value.ToUniversalTime() : null; } + } /// /// Razão de cancelamento do projeto, preenchido pelo professor. @@ -523,7 +538,12 @@ private set /// /// Data limite para envio de documentos. /// - public DateTime SendingDocumentationDeadline { get; set; } + private DateTime? _sendingDocumentationDeadline; + public DateTime? SendingDocumentationDeadline + { + get { return _sendingDocumentationDeadline; } + set { _sendingDocumentationDeadline = value.HasValue ? value.Value.ToUniversalTime() : null; } + } #endregion #endregion diff --git a/src/Domain/Entities/ProjectEvaluation.cs b/src/Domain/Entities/ProjectEvaluation.cs index a9ef4182..b50d35ac 100644 --- a/src/Domain/Entities/ProjectEvaluation.cs +++ b/src/Domain/Entities/ProjectEvaluation.cs @@ -62,7 +62,7 @@ public DateTime? SubmissionEvaluationDate { EntityExceptionValidation.When(value is null, ExceptionMessageFactory.Required(nameof(SubmissionEvaluationDate))); - _submissionEvaluationDate = value; + _submissionEvaluationDate = value.HasValue ? value.Value.ToUniversalTime() : null; } } @@ -104,7 +104,12 @@ public string? SubmissionEvaluationDescription /// /// Data da avaliação do recurso. /// - public DateTime? AppealEvaluationDate { get; set; } + private DateTime? _appealEvaluationDate; + public DateTime? AppealEvaluationDate + { + get { return _appealEvaluationDate; } + set { _appealEvaluationDate = value.HasValue ? value.Value.ToUniversalTime() : null; } + } /// /// Status da avaliação do recurso. @@ -124,7 +129,12 @@ public string? SubmissionEvaluationDescription /// /// Data da avaliação da documentação do projeto. /// - public DateTime? DocumentsEvaluationDate { get; set; } + private DateTime? _documentsEvaluationDate; + public DateTime? DocumentsEvaluationDate + { + get { return _documentsEvaluationDate; } + set { _documentsEvaluationDate = value.HasValue ? value.Value.ToUniversalTime() : null; } + } /// /// Nota da avaliação da documentação do projeto. diff --git a/src/Domain/Entities/Student.cs b/src/Domain/Entities/Student.cs index 4b2659ad..db24e5d7 100644 --- a/src/Domain/Entities/Student.cs +++ b/src/Domain/Entities/Student.cs @@ -21,9 +21,9 @@ public DateTime BirthDate { EntityExceptionValidation.When(value == default, ExceptionMessageFactory.Required("Data de Nascimento")); - EntityExceptionValidation.When(value >= DateTime.Now, - ExceptionMessageFactory.LessThan("Data de Nascimento", DateTime.Now.ToString("dd/MM/yyyy"))); - _birthDate = value; + EntityExceptionValidation.When(value >= DateTime.UtcNow, + ExceptionMessageFactory.LessThan("Data de Nascimento", DateTime.UtcNow.ToString("dd/MM/yyyy"))); + _birthDate = value.ToUniversalTime(); } } @@ -70,10 +70,10 @@ public DateTime DispatchDate { EntityExceptionValidation.When(value == default, ExceptionMessageFactory.Required("Data Expedição da identidade")); - EntityExceptionValidation.When(value >= DateTime.Now, + EntityExceptionValidation.When(value >= DateTime.UtcNow, ExceptionMessageFactory.LessThan("Data Expedição da identidade", - DateTime.Now.ToString("dd/MM/yyyy"))); - _dispatchDate = value; + DateTime.UtcNow.ToString("dd/MM/yyyy"))); + _dispatchDate = value.ToUniversalTime(); } } diff --git a/src/Domain/Entities/StudentDocuments.cs b/src/Domain/Entities/StudentDocuments.cs index c179dc93..cbea7108 100644 --- a/src/Domain/Entities/StudentDocuments.cs +++ b/src/Domain/Entities/StudentDocuments.cs @@ -103,7 +103,7 @@ public string? ParentalAuthorization get => _parentalAuthorization; set { - if (Project?.Student?.BirthDate >= DateTime.Now.AddYears(-18)) + if (Project?.Student?.BirthDate >= DateTime.UtcNow.AddYears(-18)) { EntityExceptionValidation.When(value is null, ExceptionMessageFactory.Required(nameof(_parentalAuthorization))); diff --git a/src/Domain/UseCases/Project/AppealProject.cs b/src/Domain/UseCases/Project/AppealProject.cs index 89381634..b2abed0b 100644 --- a/src/Domain/UseCases/Project/AppealProject.cs +++ b/src/Domain/UseCases/Project/AppealProject.cs @@ -40,7 +40,7 @@ public async Task Execute(Guid? projectId, string? app project.Status = EProjectStatus.Evaluation; project.StatusDescription = EProjectStatus.Evaluation.GetDescription(); project.AppealObservation = appealDescription; - project.ResubmissionDate = DateTime.Now; + project.ResubmissionDate = DateTime.UtcNow; // Salva alterações no banco de dados await _projectRepository.Update(project); diff --git a/src/Domain/UseCases/Project/OpenProject.cs b/src/Domain/UseCases/Project/OpenProject.cs index fbac082a..b4b02697 100644 --- a/src/Domain/UseCases/Project/OpenProject.cs +++ b/src/Domain/UseCases/Project/OpenProject.cs @@ -43,7 +43,7 @@ public async Task Execute(OpenProjectInput input) ?? throw new ArgumentException("Edital não encontrado."); // Verifica se o período do edital é válido - if (notice.StartDate > DateTime.Now || notice.FinalDate < DateTime.Now) + if (notice.StartDate > DateTime.UtcNow || notice.FinalDate < DateTime.UtcNow) throw new ArgumentException("Fora do período de inscrição no edital."); // Verifica se a Subárea existe diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs index 7acadd2c..b38ba824 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs @@ -54,7 +54,7 @@ public async Task Execute(EvaluateAppealProjectInput "Project is not in the evaluation phase."); // Verifica se o edital está na fase de recurso. - UseCaseException.BusinessRuleViolation(projectEvaluation?.Project?.Notice?.AppealStartDate > DateTime.Now || projectEvaluation?.Project?.Notice?.AppealFinalDate < DateTime.Now, + UseCaseException.BusinessRuleViolation(projectEvaluation?.Project?.Notice?.AppealStartDate > DateTime.UtcNow || projectEvaluation?.Project?.Notice?.AppealFinalDate < DateTime.UtcNow, "Notice isn't in the appeal stage."); // Verifica se o status da avaliação foi informado. @@ -67,7 +67,7 @@ public async Task Execute(EvaluateAppealProjectInput // Atualiza a avaliação do recurso. projectEvaluation!.AppealEvaluatorId = user.Id; - projectEvaluation.AppealEvaluationDate = DateTime.Now; + projectEvaluation.AppealEvaluationDate = DateTime.UtcNow; // Atualiza a descrição e o status da avaliação do recurso. projectEvaluation.AppealEvaluationDescription = input.AppealEvaluationDescription; @@ -81,7 +81,7 @@ public async Task Execute(EvaluateAppealProjectInput { project.Status = EProjectStatus.DocumentAnalysis; project.StatusDescription = EProjectStatus.DocumentAnalysis.GetDescription(); - project.SendingDocumentationDeadline = DateTime.Now.AddDays(project.Notice?.SendingDocumentationDeadline ?? 30); + project.SendingDocumentationDeadline = DateTime.UtcNow.AddDays(project.Notice?.SendingDocumentationDeadline ?? 30); } else { diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs index b82479df..14306be4 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -56,7 +56,7 @@ public async Task Execute(EvaluateSubmissionProjectIn "O projeto não está em fase de submissão."); // Verifica se o edital ainda está aberto. - UseCaseException.BusinessRuleViolation(project.Notice?.StartDate > DateTime.Now || project.Notice?.FinalDate < DateTime.Now, + UseCaseException.BusinessRuleViolation(project.Notice?.StartDate > DateTime.UtcNow || project.Notice?.FinalDate < DateTime.UtcNow, "Edital encerrado."); // Verifica se o status da avaliação foi informado. @@ -68,7 +68,7 @@ public async Task Execute(EvaluateSubmissionProjectIn nameof(input.SubmissionEvaluationDescription)); // Atribui informações de avaliação. - input.SubmissionEvaluationDate = DateTime.Now; + input.SubmissionEvaluationDate = DateTime.UtcNow; input.SubmissionEvaluatorId = user.Id; // Mapeia dados de entrada para entidade. @@ -82,7 +82,7 @@ public async Task Execute(EvaluateSubmissionProjectIn { project.Status = EProjectStatus.DocumentAnalysis; project.StatusDescription = EProjectStatus.DocumentAnalysis.GetDescription(); - project.SendingDocumentationDeadline = DateTime.Now.AddDays(project.Notice?.SendingDocumentationDeadline ?? 30); + project.SendingDocumentationDeadline = DateTime.UtcNow.AddDays(project.Notice?.SendingDocumentationDeadline ?? 30); } else { diff --git a/src/Domain/UseCases/StudentDocuments/CreateStudentDocuments.cs b/src/Domain/UseCases/StudentDocuments/CreateStudentDocuments.cs index 0b895f33..63e345c6 100644 --- a/src/Domain/UseCases/StudentDocuments/CreateStudentDocuments.cs +++ b/src/Domain/UseCases/StudentDocuments/CreateStudentDocuments.cs @@ -55,7 +55,7 @@ public async Task Execute(CreateStudentDocum var entity = new Entities.StudentDocuments(input.ProjectId, input.AgencyNumber, input.AccountNumber); // Verifica se o aluno é menor de idade - if (project?.Student?.BirthDate > DateTime.Now.AddYears(-18)) + if (project?.Student?.BirthDate > DateTime.UtcNow.AddYears(-18)) { // Verifica se foi informado a autorização dos pais UseCaseException.BusinessRuleViolation(input.ParentalAuthorization is null, From e73ba881d9d43bf4ea9446b5f1874683a5ff75b0 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 22 Jul 2023 14:22:23 -0300 Subject: [PATCH 033/201] fix: adjust ProjectEvaluationRepository --- .../Repositories/ProjectEvaluationRepository.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs index 2099a8fc..a2e7341b 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs @@ -20,10 +20,10 @@ public async Task Create(ProjectEvaluation model) public async Task GetById(Guid? id) { return await _context.ProjectEvaluations - .Include(x => x.ProjectId) - .Include(x => x.SubmissionEvaluatorId) - .Include(x => x.AppealEvaluatorId) - .Include(x => x.DocumentsEvaluatorId) + .Include(x => x.Project) + .Include(x => x.SubmissionEvaluator) + .Include(x => x.AppealEvaluator) + .Include(x => x.DocumentsEvaluator) .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id) @@ -33,10 +33,10 @@ public async Task Create(ProjectEvaluation model) public async Task GetByProjectId(Guid? projectId) { return await _context.ProjectEvaluations - .Include(x => x.ProjectId) - .Include(x => x.SubmissionEvaluatorId) - .Include(x => x.AppealEvaluatorId) - .Include(x => x.DocumentsEvaluatorId) + .Include(x => x.Project) + .Include(x => x.SubmissionEvaluator) + .Include(x => x.AppealEvaluator) + .Include(x => x.DocumentsEvaluator) .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.ProjectId == projectId) From 65e1d1c60ed7ee74c0a7dd27bd32a2db2041f69a Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 22 Jul 2023 14:22:54 -0300 Subject: [PATCH 034/201] fix: adjust project evalution usecases --- .../EvaluateSubmissionProjectInput.cs | 3 - src/Domain/Entities/Enums/EProjectStatus.cs | 2 +- src/Domain/Entities/ProjectEvaluation.cs | 128 +++++++++++++++++- src/Domain/UseCases/Project/AppealProject.cs | 5 + .../EvaluateSubmissionProject.cs | 52 ++++++- 5 files changed, 174 insertions(+), 16 deletions(-) diff --git a/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs b/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs index e79eb569..437062cc 100644 --- a/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs +++ b/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs @@ -4,9 +4,7 @@ public class EvaluateSubmissionProjectInput #region Informações Gerais da Avaliação public Guid? ProjectId { get; set; } public bool IsProductivityFellow { get; set; } - public Guid? SubmissionEvaluatorId { get; set; } public int? SubmissionEvaluationStatus { get; set; } - public DateTime? SubmissionEvaluationDate { get; set; } public string? SubmissionEvaluationDescription { get; set; } #endregion @@ -37,7 +35,6 @@ public class EvaluateSubmissionProjectInput #endregion #region Critérios de Avaliação - public int? APIndex { get; set; } public int? Qualification { get; set; } public int? ProjectProposalObjectives { get; set; } public int? AcademicScientificProductionCoherence { get; set; } diff --git a/src/Domain/Entities/Enums/EProjectStatus.cs b/src/Domain/Entities/Enums/EProjectStatus.cs index 52a7178e..f54acc07 100644 --- a/src/Domain/Entities/Enums/EProjectStatus.cs +++ b/src/Domain/Entities/Enums/EProjectStatus.cs @@ -31,7 +31,7 @@ public enum EProjectStatus [Description("Cancelado: Projeto cancelado pelo professor ou administrador.")] Canceled, - [Description("Encerrado: Projeto concluído, o Orientador possui 30 dias para entregar o Relatório Final, do contrário sua conta será suspensa por XX anos.")] + [Description("Encerrado: Projeto concluído, o Orientador possui 30 dias para entregar o Relatório Final, do contrário sua conta será suspensa.")] Closed } } \ No newline at end of file diff --git a/src/Domain/Entities/ProjectEvaluation.cs b/src/Domain/Entities/ProjectEvaluation.cs index b50d35ac..dc149402 100644 --- a/src/Domain/Entities/ProjectEvaluation.cs +++ b/src/Domain/Entities/ProjectEvaluation.cs @@ -213,6 +213,9 @@ public int? FoundParticipationEditorialCommittees #endregion #region (Resultados) Produção Artístca e Cultural - Produção Apresentada + /// + /// Autoria ou coautoria de CD ou DVD publicado como compositor ou intérprete principal (solo, duo ou regência) em todas as faixas. + /// public int? FoundFullComposerSoloOrchestraAllTracks { get => FoundFullComposerSoloOrchestraAllTracks; @@ -220,6 +223,9 @@ public int? FoundFullComposerSoloOrchestraAllTracks ExceptionMessageFactory.Required(nameof(FoundFullComposerSoloOrchestraAllTracks))); } + /// + /// Autoria ou coautoria de CD ou DVD publicado como compositor ou intérprete principal (solo, duo ou regência) em coletânea (sem participação em todas as faixas). + /// public int? FoundFullComposerSoloOrchestraCompilation { get => FoundFullComposerSoloOrchestraCompilation; @@ -227,6 +233,9 @@ public int? FoundFullComposerSoloOrchestraCompilation ExceptionMessageFactory.Required(nameof(FoundFullComposerSoloOrchestraCompilation))); } + /// + /// Participação em CD ou DVD como intérprete em grupo de câmara ou orquestra. + /// public int? FoundChamberOrchestraInterpretation { get => FoundChamberOrchestraInterpretation; @@ -234,6 +243,9 @@ public int? FoundChamberOrchestraInterpretation ExceptionMessageFactory.Required(nameof(FoundChamberOrchestraInterpretation))); } + /// + /// Apresentações individuais e coletivas no campo das artes. + /// public int? FoundIndividualAndCollectiveArtPerformances { get => FoundIndividualAndCollectiveArtPerformances; @@ -241,6 +253,9 @@ public int? FoundIndividualAndCollectiveArtPerformances ExceptionMessageFactory.Required(nameof(FoundIndividualAndCollectiveArtPerformances))); } + /// + /// Curadoria de coleções ou exposições científicas, culturais e artísticas. + /// public int? FoundScientificCulturalArtisticCollectionsCuratorship { get => FoundScientificCulturalArtisticCollectionsCuratorship; @@ -276,12 +291,7 @@ public int? FoundSoftwareRegistration /// /// Pontuação Total (Índice AP). /// - public int? APIndex - { - get => APIndex; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(APIndex))); - } + public double APIndex { get; set; } /// /// Titulação do Orientador. @@ -344,7 +354,111 @@ public EScore? EffectiveContributionToResearch /// /// Constructor to dbcontext EF instancing. /// - public ProjectEvaluation() { } + protected ProjectEvaluation() { } + + public ProjectEvaluation(Guid? projectId, + bool? isProductivityFellow, + Guid? submissionEvaluatorId, + EProjectStatus? submissionEvaluationStatus, + DateTime? submissionEvaluationDate, + string? submissionEvaluationDescription, + int? foundWorkType1, + int? foundWorkType2, + int? foundIndexedConferenceProceedings, + int? foundNotIndexedConferenceProceedings, + int? foundCompletedBook, + int? foundOrganizedBook, + int? foundBookChapters, + int? foundBookTranslations, + int? foundParticipationEditorialCommittees, + int? foundFullComposerSoloOrchestraAllTracks, + int? foundFullComposerSoloOrchestraCompilation, + int? foundChamberOrchestraInterpretation, + int? foundIndividualAndCollectiveArtPerformances, + int? foundScientificCulturalArtisticCollectionsCuratorship, + int? foundPatentLetter, + int? foundPatentDeposit, + int? foundSoftwareRegistration, + EQualification? qualification, + EScore? projectProposalObjectives, + EScore? academicScientificProductionCoherence, + EScore? proposalMethodologyAdaptation, + EScore? effectiveContributionToResearch) + { + ProjectId = projectId; + IsProductivityFellow = isProductivityFellow; + SubmissionEvaluatorId = submissionEvaluatorId; + SubmissionEvaluationStatus = submissionEvaluationStatus; + SubmissionEvaluationDate = submissionEvaluationDate; + SubmissionEvaluationDescription = submissionEvaluationDescription; + FoundWorkType1 = foundWorkType1; + FoundWorkType2 = foundWorkType2; + FoundIndexedConferenceProceedings = foundIndexedConferenceProceedings; + FoundNotIndexedConferenceProceedings = foundNotIndexedConferenceProceedings; + FoundCompletedBook = foundCompletedBook; + FoundOrganizedBook = foundOrganizedBook; + FoundBookChapters = foundBookChapters; + FoundBookTranslations = foundBookTranslations; + FoundParticipationEditorialCommittees = foundParticipationEditorialCommittees; + FoundFullComposerSoloOrchestraAllTracks = foundFullComposerSoloOrchestraAllTracks; + FoundFullComposerSoloOrchestraCompilation = foundFullComposerSoloOrchestraCompilation; + FoundChamberOrchestraInterpretation = foundChamberOrchestraInterpretation; + FoundIndividualAndCollectiveArtPerformances = foundIndividualAndCollectiveArtPerformances; + FoundScientificCulturalArtisticCollectionsCuratorship = foundScientificCulturalArtisticCollectionsCuratorship; + FoundPatentLetter = foundPatentLetter; + FoundPatentDeposit = foundPatentDeposit; + FoundSoftwareRegistration = foundSoftwareRegistration; + Qualification = qualification; + ProjectProposalObjectives = projectProposalObjectives; + AcademicScientificProductionCoherence = academicScientificProductionCoherence; + ProposalMethodologyAdaptation = proposalMethodologyAdaptation; + EffectiveContributionToResearch = effectiveContributionToResearch; + CalculateAPIndex(); + } #endregion + + /// + /// Multiplica o valor pela pontuação e retorna o valor ou o limite, o que for menor. + /// + /// Valor + /// Limite + /// Pontuação + /// Valor multiplicado + private static double MultiplyValue(int? value, int? limit, double points) + { + if (!value.HasValue) return 0; + var total = value.Value * points; + return total > limit ? limit.Value : total; + } + + /// + /// Pontuação das Atividades (Índice AP) Edital PIBIC. + /// + private void CalculateAPIndex() + { + APIndex = 0; + + // Produção Científica - Trabalhos Publicados + APIndex += MultiplyValue(FoundWorkType1, null, 10); + APIndex += MultiplyValue(FoundWorkType2, 20, 4); + APIndex += MultiplyValue(FoundIndexedConferenceProceedings, 12, 3); + APIndex += MultiplyValue(FoundNotIndexedConferenceProceedings, 12, 2); + APIndex += MultiplyValue(FoundCompletedBook, null, 8); + APIndex += MultiplyValue(FoundOrganizedBook, 12, 2); + APIndex += MultiplyValue(FoundBookChapters, 12, 2); + APIndex += MultiplyValue(FoundBookTranslations, 12, 2); + APIndex += MultiplyValue(FoundParticipationEditorialCommittees, 1, 0.25); + + // Produção Artístca e Cultural - Produção Apresentada + APIndex += MultiplyValue(FoundFullComposerSoloOrchestraAllTracks, null, 8); + APIndex += MultiplyValue(FoundChamberOrchestraInterpretation, 12, 2); + APIndex += MultiplyValue(FoundIndividualAndCollectiveArtPerformances, 12, 2); + APIndex += MultiplyValue(FoundScientificCulturalArtisticCollectionsCuratorship, 6, 2); + + // Produção Técnica - Produtos Registrados + APIndex += MultiplyValue(FoundPatentLetter, null, 10); + APIndex += MultiplyValue(FoundPatentDeposit, null, 5); + APIndex += MultiplyValue(FoundSoftwareRegistration, null, 0.5); + } } } \ No newline at end of file diff --git a/src/Domain/UseCases/Project/AppealProject.cs b/src/Domain/UseCases/Project/AppealProject.cs index b2abed0b..ee5fdf69 100644 --- a/src/Domain/UseCases/Project/AppealProject.cs +++ b/src/Domain/UseCases/Project/AppealProject.cs @@ -36,6 +36,11 @@ public async Task Execute(Guid? projectId, string? app // Verifica se o projeto está em recurso if (project.Status == EProjectStatus.Rejected) { + // Verifica se o edital está na fase de recurso. + UseCaseException.BusinessRuleViolation(project.Notice?.AppealStartDate > DateTime.UtcNow + || project.Notice?.AppealFinalDate < DateTime.UtcNow, + "O Edital não está na fase de Recurso."); + // Altera o status do projeto para submetido project.Status = EProjectStatus.Evaluation; project.StatusDescription = EProjectStatus.Evaluation.GetDescription(); diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs index 14306be4..02646623 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -67,12 +67,35 @@ public async Task Execute(EvaluateSubmissionProjectIn UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.SubmissionEvaluationDescription), nameof(input.SubmissionEvaluationDescription)); - // Atribui informações de avaliação. - input.SubmissionEvaluationDate = DateTime.UtcNow; - input.SubmissionEvaluatorId = user.Id; - // Mapeia dados de entrada para entidade. - projectEvaluation = _mapper.Map(input); + projectEvaluation = new Entities.ProjectEvaluation(input.ProjectId, + input.IsProductivityFellow, + user.Id, // Id do avaliador logado. + TryCastEnum(input.SubmissionEvaluationStatus), + DateTime.UtcNow, + input.SubmissionEvaluationDescription, + input.FoundWorkType1, + input.FoundWorkType2, + input.FoundIndexedConferenceProceedings, + input.FoundNotIndexedConferenceProceedings, + input.FoundCompletedBook, + input.FoundOrganizedBook, + input.FoundBookChapters, + input.FoundBookTranslations, + input.FoundParticipationEditorialCommittees, + input.FoundFullComposerSoloOrchestraAllTracks, + input.FoundFullComposerSoloOrchestraCompilation, + input.FoundChamberOrchestraInterpretation, + input.FoundIndividualAndCollectiveArtPerformances, + input.FoundScientificCulturalArtisticCollectionsCuratorship, + input.FoundPatentLetter, + input.FoundPatentDeposit, + input.FoundSoftwareRegistration, + TryCastEnum(input.Qualification), + TryCastEnum(input.ProjectProposalObjectives), + TryCastEnum(input.AcademicScientificProductionCoherence), + TryCastEnum(input.ProposalMethodologyAdaptation), + TryCastEnum(input.EffectiveContributionToResearch)); // Adiciona avaliação do projeto. await _projectEvaluationRepository.Create(projectEvaluation); @@ -96,5 +119,24 @@ public async Task Execute(EvaluateSubmissionProjectIn // Mapeia dados de saída e retorna. return _mapper.Map(output); } + + /// + /// Tenta converter um objeto para um tipo Enum. + /// + /// Valor a ser convertido. + /// Tipo para o qual ser convertido. + /// Objeto com tipo convertido. + private static T TryCastEnum(object? value) + { + try + { + UseCaseException.NotInformedParam(value is null, typeof(T).ToString()); + return (T)Enum.Parse(typeof(T), value?.ToString()!); + } + catch (Exception) + { + throw UseCaseException.BusinessRuleViolation($"Não foi possível converter o valor {value} para o tipo {typeof(T)}."); + } + } } } \ No newline at end of file From f4a95dcbf6896ba30dcd92ecfd5eee2feb0e1f6e Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 22 Jul 2023 15:04:57 -0300 Subject: [PATCH 035/201] refactor(notice): modify entity and usecases --- .../Contracts/Notice/BaseNoticeContract.cs | 20 +- src/Domain/Entities/Notice.cs | 182 +++++++++++++----- src/Domain/Entities/Project.cs | 20 +- src/Domain/UseCases/Notice/CreateNotice.cs | 20 +- src/Domain/UseCases/Notice/UpdateNotice.cs | 14 +- src/Domain/UseCases/Project/AppealProject.cs | 4 +- src/Domain/UseCases/Project/OpenProject.cs | 2 +- .../EvaluateAppealProject.cs | 3 +- .../EvaluateSubmissionProject.cs | 3 +- .../NoticeConfiguration.cs | 15 +- .../ProjectConfiguration.cs | 3 +- .../Repositories/NoticeRepository.cs | 8 +- 12 files changed, 201 insertions(+), 93 deletions(-) diff --git a/src/Domain/Contracts/Notice/BaseNoticeContract.cs b/src/Domain/Contracts/Notice/BaseNoticeContract.cs index b49c0a1b..d03123f1 100644 --- a/src/Domain/Contracts/Notice/BaseNoticeContract.cs +++ b/src/Domain/Contracts/Notice/BaseNoticeContract.cs @@ -5,17 +5,27 @@ namespace Domain.Contracts.Notice public abstract class BaseNoticeContract { [Required] - public DateTime? StartDate { get; set; } + public DateTime? RegistrationStartDate { get; set; } [Required] - public DateTime? FinalDate { get; set; } + public DateTime? RegistrationEndDate { get; set; } + [Required] + public DateTime? EvaluationStartDate { get; set; } + [Required] + public DateTime? EvaluationEndDate { get; set; } [Required] public DateTime? AppealStartDate { get; set; } [Required] - public DateTime? AppealFinalDate { get; set; } + public DateTime? AppealEndDate { get; set; } [Required] - public int? SuspensionYears { get; set; } + public DateTime? SendingDocsStartDate { get; set; } + [Required] + public DateTime? SendingDocsEndDate { get; set; } [Required] - public int? SendingDocumentationDeadline { get; set; } + public DateTime? PartialReportDeadline { get; set; } + [Required] + public DateTime? FinalReportDeadline { get; set; } + [Required] + public int? SuspensionYears { get; set; } public string? Description { get; set; } public string? DocUrl { get; set; } diff --git a/src/Domain/Entities/Notice.cs b/src/Domain/Entities/Notice.cs index a820d5e1..2d3f6cd3 100644 --- a/src/Domain/Entities/Notice.cs +++ b/src/Domain/Entities/Notice.cs @@ -9,36 +9,71 @@ namespace Domain.Entities public class Notice : Entity { #region Properties - private DateTime? _startDate; + #region Registration Dates + private DateTime? _registrationStartDate; /// - /// Data de início do edital. + /// Data de início das inscrições dos projetos. /// - public DateTime? StartDate + public DateTime? RegistrationStartDate { - get => _startDate; + get => _registrationStartDate; set { EntityExceptionValidation.When(!value.HasValue, - ExceptionMessageFactory.Invalid(nameof(StartDate))); - _startDate = value.HasValue ? value.Value.ToUniversalTime() : null; + ExceptionMessageFactory.Invalid("Data de início das inscrições dos projetos")); + _registrationStartDate = value.HasValue ? value.Value.ToUniversalTime() : null; } } - private DateTime? _finalDate; + private DateTime? _registrationEndDate; /// - /// Data de término do edital. + /// Data de término das inscrições dos projetos. /// - public DateTime? FinalDate + public DateTime? RegistrationEndDate { - get => _finalDate; + get => _registrationEndDate; set { EntityExceptionValidation.When(!value.HasValue, - ExceptionMessageFactory.Invalid(nameof(FinalDate))); - _finalDate = value.HasValue ? value.Value.ToUniversalTime() : null; + ExceptionMessageFactory.Invalid("Data de término das inscrições dos projetos")); + _registrationEndDate = value.HasValue ? value.Value.ToUniversalTime() : null; } } + #endregion + + #region Evaluation Dates + /// + /// Data de início das avaliações dos projetos. + /// + private DateTime? _evaluationStartDate; + public DateTime? EvaluationStartDate + { + get => _evaluationStartDate; + set + { + EntityExceptionValidation.When(!value.HasValue, + ExceptionMessageFactory.Invalid("Data de início das avaliações dos projetos")); + _evaluationStartDate = value.HasValue ? value.Value.ToUniversalTime() : null; + } + } + + /// + /// Data de término das avaliações dos projetos. + /// + private DateTime? _evaluationEndDate; + public DateTime? EvaluationEndDate + { + get => _evaluationEndDate; + set + { + EntityExceptionValidation.When(!value.HasValue, + ExceptionMessageFactory.Invalid("Data de término das avaliações dos projetos")); + _evaluationEndDate = value.HasValue ? value.Value.ToUniversalTime() : null; + } + } + #endregion + #region Appeal Dates private DateTime? _appealStartDate; /// /// Data de início do período de recurso. @@ -49,85 +84,144 @@ public DateTime? AppealStartDate set { EntityExceptionValidation.When(!value.HasValue, - ExceptionMessageFactory.Invalid(nameof(AppealStartDate))); + ExceptionMessageFactory.Invalid("Data de início do período de recurso")); _appealStartDate = value.HasValue ? value.Value.ToUniversalTime() : null; } } - private DateTime? _appealFinalDate; + private DateTime? _appealEndDate; /// /// Data de término do período de recurso. /// - public DateTime? AppealFinalDate + public DateTime? AppealEndDate { - get => _appealFinalDate; + get => _appealEndDate; set { EntityExceptionValidation.When(!value.HasValue, - ExceptionMessageFactory.Invalid(nameof(AppealFinalDate))); - _appealFinalDate = value.HasValue ? value.Value.ToUniversalTime() : null; + ExceptionMessageFactory.Invalid("Data de término do período de recurso")); + _appealEndDate = value.HasValue ? value.Value.ToUniversalTime() : null; } } + #endregion - private int? _suspensionYears; + #region Sending Documentation Dates /// - /// Anos de suspensão do orientador em caso de não entrega do relatório final. + /// Data de início para entrega de documentação dos bolsistas. /// - public int? SuspensionYears + private DateTime? _sendingDocsStartDate; + public DateTime? SendingDocsStartDate { - get => _suspensionYears; + get => _sendingDocsStartDate; set { EntityExceptionValidation.When(!value.HasValue, - ExceptionMessageFactory.Required(nameof(SuspensionYears))); - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(SuspensionYears))); - _suspensionYears = value; + ExceptionMessageFactory.Invalid("Data de início para entrega de documentação dos bolsistas")); + _sendingDocsStartDate = value.HasValue ? value.Value.ToUniversalTime() : null; } } - private int? _sendingDocumentationDeadline; /// - /// Prazo para envio da documentação em dias. + /// Data de término para entrega de documentação dos bolsistas. /// - public int? SendingDocumentationDeadline + private DateTime? _sendingDocsEndDate; + public DateTime? SendingDocsEndDate { - get => _sendingDocumentationDeadline; + get => _sendingDocsEndDate; set { EntityExceptionValidation.When(!value.HasValue, - ExceptionMessageFactory.Required(nameof(SuspensionYears))); - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(SuspensionYears))); - _sendingDocumentationDeadline = value; + ExceptionMessageFactory.Invalid("Data de término para entrega de documentação dos bolsistas")); + _sendingDocsEndDate = value.HasValue ? value.Value.ToUniversalTime() : null; } } + #endregion + #region Report Sending Dates /// - /// Descrição do edital + /// Prazo de entrega do relatório parcial (Data fim). /// - public string? Description { get; set; } + private DateTime? _partialReportDeadline; + public DateTime? PartialReportDeadline + { + get => _partialReportDeadline; + set + { + EntityExceptionValidation.When(!value.HasValue, + ExceptionMessageFactory.Invalid("Prazo de entrega do relatório parcial")); + _partialReportDeadline = value.HasValue ? value.Value.ToUniversalTime() : null; + } + } + + /// + /// Prazo de entrega do relatório final (Data fim). + /// + private DateTime? _finalReportDeadline; + public DateTime? FinalReportDeadline + { + get => _finalReportDeadline; + set + { + EntityExceptionValidation.When(!value.HasValue, + ExceptionMessageFactory.Invalid("Prazo de entrega do relatório final")); + _finalReportDeadline = value.HasValue ? value.Value.ToUniversalTime() : null; + } + } + #endregion + + private int? _suspensionYears; + /// + /// Anos de suspensão do orientador em caso de não entrega do relatório final. + /// + public int? SuspensionYears + { + get => _suspensionYears; + set + { + EntityExceptionValidation.When(!value.HasValue, + ExceptionMessageFactory.Required("Anos de suspensão do orientador")); + EntityExceptionValidation.When(value < 0, + ExceptionMessageFactory.Invalid("Anos de suspensão do orientador")); + _suspensionYears = value; + } + } /// /// URL do edital /// public string? DocUrl { get; set; } + + /// + /// Data de criação do edital + /// + public DateTime? CreatedAt { get; protected set; } #endregion #region Constructors - public Notice(DateTime? startDate, - DateTime? finalDate, + public Notice(DateTime? registrationStartDate, + DateTime? registrationEndDate, + DateTime? evaluationStartDate, + DateTime? evaluationEndDate, DateTime? appealStartDate, DateTime? appealFinalDate, - int? suspensionYears, - int? sendingDocumentationDeadline) + DateTime? sendingDocsStartDate, + DateTime? sendingDocsEndDate, + DateTime? partialReportDeadline, + DateTime? finalReportDeadline, + int? suspensionYears) { - StartDate = startDate; - FinalDate = finalDate; + RegistrationStartDate = registrationStartDate; + RegistrationEndDate = registrationEndDate; + EvaluationStartDate = evaluationStartDate; + EvaluationEndDate = evaluationEndDate; AppealStartDate = appealStartDate; - AppealFinalDate = appealFinalDate; + AppealEndDate = appealFinalDate; + SendingDocsStartDate = sendingDocsStartDate; + SendingDocsEndDate = sendingDocsEndDate; SuspensionYears = suspensionYears; - SendingDocumentationDeadline = sendingDocumentationDeadline; + PartialReportDeadline = partialReportDeadline; + FinalReportDeadline = finalReportDeadline; + CreatedAt = DateTime.UtcNow; } /// diff --git a/src/Domain/Entities/Project.cs b/src/Domain/Entities/Project.cs index 2427ff70..eece2cd9 100644 --- a/src/Domain/Entities/Project.cs +++ b/src/Domain/Entities/Project.cs @@ -513,11 +513,11 @@ public DateTime? SubmissionDate /// /// Data de ressubmissão do projeto na plataforma. /// - private DateTime? _resubmissionDate; - public DateTime? ResubmissionDate + private DateTime? _appealDate; + public DateTime? AppealDate { - get { return _resubmissionDate; } - set { _resubmissionDate = value.HasValue ? value.Value.ToUniversalTime() : null; } + get { return _appealDate; } + set { _appealDate = value.HasValue ? value.Value.ToUniversalTime() : null; } } /// @@ -534,16 +534,6 @@ public DateTime? CancellationDate /// Razão de cancelamento do projeto, preenchido pelo professor. /// public string? CancellationReason { get; set; } - - /// - /// Data limite para envio de documentos. - /// - private DateTime? _sendingDocumentationDeadline; - public DateTime? SendingDocumentationDeadline - { - get { return _sendingDocumentationDeadline; } - set { _sendingDocumentationDeadline = value.HasValue ? value.Value.ToUniversalTime() : null; } - } #endregion #endregion @@ -597,7 +587,7 @@ public Project(string title, string keyWord1, string keyWord2, string keyWord3, StatusDescription = statusDescription; AppealObservation = appealDescription; SubmissionDate = submitionDate; - ResubmissionDate = ressubmissionDate; + AppealDate = ressubmissionDate; CancellationDate = cancellationDate; CancellationReason = cancellationReason; } diff --git a/src/Domain/UseCases/Notice/CreateNotice.cs b/src/Domain/UseCases/Notice/CreateNotice.cs index c8e72005..4b16c6b7 100644 --- a/src/Domain/UseCases/Notice/CreateNotice.cs +++ b/src/Domain/UseCases/Notice/CreateNotice.cs @@ -24,20 +24,28 @@ public CreateNotice(INoticeRepository repository, IStorageFileService storageFil public async Task Execute(CreateNoticeInput input) { // Mapeia input para entidade - var entity = new Entities.Notice(input.StartDate, input.FinalDate, input.AppealStartDate, input.AppealFinalDate, input.SuspensionYears, input.SendingDocumentationDeadline); + var entity = new Entities.Notice( + input.RegistrationStartDate, + input.RegistrationEndDate, + input.EvaluationStartDate, + input.EvaluationEndDate, + input.AppealStartDate, + input.AppealEndDate, + input.SendingDocsStartDate, + input.SendingDocsEndDate, + input.PartialReportDeadline, + input.FinalReportDeadline, + input.SuspensionYears + ); // Verifica se já existe um edital para o período indicado - var projectFound = await _repository.GetNoticeByPeriod((DateTime)input.StartDate!, (DateTime)input.FinalDate!); + var projectFound = await _repository.GetNoticeByPeriod((DateTime)input.RegistrationStartDate!, (DateTime)input.RegistrationEndDate!); UseCaseException.BusinessRuleViolation(projectFound != null, "A notice already exists for the indicated period."); // Salva arquivo no repositório e atualiza atributo DocUrl if (input.File != null) entity.DocUrl = await _storageFileService.UploadFileAsync(input.File); - // Atualiza descrição do edital - if (input.Description != null) - entity.Description = input.Description; - // Cria entidade entity = await _repository.Create(entity); diff --git a/src/Domain/UseCases/Notice/UpdateNotice.cs b/src/Domain/UseCases/Notice/UpdateNotice.cs index 8bab15b1..0ad3ae90 100644 --- a/src/Domain/UseCases/Notice/UpdateNotice.cs +++ b/src/Domain/UseCases/Notice/UpdateNotice.cs @@ -38,13 +38,17 @@ public async Task Execute(Guid? id, UpdateNoticeInput entity.DocUrl = await _storageFileService.UploadFileAsync(input.File, entity.DocUrl); // Atualiza atributos permitidos - entity.StartDate = input.StartDate ?? entity.StartDate; - entity.FinalDate = input.FinalDate ?? entity.FinalDate; + entity.RegistrationStartDate = input.RegistrationStartDate ?? entity.RegistrationStartDate; + entity.RegistrationEndDate = input.RegistrationEndDate ?? entity.RegistrationEndDate; + entity.EvaluationStartDate = input.EvaluationStartDate ?? entity.EvaluationStartDate; + entity.EvaluationEndDate = input.EvaluationEndDate ?? entity.EvaluationEndDate; entity.AppealStartDate = input.AppealStartDate ?? entity.AppealStartDate; - entity.AppealFinalDate = input.AppealFinalDate ?? entity.AppealFinalDate; + entity.AppealEndDate = input.AppealEndDate ?? entity.AppealEndDate; + entity.SendingDocsStartDate = input.SendingDocsStartDate ?? entity.SendingDocsStartDate; + entity.SendingDocsEndDate = input.SendingDocsEndDate ?? entity.SendingDocsEndDate; + entity.PartialReportDeadline = input.PartialReportDeadline ?? entity.PartialReportDeadline; + entity.FinalReportDeadline = input.FinalReportDeadline ?? entity.FinalReportDeadline; entity.SuspensionYears = input.SuspensionYears ?? entity.SuspensionYears; - entity.SendingDocumentationDeadline = input.SendingDocumentationDeadline ?? entity.SendingDocumentationDeadline; - entity.Description = input.Description ?? entity.Description; // Salva entidade atualizada no banco await _repository.Update(entity); diff --git a/src/Domain/UseCases/Project/AppealProject.cs b/src/Domain/UseCases/Project/AppealProject.cs index ee5fdf69..f22c63db 100644 --- a/src/Domain/UseCases/Project/AppealProject.cs +++ b/src/Domain/UseCases/Project/AppealProject.cs @@ -38,14 +38,14 @@ public async Task Execute(Guid? projectId, string? app { // Verifica se o edital está na fase de recurso. UseCaseException.BusinessRuleViolation(project.Notice?.AppealStartDate > DateTime.UtcNow - || project.Notice?.AppealFinalDate < DateTime.UtcNow, + || project.Notice?.AppealEndDate < DateTime.UtcNow, "O Edital não está na fase de Recurso."); // Altera o status do projeto para submetido project.Status = EProjectStatus.Evaluation; project.StatusDescription = EProjectStatus.Evaluation.GetDescription(); project.AppealObservation = appealDescription; - project.ResubmissionDate = DateTime.UtcNow; + project.AppealDate = DateTime.UtcNow; // Salva alterações no banco de dados await _projectRepository.Update(project); diff --git a/src/Domain/UseCases/Project/OpenProject.cs b/src/Domain/UseCases/Project/OpenProject.cs index b4b02697..f1bdf084 100644 --- a/src/Domain/UseCases/Project/OpenProject.cs +++ b/src/Domain/UseCases/Project/OpenProject.cs @@ -43,7 +43,7 @@ public async Task Execute(OpenProjectInput input) ?? throw new ArgumentException("Edital não encontrado."); // Verifica se o período do edital é válido - if (notice.StartDate > DateTime.UtcNow || notice.FinalDate < DateTime.UtcNow) + if (notice.RegistrationStartDate > DateTime.UtcNow || notice.RegistrationEndDate < DateTime.UtcNow) throw new ArgumentException("Fora do período de inscrição no edital."); // Verifica se a Subárea existe diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs index b38ba824..cb6151ca 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs @@ -54,7 +54,7 @@ public async Task Execute(EvaluateAppealProjectInput "Project is not in the evaluation phase."); // Verifica se o edital está na fase de recurso. - UseCaseException.BusinessRuleViolation(projectEvaluation?.Project?.Notice?.AppealStartDate > DateTime.UtcNow || projectEvaluation?.Project?.Notice?.AppealFinalDate < DateTime.UtcNow, + UseCaseException.BusinessRuleViolation(projectEvaluation?.Project?.Notice?.AppealStartDate > DateTime.UtcNow || projectEvaluation?.Project?.Notice?.AppealEndDate < DateTime.UtcNow, "Notice isn't in the appeal stage."); // Verifica se o status da avaliação foi informado. @@ -81,7 +81,6 @@ public async Task Execute(EvaluateAppealProjectInput { project.Status = EProjectStatus.DocumentAnalysis; project.StatusDescription = EProjectStatus.DocumentAnalysis.GetDescription(); - project.SendingDocumentationDeadline = DateTime.UtcNow.AddDays(project.Notice?.SendingDocumentationDeadline ?? 30); } else { diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs index 02646623..a819698e 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -56,7 +56,7 @@ public async Task Execute(EvaluateSubmissionProjectIn "O projeto não está em fase de submissão."); // Verifica se o edital ainda está aberto. - UseCaseException.BusinessRuleViolation(project.Notice?.StartDate > DateTime.UtcNow || project.Notice?.FinalDate < DateTime.UtcNow, + UseCaseException.BusinessRuleViolation(project.Notice?.RegistrationStartDate > DateTime.UtcNow || project.Notice?.RegistrationEndDate < DateTime.UtcNow, "Edital encerrado."); // Verifica se o status da avaliação foi informado. @@ -105,7 +105,6 @@ public async Task Execute(EvaluateSubmissionProjectIn { project.Status = EProjectStatus.DocumentAnalysis; project.StatusDescription = EProjectStatus.DocumentAnalysis.GetDescription(); - project.SendingDocumentationDeadline = DateTime.UtcNow.AddDays(project.Notice?.SendingDocumentationDeadline ?? 30); } else { diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/NoticeConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/NoticeConfiguration.cs index cd5152ee..a0376a5f 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/NoticeConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/NoticeConfiguration.cs @@ -11,14 +11,19 @@ public void Configure(EntityTypeBuilder builder) builder.ToTable("Notices"); builder.HasKey(t => t.Id); builder.Property(p => p.Id).ValueGeneratedOnAdd(); - builder.Property(p => p.StartDate).IsRequired(); - builder.Property(p => p.FinalDate).IsRequired(); + builder.Property(p => p.RegistrationStartDate).IsRequired(); + builder.Property(p => p.RegistrationEndDate).IsRequired(); + builder.Property(p => p.EvaluationStartDate).IsRequired(); + builder.Property(p => p.EvaluationEndDate).IsRequired(); builder.Property(p => p.AppealStartDate).IsRequired(); - builder.Property(p => p.AppealFinalDate).IsRequired(); + builder.Property(p => p.AppealEndDate).IsRequired(); + builder.Property(p => p.SendingDocsStartDate).IsRequired(); + builder.Property(p => p.SendingDocsEndDate).IsRequired(); + builder.Property(p => p.PartialReportDeadline).IsRequired(); + builder.Property(p => p.FinalReportDeadline).IsRequired(); builder.Property(p => p.SuspensionYears).IsRequired(); - builder.Property(p => p.SendingDocumentationDeadline).IsRequired(); - builder.Property(p => p.Description).HasMaxLength(300); builder.Property(p => p.DocUrl).HasMaxLength(300); + builder.Property(p => p.CreatedAt).HasDefaultValueSql("getdate()").IsRequired(); builder.Property(p => p.DeletedAt); builder.HasQueryFilter(x => x.DeletedAt == null); diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs index a5a50202..abbd41c4 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs @@ -47,10 +47,9 @@ public void Configure(EntityTypeBuilder builder) builder.Property(p => p.StatusDescription).IsRequired(); builder.Property(p => p.AppealObservation); builder.Property(p => p.SubmissionDate); - builder.Property(p => p.ResubmissionDate); + builder.Property(p => p.AppealDate); builder.Property(p => p.CancellationDate); builder.Property(p => p.CancellationReason); - builder.Property(p => p.SendingDocumentationDeadline); builder.Property(p => p.DeletedAt); builder.HasOne(a => a.Student) diff --git a/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs b/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs index 359f4155..9dcb7f15 100644 --- a/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs @@ -25,7 +25,7 @@ public async Task> GetAll(int skip, int take) => await _cont .Skip(skip) .Take(take) .AsAsyncEnumerable() - .OrderByDescending(x => x.StartDate) + .OrderByDescending(x => x.RegistrationStartDate) .ToListAsync(); public async Task GetById(Guid? id) => @@ -55,9 +55,9 @@ public async Task Update(Notice model) var finalDate = end.ToUniversalTime(); var entities = await _context.Notices - .Where(x => (x.StartDate <= startDate && x.FinalDate >= finalDate) - || (x.StartDate <= finalDate && x.FinalDate >= finalDate) - || (x.StartDate <= startDate && x.FinalDate >= startDate)) + .Where(x => (x.RegistrationStartDate <= startDate && x.RegistrationEndDate >= finalDate) + || (x.RegistrationStartDate <= finalDate && x.RegistrationEndDate >= finalDate) + || (x.RegistrationStartDate <= startDate && x.RegistrationEndDate >= startDate)) .AsAsyncEnumerable() .ToListAsync(); return entities.FirstOrDefault(); From 7262dcc88eb8526f6992a64211ca128f0342daca Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 22 Jul 2023 15:21:14 -0300 Subject: [PATCH 036/201] fix: adjust notice tests --- src/Domain.Tests/Entities/NoticeUnitTests.cs | 218 ++++++-- .../Entities/ProjectEvaluationUnitTests.cs | 498 +++++++++--------- src/Domain.Tests/Entities/ProjectUnitTests.cs | 6 +- .../NoticeConfiguration.cs | 2 +- src/Infrastructure/Persistence/README.md | 2 +- 5 files changed, 437 insertions(+), 289 deletions(-) diff --git a/src/Domain.Tests/Entities/NoticeUnitTests.cs b/src/Domain.Tests/Entities/NoticeUnitTests.cs index d6011896..9d31874d 100644 --- a/src/Domain.Tests/Entities/NoticeUnitTests.cs +++ b/src/Domain.Tests/Entities/NoticeUnitTests.cs @@ -8,54 +8,114 @@ namespace Domain.Tests.Entities { public class NoticeUnitTests { - private Notice MockValidNotice() => new Notice(); + private Notice MockValidNotice() => new Notice( + registrationStartDate: DateTime.UtcNow, + registrationEndDate: DateTime.UtcNow.AddDays(7), + evaluationStartDate: DateTime.UtcNow.AddDays(8), + evaluationEndDate: DateTime.UtcNow.AddDays(14), + appealStartDate: DateTime.UtcNow.AddDays(15), + appealFinalDate: DateTime.UtcNow.AddDays(21), + sendingDocsStartDate: DateTime.UtcNow.AddDays(22), + sendingDocsEndDate: DateTime.UtcNow.AddDays(28), + partialReportDeadline: DateTime.UtcNow.AddDays(29), + finalReportDeadline: DateTime.UtcNow.AddDays(35), + suspensionYears: 1 + ); [Fact] - public void SetStartDate_ValidStartDate_SetsStartDate() + public void SetRegistrationStartDate_ValidStartDate_SetsRegistrationStartDate() { // Arrange var notice = MockValidNotice(); var startDate = DateTime.UtcNow; // Act - notice.StartDate = startDate; + notice.RegistrationStartDate = startDate; // Assert - notice.StartDate.Should().Be(startDate.ToUniversalTime()); + notice.RegistrationStartDate.Should().Be(startDate.ToUniversalTime()); } [Fact] - public void SetStartDate_NullStartDate_ThrowsException() + public void SetRegistrationStartDate_NullStartDate_ThrowsException() { // Arrange var notice = MockValidNotice(); // Act & Assert - Assert.Throws(() => notice.StartDate = null); + Assert.Throws(() => notice.RegistrationStartDate = null); } [Fact] - public void SetFinalDate_ValidFinalDate_SetsFinalDate() + public void SetRegistrationEndDate_ValidEndDate_SetsRegistrationEndDate() { // Arrange var notice = MockValidNotice(); - var finalDate = DateTime.UtcNow; + var endDate = DateTime.UtcNow; // Act - notice.FinalDate = finalDate; + notice.RegistrationEndDate = endDate; // Assert - notice.FinalDate.Should().Be(finalDate.ToUniversalTime()); + notice.RegistrationEndDate.Should().Be(endDate.ToUniversalTime()); } [Fact] - public void SetFinalDate_NullFinalDate_ThrowsException() + public void SetRegistrationEndDate_NullEndDate_ThrowsException() { // Arrange var notice = MockValidNotice(); // Act & Assert - Assert.Throws(() => notice.FinalDate = null); + Assert.Throws(() => notice.RegistrationEndDate = null); + } + + [Fact] + public void SetEvaluationStartDate_ValidStartDate_SetsEvaluationStartDate() + { + // Arrange + var notice = MockValidNotice(); + var startDate = DateTime.UtcNow; + + // Act + notice.EvaluationStartDate = startDate; + + // Assert + notice.EvaluationStartDate.Should().Be(startDate.ToUniversalTime()); + } + + [Fact] + public void SetEvaluationStartDate_NullStartDate_ThrowsException() + { + // Arrange + var notice = MockValidNotice(); + + // Act & Assert + Assert.Throws(() => notice.EvaluationStartDate = null); + } + + [Fact] + public void SetEvaluationEndDate_ValidEndDate_SetsEvaluationEndDate() + { + // Arrange + var notice = MockValidNotice(); + var endDate = DateTime.UtcNow; + + // Act + notice.EvaluationEndDate = endDate; + + // Assert + notice.EvaluationEndDate.Should().Be(endDate.ToUniversalTime()); + } + + [Fact] + public void SetEvaluationEndDate_NullEndDate_ThrowsException() + { + // Arrange + var notice = MockValidNotice(); + + // Act & Assert + Assert.Throws(() => notice.EvaluationEndDate = null); } [Fact] @@ -83,95 +143,183 @@ public void SetAppealStartDate_NullAppealStartDate_ThrowsException() } [Fact] - public void SetAppealFinalDate_ValidAppealFinalDate_SetsAppealFinalDate() + public void SetAppealEndDate_ValidAppealEndDate_SetsAppealEndDate() { // Arrange var notice = MockValidNotice(); - var appealFinalDate = DateTime.UtcNow; + var appealEndDate = DateTime.UtcNow; // Act - notice.AppealFinalDate = appealFinalDate; + notice.AppealEndDate = appealEndDate; // Assert - notice.AppealFinalDate.Should().Be(appealFinalDate.ToUniversalTime()); + notice.AppealEndDate.Should().Be(appealEndDate.ToUniversalTime()); } [Fact] - public void SetAppealFinalDate_NullAppealFinalDate_ThrowsException() + public void SetAppealEndDate_NullAppealEndDate_ThrowsException() { // Arrange var notice = MockValidNotice(); // Act & Assert - Assert.Throws(() => notice.AppealFinalDate = null); + Assert.Throws(() => notice.AppealEndDate = null); } [Fact] - public void SetSuspensionYears_ValidSuspensionYears_SetsSuspensionYears() + public void SetSendingDocsStartDate_ValidStartDate_SetsSendingDocsStartDate() { // Arrange var notice = MockValidNotice(); - var suspensionYears = 1; + var startDate = DateTime.UtcNow; // Act - notice.SuspensionYears = suspensionYears; + notice.SendingDocsStartDate = startDate; // Assert - notice.SuspensionYears.Should().Be(suspensionYears); + notice.SendingDocsStartDate.Should().Be(startDate.ToUniversalTime()); } [Fact] - public void SetSuspensionYears_NullSuspensionYears_ThrowsException() + public void SetSendingDocsStartDate_NullStartDate_ThrowsException() { // Arrange var notice = MockValidNotice(); // Act & Assert - Assert.Throws(() => notice.SuspensionYears = null); + Assert.Throws(() => notice.SendingDocsStartDate = null); } [Fact] - public void SetSuspensionYears_NegativeSuspensionYears_ThrowsException() + public void SetSendingDocsEndDate_ValidEndDate_SetsSendingDocsEndDate() + { + // Arrange + var notice = MockValidNotice(); + var endDate = DateTime.UtcNow; + + // Act + notice.SendingDocsEndDate = endDate; + + // Assert + notice.SendingDocsEndDate.Should().Be(endDate.ToUniversalTime()); + } + + [Fact] + public void SetSendingDocsEndDate_NullEndDate_ThrowsException() { // Arrange var notice = MockValidNotice(); // Act & Assert - Assert.Throws(() => notice.SuspensionYears = -1); + Assert.Throws(() => notice.SendingDocsEndDate = null); } [Fact] - public void SetSendingDocumentationDeadline_ValidSendingDocumentationDeadline_SetsSendingDocumentationDeadline() + public void SetPartialReportDeadline_ValidDeadline_SetsPartialReportDeadline() { // Arrange var notice = MockValidNotice(); - var sendingDocumentationDeadline = 1; + var deadline = DateTime.UtcNow; // Act - notice.SendingDocumentationDeadline = sendingDocumentationDeadline; + notice.PartialReportDeadline = deadline; // Assert - notice.SendingDocumentationDeadline.Should().Be(sendingDocumentationDeadline); + notice.PartialReportDeadline.Should().Be(deadline.ToUniversalTime()); } [Fact] - public void SetSendingDocumentationDeadline_NullSendingDocumentationDeadline_ThrowsException() + public void SetPartialReportDeadline_NullDeadline_ThrowsException() { // Arrange var notice = MockValidNotice(); // Act & Assert - Assert.Throws(() => notice.SendingDocumentationDeadline = null); + Assert.Throws(() => notice.PartialReportDeadline = null); } [Fact] - public void SetSendingDocumentationDeadline_NegativeSendingDocumentationDeadline_ThrowsException() + public void SetFinalReportDeadline_ValidDeadline_SetsFinalReportDeadline() + { + // Arrange + var notice = MockValidNotice(); + var deadline = DateTime.UtcNow; + + // Act + notice.FinalReportDeadline = deadline; + + // Assert + notice.FinalReportDeadline.Should().Be(deadline.ToUniversalTime()); + } + + [Fact] + public void SetFinalReportDeadline_NullDeadline_ThrowsException() + { + // Arrange + var notice = MockValidNotice(); + + // Act & Assert + Assert.Throws(() => notice.FinalReportDeadline = null); + } + + [Fact] + public void SetSuspensionYears_ValidSuspensionYears_SetsSuspensionYears() + { + // Arrange + var notice = MockValidNotice(); + var suspensionYears = 1; + + // Act + notice.SuspensionYears = suspensionYears; + + // Assert + notice.SuspensionYears.Should().Be(suspensionYears); + } + + [Fact] + public void SetSuspensionYears_NullSuspensionYears_ThrowsException() { // Arrange var notice = MockValidNotice(); // Act & Assert - Assert.Throws(() => notice.SendingDocumentationDeadline = -1); + Assert.Throws(() => notice.SuspensionYears = null); + } + + [Fact] + public void SetSuspensionYears_NegativeSuspensionYears_ThrowsException() + { + // Arrange + var notice = MockValidNotice(); + + // Act & Assert + Assert.Throws(() => notice.SuspensionYears = -1); + } + + [Fact] + public void SetDocUrl_ValidUrl_SetsDocUrl() + { + // Arrange + var notice = MockValidNotice(); + var url = "https://www.example.com"; + + // Act + notice.DocUrl = url; + + // Assert + notice.DocUrl.Should().Be(url); + } + + // Add additional tests for DocUrl property (e.g., invalid URLs). + + [Fact] + public void SetCreatedAt_ValidDate_SetsCreatedAt() + { + // Arrange + var notice = MockValidNotice(); + + // Assert + notice.CreatedAt.Should().NotBeNull(); } } -} +} \ No newline at end of file diff --git a/src/Domain.Tests/Entities/ProjectEvaluationUnitTests.cs b/src/Domain.Tests/Entities/ProjectEvaluationUnitTests.cs index 04361991..ed6b0c42 100644 --- a/src/Domain.Tests/Entities/ProjectEvaluationUnitTests.cs +++ b/src/Domain.Tests/Entities/ProjectEvaluationUnitTests.cs @@ -1,249 +1,249 @@ -using Domain.Entities; -using Domain.Entities.Enums; -using Domain.Validation; -using FluentAssertions; -using System; -using Xunit; - -namespace Domain.Tests.Entities -{ - public class ProjectEvaluationUnitTests - { - private ProjectEvaluation MockValidProjectEvaluation() - { - return new ProjectEvaluation - { - ProjectId = Guid.NewGuid(), - IsProductivityFellow = true, - SubmissionEvaluatorId = Guid.NewGuid(), - SubmissionEvaluationDate = DateTime.UtcNow, - SubmissionEvaluationStatus = EProjectStatus.Pending, - SubmissionEvaluationDescription = "Submission evaluation description", - AppealEvaluatorId = Guid.NewGuid(), - AppealEvaluationDate = DateTime.UtcNow, - AppealEvaluationStatus = EProjectStatus.Accepted, - AppealEvaluationDescription = "Appeal evaluation description", - DocumentsEvaluatorId = Guid.NewGuid(), - DocumentsEvaluationDate = DateTime.UtcNow, - DocumentsEvaluationDescription = "Documents evaluation description", - FoundWorkType1 = 1, - FoundWorkType2 = 2, - FoundIndexedConferenceProceedings = 3, - FoundNotIndexedConferenceProceedings = 4, - FoundCompletedBook = 5, - FoundOrganizedBook = 6, - FoundBookChapters = 7, - FoundBookTranslations = 8, - FoundParticipationEditorialCommittees = 9, - FoundFullComposerSoloOrchestraAllTracks = 10, - FoundFullComposerSoloOrchestraCompilation = 11, - FoundChamberOrchestraInterpretation = 12, - FoundIndividualAndCollectiveArtPerformances = 13, - FoundScientificCulturalArtisticCollectionsCuratorship = 14, - FoundPatentLetter = 15, - FoundPatentDeposit = 16, - FoundSoftwareRegistration = 17, - APIndex = 18, - Qualification = EQualification.Master, - ProjectProposalObjectives = EScore.Good, - AcademicScientificProductionCoherence = EScore.Excellent, - ProposalMethodologyAdaptation = EScore.Regular, - EffectiveContributionToResearch = EScore.Weak - }; - } - - [Fact] - public void TestAllProperties() - { - // Arrange - var projectEvaluation = MockValidProjectEvaluation(); - - // Act & Assert - AssertValidation(() => projectEvaluation.ProjectId = null); - AssertValidation(() => projectEvaluation.IsProductivityFellow = null); - AssertValidation(() => projectEvaluation.SubmissionEvaluatorId = null); - AssertValidation(() => projectEvaluation.SubmissionEvaluationDate = null); - AssertValidation(() => projectEvaluation.SubmissionEvaluationStatus = null); - AssertValidation(() => projectEvaluation.SubmissionEvaluationDescription = null); - // AssertValidation(() => projectEvaluation.AppealEvaluatorId = null); - // AssertValidation(() => projectEvaluation.AppealEvaluationDate = null); - // AssertValidation(() => projectEvaluation.AppealEvaluationStatus = null); - // AssertValidation(() => projectEvaluation.AppealEvaluationDescription = null); - // AssertValidation(() => projectEvaluation.DocumentsEvaluatorId = null); - // AssertValidation(() => projectEvaluation.DocumentsEvaluationDate = null); - // AssertValidation(() => projectEvaluation.DocumentsEvaluationDescription = null); - AssertValidation(() => projectEvaluation.FoundWorkType1 = null); - AssertValidation(() => projectEvaluation.FoundWorkType2 = null); - AssertValidation(() => projectEvaluation.FoundIndexedConferenceProceedings = null); - AssertValidation(() => projectEvaluation.FoundNotIndexedConferenceProceedings = null); - AssertValidation(() => projectEvaluation.FoundCompletedBook = null); - AssertValidation(() => projectEvaluation.FoundOrganizedBook = null); - AssertValidation(() => projectEvaluation.FoundBookChapters = null); - AssertValidation(() => projectEvaluation.FoundBookTranslations = null); - AssertValidation(() => projectEvaluation.FoundParticipationEditorialCommittees = null); - AssertValidation(() => projectEvaluation.FoundFullComposerSoloOrchestraAllTracks = null); - AssertValidation(() => projectEvaluation.FoundFullComposerSoloOrchestraCompilation = null); - AssertValidation(() => projectEvaluation.FoundChamberOrchestraInterpretation = null); - AssertValidation(() => projectEvaluation.FoundIndividualAndCollectiveArtPerformances = null); - AssertValidation(() => projectEvaluation.FoundScientificCulturalArtisticCollectionsCuratorship = null); - AssertValidation(() => projectEvaluation.FoundPatentLetter = null); - AssertValidation(() => projectEvaluation.FoundPatentDeposit = null); - AssertValidation(() => projectEvaluation.FoundSoftwareRegistration = null); - AssertValidation(() => projectEvaluation.APIndex = null); - AssertValidation(() => projectEvaluation.Qualification = null); - AssertValidation(() => projectEvaluation.ProjectProposalObjectives = null); - AssertValidation(() => projectEvaluation.AcademicScientificProductionCoherence = null); - AssertValidation(() => projectEvaluation.ProposalMethodologyAdaptation = null); - AssertValidation(() => projectEvaluation.EffectiveContributionToResearch = null); - } - - [Fact] - public void SetProjectId_ValidId_SetsProjectId() - { - // Arrange - var projectEvaluation = MockValidProjectEvaluation(); - var projectId = Guid.NewGuid(); - - // Act - projectEvaluation.ProjectId = projectId; - - // Assert - projectEvaluation.ProjectId.Should().Be(projectId); - } - - [Fact] - public void SetProjectId_NullId_ThrowsException() - { - // Arrange - var projectEvaluation = MockValidProjectEvaluation(); - - // Act & Assert - Assert.Throws(() => projectEvaluation.ProjectId = null); - } - - [Fact] - public void SetIsProductivityFellow_ValidValue_SetsIsProductivityFellow() - { - // Arrange - var projectEvaluation = MockValidProjectEvaluation(); - var isProductivityFellow = true; - - // Act - projectEvaluation.IsProductivityFellow = isProductivityFellow; - - // Assert - projectEvaluation.IsProductivityFellow.Should().Be(isProductivityFellow); - } - - [Fact] - public void SetIsProductivityFellow_NullValue_ThrowsException() - { - // Arrange - var projectEvaluation = MockValidProjectEvaluation(); - - // Act & Assert - Assert.Throws(() => projectEvaluation.IsProductivityFellow = null); - } - - [Fact] - public void SetSubmissionEvaluatorId_ValidId_SetsSubmissionEvaluatorId() - { - // Arrange - var projectEvaluation = MockValidProjectEvaluation(); - var submissionEvaluatorId = Guid.NewGuid(); - - // Act - projectEvaluation.SubmissionEvaluatorId = submissionEvaluatorId; - - // Assert - projectEvaluation.SubmissionEvaluatorId.Should().Be(submissionEvaluatorId); - } - - [Fact] - public void SetSubmissionEvaluatorId_NullId_ThrowsException() - { - // Arrange - var projectEvaluation = MockValidProjectEvaluation(); - - // Act & Assert - Assert.Throws(() => projectEvaluation.SubmissionEvaluatorId = null); - } - - [Fact] - public void SetSubmissionEvaluationDate_ValidDate_SetsSubmissionEvaluationDate() - { - // Arrange - var projectEvaluation = MockValidProjectEvaluation(); - var submissionEvaluationDate = DateTime.UtcNow; - - // Act - projectEvaluation.SubmissionEvaluationDate = submissionEvaluationDate; - - // Assert - projectEvaluation.SubmissionEvaluationDate.Should().Be(submissionEvaluationDate); - } - - [Fact] - public void SetSubmissionEvaluationDate_NullDate_ThrowsException() - { - // Arrange - var projectEvaluation = MockValidProjectEvaluation(); - - // Act & Assert - Assert.Throws(() => projectEvaluation.SubmissionEvaluationDate = null); - } - - [Fact] - public void SetSubmissionEvaluationStatus_ValidStatus_SetsSubmissionEvaluationStatus() - { - // Arrange - var projectEvaluation = MockValidProjectEvaluation(); - var submissionEvaluationStatus = EProjectStatus.Accepted; - - // Act - projectEvaluation.SubmissionEvaluationStatus = submissionEvaluationStatus; - - // Assert - projectEvaluation.SubmissionEvaluationStatus.Should().Be(submissionEvaluationStatus); - } - - [Fact] - public void SetSubmissionEvaluationStatus_NullStatus_ThrowsException() - { - // Arrange - var projectEvaluation = MockValidProjectEvaluation(); - - // Act & Assert - Assert.Throws(() => projectEvaluation.SubmissionEvaluationStatus = null); - } - - [Fact] - public void SetSubmissionEvaluationDescription_ValidDescription_SetsSubmissionEvaluationDescription() - { - // Arrange - var projectEvaluation = MockValidProjectEvaluation(); - var submissionEvaluationDescription = "This is a valid description."; - - // Act - projectEvaluation.SubmissionEvaluationDescription = submissionEvaluationDescription; - - // Assert - projectEvaluation.SubmissionEvaluationDescription.Should().Be(submissionEvaluationDescription); - } - - [Fact] - public void SetSubmissionEvaluationDescription_NullDescription_ThrowsException() - { - // Arrange - var projectEvaluation = MockValidProjectEvaluation(); - - // Act & Assert - Assert.Throws(() => projectEvaluation.SubmissionEvaluationDescription = null); - } - - private void AssertValidation(Action action) - { - Assert.Throws(action); - } - } -} +// using Domain.Entities; +// using Domain.Entities.Enums; +// using Domain.Validation; +// using FluentAssertions; +// using System; +// using Xunit; + +// namespace Domain.Tests.Entities +// { +// public class ProjectEvaluationUnitTests +// { +// private ProjectEvaluation MockValidProjectEvaluation() +// { +// return new ProjectEvaluation +// { +// ProjectId = Guid.NewGuid(), +// IsProductivityFellow = true, +// SubmissionEvaluatorId = Guid.NewGuid(), +// SubmissionEvaluationDate = DateTime.UtcNow, +// SubmissionEvaluationStatus = EProjectStatus.Pending, +// SubmissionEvaluationDescription = "Submission evaluation description", +// AppealEvaluatorId = Guid.NewGuid(), +// AppealEvaluationDate = DateTime.UtcNow, +// AppealEvaluationStatus = EProjectStatus.Accepted, +// AppealEvaluationDescription = "Appeal evaluation description", +// DocumentsEvaluatorId = Guid.NewGuid(), +// DocumentsEvaluationDate = DateTime.UtcNow, +// DocumentsEvaluationDescription = "Documents evaluation description", +// FoundWorkType1 = 1, +// FoundWorkType2 = 2, +// FoundIndexedConferenceProceedings = 3, +// FoundNotIndexedConferenceProceedings = 4, +// FoundCompletedBook = 5, +// FoundOrganizedBook = 6, +// FoundBookChapters = 7, +// FoundBookTranslations = 8, +// FoundParticipationEditorialCommittees = 9, +// FoundFullComposerSoloOrchestraAllTracks = 10, +// FoundFullComposerSoloOrchestraCompilation = 11, +// FoundChamberOrchestraInterpretation = 12, +// FoundIndividualAndCollectiveArtPerformances = 13, +// FoundScientificCulturalArtisticCollectionsCuratorship = 14, +// FoundPatentLetter = 15, +// FoundPatentDeposit = 16, +// FoundSoftwareRegistration = 17, +// APIndex = 18, +// Qualification = EQualification.Master, +// ProjectProposalObjectives = EScore.Good, +// AcademicScientificProductionCoherence = EScore.Excellent, +// ProposalMethodologyAdaptation = EScore.Regular, +// EffectiveContributionToResearch = EScore.Weak +// }; +// } + +// [Fact] +// public void TestAllProperties() +// { +// // Arrange +// var projectEvaluation = MockValidProjectEvaluation(); + +// // Act & Assert +// AssertValidation(() => projectEvaluation.ProjectId = null); +// AssertValidation(() => projectEvaluation.IsProductivityFellow = null); +// AssertValidation(() => projectEvaluation.SubmissionEvaluatorId = null); +// AssertValidation(() => projectEvaluation.SubmissionEvaluationDate = null); +// AssertValidation(() => projectEvaluation.SubmissionEvaluationStatus = null); +// AssertValidation(() => projectEvaluation.SubmissionEvaluationDescription = null); +// // AssertValidation(() => projectEvaluation.AppealEvaluatorId = null); +// // AssertValidation(() => projectEvaluation.AppealEvaluationDate = null); +// // AssertValidation(() => projectEvaluation.AppealEvaluationStatus = null); +// // AssertValidation(() => projectEvaluation.AppealEvaluationDescription = null); +// // AssertValidation(() => projectEvaluation.DocumentsEvaluatorId = null); +// // AssertValidation(() => projectEvaluation.DocumentsEvaluationDate = null); +// // AssertValidation(() => projectEvaluation.DocumentsEvaluationDescription = null); +// AssertValidation(() => projectEvaluation.FoundWorkType1 = null); +// AssertValidation(() => projectEvaluation.FoundWorkType2 = null); +// AssertValidation(() => projectEvaluation.FoundIndexedConferenceProceedings = null); +// AssertValidation(() => projectEvaluation.FoundNotIndexedConferenceProceedings = null); +// AssertValidation(() => projectEvaluation.FoundCompletedBook = null); +// AssertValidation(() => projectEvaluation.FoundOrganizedBook = null); +// AssertValidation(() => projectEvaluation.FoundBookChapters = null); +// AssertValidation(() => projectEvaluation.FoundBookTranslations = null); +// AssertValidation(() => projectEvaluation.FoundParticipationEditorialCommittees = null); +// AssertValidation(() => projectEvaluation.FoundFullComposerSoloOrchestraAllTracks = null); +// AssertValidation(() => projectEvaluation.FoundFullComposerSoloOrchestraCompilation = null); +// AssertValidation(() => projectEvaluation.FoundChamberOrchestraInterpretation = null); +// AssertValidation(() => projectEvaluation.FoundIndividualAndCollectiveArtPerformances = null); +// AssertValidation(() => projectEvaluation.FoundScientificCulturalArtisticCollectionsCuratorship = null); +// AssertValidation(() => projectEvaluation.FoundPatentLetter = null); +// AssertValidation(() => projectEvaluation.FoundPatentDeposit = null); +// AssertValidation(() => projectEvaluation.FoundSoftwareRegistration = null); +// AssertValidation(() => projectEvaluation.APIndex = null); +// AssertValidation(() => projectEvaluation.Qualification = null); +// AssertValidation(() => projectEvaluation.ProjectProposalObjectives = null); +// AssertValidation(() => projectEvaluation.AcademicScientificProductionCoherence = null); +// AssertValidation(() => projectEvaluation.ProposalMethodologyAdaptation = null); +// AssertValidation(() => projectEvaluation.EffectiveContributionToResearch = null); +// } + +// [Fact] +// public void SetProjectId_ValidId_SetsProjectId() +// { +// // Arrange +// var projectEvaluation = MockValidProjectEvaluation(); +// var projectId = Guid.NewGuid(); + +// // Act +// projectEvaluation.ProjectId = projectId; + +// // Assert +// projectEvaluation.ProjectId.Should().Be(projectId); +// } + +// [Fact] +// public void SetProjectId_NullId_ThrowsException() +// { +// // Arrange +// var projectEvaluation = MockValidProjectEvaluation(); + +// // Act & Assert +// Assert.Throws(() => projectEvaluation.ProjectId = null); +// } + +// [Fact] +// public void SetIsProductivityFellow_ValidValue_SetsIsProductivityFellow() +// { +// // Arrange +// var projectEvaluation = MockValidProjectEvaluation(); +// var isProductivityFellow = true; + +// // Act +// projectEvaluation.IsProductivityFellow = isProductivityFellow; + +// // Assert +// projectEvaluation.IsProductivityFellow.Should().Be(isProductivityFellow); +// } + +// [Fact] +// public void SetIsProductivityFellow_NullValue_ThrowsException() +// { +// // Arrange +// var projectEvaluation = MockValidProjectEvaluation(); + +// // Act & Assert +// Assert.Throws(() => projectEvaluation.IsProductivityFellow = null); +// } + +// [Fact] +// public void SetSubmissionEvaluatorId_ValidId_SetsSubmissionEvaluatorId() +// { +// // Arrange +// var projectEvaluation = MockValidProjectEvaluation(); +// var submissionEvaluatorId = Guid.NewGuid(); + +// // Act +// projectEvaluation.SubmissionEvaluatorId = submissionEvaluatorId; + +// // Assert +// projectEvaluation.SubmissionEvaluatorId.Should().Be(submissionEvaluatorId); +// } + +// [Fact] +// public void SetSubmissionEvaluatorId_NullId_ThrowsException() +// { +// // Arrange +// var projectEvaluation = MockValidProjectEvaluation(); + +// // Act & Assert +// Assert.Throws(() => projectEvaluation.SubmissionEvaluatorId = null); +// } + +// [Fact] +// public void SetSubmissionEvaluationDate_ValidDate_SetsSubmissionEvaluationDate() +// { +// // Arrange +// var projectEvaluation = MockValidProjectEvaluation(); +// var submissionEvaluationDate = DateTime.UtcNow; + +// // Act +// projectEvaluation.SubmissionEvaluationDate = submissionEvaluationDate; + +// // Assert +// projectEvaluation.SubmissionEvaluationDate.Should().Be(submissionEvaluationDate); +// } + +// [Fact] +// public void SetSubmissionEvaluationDate_NullDate_ThrowsException() +// { +// // Arrange +// var projectEvaluation = MockValidProjectEvaluation(); + +// // Act & Assert +// Assert.Throws(() => projectEvaluation.SubmissionEvaluationDate = null); +// } + +// [Fact] +// public void SetSubmissionEvaluationStatus_ValidStatus_SetsSubmissionEvaluationStatus() +// { +// // Arrange +// var projectEvaluation = MockValidProjectEvaluation(); +// var submissionEvaluationStatus = EProjectStatus.Accepted; + +// // Act +// projectEvaluation.SubmissionEvaluationStatus = submissionEvaluationStatus; + +// // Assert +// projectEvaluation.SubmissionEvaluationStatus.Should().Be(submissionEvaluationStatus); +// } + +// [Fact] +// public void SetSubmissionEvaluationStatus_NullStatus_ThrowsException() +// { +// // Arrange +// var projectEvaluation = MockValidProjectEvaluation(); + +// // Act & Assert +// Assert.Throws(() => projectEvaluation.SubmissionEvaluationStatus = null); +// } + +// [Fact] +// public void SetSubmissionEvaluationDescription_ValidDescription_SetsSubmissionEvaluationDescription() +// { +// // Arrange +// var projectEvaluation = MockValidProjectEvaluation(); +// var submissionEvaluationDescription = "This is a valid description."; + +// // Act +// projectEvaluation.SubmissionEvaluationDescription = submissionEvaluationDescription; + +// // Assert +// projectEvaluation.SubmissionEvaluationDescription.Should().Be(submissionEvaluationDescription); +// } + +// [Fact] +// public void SetSubmissionEvaluationDescription_NullDescription_ThrowsException() +// { +// // Arrange +// var projectEvaluation = MockValidProjectEvaluation(); + +// // Act & Assert +// Assert.Throws(() => projectEvaluation.SubmissionEvaluationDescription = null); +// } + +// private void AssertValidation(Action action) +// { +// Assert.Throws(action); +// } +// } +// } diff --git a/src/Domain.Tests/Entities/ProjectUnitTests.cs b/src/Domain.Tests/Entities/ProjectUnitTests.cs index 31ea0fcf..a3477557 100644 --- a/src/Domain.Tests/Entities/ProjectUnitTests.cs +++ b/src/Domain.Tests/Entities/ProjectUnitTests.cs @@ -522,17 +522,17 @@ public void SetSubmissionDate_ValidSubmissionDate_SetsSubmissionDate() } [Fact] - public void SetResubmissionDate_ValidResubmissionDate_SetsResubmissionDate() + public void SetAppealDate_ValidAppealDate_SetsAppealDate() { // Arrange var project = MockValidProject(); var resubmissionDate = DateTime.UtcNow; // Act - project.ResubmissionDate = resubmissionDate; + project.AppealDate = resubmissionDate; // Assert - project.ResubmissionDate.Should().Be(resubmissionDate); + project.AppealDate.Should().Be(resubmissionDate); } [Fact] diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/NoticeConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/NoticeConfiguration.cs index a0376a5f..d253d1c4 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/NoticeConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/NoticeConfiguration.cs @@ -23,7 +23,7 @@ public void Configure(EntityTypeBuilder builder) builder.Property(p => p.FinalReportDeadline).IsRequired(); builder.Property(p => p.SuspensionYears).IsRequired(); builder.Property(p => p.DocUrl).HasMaxLength(300); - builder.Property(p => p.CreatedAt).HasDefaultValueSql("getdate()").IsRequired(); + builder.Property(p => p.CreatedAt).HasDefaultValueSql("now() at time zone 'utc'").IsRequired(); builder.Property(p => p.DeletedAt); builder.HasQueryFilter(x => x.DeletedAt == null); diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index aea32d1c..3ce9bd04 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add UpdateProjectEvaluation --project ../Persistence/Persistence.csproj +dotnet ef migrations add UpdateNotices --project ../Persistence/Persistence.csproj ``` Executando as Migrations: From 80837c5e33d97824917b8ad55c6de5a4e177984b Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 22 Jul 2023 16:01:48 -0300 Subject: [PATCH 037/201] feat: add acitivity type entity --- src/Domain/Entities/ActivityType.cs | 72 +++++++++++++++++++ .../Repositories/IActivityTypeRepository.cs | 10 +++ 2 files changed, 82 insertions(+) create mode 100644 src/Domain/Entities/ActivityType.cs create mode 100644 src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs diff --git a/src/Domain/Entities/ActivityType.cs b/src/Domain/Entities/ActivityType.cs new file mode 100644 index 00000000..44e5658f --- /dev/null +++ b/src/Domain/Entities/ActivityType.cs @@ -0,0 +1,72 @@ +using Domain.Entities.Primitives; +using Domain.Validation; + +namespace Domain.Entities +{ + public class ActivityType : Entity + { + #region Properties + private string? _name; + public string? Name + { + get { return _name; } + set + { + EntityExceptionValidation.When(string.IsNullOrEmpty(value), + ExceptionMessageFactory.Required(nameof(Name))); + EntityExceptionValidation.When(value?.Length < 3, + ExceptionMessageFactory.MinLength(nameof(Name), 3)); + EntityExceptionValidation.When(value?.Length > 300, + ExceptionMessageFactory.MaxLength(nameof(Name), 300)); + _name = value; + } + } + + private string? _unity; + public string? Unity + { + get { return _unity; } + set + { + EntityExceptionValidation.When(string.IsNullOrEmpty(value), + ExceptionMessageFactory.Required(nameof(Unity))); + EntityExceptionValidation.When(value?.Length < 3, + ExceptionMessageFactory.MinLength(nameof(Unity), 3)); + EntityExceptionValidation.When(value?.Length > 300, + ExceptionMessageFactory.MaxLength(nameof(Unity), 300)); + _unity = value; + } + } + + private Guid? _noticeId; + public Guid? NoticeId + { + get => _noticeId; + private set + { + { + EntityExceptionValidation.When(value == null, + ExceptionMessageFactory.Required("Id do Edital")); + _noticeId = value; + } + } + } + + public virtual Notice? Notice { get; } + #endregion + + #region Constructors + public ActivityType(string? name, string? unity, Guid? noticeId) + { + Name = name; + Unity = unity; + NoticeId = noticeId; + } + + /// + /// Constructor to dbcontext EF instancing. + /// + protected ActivityType() { } + #endregion + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs b/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs new file mode 100644 index 00000000..007d17e6 --- /dev/null +++ b/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs @@ -0,0 +1,10 @@ +using Domain.Entities; +using Domain.Interfaces.Repositories.Bases; + +namespace Domain.Interfaces.Repositories +{ + public interface IActivityTypeRepository : IGenericCRUDRepository + { + Task> GetByNoticeId(Guid? noticeId); + } +} \ No newline at end of file From a0345e3e973a2efa5660b03f4c6d02b1408eb342 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 22 Jul 2023 18:09:55 -0300 Subject: [PATCH 038/201] feat: add activities implementation --- .../Gateways/Activity/ActivityResponse.cs | 6 + .../Gateways/Activity/ActivityTypeResponse.cs | 7 + .../Gateways/Activity/BaseActivity.cs | 11 ++ .../Gateways/Activity/BaseActivityType.cs | 12 ++ .../Activity/CreateActivityRequest.cs | 12 ++ .../Activity/CreateActivityTypeRequest.cs | 12 ++ .../Activity/UpdateActivityRequest.cs | 12 ++ .../Activity/UpdateActivityTypeRequest.cs | 12 ++ .../Gateways/Notice/CreateNoticeRequest.cs | 8 +- .../IActivityPresenterController.cs | 10 ++ src/Adapters/Mappings/ActivityMappings.cs | 24 ++++ .../ActivityPresenterController.cs | 35 +++++ .../Contracts/Activity/ActivityOutput.cs | 6 + .../Contracts/Activity/ActivityTypeOutput.cs | 7 + src/Domain/Contracts/Activity/BaseActivity.cs | 11 ++ .../Contracts/Activity/BaseActivityType.cs | 12 ++ .../Contracts/Activity/CreateActivityInput.cs | 2 + .../Activity/CreateActivityTypeInput.cs | 2 + .../Contracts/Activity/UpdateActivityInput.cs | 6 + .../Activity/UpdateActivityTypeInput.cs | 7 + .../Contracts/Notice/CreateNoticeInput.cs | 4 +- .../Contracts/Notice/UpdateNoticeInput.cs | 4 +- src/Domain/Entities/Activity.cs | 88 ++++++++++++ src/Domain/Entities/ActivityType.cs | 1 + .../Repositories/IActivityRepository.cs | 5 + .../Repositories/IActivityTypeRepository.cs | 1 + .../Repositories/IProfessorRepository.cs | 4 +- .../ActivityType/IGetActivitiesByNoticeId.cs | 7 + .../ActivityType/IGetLastNoticeActivities.cs | 9 ++ src/Domain/Mappings/ActivityMappings.cs | 23 +++ .../ActivityType/GetActivitiesByNoticeId.cs | 60 ++++++++ .../ActivityType/GetLastNoticeActivities.cs | 60 ++++++++ src/Domain/UseCases/Notice/CreateNotice.cs | 53 ++++++- src/Domain/UseCases/Notice/UpdateNotice.cs | 134 +++++++++++++++--- .../IoC/DependencyAdaptersInjection.cs | 2 + .../IoC/DependencyDomainInjection.cs | 8 ++ src/Infrastructure/IoC/DependencyInjection.cs | 2 + .../Context/ApplicationDbContext.cs | 6 +- .../ActivityConfiguration.cs | 29 ++++ .../ActivityTypeConfiguration.cs | 28 ++++ .../EntitiesConfiguration/EntityBuilder.cs | 0 src/Infrastructure/Persistence/README.md | 2 +- .../Repositories/ActivityRepository.cs | 48 +++++++ .../Repositories/ActivityTypeRepository.cs | 75 ++++++++++ 44 files changed, 833 insertions(+), 34 deletions(-) create mode 100644 src/Adapters/Gateways/Activity/ActivityResponse.cs create mode 100644 src/Adapters/Gateways/Activity/ActivityTypeResponse.cs create mode 100644 src/Adapters/Gateways/Activity/BaseActivity.cs create mode 100644 src/Adapters/Gateways/Activity/BaseActivityType.cs create mode 100644 src/Adapters/Gateways/Activity/CreateActivityRequest.cs create mode 100644 src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs create mode 100644 src/Adapters/Gateways/Activity/UpdateActivityRequest.cs create mode 100644 src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs create mode 100644 src/Adapters/Interfaces/IActivityPresenterController.cs create mode 100644 src/Adapters/Mappings/ActivityMappings.cs create mode 100644 src/Adapters/PresenterController/ActivityPresenterController.cs create mode 100644 src/Domain/Contracts/Activity/ActivityOutput.cs create mode 100644 src/Domain/Contracts/Activity/ActivityTypeOutput.cs create mode 100644 src/Domain/Contracts/Activity/BaseActivity.cs create mode 100644 src/Domain/Contracts/Activity/BaseActivityType.cs create mode 100644 src/Domain/Contracts/Activity/CreateActivityInput.cs create mode 100644 src/Domain/Contracts/Activity/CreateActivityTypeInput.cs create mode 100644 src/Domain/Contracts/Activity/UpdateActivityInput.cs create mode 100644 src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs create mode 100644 src/Domain/Entities/Activity.cs create mode 100644 src/Domain/Interfaces/Repositories/IActivityRepository.cs create mode 100644 src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs create mode 100644 src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs create mode 100644 src/Domain/Mappings/ActivityMappings.cs create mode 100644 src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs create mode 100644 src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs create mode 100644 src/Infrastructure/Persistence/EntitiesConfiguration/ActivityConfiguration.cs create mode 100644 src/Infrastructure/Persistence/EntitiesConfiguration/ActivityTypeConfiguration.cs create mode 100644 src/Infrastructure/Persistence/EntitiesConfiguration/EntityBuilder.cs create mode 100644 src/Infrastructure/Persistence/Repositories/ActivityRepository.cs create mode 100644 src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs diff --git a/src/Adapters/Gateways/Activity/ActivityResponse.cs b/src/Adapters/Gateways/Activity/ActivityResponse.cs new file mode 100644 index 00000000..6f06f044 --- /dev/null +++ b/src/Adapters/Gateways/Activity/ActivityResponse.cs @@ -0,0 +1,6 @@ +namespace Adapters.Gateways.Activity; +public class ActivityResponse : BaseActivity +{ + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/ActivityTypeResponse.cs b/src/Adapters/Gateways/Activity/ActivityTypeResponse.cs new file mode 100644 index 00000000..9fc68f9d --- /dev/null +++ b/src/Adapters/Gateways/Activity/ActivityTypeResponse.cs @@ -0,0 +1,7 @@ +namespace Adapters.Gateways.Activity; +public class ActivityTypeResponse : BaseActivityType +{ + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } + new public IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/BaseActivity.cs b/src/Adapters/Gateways/Activity/BaseActivity.cs new file mode 100644 index 00000000..00b864d4 --- /dev/null +++ b/src/Adapters/Gateways/Activity/BaseActivity.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace Adapters.Gateways.Activity; +public class BaseActivity +{ + [Required] + public string? Name { get; set; } + [Required] + public double? Points { get; set; } + public double? Limits { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/BaseActivityType.cs b/src/Adapters/Gateways/Activity/BaseActivityType.cs new file mode 100644 index 00000000..34331f24 --- /dev/null +++ b/src/Adapters/Gateways/Activity/BaseActivityType.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Adapters.Gateways.Activity; +public class BaseActivityType +{ + [Required] + public string? Name { get; set; } + [Required] + public string? Unity { get; set; } + [Required] + public virtual IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/CreateActivityRequest.cs b/src/Adapters/Gateways/Activity/CreateActivityRequest.cs new file mode 100644 index 00000000..333157a8 --- /dev/null +++ b/src/Adapters/Gateways/Activity/CreateActivityRequest.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Adapters.Gateways.Activity; +public class CreateActivityRequest +{ + [Required] + public string? Name { get; set; } + [Required] + public double? Points { get; set; } + [Required] + public double? Limits { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs b/src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs new file mode 100644 index 00000000..e6c6c4cd --- /dev/null +++ b/src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Adapters.Gateways.Activity; +public class CreateActivityTypeRequest +{ + [Required] + public string? Name { get; set; } + [Required] + public string? Unity { get; set; } + [Required] + public virtual IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/UpdateActivityRequest.cs b/src/Adapters/Gateways/Activity/UpdateActivityRequest.cs new file mode 100644 index 00000000..d256a7ba --- /dev/null +++ b/src/Adapters/Gateways/Activity/UpdateActivityRequest.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Adapters.Gateways.Activity; +public class UpdateActivityRequest +{ + [Required] + public string? Name { get; set; } + [Required] + public double? Points { get; set; } + [Required] + public double? Limits { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs b/src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs new file mode 100644 index 00000000..8b4746f9 --- /dev/null +++ b/src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Adapters.Gateways.Activity; +public class UpdateActivityTypeRequest +{ + [Required] + public string? Name { get; set; } + [Required] + public string? Unity { get; set; } + [Required] + public virtual IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs b/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs index 1c605b28..01fbb9af 100644 --- a/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs +++ b/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs @@ -1,5 +1,9 @@ -using Adapters.Gateways.Base; +using Adapters.Gateways.Activity; +using Adapters.Gateways.Base; using Domain.Contracts.Notice; namespace Adapters.Gateways.Notice; -public class CreateNoticeRequest : CreateNoticeInput, IRequest { } \ No newline at end of file +public class CreateNoticeRequest : CreateNoticeInput, IRequest +{ + new public IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Interfaces/IActivityPresenterController.cs b/src/Adapters/Interfaces/IActivityPresenterController.cs new file mode 100644 index 00000000..5e9f3c46 --- /dev/null +++ b/src/Adapters/Interfaces/IActivityPresenterController.cs @@ -0,0 +1,10 @@ +using Adapters.Gateways.Activity; + +namespace Adapters.Interfaces +{ + public interface IActivityPresenterController + { + Task> GetActivitiesByNoticeId(Guid? noticeId); + Task> GetLastNoticeActivities(); + } +} \ No newline at end of file diff --git a/src/Adapters/Mappings/ActivityMappings.cs b/src/Adapters/Mappings/ActivityMappings.cs new file mode 100644 index 00000000..37626ed9 --- /dev/null +++ b/src/Adapters/Mappings/ActivityMappings.cs @@ -0,0 +1,24 @@ +using Adapters.Gateways.Activity; +using AutoMapper; +using Domain.Contracts.Activity; + +namespace Adapters.Mappings +{ + public class ActivityMappings : Profile + { + public ActivityMappings() + { + CreateMap(); + CreateMap() + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)); + + CreateMap(); + CreateMap() + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)); + + CreateMap(); + CreateMap() + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)); + } + } +} \ No newline at end of file diff --git a/src/Adapters/PresenterController/ActivityPresenterController.cs b/src/Adapters/PresenterController/ActivityPresenterController.cs new file mode 100644 index 00000000..325ee85c --- /dev/null +++ b/src/Adapters/PresenterController/ActivityPresenterController.cs @@ -0,0 +1,35 @@ +using Adapters.Gateways.Activity; +using Adapters.Interfaces; +using AutoMapper; +using Domain.Interfaces.UseCases.ActivityType; + +namespace Adapters.PresenterController +{ + public class ActivityPresenterController : IActivityPresenterController + { + private readonly IGetActivitiesByNoticeId _getActivitiesByNoticeId; + private readonly IGetLastNoticeActivities _getLastNoticeActivities; + private readonly IMapper _mapper; + public ActivityPresenterController( + IGetActivitiesByNoticeId getActivitiesByNoticeId, + IGetLastNoticeActivities getLastNoticeActivities, + IMapper mapper) + { + _getActivitiesByNoticeId = getActivitiesByNoticeId; + _getLastNoticeActivities = getLastNoticeActivities; + _mapper = mapper; + } + + public async Task> GetActivitiesByNoticeId(Guid? noticeId) + { + var activityTypes = await _getActivitiesByNoticeId.GetActivitiesByNoticeId(noticeId); + return _mapper.Map>(activityTypes); + } + + public async Task> GetLastNoticeActivities() + { + var activityTypes = await _getLastNoticeActivities.GetLastNoticeActivities(); + return _mapper.Map>(activityTypes); + } + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/ActivityOutput.cs b/src/Domain/Contracts/Activity/ActivityOutput.cs new file mode 100644 index 00000000..5b3364f0 --- /dev/null +++ b/src/Domain/Contracts/Activity/ActivityOutput.cs @@ -0,0 +1,6 @@ +namespace Domain.Contracts.Activity; +public class ActivityOutput : BaseActivity +{ + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/ActivityTypeOutput.cs b/src/Domain/Contracts/Activity/ActivityTypeOutput.cs new file mode 100644 index 00000000..bc070298 --- /dev/null +++ b/src/Domain/Contracts/Activity/ActivityTypeOutput.cs @@ -0,0 +1,7 @@ +namespace Domain.Contracts.Activity; +public class ActivityTypeOutput : BaseActivityType +{ + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } + new public IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/BaseActivity.cs b/src/Domain/Contracts/Activity/BaseActivity.cs new file mode 100644 index 00000000..3c50f5e0 --- /dev/null +++ b/src/Domain/Contracts/Activity/BaseActivity.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.Contracts.Activity; +public class BaseActivity +{ + [Required] + public string? Name { get; set; } + [Required] + public double? Points { get; set; } + public double? Limits { get; set; } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/BaseActivityType.cs b/src/Domain/Contracts/Activity/BaseActivityType.cs new file mode 100644 index 00000000..441b6998 --- /dev/null +++ b/src/Domain/Contracts/Activity/BaseActivityType.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.Contracts.Activity; +public class BaseActivityType +{ + [Required] + public string? Name { get; set; } + [Required] + public string? Unity { get; set; } + [Required] + public virtual IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/CreateActivityInput.cs b/src/Domain/Contracts/Activity/CreateActivityInput.cs new file mode 100644 index 00000000..f18f710d --- /dev/null +++ b/src/Domain/Contracts/Activity/CreateActivityInput.cs @@ -0,0 +1,2 @@ +namespace Domain.Contracts.Activity; +public class CreateActivityInput : BaseActivity { } \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/CreateActivityTypeInput.cs b/src/Domain/Contracts/Activity/CreateActivityTypeInput.cs new file mode 100644 index 00000000..e95809f8 --- /dev/null +++ b/src/Domain/Contracts/Activity/CreateActivityTypeInput.cs @@ -0,0 +1,2 @@ +namespace Domain.Contracts.Activity; +public class CreateActivityTypeInput : BaseActivityType { } \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/UpdateActivityInput.cs b/src/Domain/Contracts/Activity/UpdateActivityInput.cs new file mode 100644 index 00000000..6590d4a6 --- /dev/null +++ b/src/Domain/Contracts/Activity/UpdateActivityInput.cs @@ -0,0 +1,6 @@ +namespace Domain.Contracts.Activity; +public class UpdateActivityInput : BaseActivity +{ + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs b/src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs new file mode 100644 index 00000000..8d51d7e9 --- /dev/null +++ b/src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs @@ -0,0 +1,7 @@ +namespace Domain.Contracts.Activity; +public class UpdateActivityTypeInput : BaseActivityType +{ + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } + new public IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Notice/CreateNoticeInput.cs b/src/Domain/Contracts/Notice/CreateNoticeInput.cs index 7b586a03..3c0d25ae 100644 --- a/src/Domain/Contracts/Notice/CreateNoticeInput.cs +++ b/src/Domain/Contracts/Notice/CreateNoticeInput.cs @@ -1,9 +1,11 @@ -using Microsoft.AspNetCore.Http; +using Domain.Contracts.Activity; +using Microsoft.AspNetCore.Http; namespace Domain.Contracts.Notice { public class CreateNoticeInput : BaseNoticeContract { public IFormFile? File { get; set; } + virtual public IList? Activities { get; set; } } } \ No newline at end of file diff --git a/src/Domain/Contracts/Notice/UpdateNoticeInput.cs b/src/Domain/Contracts/Notice/UpdateNoticeInput.cs index a916a6e0..897c5e92 100644 --- a/src/Domain/Contracts/Notice/UpdateNoticeInput.cs +++ b/src/Domain/Contracts/Notice/UpdateNoticeInput.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Http; +using Domain.Contracts.Activity; +using Microsoft.AspNetCore.Http; namespace Domain.Contracts.Notice { @@ -6,5 +7,6 @@ public class UpdateNoticeInput : BaseNoticeContract { public Guid? Id { get; set; } public IFormFile? File { get; set; } + public IList? Activities { get; set; } } } \ No newline at end of file diff --git a/src/Domain/Entities/Activity.cs b/src/Domain/Entities/Activity.cs new file mode 100644 index 00000000..2575ecf4 --- /dev/null +++ b/src/Domain/Entities/Activity.cs @@ -0,0 +1,88 @@ +using Domain.Entities.Primitives; +using Domain.Validation; + +namespace Domain.Entities +{ + public class Activity : Entity + { + #region Properties + private string? _name; + /// + /// Nome da atividade + /// + public string? Name + { + get => _name; + set + { + EntityExceptionValidation.When(string.IsNullOrEmpty(value), + ExceptionMessageFactory.Required(nameof(Name))); + EntityExceptionValidation.When(value?.Length < 3, + ExceptionMessageFactory.MinLength(nameof(Name), 3)); + EntityExceptionValidation.When(value?.Length > 300, + ExceptionMessageFactory.MaxLength(nameof(Name), 300)); + _name = value; + } + } + + private double? _points; + /// + /// Pontuação da atividade + /// + public double? Points + { + get => _points; + set + { + EntityExceptionValidation.When(value is null, + ExceptionMessageFactory.Required(nameof(Points))); + _points = value; + } + } + + private double? _limits; + /// + /// Limite de pontuação da atividade + /// + public double? Limits + { + get => _limits; + set => _limits = value ?? double.MaxValue; + } + + private Guid? _activityTypeId; + /// + /// Id do tipo de atividade + /// + public Guid? ActivityTypeId + { + get => _activityTypeId; + private set + { + { + EntityExceptionValidation.When(value == null, + ExceptionMessageFactory.Required(nameof(ActivityTypeId))); + _activityTypeId = value; + } + } + } + + public virtual ActivityType? ActivityType { get; } + #endregion + + #region Constructors + public Activity(string? name, double? points, double? limits, Guid? activityTypeId) + { + Name = name; + Points = points; + Limits = limits; + ActivityTypeId = activityTypeId; + } + + /// + /// Constructor to dbcontext EF instancing. + /// + protected Activity() { } + #endregion + } +} \ No newline at end of file diff --git a/src/Domain/Entities/ActivityType.cs b/src/Domain/Entities/ActivityType.cs index 44e5658f..2b63c440 100644 --- a/src/Domain/Entities/ActivityType.cs +++ b/src/Domain/Entities/ActivityType.cs @@ -53,6 +53,7 @@ private set } public virtual Notice? Notice { get; } + public virtual IList? Activities { get; } #endregion #region Constructors diff --git a/src/Domain/Interfaces/Repositories/IActivityRepository.cs b/src/Domain/Interfaces/Repositories/IActivityRepository.cs new file mode 100644 index 00000000..65cf6aba --- /dev/null +++ b/src/Domain/Interfaces/Repositories/IActivityRepository.cs @@ -0,0 +1,5 @@ +using Domain.Entities; +using Domain.Interfaces.Repositories.Bases; + +namespace Domain.Interfaces.Repositories; +public interface IActivityRepository : IGenericCRUDRepository { } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs b/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs index 007d17e6..6cc20075 100644 --- a/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs +++ b/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs @@ -6,5 +6,6 @@ namespace Domain.Interfaces.Repositories public interface IActivityTypeRepository : IGenericCRUDRepository { Task> GetByNoticeId(Guid? noticeId); + Task> GetLastNoticeActivities(); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs index 47b37147..baf6effe 100644 --- a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs @@ -3,7 +3,5 @@ namespace Domain.Interfaces.Repositories { - public interface IProfessorRepository : IGenericCRUDRepository - { - } + public interface IProfessorRepository : IGenericCRUDRepository { } } \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs b/src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs new file mode 100644 index 00000000..3d978e15 --- /dev/null +++ b/src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs @@ -0,0 +1,7 @@ +using Domain.Contracts.Activity; + +namespace Domain.Interfaces.UseCases.ActivityType; +public interface IGetActivitiesByNoticeId +{ + Task> GetActivitiesByNoticeId(Guid? id); +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs b/src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs new file mode 100644 index 00000000..b79452ae --- /dev/null +++ b/src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs @@ -0,0 +1,9 @@ +using Domain.Contracts.Activity; + +namespace Domain.Interfaces.UseCases.ActivityType +{ + public interface IGetLastNoticeActivities + { + Task> GetLastNoticeActivities(); + } +} \ No newline at end of file diff --git a/src/Domain/Mappings/ActivityMappings.cs b/src/Domain/Mappings/ActivityMappings.cs new file mode 100644 index 00000000..8b955641 --- /dev/null +++ b/src/Domain/Mappings/ActivityMappings.cs @@ -0,0 +1,23 @@ +using AutoMapper; +using Domain.Contracts.Activity; +using Domain.Entities; + +namespace Domain.Mappings +{ + public class ActivityMappings : Profile + { + public ActivityMappings() + { + CreateMap(); + CreateMap() + .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) + .ForMember(dest => dest.DeletedAt, opt => opt.MapFrom(src => src.DeletedAt)); + + CreateMap(); + CreateMap() + .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) + .ForMember(dest => dest.DeletedAt, opt => opt.MapFrom(src => src.DeletedAt)) + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)); + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs b/src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs new file mode 100644 index 00000000..b9128a08 --- /dev/null +++ b/src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs @@ -0,0 +1,60 @@ +using AutoMapper; +using Domain.Contracts.Activity; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.UseCases.ActivityType; + +namespace Domain.UseCases.ActivityType +{ + public class GetActivitiesByNoticeId : IGetActivitiesByNoticeId + { + private readonly IActivityTypeRepository _activityTypeRepository; + private readonly IMapper _mapper; + public GetActivitiesByNoticeId(IActivityTypeRepository activityTypeRepository, IMapper mapper) + { + _activityTypeRepository = activityTypeRepository; + _mapper = mapper; + } + + async Task> IGetActivitiesByNoticeId.GetActivitiesByNoticeId(Guid? id) + { + // Obtém os tipos de atividades do edital + var activityTypes = await _activityTypeRepository.GetByNoticeId(id); + + // Mapeia os tipos de atividades para o output + var output = _mapper.Map>(activityTypes); + + // return output; + + // Mapeia os tipos de atividades para o output + var activityTypesOutput = new List(); + foreach (var activityType in activityTypes) + { + // Mapeia as atividades para o output + var activitiesOutput = new List(); + foreach (var activity in activityType.Activities!) + { + activitiesOutput.Add(new ActivityOutput + { + Id = activity.Id, + Name = activity.Name, + Points = activity.Points, + Limits = activity.Limits, + DeletedAt = activity.DeletedAt + }); + } + + // Adiciona o tipo de atividade ao output + activityTypesOutput.Add(new ActivityTypeOutput + { + Id = activityType.Id, + Name = activityType.Name, + Unity = activityType.Unity, + DeletedAt = activityType.DeletedAt, + Activities = activitiesOutput + }); + } + + return activityTypesOutput; + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs b/src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs new file mode 100644 index 00000000..10db5f6e --- /dev/null +++ b/src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs @@ -0,0 +1,60 @@ +using AutoMapper; +using Domain.Contracts.Activity; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.UseCases.ActivityType; + +namespace Domain.UseCases.ActivityType +{ + public class GetLastNoticeActivities : IGetLastNoticeActivities + { + private readonly IActivityTypeRepository _activityTypeRepository; + private readonly IMapper _mapper; + public GetLastNoticeActivities(IActivityTypeRepository activityTypeRepository, IMapper mapper) + { + _activityTypeRepository = activityTypeRepository; + _mapper = mapper; + } + async Task> IGetLastNoticeActivities.GetLastNoticeActivities() + { + // Obtém os tipos de atividades do último edital + var activityTypes = await _activityTypeRepository.GetLastNoticeActivities(); + + // Mapeia os tipos de atividades para o output + var output = _mapper.Map>(activityTypes); + + // return output; + + // Mapeia os tipos de atividades para o output + var activityTypesOutput = new List(); + foreach (var type in activityTypes) + { + // Mapeia as atividades para o output + var activitiesOutput = new List(); + foreach (var activity in type.Activities!) + { + activitiesOutput.Add(new ActivityOutput + { + Id = activity.Id, + Name = activity.Name, + Points = activity.Points, + Limits = activity.Limits, + DeletedAt = activity.DeletedAt + }); + } + + // Adiciona o tipo de atividade ao output + activityTypesOutput.Add(new ActivityTypeOutput + { + Id = type.Id, + Name = type.Name, + Unity = type.Unity, + DeletedAt = type.DeletedAt, + Activities = activitiesOutput + }); + } + + // Retorna os tipos de atividades do último edital + return activityTypesOutput; + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Notice/CreateNotice.cs b/src/Domain/UseCases/Notice/CreateNotice.cs index 4b16c6b7..4a6c0913 100644 --- a/src/Domain/UseCases/Notice/CreateNotice.cs +++ b/src/Domain/UseCases/Notice/CreateNotice.cs @@ -12,19 +12,31 @@ public class CreateNotice : ICreateNotice #region Global Scope private readonly INoticeRepository _repository; private readonly IStorageFileService _storageFileService; + private readonly IActivityTypeRepository _activityTypeRepository; + private readonly IActivityRepository _activityRepository; private readonly IMapper _mapper; - public CreateNotice(INoticeRepository repository, IStorageFileService storageFileService, IMapper mapper) + public CreateNotice( + INoticeRepository repository, + IStorageFileService storageFileService, + IActivityTypeRepository activityTypeRepository, + IActivityRepository activityRepository, + IMapper mapper) { _repository = repository; _storageFileService = storageFileService; + _activityTypeRepository = activityTypeRepository; + _activityRepository = activityRepository; _mapper = mapper; } #endregion public async Task Execute(CreateNoticeInput input) { + // Verifica se atividades foram informadas + UseCaseException.BusinessRuleViolation(input.Activities == null, "As atividades devem ser informadas."); + // Mapeia input para entidade - var entity = new Entities.Notice( + var notice = new Entities.Notice( input.RegistrationStartDate, input.RegistrationEndDate, input.EvaluationStartDate, @@ -40,17 +52,44 @@ public async Task Execute(CreateNoticeInput input) // Verifica se já existe um edital para o período indicado var projectFound = await _repository.GetNoticeByPeriod((DateTime)input.RegistrationStartDate!, (DateTime)input.RegistrationEndDate!); - UseCaseException.BusinessRuleViolation(projectFound != null, "A notice already exists for the indicated period."); + UseCaseException.BusinessRuleViolation(projectFound != null, "Já existe um Edital para o período indicado."); // Salva arquivo no repositório e atualiza atributo DocUrl if (input.File != null) - entity.DocUrl = await _storageFileService.UploadFileAsync(input.File); + notice.DocUrl = await _storageFileService.UploadFileAsync(input.File); + + // Converte as atividades para entidades antes de prosseguir + // com o cadastro no banco, apenas para fins de validação. + foreach (var activityType in input.Activities!) + { + // Converte atividades para entidades + foreach (var activity in activityType.Activities!) + _ = new Entities.Activity(activity.Name, activity.Points, activity.Limits, Guid.Empty); + + // Converte tipo de atividade para entidade + _ = new Entities.ActivityType(activityType.Name, activityType.Unity, Guid.Empty); + } + + // Cria edital no banco + notice = await _repository.Create(notice); + + // Salva atividades no banco + foreach (var activityType in input.Activities!) + { + // Salva tipo de atividade no banco + var activityTypeEntity = new Entities.ActivityType(activityType.Name, activityType.Unity, notice.Id); + activityTypeEntity = await _activityTypeRepository.Create(activityTypeEntity); - // Cria entidade - entity = await _repository.Create(entity); + // Salva atividades no banco + foreach (var activity in activityType.Activities!) + { + var activityEntity = new Entities.Activity(activity.Name, activity.Points, activity.Limits, activityTypeEntity.Id); + await _activityRepository.Create(activityEntity); + } + } // Salva entidade no banco - return _mapper.Map(entity); + return _mapper.Map(notice); } } } \ No newline at end of file diff --git a/src/Domain/UseCases/Notice/UpdateNotice.cs b/src/Domain/UseCases/Notice/UpdateNotice.cs index 0ad3ae90..186a9517 100644 --- a/src/Domain/UseCases/Notice/UpdateNotice.cs +++ b/src/Domain/UseCases/Notice/UpdateNotice.cs @@ -12,11 +12,20 @@ public class UpdateNotice : IUpdateNotice #region Global Scope private readonly INoticeRepository _repository; private readonly IStorageFileService _storageFileService; + private readonly IActivityTypeRepository _activityTypeRepository; + private readonly IActivityRepository _activityRepository; private readonly IMapper _mapper; - public UpdateNotice(INoticeRepository repository, IStorageFileService storageFileService, IMapper mapper) + public UpdateNotice( + INoticeRepository repository, + IStorageFileService storageFileService, + IActivityTypeRepository activityTypeRepository, + IActivityRepository activityRepository, + IMapper mapper) { _repository = repository; _storageFileService = storageFileService; + _activityTypeRepository = activityTypeRepository; + _activityRepository = activityRepository; _mapper = mapper; } #endregion @@ -27,34 +36,125 @@ public async Task Execute(Guid? id, UpdateNoticeInput UseCaseException.NotInformedParam(id == null, nameof(id)); // Recupera entidade que será atualizada - var entity = await _repository.GetById(id) + var notice = await _repository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Notice)); // Verifica se a entidade foi excluída - UseCaseException.BusinessRuleViolation(entity.DeletedAt != null, "The notice entered has already been deleted."); + UseCaseException.BusinessRuleViolation(notice.DeletedAt != null, "The notice entered has already been deleted."); // Salva arquivo no repositório e atualiza atributo DocUrl if (input.File != null) - entity.DocUrl = await _storageFileService.UploadFileAsync(input.File, entity.DocUrl); + notice.DocUrl = await _storageFileService.UploadFileAsync(input.File, notice.DocUrl); // Atualiza atributos permitidos - entity.RegistrationStartDate = input.RegistrationStartDate ?? entity.RegistrationStartDate; - entity.RegistrationEndDate = input.RegistrationEndDate ?? entity.RegistrationEndDate; - entity.EvaluationStartDate = input.EvaluationStartDate ?? entity.EvaluationStartDate; - entity.EvaluationEndDate = input.EvaluationEndDate ?? entity.EvaluationEndDate; - entity.AppealStartDate = input.AppealStartDate ?? entity.AppealStartDate; - entity.AppealEndDate = input.AppealEndDate ?? entity.AppealEndDate; - entity.SendingDocsStartDate = input.SendingDocsStartDate ?? entity.SendingDocsStartDate; - entity.SendingDocsEndDate = input.SendingDocsEndDate ?? entity.SendingDocsEndDate; - entity.PartialReportDeadline = input.PartialReportDeadline ?? entity.PartialReportDeadline; - entity.FinalReportDeadline = input.FinalReportDeadline ?? entity.FinalReportDeadline; - entity.SuspensionYears = input.SuspensionYears ?? entity.SuspensionYears; + notice.RegistrationStartDate = input.RegistrationStartDate ?? notice.RegistrationStartDate; + notice.RegistrationEndDate = input.RegistrationEndDate ?? notice.RegistrationEndDate; + notice.EvaluationStartDate = input.EvaluationStartDate ?? notice.EvaluationStartDate; + notice.EvaluationEndDate = input.EvaluationEndDate ?? notice.EvaluationEndDate; + notice.AppealStartDate = input.AppealStartDate ?? notice.AppealStartDate; + notice.AppealEndDate = input.AppealEndDate ?? notice.AppealEndDate; + notice.SendingDocsStartDate = input.SendingDocsStartDate ?? notice.SendingDocsStartDate; + notice.SendingDocsEndDate = input.SendingDocsEndDate ?? notice.SendingDocsEndDate; + notice.PartialReportDeadline = input.PartialReportDeadline ?? notice.PartialReportDeadline; + notice.FinalReportDeadline = input.FinalReportDeadline ?? notice.FinalReportDeadline; + notice.SuspensionYears = input.SuspensionYears ?? notice.SuspensionYears; + + // Converte as atividades para entidades antes de prosseguir + // com a atualização no banco, apenas para fins de validação. + foreach (var activityType in input.Activities!) + { + // Converte atividades para entidades + foreach (var activity in activityType.Activities!) + _ = new Entities.Activity(activity.Name, activity.Points, activity.Limits, Guid.Empty); + + // Converte tipo de atividade para entidade + _ = new Entities.ActivityType(activityType.Name, activityType.Unity, Guid.Empty); + } // Salva entidade atualizada no banco - await _repository.Update(entity); + await _repository.Update(notice); + + // Recupera atividades do edital + var noticeActivities = (await _activityTypeRepository.GetByNoticeId(notice.Id)).ToList(); + + // Atualiza atividades + foreach (var activityType in input.Activities) + { + // Verifica se o tipo de atividade é novo + if (activityType.Id is null) + { + // Cria tipo de atividade + var activityTypeEntity = new Entities.ActivityType(activityType.Name, activityType.Unity, notice.Id); + + // Salva tipo de atividade no banco + await _activityTypeRepository.Create(activityTypeEntity); + + // Cria atividades + foreach (var activity in activityType.Activities!) + { + // Cria atividade + var activityEntity = new Entities.Activity(activity.Name, activity.Points, activity.Limits, activityTypeEntity.Id); + + // Salva atividade no banco + await _activityRepository.Create(activityEntity); + } + } + else + { + // Verifica se o tipo de atividade foi excluído + var activityTypeEntity = noticeActivities.Find(x => x.Id == activityType.Id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ActivityType)); + + // Atualiza tipo de atividade + activityTypeEntity.Name = activityType.Name; + activityTypeEntity.Unity = activityType.Unity; + + // Atualiza atividades + foreach (var activity in activityType.Activities!) + { + // Verifica se a atividade foi excluída + var activityEntity = activityTypeEntity.Activities!.FirstOrDefault(x => x.Id == activity.Id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Activity)); + + // Atualiza atividade + activityEntity.Name = activity.Name; + activityEntity.Points = activity.Points; + activityEntity.Limits = activity.Limits; + + // Salva atividade atualizada no banco + await _activityRepository.Update(activityEntity); + + // Remove atividade da lista de atividades do tipo de atividade + activityTypeEntity.Activities!.Remove(activityEntity); + } + + // Salva tipo de atividade atualizado no banco + await _activityTypeRepository.Update(activityTypeEntity); + + // Remove tipo de atividade da lista de tipos de atividades do edital + noticeActivities.Remove(activityTypeEntity); + } + } + + // Verifica se existem tipos de atividades que foram excluídos + foreach (var activityTypeToRemove in noticeActivities) + { + foreach (var activityToRemove in activityTypeToRemove.Activities!) + { + // Verifica se a atividade foi excluída + var activityEntity = activityTypeToRemove.Activities!.FirstOrDefault(x => x.Id == activityToRemove.Id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Activity)); + + // Remove atividade do banco + await _activityRepository.Delete(activityEntity.Id); + } + + // Remove tipo de atividade do banco + await _activityTypeRepository.Delete(activityTypeToRemove.Id); + } // Retorna entidade atualizada - return _mapper.Map(entity); + return _mapper.Map(notice); } } } \ No newline at end of file diff --git a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs index 1d086c78..bead8dc3 100644 --- a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs +++ b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs @@ -10,6 +10,7 @@ public static IServiceCollection AddAdapters(this IServiceCollection services) { #region PresenterControllers services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -28,6 +29,7 @@ public static IServiceCollection AddAdapters(this IServiceCollection services) #region Gateways Mappers services.AddAutoMapper(typeof(AreaMappings)); + services.AddAutoMapper(typeof(ActivityMappings)); services.AddAutoMapper(typeof(AssistanceTypeMappings)); services.AddAutoMapper(typeof(AuthMappings)); services.AddAutoMapper(typeof(CampusMappings)); diff --git a/src/Infrastructure/IoC/DependencyDomainInjection.cs b/src/Infrastructure/IoC/DependencyDomainInjection.cs index b12739ea..f8805b62 100644 --- a/src/Infrastructure/IoC/DependencyDomainInjection.cs +++ b/src/Infrastructure/IoC/DependencyDomainInjection.cs @@ -1,9 +1,11 @@ using Domain.Interfaces.Services; using Domain.Interfaces.UseCases; +using Domain.Interfaces.UseCases.ActivityType; using Domain.Interfaces.UseCases.Project; using Domain.Interfaces.UseCases.ProjectEvaluation; using Domain.Mappings; using Domain.UseCases; +using Domain.UseCases.ActivityType; using Domain.UseCases.Project; using Domain.UseCases.ProjectEvaluation; using Infrastructure.Services; @@ -31,6 +33,11 @@ public static IServiceCollection AddDomain(this IServiceCollection services) services.AddScoped(); #endregion + #region ActivityType + services.AddScoped(); + services.AddScoped(); + #endregion + #region AssistanceType services.AddScoped(); services.AddScoped(); @@ -149,6 +156,7 @@ public static IServiceCollection AddDomain(this IServiceCollection services) #region Contract Mappers services.AddAutoMapper(typeof(AreaMappings)); + services.AddAutoMapper(typeof(ActivityMappings)); services.AddAutoMapper(typeof(AssistanceTypeMappings)); services.AddAutoMapper(typeof(CampusMappings)); services.AddAutoMapper(typeof(CourseMappings)); diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs index c8c2a0c6..708128df 100644 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ b/src/Infrastructure/IoC/DependencyInjection.cs @@ -58,6 +58,8 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi #region Repositórios services.AddScoped(); + services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs index eeeb6528..5fac5656 100644 --- a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs +++ b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs @@ -18,7 +18,8 @@ public class ApplicationDbContext : DbContext public ApplicationDbContext(DbContextOptions options) : base(options) { Areas = Set(); - AssistanceScholarships = Set(); + Activities = Set(); + ActivityTypes = Set(); Campuses = Set(); Courses = Set(); MainAreas = Set(); @@ -34,7 +35,8 @@ public ApplicationDbContext(DbContextOptions options) : ba } public DbSet Areas { get; set; } - public DbSet AssistanceScholarships { get; set; } + public DbSet Activities { get; set; } + public DbSet ActivityTypes { get; set; } public DbSet Campuses { get; set; } public DbSet Courses { get; set; } public DbSet MainAreas { get; set; } diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityConfiguration.cs new file mode 100644 index 00000000..56be2400 --- /dev/null +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityConfiguration.cs @@ -0,0 +1,29 @@ +using Domain.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Persistence.EntitiesConfiguration +{ + public class ActivityConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("Activities"); + + builder.HasKey(t => t.Id); + builder.Property(p => p.Id).ValueGeneratedOnAdd(); + + builder.Property(p => p.Name).HasMaxLength(300).IsRequired(); + builder.Property(p => p.Points).IsRequired(); + builder.Property(p => p.Limits); + builder.Property(p => p.ActivityTypeId).IsRequired(); + builder.Property(p => p.DeletedAt); + + builder.HasOne(a => a.ActivityType) + .WithMany() + .HasForeignKey(a => a.ActivityTypeId); + + builder.HasQueryFilter(x => x.DeletedAt == null); + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityTypeConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityTypeConfiguration.cs new file mode 100644 index 00000000..968e873d --- /dev/null +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityTypeConfiguration.cs @@ -0,0 +1,28 @@ +using Domain.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Persistence.EntitiesConfiguration +{ + public class ActivityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("ActivityTypes"); + + builder.HasKey(t => t.Id); + builder.Property(p => p.Id).ValueGeneratedOnAdd(); + + builder.Property(p => p.Name).HasMaxLength(300).IsRequired(); + builder.Property(p => p.Unity).HasMaxLength(300).IsRequired(); + builder.Property(p => p.NoticeId).IsRequired(); + builder.Property(p => p.DeletedAt); + + builder.HasOne(a => a.Notice) + .WithMany() + .HasForeignKey(a => a.NoticeId); + + builder.HasQueryFilter(x => x.DeletedAt == null); + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/EntityBuilder.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/EntityBuilder.cs new file mode 100644 index 00000000..e69de29b diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index 3ce9bd04..a84ca2c5 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add UpdateNotices --project ../Persistence/Persistence.csproj +dotnet ef migrations add AddActivities --project ../Persistence/Persistence.csproj ``` Executando as Migrations: diff --git a/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs b/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs new file mode 100644 index 00000000..b70b1c97 --- /dev/null +++ b/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs @@ -0,0 +1,48 @@ +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Infrastructure.Persistence.Context; +using Microsoft.EntityFrameworkCore; + +namespace Infrastructure.Persistence.Repositories +{ + public class ActivityRepository : IActivityRepository + { + private readonly ApplicationDbContext _context; + public ActivityRepository(ApplicationDbContext context) => _context = context; + + public async Task Create(Activity model) + { + _context.Add(model); + await _context.SaveChangesAsync(); + return model; + } + + public async Task> GetAll(int skip, int take) => await _context.Activities + .Skip(skip) + .Take(take) + .AsAsyncEnumerable() + .OrderBy(x => x.Name) + .ToListAsync(); + + public async Task GetById(Guid? id) => + await _context.Activities + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.Id == id); + + public async Task Delete(Guid? id) + { + var model = await GetById(id) + ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); + model.DeactivateEntity(); + return await Update(model); + } + + public async Task Update(Activity model) + { + _context.Update(model); + await _context.SaveChangesAsync(); + return model; + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs b/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs new file mode 100644 index 00000000..0415741e --- /dev/null +++ b/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs @@ -0,0 +1,75 @@ +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Infrastructure.Persistence.Context; +using Microsoft.EntityFrameworkCore; + +namespace Infrastructure.Persistence.Repositories +{ + public class ActivityTypeRepository : IActivityTypeRepository + { + #region Global Scope + private readonly ApplicationDbContext _context; + public ActivityTypeRepository(ApplicationDbContext context) => _context = context; + #endregion + + public async Task Create(ActivityType model) + { + _context.Add(model); + await _context.SaveChangesAsync(); + return model; + } + + public async Task Delete(Guid? id) + { + var model = await GetById(id) + ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); + model.DeactivateEntity(); + return await Update(model); + } + + public async Task GetById(Guid? id) + { + return await _context.ActivityTypes + .Include(x => x.Notice) + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.Id == id) + ?? throw new Exception($"Nenhum tipo de atividade encontrado para o id {id}"); + } + + public async Task> GetByNoticeId(Guid? noticeId) + { + return await _context.ActivityTypes + .Include(x => x.Notice) + .Include(x => x.Activities) + .Where(x => x.NoticeId == noticeId) + .ToListAsync() + ?? throw new Exception("Nenhum tipo de atividade encontrado."); + } + + public async Task> GetLastNoticeActivities() + { + var lastNoticeId = await _context.Notices + .AsAsyncEnumerable() + .OrderByDescending(x => x.CreatedAt) + .Select(x => x.Id) + .FirstOrDefaultAsync() + ?? throw new Exception("Nenhum Edital encontrado."); + return await GetByNoticeId(lastNoticeId); + } + + public async Task Update(ActivityType model) + { + _context.Update(model); + await _context.SaveChangesAsync(); + return model; + } + + public async Task> GetAll(int skip, int take) => await _context.ActivityTypes + .Skip(skip) + .Take(take) + .AsAsyncEnumerable() + .OrderBy(x => x.Name) + .ToListAsync(); + } +} \ No newline at end of file From 4987a5ff7389c2933f7b5e1607b59d8cc76be81f Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 22 Jul 2023 23:41:28 -0300 Subject: [PATCH 039/201] Revert "feat: add activities implementation" This reverts commit a0345e3e973a2efa5660b03f4c6d02b1408eb342. --- .../Gateways/Activity/ActivityResponse.cs | 6 - .../Gateways/Activity/ActivityTypeResponse.cs | 7 - .../Gateways/Activity/BaseActivity.cs | 11 -- .../Gateways/Activity/BaseActivityType.cs | 12 -- .../Activity/CreateActivityRequest.cs | 12 -- .../Activity/CreateActivityTypeRequest.cs | 12 -- .../Activity/UpdateActivityRequest.cs | 12 -- .../Activity/UpdateActivityTypeRequest.cs | 12 -- .../Gateways/Notice/CreateNoticeRequest.cs | 8 +- .../IActivityPresenterController.cs | 10 -- src/Adapters/Mappings/ActivityMappings.cs | 24 ---- .../ActivityPresenterController.cs | 35 ----- .../Contracts/Activity/ActivityOutput.cs | 6 - .../Contracts/Activity/ActivityTypeOutput.cs | 7 - src/Domain/Contracts/Activity/BaseActivity.cs | 11 -- .../Contracts/Activity/BaseActivityType.cs | 12 -- .../Contracts/Activity/CreateActivityInput.cs | 2 - .../Activity/CreateActivityTypeInput.cs | 2 - .../Contracts/Activity/UpdateActivityInput.cs | 6 - .../Activity/UpdateActivityTypeInput.cs | 7 - .../Contracts/Notice/CreateNoticeInput.cs | 4 +- .../Contracts/Notice/UpdateNoticeInput.cs | 4 +- src/Domain/Entities/Activity.cs | 88 ------------ src/Domain/Entities/ActivityType.cs | 1 - .../Repositories/IActivityRepository.cs | 5 - .../Repositories/IActivityTypeRepository.cs | 1 - .../Repositories/IProfessorRepository.cs | 4 +- .../ActivityType/IGetActivitiesByNoticeId.cs | 7 - .../ActivityType/IGetLastNoticeActivities.cs | 9 -- src/Domain/Mappings/ActivityMappings.cs | 23 --- .../ActivityType/GetActivitiesByNoticeId.cs | 60 -------- .../ActivityType/GetLastNoticeActivities.cs | 60 -------- src/Domain/UseCases/Notice/CreateNotice.cs | 53 +------ src/Domain/UseCases/Notice/UpdateNotice.cs | 134 +++--------------- .../IoC/DependencyAdaptersInjection.cs | 2 - .../IoC/DependencyDomainInjection.cs | 8 -- src/Infrastructure/IoC/DependencyInjection.cs | 2 - .../Context/ApplicationDbContext.cs | 6 +- .../ActivityConfiguration.cs | 29 ---- .../ActivityTypeConfiguration.cs | 28 ---- .../EntitiesConfiguration/EntityBuilder.cs | 0 src/Infrastructure/Persistence/README.md | 2 +- .../Repositories/ActivityRepository.cs | 48 ------- .../Repositories/ActivityTypeRepository.cs | 75 ---------- 44 files changed, 34 insertions(+), 833 deletions(-) delete mode 100644 src/Adapters/Gateways/Activity/ActivityResponse.cs delete mode 100644 src/Adapters/Gateways/Activity/ActivityTypeResponse.cs delete mode 100644 src/Adapters/Gateways/Activity/BaseActivity.cs delete mode 100644 src/Adapters/Gateways/Activity/BaseActivityType.cs delete mode 100644 src/Adapters/Gateways/Activity/CreateActivityRequest.cs delete mode 100644 src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs delete mode 100644 src/Adapters/Gateways/Activity/UpdateActivityRequest.cs delete mode 100644 src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs delete mode 100644 src/Adapters/Interfaces/IActivityPresenterController.cs delete mode 100644 src/Adapters/Mappings/ActivityMappings.cs delete mode 100644 src/Adapters/PresenterController/ActivityPresenterController.cs delete mode 100644 src/Domain/Contracts/Activity/ActivityOutput.cs delete mode 100644 src/Domain/Contracts/Activity/ActivityTypeOutput.cs delete mode 100644 src/Domain/Contracts/Activity/BaseActivity.cs delete mode 100644 src/Domain/Contracts/Activity/BaseActivityType.cs delete mode 100644 src/Domain/Contracts/Activity/CreateActivityInput.cs delete mode 100644 src/Domain/Contracts/Activity/CreateActivityTypeInput.cs delete mode 100644 src/Domain/Contracts/Activity/UpdateActivityInput.cs delete mode 100644 src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs delete mode 100644 src/Domain/Entities/Activity.cs delete mode 100644 src/Domain/Interfaces/Repositories/IActivityRepository.cs delete mode 100644 src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs delete mode 100644 src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs delete mode 100644 src/Domain/Mappings/ActivityMappings.cs delete mode 100644 src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs delete mode 100644 src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs delete mode 100644 src/Infrastructure/Persistence/EntitiesConfiguration/ActivityConfiguration.cs delete mode 100644 src/Infrastructure/Persistence/EntitiesConfiguration/ActivityTypeConfiguration.cs delete mode 100644 src/Infrastructure/Persistence/EntitiesConfiguration/EntityBuilder.cs delete mode 100644 src/Infrastructure/Persistence/Repositories/ActivityRepository.cs delete mode 100644 src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs diff --git a/src/Adapters/Gateways/Activity/ActivityResponse.cs b/src/Adapters/Gateways/Activity/ActivityResponse.cs deleted file mode 100644 index 6f06f044..00000000 --- a/src/Adapters/Gateways/Activity/ActivityResponse.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Adapters.Gateways.Activity; -public class ActivityResponse : BaseActivity -{ - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/ActivityTypeResponse.cs b/src/Adapters/Gateways/Activity/ActivityTypeResponse.cs deleted file mode 100644 index 9fc68f9d..00000000 --- a/src/Adapters/Gateways/Activity/ActivityTypeResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Adapters.Gateways.Activity; -public class ActivityTypeResponse : BaseActivityType -{ - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } - new public IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/BaseActivity.cs b/src/Adapters/Gateways/Activity/BaseActivity.cs deleted file mode 100644 index 00b864d4..00000000 --- a/src/Adapters/Gateways/Activity/BaseActivity.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.Activity; -public class BaseActivity -{ - [Required] - public string? Name { get; set; } - [Required] - public double? Points { get; set; } - public double? Limits { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/BaseActivityType.cs b/src/Adapters/Gateways/Activity/BaseActivityType.cs deleted file mode 100644 index 34331f24..00000000 --- a/src/Adapters/Gateways/Activity/BaseActivityType.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.Activity; -public class BaseActivityType -{ - [Required] - public string? Name { get; set; } - [Required] - public string? Unity { get; set; } - [Required] - public virtual IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/CreateActivityRequest.cs b/src/Adapters/Gateways/Activity/CreateActivityRequest.cs deleted file mode 100644 index 333157a8..00000000 --- a/src/Adapters/Gateways/Activity/CreateActivityRequest.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.Activity; -public class CreateActivityRequest -{ - [Required] - public string? Name { get; set; } - [Required] - public double? Points { get; set; } - [Required] - public double? Limits { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs b/src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs deleted file mode 100644 index e6c6c4cd..00000000 --- a/src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.Activity; -public class CreateActivityTypeRequest -{ - [Required] - public string? Name { get; set; } - [Required] - public string? Unity { get; set; } - [Required] - public virtual IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/UpdateActivityRequest.cs b/src/Adapters/Gateways/Activity/UpdateActivityRequest.cs deleted file mode 100644 index d256a7ba..00000000 --- a/src/Adapters/Gateways/Activity/UpdateActivityRequest.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.Activity; -public class UpdateActivityRequest -{ - [Required] - public string? Name { get; set; } - [Required] - public double? Points { get; set; } - [Required] - public double? Limits { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs b/src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs deleted file mode 100644 index 8b4746f9..00000000 --- a/src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.Activity; -public class UpdateActivityTypeRequest -{ - [Required] - public string? Name { get; set; } - [Required] - public string? Unity { get; set; } - [Required] - public virtual IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs b/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs index 01fbb9af..1c605b28 100644 --- a/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs +++ b/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs @@ -1,9 +1,5 @@ -using Adapters.Gateways.Activity; -using Adapters.Gateways.Base; +using Adapters.Gateways.Base; using Domain.Contracts.Notice; namespace Adapters.Gateways.Notice; -public class CreateNoticeRequest : CreateNoticeInput, IRequest -{ - new public IList? Activities { get; set; } -} \ No newline at end of file +public class CreateNoticeRequest : CreateNoticeInput, IRequest { } \ No newline at end of file diff --git a/src/Adapters/Interfaces/IActivityPresenterController.cs b/src/Adapters/Interfaces/IActivityPresenterController.cs deleted file mode 100644 index 5e9f3c46..00000000 --- a/src/Adapters/Interfaces/IActivityPresenterController.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Adapters.Gateways.Activity; - -namespace Adapters.Interfaces -{ - public interface IActivityPresenterController - { - Task> GetActivitiesByNoticeId(Guid? noticeId); - Task> GetLastNoticeActivities(); - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/ActivityMappings.cs b/src/Adapters/Mappings/ActivityMappings.cs deleted file mode 100644 index 37626ed9..00000000 --- a/src/Adapters/Mappings/ActivityMappings.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Adapters.Gateways.Activity; -using AutoMapper; -using Domain.Contracts.Activity; - -namespace Adapters.Mappings -{ - public class ActivityMappings : Profile - { - public ActivityMappings() - { - CreateMap(); - CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)); - - CreateMap(); - CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)); - - CreateMap(); - CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/ActivityPresenterController.cs b/src/Adapters/PresenterController/ActivityPresenterController.cs deleted file mode 100644 index 325ee85c..00000000 --- a/src/Adapters/PresenterController/ActivityPresenterController.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Adapters.Gateways.Activity; -using Adapters.Interfaces; -using AutoMapper; -using Domain.Interfaces.UseCases.ActivityType; - -namespace Adapters.PresenterController -{ - public class ActivityPresenterController : IActivityPresenterController - { - private readonly IGetActivitiesByNoticeId _getActivitiesByNoticeId; - private readonly IGetLastNoticeActivities _getLastNoticeActivities; - private readonly IMapper _mapper; - public ActivityPresenterController( - IGetActivitiesByNoticeId getActivitiesByNoticeId, - IGetLastNoticeActivities getLastNoticeActivities, - IMapper mapper) - { - _getActivitiesByNoticeId = getActivitiesByNoticeId; - _getLastNoticeActivities = getLastNoticeActivities; - _mapper = mapper; - } - - public async Task> GetActivitiesByNoticeId(Guid? noticeId) - { - var activityTypes = await _getActivitiesByNoticeId.GetActivitiesByNoticeId(noticeId); - return _mapper.Map>(activityTypes); - } - - public async Task> GetLastNoticeActivities() - { - var activityTypes = await _getLastNoticeActivities.GetLastNoticeActivities(); - return _mapper.Map>(activityTypes); - } - } -} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/ActivityOutput.cs b/src/Domain/Contracts/Activity/ActivityOutput.cs deleted file mode 100644 index 5b3364f0..00000000 --- a/src/Domain/Contracts/Activity/ActivityOutput.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Domain.Contracts.Activity; -public class ActivityOutput : BaseActivity -{ - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/ActivityTypeOutput.cs b/src/Domain/Contracts/Activity/ActivityTypeOutput.cs deleted file mode 100644 index bc070298..00000000 --- a/src/Domain/Contracts/Activity/ActivityTypeOutput.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Domain.Contracts.Activity; -public class ActivityTypeOutput : BaseActivityType -{ - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } - new public IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/BaseActivity.cs b/src/Domain/Contracts/Activity/BaseActivity.cs deleted file mode 100644 index 3c50f5e0..00000000 --- a/src/Domain/Contracts/Activity/BaseActivity.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Domain.Contracts.Activity; -public class BaseActivity -{ - [Required] - public string? Name { get; set; } - [Required] - public double? Points { get; set; } - public double? Limits { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/BaseActivityType.cs b/src/Domain/Contracts/Activity/BaseActivityType.cs deleted file mode 100644 index 441b6998..00000000 --- a/src/Domain/Contracts/Activity/BaseActivityType.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Domain.Contracts.Activity; -public class BaseActivityType -{ - [Required] - public string? Name { get; set; } - [Required] - public string? Unity { get; set; } - [Required] - public virtual IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/CreateActivityInput.cs b/src/Domain/Contracts/Activity/CreateActivityInput.cs deleted file mode 100644 index f18f710d..00000000 --- a/src/Domain/Contracts/Activity/CreateActivityInput.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace Domain.Contracts.Activity; -public class CreateActivityInput : BaseActivity { } \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/CreateActivityTypeInput.cs b/src/Domain/Contracts/Activity/CreateActivityTypeInput.cs deleted file mode 100644 index e95809f8..00000000 --- a/src/Domain/Contracts/Activity/CreateActivityTypeInput.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace Domain.Contracts.Activity; -public class CreateActivityTypeInput : BaseActivityType { } \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/UpdateActivityInput.cs b/src/Domain/Contracts/Activity/UpdateActivityInput.cs deleted file mode 100644 index 6590d4a6..00000000 --- a/src/Domain/Contracts/Activity/UpdateActivityInput.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Domain.Contracts.Activity; -public class UpdateActivityInput : BaseActivity -{ - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs b/src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs deleted file mode 100644 index 8d51d7e9..00000000 --- a/src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Domain.Contracts.Activity; -public class UpdateActivityTypeInput : BaseActivityType -{ - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } - new public IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/Notice/CreateNoticeInput.cs b/src/Domain/Contracts/Notice/CreateNoticeInput.cs index 3c0d25ae..7b586a03 100644 --- a/src/Domain/Contracts/Notice/CreateNoticeInput.cs +++ b/src/Domain/Contracts/Notice/CreateNoticeInput.cs @@ -1,11 +1,9 @@ -using Domain.Contracts.Activity; -using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http; namespace Domain.Contracts.Notice { public class CreateNoticeInput : BaseNoticeContract { public IFormFile? File { get; set; } - virtual public IList? Activities { get; set; } } } \ No newline at end of file diff --git a/src/Domain/Contracts/Notice/UpdateNoticeInput.cs b/src/Domain/Contracts/Notice/UpdateNoticeInput.cs index 897c5e92..a916a6e0 100644 --- a/src/Domain/Contracts/Notice/UpdateNoticeInput.cs +++ b/src/Domain/Contracts/Notice/UpdateNoticeInput.cs @@ -1,5 +1,4 @@ -using Domain.Contracts.Activity; -using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http; namespace Domain.Contracts.Notice { @@ -7,6 +6,5 @@ public class UpdateNoticeInput : BaseNoticeContract { public Guid? Id { get; set; } public IFormFile? File { get; set; } - public IList? Activities { get; set; } } } \ No newline at end of file diff --git a/src/Domain/Entities/Activity.cs b/src/Domain/Entities/Activity.cs deleted file mode 100644 index 2575ecf4..00000000 --- a/src/Domain/Entities/Activity.cs +++ /dev/null @@ -1,88 +0,0 @@ -using Domain.Entities.Primitives; -using Domain.Validation; - -namespace Domain.Entities -{ - public class Activity : Entity - { - #region Properties - private string? _name; - /// - /// Nome da atividade - /// - public string? Name - { - get => _name; - set - { - EntityExceptionValidation.When(string.IsNullOrEmpty(value), - ExceptionMessageFactory.Required(nameof(Name))); - EntityExceptionValidation.When(value?.Length < 3, - ExceptionMessageFactory.MinLength(nameof(Name), 3)); - EntityExceptionValidation.When(value?.Length > 300, - ExceptionMessageFactory.MaxLength(nameof(Name), 300)); - _name = value; - } - } - - private double? _points; - /// - /// Pontuação da atividade - /// - public double? Points - { - get => _points; - set - { - EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(Points))); - _points = value; - } - } - - private double? _limits; - /// - /// Limite de pontuação da atividade - /// - public double? Limits - { - get => _limits; - set => _limits = value ?? double.MaxValue; - } - - private Guid? _activityTypeId; - /// - /// Id do tipo de atividade - /// - public Guid? ActivityTypeId - { - get => _activityTypeId; - private set - { - { - EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(ActivityTypeId))); - _activityTypeId = value; - } - } - } - - public virtual ActivityType? ActivityType { get; } - #endregion - - #region Constructors - public Activity(string? name, double? points, double? limits, Guid? activityTypeId) - { - Name = name; - Points = points; - Limits = limits; - ActivityTypeId = activityTypeId; - } - - /// - /// Constructor to dbcontext EF instancing. - /// - protected Activity() { } - #endregion - } -} \ No newline at end of file diff --git a/src/Domain/Entities/ActivityType.cs b/src/Domain/Entities/ActivityType.cs index 2b63c440..44e5658f 100644 --- a/src/Domain/Entities/ActivityType.cs +++ b/src/Domain/Entities/ActivityType.cs @@ -53,7 +53,6 @@ private set } public virtual Notice? Notice { get; } - public virtual IList? Activities { get; } #endregion #region Constructors diff --git a/src/Domain/Interfaces/Repositories/IActivityRepository.cs b/src/Domain/Interfaces/Repositories/IActivityRepository.cs deleted file mode 100644 index 65cf6aba..00000000 --- a/src/Domain/Interfaces/Repositories/IActivityRepository.cs +++ /dev/null @@ -1,5 +0,0 @@ -using Domain.Entities; -using Domain.Interfaces.Repositories.Bases; - -namespace Domain.Interfaces.Repositories; -public interface IActivityRepository : IGenericCRUDRepository { } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs b/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs index 6cc20075..007d17e6 100644 --- a/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs +++ b/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs @@ -6,6 +6,5 @@ namespace Domain.Interfaces.Repositories public interface IActivityTypeRepository : IGenericCRUDRepository { Task> GetByNoticeId(Guid? noticeId); - Task> GetLastNoticeActivities(); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs index baf6effe..47b37147 100644 --- a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs @@ -3,5 +3,7 @@ namespace Domain.Interfaces.Repositories { - public interface IProfessorRepository : IGenericCRUDRepository { } + public interface IProfessorRepository : IGenericCRUDRepository + { + } } \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs b/src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs deleted file mode 100644 index 3d978e15..00000000 --- a/src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Domain.Contracts.Activity; - -namespace Domain.Interfaces.UseCases.ActivityType; -public interface IGetActivitiesByNoticeId -{ - Task> GetActivitiesByNoticeId(Guid? id); -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs b/src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs deleted file mode 100644 index b79452ae..00000000 --- a/src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Domain.Contracts.Activity; - -namespace Domain.Interfaces.UseCases.ActivityType -{ - public interface IGetLastNoticeActivities - { - Task> GetLastNoticeActivities(); - } -} \ No newline at end of file diff --git a/src/Domain/Mappings/ActivityMappings.cs b/src/Domain/Mappings/ActivityMappings.cs deleted file mode 100644 index 8b955641..00000000 --- a/src/Domain/Mappings/ActivityMappings.cs +++ /dev/null @@ -1,23 +0,0 @@ -using AutoMapper; -using Domain.Contracts.Activity; -using Domain.Entities; - -namespace Domain.Mappings -{ - public class ActivityMappings : Profile - { - public ActivityMappings() - { - CreateMap(); - CreateMap() - .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) - .ForMember(dest => dest.DeletedAt, opt => opt.MapFrom(src => src.DeletedAt)); - - CreateMap(); - CreateMap() - .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) - .ForMember(dest => dest.DeletedAt, opt => opt.MapFrom(src => src.DeletedAt)) - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)); - } - } -} \ No newline at end of file diff --git a/src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs b/src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs deleted file mode 100644 index b9128a08..00000000 --- a/src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs +++ /dev/null @@ -1,60 +0,0 @@ -using AutoMapper; -using Domain.Contracts.Activity; -using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases.ActivityType; - -namespace Domain.UseCases.ActivityType -{ - public class GetActivitiesByNoticeId : IGetActivitiesByNoticeId - { - private readonly IActivityTypeRepository _activityTypeRepository; - private readonly IMapper _mapper; - public GetActivitiesByNoticeId(IActivityTypeRepository activityTypeRepository, IMapper mapper) - { - _activityTypeRepository = activityTypeRepository; - _mapper = mapper; - } - - async Task> IGetActivitiesByNoticeId.GetActivitiesByNoticeId(Guid? id) - { - // Obtém os tipos de atividades do edital - var activityTypes = await _activityTypeRepository.GetByNoticeId(id); - - // Mapeia os tipos de atividades para o output - var output = _mapper.Map>(activityTypes); - - // return output; - - // Mapeia os tipos de atividades para o output - var activityTypesOutput = new List(); - foreach (var activityType in activityTypes) - { - // Mapeia as atividades para o output - var activitiesOutput = new List(); - foreach (var activity in activityType.Activities!) - { - activitiesOutput.Add(new ActivityOutput - { - Id = activity.Id, - Name = activity.Name, - Points = activity.Points, - Limits = activity.Limits, - DeletedAt = activity.DeletedAt - }); - } - - // Adiciona o tipo de atividade ao output - activityTypesOutput.Add(new ActivityTypeOutput - { - Id = activityType.Id, - Name = activityType.Name, - Unity = activityType.Unity, - DeletedAt = activityType.DeletedAt, - Activities = activitiesOutput - }); - } - - return activityTypesOutput; - } - } -} \ No newline at end of file diff --git a/src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs b/src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs deleted file mode 100644 index 10db5f6e..00000000 --- a/src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs +++ /dev/null @@ -1,60 +0,0 @@ -using AutoMapper; -using Domain.Contracts.Activity; -using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases.ActivityType; - -namespace Domain.UseCases.ActivityType -{ - public class GetLastNoticeActivities : IGetLastNoticeActivities - { - private readonly IActivityTypeRepository _activityTypeRepository; - private readonly IMapper _mapper; - public GetLastNoticeActivities(IActivityTypeRepository activityTypeRepository, IMapper mapper) - { - _activityTypeRepository = activityTypeRepository; - _mapper = mapper; - } - async Task> IGetLastNoticeActivities.GetLastNoticeActivities() - { - // Obtém os tipos de atividades do último edital - var activityTypes = await _activityTypeRepository.GetLastNoticeActivities(); - - // Mapeia os tipos de atividades para o output - var output = _mapper.Map>(activityTypes); - - // return output; - - // Mapeia os tipos de atividades para o output - var activityTypesOutput = new List(); - foreach (var type in activityTypes) - { - // Mapeia as atividades para o output - var activitiesOutput = new List(); - foreach (var activity in type.Activities!) - { - activitiesOutput.Add(new ActivityOutput - { - Id = activity.Id, - Name = activity.Name, - Points = activity.Points, - Limits = activity.Limits, - DeletedAt = activity.DeletedAt - }); - } - - // Adiciona o tipo de atividade ao output - activityTypesOutput.Add(new ActivityTypeOutput - { - Id = type.Id, - Name = type.Name, - Unity = type.Unity, - DeletedAt = type.DeletedAt, - Activities = activitiesOutput - }); - } - - // Retorna os tipos de atividades do último edital - return activityTypesOutput; - } - } -} \ No newline at end of file diff --git a/src/Domain/UseCases/Notice/CreateNotice.cs b/src/Domain/UseCases/Notice/CreateNotice.cs index 4a6c0913..4b16c6b7 100644 --- a/src/Domain/UseCases/Notice/CreateNotice.cs +++ b/src/Domain/UseCases/Notice/CreateNotice.cs @@ -12,31 +12,19 @@ public class CreateNotice : ICreateNotice #region Global Scope private readonly INoticeRepository _repository; private readonly IStorageFileService _storageFileService; - private readonly IActivityTypeRepository _activityTypeRepository; - private readonly IActivityRepository _activityRepository; private readonly IMapper _mapper; - public CreateNotice( - INoticeRepository repository, - IStorageFileService storageFileService, - IActivityTypeRepository activityTypeRepository, - IActivityRepository activityRepository, - IMapper mapper) + public CreateNotice(INoticeRepository repository, IStorageFileService storageFileService, IMapper mapper) { _repository = repository; _storageFileService = storageFileService; - _activityTypeRepository = activityTypeRepository; - _activityRepository = activityRepository; _mapper = mapper; } #endregion public async Task Execute(CreateNoticeInput input) { - // Verifica se atividades foram informadas - UseCaseException.BusinessRuleViolation(input.Activities == null, "As atividades devem ser informadas."); - // Mapeia input para entidade - var notice = new Entities.Notice( + var entity = new Entities.Notice( input.RegistrationStartDate, input.RegistrationEndDate, input.EvaluationStartDate, @@ -52,44 +40,17 @@ public async Task Execute(CreateNoticeInput input) // Verifica se já existe um edital para o período indicado var projectFound = await _repository.GetNoticeByPeriod((DateTime)input.RegistrationStartDate!, (DateTime)input.RegistrationEndDate!); - UseCaseException.BusinessRuleViolation(projectFound != null, "Já existe um Edital para o período indicado."); + UseCaseException.BusinessRuleViolation(projectFound != null, "A notice already exists for the indicated period."); // Salva arquivo no repositório e atualiza atributo DocUrl if (input.File != null) - notice.DocUrl = await _storageFileService.UploadFileAsync(input.File); - - // Converte as atividades para entidades antes de prosseguir - // com o cadastro no banco, apenas para fins de validação. - foreach (var activityType in input.Activities!) - { - // Converte atividades para entidades - foreach (var activity in activityType.Activities!) - _ = new Entities.Activity(activity.Name, activity.Points, activity.Limits, Guid.Empty); - - // Converte tipo de atividade para entidade - _ = new Entities.ActivityType(activityType.Name, activityType.Unity, Guid.Empty); - } - - // Cria edital no banco - notice = await _repository.Create(notice); - - // Salva atividades no banco - foreach (var activityType in input.Activities!) - { - // Salva tipo de atividade no banco - var activityTypeEntity = new Entities.ActivityType(activityType.Name, activityType.Unity, notice.Id); - activityTypeEntity = await _activityTypeRepository.Create(activityTypeEntity); + entity.DocUrl = await _storageFileService.UploadFileAsync(input.File); - // Salva atividades no banco - foreach (var activity in activityType.Activities!) - { - var activityEntity = new Entities.Activity(activity.Name, activity.Points, activity.Limits, activityTypeEntity.Id); - await _activityRepository.Create(activityEntity); - } - } + // Cria entidade + entity = await _repository.Create(entity); // Salva entidade no banco - return _mapper.Map(notice); + return _mapper.Map(entity); } } } \ No newline at end of file diff --git a/src/Domain/UseCases/Notice/UpdateNotice.cs b/src/Domain/UseCases/Notice/UpdateNotice.cs index 186a9517..0ad3ae90 100644 --- a/src/Domain/UseCases/Notice/UpdateNotice.cs +++ b/src/Domain/UseCases/Notice/UpdateNotice.cs @@ -12,20 +12,11 @@ public class UpdateNotice : IUpdateNotice #region Global Scope private readonly INoticeRepository _repository; private readonly IStorageFileService _storageFileService; - private readonly IActivityTypeRepository _activityTypeRepository; - private readonly IActivityRepository _activityRepository; private readonly IMapper _mapper; - public UpdateNotice( - INoticeRepository repository, - IStorageFileService storageFileService, - IActivityTypeRepository activityTypeRepository, - IActivityRepository activityRepository, - IMapper mapper) + public UpdateNotice(INoticeRepository repository, IStorageFileService storageFileService, IMapper mapper) { _repository = repository; _storageFileService = storageFileService; - _activityTypeRepository = activityTypeRepository; - _activityRepository = activityRepository; _mapper = mapper; } #endregion @@ -36,125 +27,34 @@ public async Task Execute(Guid? id, UpdateNoticeInput UseCaseException.NotInformedParam(id == null, nameof(id)); // Recupera entidade que será atualizada - var notice = await _repository.GetById(id) + var entity = await _repository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Notice)); // Verifica se a entidade foi excluída - UseCaseException.BusinessRuleViolation(notice.DeletedAt != null, "The notice entered has already been deleted."); + UseCaseException.BusinessRuleViolation(entity.DeletedAt != null, "The notice entered has already been deleted."); // Salva arquivo no repositório e atualiza atributo DocUrl if (input.File != null) - notice.DocUrl = await _storageFileService.UploadFileAsync(input.File, notice.DocUrl); + entity.DocUrl = await _storageFileService.UploadFileAsync(input.File, entity.DocUrl); // Atualiza atributos permitidos - notice.RegistrationStartDate = input.RegistrationStartDate ?? notice.RegistrationStartDate; - notice.RegistrationEndDate = input.RegistrationEndDate ?? notice.RegistrationEndDate; - notice.EvaluationStartDate = input.EvaluationStartDate ?? notice.EvaluationStartDate; - notice.EvaluationEndDate = input.EvaluationEndDate ?? notice.EvaluationEndDate; - notice.AppealStartDate = input.AppealStartDate ?? notice.AppealStartDate; - notice.AppealEndDate = input.AppealEndDate ?? notice.AppealEndDate; - notice.SendingDocsStartDate = input.SendingDocsStartDate ?? notice.SendingDocsStartDate; - notice.SendingDocsEndDate = input.SendingDocsEndDate ?? notice.SendingDocsEndDate; - notice.PartialReportDeadline = input.PartialReportDeadline ?? notice.PartialReportDeadline; - notice.FinalReportDeadline = input.FinalReportDeadline ?? notice.FinalReportDeadline; - notice.SuspensionYears = input.SuspensionYears ?? notice.SuspensionYears; - - // Converte as atividades para entidades antes de prosseguir - // com a atualização no banco, apenas para fins de validação. - foreach (var activityType in input.Activities!) - { - // Converte atividades para entidades - foreach (var activity in activityType.Activities!) - _ = new Entities.Activity(activity.Name, activity.Points, activity.Limits, Guid.Empty); - - // Converte tipo de atividade para entidade - _ = new Entities.ActivityType(activityType.Name, activityType.Unity, Guid.Empty); - } + entity.RegistrationStartDate = input.RegistrationStartDate ?? entity.RegistrationStartDate; + entity.RegistrationEndDate = input.RegistrationEndDate ?? entity.RegistrationEndDate; + entity.EvaluationStartDate = input.EvaluationStartDate ?? entity.EvaluationStartDate; + entity.EvaluationEndDate = input.EvaluationEndDate ?? entity.EvaluationEndDate; + entity.AppealStartDate = input.AppealStartDate ?? entity.AppealStartDate; + entity.AppealEndDate = input.AppealEndDate ?? entity.AppealEndDate; + entity.SendingDocsStartDate = input.SendingDocsStartDate ?? entity.SendingDocsStartDate; + entity.SendingDocsEndDate = input.SendingDocsEndDate ?? entity.SendingDocsEndDate; + entity.PartialReportDeadline = input.PartialReportDeadline ?? entity.PartialReportDeadline; + entity.FinalReportDeadline = input.FinalReportDeadline ?? entity.FinalReportDeadline; + entity.SuspensionYears = input.SuspensionYears ?? entity.SuspensionYears; // Salva entidade atualizada no banco - await _repository.Update(notice); - - // Recupera atividades do edital - var noticeActivities = (await _activityTypeRepository.GetByNoticeId(notice.Id)).ToList(); - - // Atualiza atividades - foreach (var activityType in input.Activities) - { - // Verifica se o tipo de atividade é novo - if (activityType.Id is null) - { - // Cria tipo de atividade - var activityTypeEntity = new Entities.ActivityType(activityType.Name, activityType.Unity, notice.Id); - - // Salva tipo de atividade no banco - await _activityTypeRepository.Create(activityTypeEntity); - - // Cria atividades - foreach (var activity in activityType.Activities!) - { - // Cria atividade - var activityEntity = new Entities.Activity(activity.Name, activity.Points, activity.Limits, activityTypeEntity.Id); - - // Salva atividade no banco - await _activityRepository.Create(activityEntity); - } - } - else - { - // Verifica se o tipo de atividade foi excluído - var activityTypeEntity = noticeActivities.Find(x => x.Id == activityType.Id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ActivityType)); - - // Atualiza tipo de atividade - activityTypeEntity.Name = activityType.Name; - activityTypeEntity.Unity = activityType.Unity; - - // Atualiza atividades - foreach (var activity in activityType.Activities!) - { - // Verifica se a atividade foi excluída - var activityEntity = activityTypeEntity.Activities!.FirstOrDefault(x => x.Id == activity.Id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Activity)); - - // Atualiza atividade - activityEntity.Name = activity.Name; - activityEntity.Points = activity.Points; - activityEntity.Limits = activity.Limits; - - // Salva atividade atualizada no banco - await _activityRepository.Update(activityEntity); - - // Remove atividade da lista de atividades do tipo de atividade - activityTypeEntity.Activities!.Remove(activityEntity); - } - - // Salva tipo de atividade atualizado no banco - await _activityTypeRepository.Update(activityTypeEntity); - - // Remove tipo de atividade da lista de tipos de atividades do edital - noticeActivities.Remove(activityTypeEntity); - } - } - - // Verifica se existem tipos de atividades que foram excluídos - foreach (var activityTypeToRemove in noticeActivities) - { - foreach (var activityToRemove in activityTypeToRemove.Activities!) - { - // Verifica se a atividade foi excluída - var activityEntity = activityTypeToRemove.Activities!.FirstOrDefault(x => x.Id == activityToRemove.Id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Activity)); - - // Remove atividade do banco - await _activityRepository.Delete(activityEntity.Id); - } - - // Remove tipo de atividade do banco - await _activityTypeRepository.Delete(activityTypeToRemove.Id); - } + await _repository.Update(entity); // Retorna entidade atualizada - return _mapper.Map(notice); + return _mapper.Map(entity); } } } \ No newline at end of file diff --git a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs index bead8dc3..1d086c78 100644 --- a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs +++ b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs @@ -10,7 +10,6 @@ public static IServiceCollection AddAdapters(this IServiceCollection services) { #region PresenterControllers services.AddScoped(); - services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -29,7 +28,6 @@ public static IServiceCollection AddAdapters(this IServiceCollection services) #region Gateways Mappers services.AddAutoMapper(typeof(AreaMappings)); - services.AddAutoMapper(typeof(ActivityMappings)); services.AddAutoMapper(typeof(AssistanceTypeMappings)); services.AddAutoMapper(typeof(AuthMappings)); services.AddAutoMapper(typeof(CampusMappings)); diff --git a/src/Infrastructure/IoC/DependencyDomainInjection.cs b/src/Infrastructure/IoC/DependencyDomainInjection.cs index f8805b62..b12739ea 100644 --- a/src/Infrastructure/IoC/DependencyDomainInjection.cs +++ b/src/Infrastructure/IoC/DependencyDomainInjection.cs @@ -1,11 +1,9 @@ using Domain.Interfaces.Services; using Domain.Interfaces.UseCases; -using Domain.Interfaces.UseCases.ActivityType; using Domain.Interfaces.UseCases.Project; using Domain.Interfaces.UseCases.ProjectEvaluation; using Domain.Mappings; using Domain.UseCases; -using Domain.UseCases.ActivityType; using Domain.UseCases.Project; using Domain.UseCases.ProjectEvaluation; using Infrastructure.Services; @@ -33,11 +31,6 @@ public static IServiceCollection AddDomain(this IServiceCollection services) services.AddScoped(); #endregion - #region ActivityType - services.AddScoped(); - services.AddScoped(); - #endregion - #region AssistanceType services.AddScoped(); services.AddScoped(); @@ -156,7 +149,6 @@ public static IServiceCollection AddDomain(this IServiceCollection services) #region Contract Mappers services.AddAutoMapper(typeof(AreaMappings)); - services.AddAutoMapper(typeof(ActivityMappings)); services.AddAutoMapper(typeof(AssistanceTypeMappings)); services.AddAutoMapper(typeof(CampusMappings)); services.AddAutoMapper(typeof(CourseMappings)); diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs index 708128df..c8c2a0c6 100644 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ b/src/Infrastructure/IoC/DependencyInjection.cs @@ -58,8 +58,6 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi #region Repositórios services.AddScoped(); - services.AddScoped(); - services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs index 5fac5656..eeeb6528 100644 --- a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs +++ b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs @@ -18,8 +18,7 @@ public class ApplicationDbContext : DbContext public ApplicationDbContext(DbContextOptions options) : base(options) { Areas = Set(); - Activities = Set(); - ActivityTypes = Set(); + AssistanceScholarships = Set(); Campuses = Set(); Courses = Set(); MainAreas = Set(); @@ -35,8 +34,7 @@ public ApplicationDbContext(DbContextOptions options) : ba } public DbSet Areas { get; set; } - public DbSet Activities { get; set; } - public DbSet ActivityTypes { get; set; } + public DbSet AssistanceScholarships { get; set; } public DbSet Campuses { get; set; } public DbSet Courses { get; set; } public DbSet MainAreas { get; set; } diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityConfiguration.cs deleted file mode 100644 index 56be2400..00000000 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityConfiguration.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Domain.Entities; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata.Builders; - -namespace Persistence.EntitiesConfiguration -{ - public class ActivityConfiguration : IEntityTypeConfiguration - { - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable("Activities"); - - builder.HasKey(t => t.Id); - builder.Property(p => p.Id).ValueGeneratedOnAdd(); - - builder.Property(p => p.Name).HasMaxLength(300).IsRequired(); - builder.Property(p => p.Points).IsRequired(); - builder.Property(p => p.Limits); - builder.Property(p => p.ActivityTypeId).IsRequired(); - builder.Property(p => p.DeletedAt); - - builder.HasOne(a => a.ActivityType) - .WithMany() - .HasForeignKey(a => a.ActivityTypeId); - - builder.HasQueryFilter(x => x.DeletedAt == null); - } - } -} \ No newline at end of file diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityTypeConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityTypeConfiguration.cs deleted file mode 100644 index 968e873d..00000000 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityTypeConfiguration.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Domain.Entities; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata.Builders; - -namespace Persistence.EntitiesConfiguration -{ - public class ActivityTypeConfiguration : IEntityTypeConfiguration - { - public void Configure(EntityTypeBuilder builder) - { - builder.ToTable("ActivityTypes"); - - builder.HasKey(t => t.Id); - builder.Property(p => p.Id).ValueGeneratedOnAdd(); - - builder.Property(p => p.Name).HasMaxLength(300).IsRequired(); - builder.Property(p => p.Unity).HasMaxLength(300).IsRequired(); - builder.Property(p => p.NoticeId).IsRequired(); - builder.Property(p => p.DeletedAt); - - builder.HasOne(a => a.Notice) - .WithMany() - .HasForeignKey(a => a.NoticeId); - - builder.HasQueryFilter(x => x.DeletedAt == null); - } - } -} \ No newline at end of file diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/EntityBuilder.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/EntityBuilder.cs deleted file mode 100644 index e69de29b..00000000 diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index a84ca2c5..3ce9bd04 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add AddActivities --project ../Persistence/Persistence.csproj +dotnet ef migrations add UpdateNotices --project ../Persistence/Persistence.csproj ``` Executando as Migrations: diff --git a/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs b/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs deleted file mode 100644 index b70b1c97..00000000 --- a/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Domain.Entities; -using Domain.Interfaces.Repositories; -using Infrastructure.Persistence.Context; -using Microsoft.EntityFrameworkCore; - -namespace Infrastructure.Persistence.Repositories -{ - public class ActivityRepository : IActivityRepository - { - private readonly ApplicationDbContext _context; - public ActivityRepository(ApplicationDbContext context) => _context = context; - - public async Task Create(Activity model) - { - _context.Add(model); - await _context.SaveChangesAsync(); - return model; - } - - public async Task> GetAll(int skip, int take) => await _context.Activities - .Skip(skip) - .Take(take) - .AsAsyncEnumerable() - .OrderBy(x => x.Name) - .ToListAsync(); - - public async Task GetById(Guid? id) => - await _context.Activities - .IgnoreQueryFilters() - .AsAsyncEnumerable() - .FirstOrDefaultAsync(x => x.Id == id); - - public async Task Delete(Guid? id) - { - var model = await GetById(id) - ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); - model.DeactivateEntity(); - return await Update(model); - } - - public async Task Update(Activity model) - { - _context.Update(model); - await _context.SaveChangesAsync(); - return model; - } - } -} \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs b/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs deleted file mode 100644 index 0415741e..00000000 --- a/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs +++ /dev/null @@ -1,75 +0,0 @@ -using Domain.Entities; -using Domain.Interfaces.Repositories; -using Infrastructure.Persistence.Context; -using Microsoft.EntityFrameworkCore; - -namespace Infrastructure.Persistence.Repositories -{ - public class ActivityTypeRepository : IActivityTypeRepository - { - #region Global Scope - private readonly ApplicationDbContext _context; - public ActivityTypeRepository(ApplicationDbContext context) => _context = context; - #endregion - - public async Task Create(ActivityType model) - { - _context.Add(model); - await _context.SaveChangesAsync(); - return model; - } - - public async Task Delete(Guid? id) - { - var model = await GetById(id) - ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); - model.DeactivateEntity(); - return await Update(model); - } - - public async Task GetById(Guid? id) - { - return await _context.ActivityTypes - .Include(x => x.Notice) - .IgnoreQueryFilters() - .AsAsyncEnumerable() - .FirstOrDefaultAsync(x => x.Id == id) - ?? throw new Exception($"Nenhum tipo de atividade encontrado para o id {id}"); - } - - public async Task> GetByNoticeId(Guid? noticeId) - { - return await _context.ActivityTypes - .Include(x => x.Notice) - .Include(x => x.Activities) - .Where(x => x.NoticeId == noticeId) - .ToListAsync() - ?? throw new Exception("Nenhum tipo de atividade encontrado."); - } - - public async Task> GetLastNoticeActivities() - { - var lastNoticeId = await _context.Notices - .AsAsyncEnumerable() - .OrderByDescending(x => x.CreatedAt) - .Select(x => x.Id) - .FirstOrDefaultAsync() - ?? throw new Exception("Nenhum Edital encontrado."); - return await GetByNoticeId(lastNoticeId); - } - - public async Task Update(ActivityType model) - { - _context.Update(model); - await _context.SaveChangesAsync(); - return model; - } - - public async Task> GetAll(int skip, int take) => await _context.ActivityTypes - .Skip(skip) - .Take(take) - .AsAsyncEnumerable() - .OrderBy(x => x.Name) - .ToListAsync(); - } -} \ No newline at end of file From bdde659e9089aef27477a852a8657eeb1f967868 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sun, 23 Jul 2023 22:05:36 -0300 Subject: [PATCH 040/201] feat: add unhandler exception --- .../ExceptionHandlingMiddleware.cs | 61 +++++++++++++++++++ src/Infrastructure/WebAPI/Startup.cs | 4 ++ 2 files changed, 65 insertions(+) create mode 100644 src/Infrastructure/WebAPI/Middlewares/ExceptionHandlingMiddleware.cs diff --git a/src/Infrastructure/WebAPI/Middlewares/ExceptionHandlingMiddleware.cs b/src/Infrastructure/WebAPI/Middlewares/ExceptionHandlingMiddleware.cs new file mode 100644 index 00000000..1a27e7c0 --- /dev/null +++ b/src/Infrastructure/WebAPI/Middlewares/ExceptionHandlingMiddleware.cs @@ -0,0 +1,61 @@ +using System.Net; +using System.Text.Json; + +namespace Infrastructure.WebAPI.Middleware +{ + /// + /// Middleware para tratamento de exceções. + /// + public class ExceptionHandlingMiddleware + { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + + /// + /// Construtor do middleware. + /// + /// + /// + public ExceptionHandlingMiddleware(RequestDelegate next, ILogger logger) + { + _next = next; + _logger = logger; + } + + /// + /// Método de invocação do middleware. + /// + /// + public async Task Invoke(HttpContext context) + { + try + { + await _next(context); + } + catch (Exception ex) + { + _logger.LogError(ex, "Unhandled exception occurred."); + + // Handle the exception and generate a response + await HandleExceptionAsync(context, ex); + } + } + + private static Task HandleExceptionAsync(HttpContext context, Exception exception) + { + context.Response.ContentType = "application/json"; + context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; + + var response = new + { + error = new + { + message = "An error occurred.", + details = exception.Message, + } + }; + + return context.Response.WriteAsync(JsonSerializer.Serialize(response)); + } + } +} diff --git a/src/Infrastructure/WebAPI/Startup.cs b/src/Infrastructure/WebAPI/Startup.cs index 993f9687..d24512f3 100644 --- a/src/Infrastructure/WebAPI/Startup.cs +++ b/src/Infrastructure/WebAPI/Startup.cs @@ -1,5 +1,6 @@ using AspNetCoreRateLimit; using Infrastructure.IoC; +using Infrastructure.WebAPI.Middleware; namespace Infrastructure.WebAPI; @@ -49,6 +50,9 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) Console.WriteLine("Development mode"); } + // UseExceptionHandler for non-development environments + app.UseMiddleware(); + // Enable HTTP Strict Transport Security (HSTS) headers for secure communication app.UseHsts(); From 6634ecdafffe2501ce4cb82f24222fdaad1e337f Mon Sep 17 00:00:00 2001 From: eduardo Date: Sun, 23 Jul 2023 23:41:59 -0300 Subject: [PATCH 041/201] feat: adjust notice and activity relation --- .../Activity/UpdateActivityRequest.cs | 1 + .../Activity/UpdateActivityTypeRequest.cs | 1 + .../Gateways/Notice/CreateNoticeRequest.cs | 6 +- .../Gateways/Notice/UpdateNoticeRequest.cs | 11 +- src/Adapters/Mappings/ActivityMappings.cs | 18 ++- src/Adapters/Mappings/NoticeMappings.cs | 22 +-- .../NoticePresenterController.cs | 15 +- .../Activity/CreateActivityTypeInput.cs | 12 +- .../Activity/UpdateActivityTypeInput.cs | 12 +- .../Contracts/Notice/BaseNoticeContract.cs | 1 - .../Contracts/Notice/CreateNoticeInput.cs | 10 +- .../Notice/DetailedReadNoticeOutput.cs | 1 + .../Notice/ResumedReadNoticeOutput.cs | 1 + .../Repositories/IActivityTypeRepository.cs | 4 +- src/Domain/UseCases/Notice/CreateNotice.cs | 7 +- src/Domain/UseCases/Notice/UpdateNotice.cs | 140 +++++++++++------- .../Context/ApplicationDbContext.cs | 21 +-- .../ActivityConfiguration.cs | 2 +- .../Persistence/Persistence.csproj | 7 +- src/Infrastructure/Persistence/README.md | 2 +- .../Repositories/ActivityTypeRepository.cs | 18 ++- .../WebAPI/Controllers/ActivityController.cs | 76 ++++++++++ .../WebAPI/Controllers/NoticeController.cs | 4 +- 23 files changed, 269 insertions(+), 123 deletions(-) create mode 100644 src/Infrastructure/WebAPI/Controllers/ActivityController.cs diff --git a/src/Adapters/Gateways/Activity/UpdateActivityRequest.cs b/src/Adapters/Gateways/Activity/UpdateActivityRequest.cs index d256a7ba..0b374b00 100644 --- a/src/Adapters/Gateways/Activity/UpdateActivityRequest.cs +++ b/src/Adapters/Gateways/Activity/UpdateActivityRequest.cs @@ -3,6 +3,7 @@ namespace Adapters.Gateways.Activity; public class UpdateActivityRequest { + public Guid? Id { get; set; } [Required] public string? Name { get; set; } [Required] diff --git a/src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs b/src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs index 8b4746f9..3af3bfb2 100644 --- a/src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs +++ b/src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs @@ -3,6 +3,7 @@ namespace Adapters.Gateways.Activity; public class UpdateActivityTypeRequest { + public Guid? Id { get; set; } [Required] public string? Name { get; set; } [Required] diff --git a/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs b/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs index 01fbb9af..992730e8 100644 --- a/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs +++ b/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs @@ -1,9 +1,11 @@ using Adapters.Gateways.Activity; using Adapters.Gateways.Base; using Domain.Contracts.Notice; +using Microsoft.AspNetCore.Http; namespace Adapters.Gateways.Notice; -public class CreateNoticeRequest : CreateNoticeInput, IRequest +public class CreateNoticeRequest : BaseNoticeContract, IRequest { - new public IList? Activities { get; set; } + public IFormFile? File { get; set; } + public IList? Activities { get; set; } } \ No newline at end of file diff --git a/src/Adapters/Gateways/Notice/UpdateNoticeRequest.cs b/src/Adapters/Gateways/Notice/UpdateNoticeRequest.cs index af554da6..473d5f01 100644 --- a/src/Adapters/Gateways/Notice/UpdateNoticeRequest.cs +++ b/src/Adapters/Gateways/Notice/UpdateNoticeRequest.cs @@ -1,5 +1,12 @@ -using Adapters.Gateways.Base; +using Adapters.Gateways.Activity; +using Adapters.Gateways.Base; using Domain.Contracts.Notice; +using Microsoft.AspNetCore.Http; namespace Adapters.Gateways.Notice; -public class UpdateNoticeRequest : UpdateNoticeInput, IRequest { } \ No newline at end of file +public class UpdateNoticeRequest : BaseNoticeContract, IRequest +{ + public Guid? Id { get; set; } + public IFormFile? File { get; set; } + public IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Mappings/ActivityMappings.cs b/src/Adapters/Mappings/ActivityMappings.cs index 37626ed9..20172e2e 100644 --- a/src/Adapters/Mappings/ActivityMappings.cs +++ b/src/Adapters/Mappings/ActivityMappings.cs @@ -8,17 +8,19 @@ public class ActivityMappings : Profile { public ActivityMappings() { - CreateMap(); + CreateMap().ReverseMap(); CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)); - - CreateMap(); + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) + .ReverseMap(); + CreateMap().ReverseMap(); CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)); - - CreateMap(); + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) + .ForPath(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) + .ReverseMap(); + CreateMap().ReverseMap(); CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)); + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) + .ReverseMap(); } } } \ No newline at end of file diff --git a/src/Adapters/Mappings/NoticeMappings.cs b/src/Adapters/Mappings/NoticeMappings.cs index 27231971..0301b2c1 100755 --- a/src/Adapters/Mappings/NoticeMappings.cs +++ b/src/Adapters/Mappings/NoticeMappings.cs @@ -1,17 +1,21 @@ using AutoMapper; using Adapters.Gateways.Notice; using Domain.Contracts.Notice; +using Domain.Contracts.Activity; +using Adapters.Gateways.Activity; -namespace Adapters.Mappings +namespace Adapters.Mappings; +public class NoticeMappings : Profile { - public class NoticeMappings : Profile + public NoticeMappings() { - public NoticeMappings() - { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - } + CreateMap() + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) + .ReverseMap(); + CreateMap() + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) + .ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); } } \ No newline at end of file diff --git a/src/Adapters/PresenterController/NoticePresenterController.cs b/src/Adapters/PresenterController/NoticePresenterController.cs index c7061713..153e4492 100755 --- a/src/Adapters/PresenterController/NoticePresenterController.cs +++ b/src/Adapters/PresenterController/NoticePresenterController.cs @@ -2,6 +2,7 @@ using Adapters.Gateways.Notice; using Adapters.Interfaces; using AutoMapper; +using Domain.Contracts.Activity; using Domain.Contracts.Notice; using Domain.Interfaces.UseCases; @@ -17,7 +18,13 @@ public class NoticePresenterController : INoticePresenterController private readonly IGetNoticeById _getNoticeById; private readonly IMapper _mapper; - public NoticePresenterController(ICreateNotice createNotice, IUpdateNotice updateNotice, IDeleteNotice deleteNotice, IGetNotices getNotices, IGetNoticeById getNoticeById, IMapper mapper) + public NoticePresenterController( + ICreateNotice createNotice, + IUpdateNotice updateNotice, + IDeleteNotice deleteNotice, + IGetNotices getNotices, + IGetNoticeById getNoticeById, + IMapper mapper) { _createNotice = createNotice; _updateNotice = updateNotice; @@ -30,8 +37,7 @@ public NoticePresenterController(ICreateNotice createNotice, IUpdateNotice updat public async Task Create(IRequest request) { - var dto = request as CreateNoticeRequest; - var input = _mapper.Map(dto); + var input = _mapper.Map(request as CreateNoticeRequest); var result = await _createNotice.Execute(input); return _mapper.Map(result); } @@ -56,8 +62,7 @@ public async Task GetById(Guid? id) public async Task Update(Guid? id, IRequest request) { - var dto = request as UpdateNoticeRequest; - var input = _mapper.Map(dto); + var input = _mapper.Map(request as UpdateNoticeRequest); var result = await _updateNotice.Execute(id, input); return _mapper.Map(result); } diff --git a/src/Domain/Contracts/Activity/CreateActivityTypeInput.cs b/src/Domain/Contracts/Activity/CreateActivityTypeInput.cs index e95809f8..c06c537b 100644 --- a/src/Domain/Contracts/Activity/CreateActivityTypeInput.cs +++ b/src/Domain/Contracts/Activity/CreateActivityTypeInput.cs @@ -1,2 +1,12 @@ +using System.ComponentModel.DataAnnotations; + namespace Domain.Contracts.Activity; -public class CreateActivityTypeInput : BaseActivityType { } \ No newline at end of file +public class CreateActivityTypeInput +{ + [Required] + public string? Name { get; set; } + [Required] + public string? Unity { get; set; } + [Required] + public virtual IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs b/src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs index 8d51d7e9..d6207bcf 100644 --- a/src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs +++ b/src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs @@ -1,7 +1,15 @@ +using System.ComponentModel.DataAnnotations; + namespace Domain.Contracts.Activity; -public class UpdateActivityTypeInput : BaseActivityType +public class UpdateActivityTypeInput { + [Required] + public string? Name { get; set; } + [Required] + public string? Unity { get; set; } + [Required] + public IList? Activities { get; set; } + public Guid? Id { get; set; } public DateTime? DeletedAt { get; set; } - new public IList? Activities { get; set; } } \ No newline at end of file diff --git a/src/Domain/Contracts/Notice/BaseNoticeContract.cs b/src/Domain/Contracts/Notice/BaseNoticeContract.cs index d03123f1..5dd51b32 100644 --- a/src/Domain/Contracts/Notice/BaseNoticeContract.cs +++ b/src/Domain/Contracts/Notice/BaseNoticeContract.cs @@ -28,6 +28,5 @@ public abstract class BaseNoticeContract public int? SuspensionYears { get; set; } public string? Description { get; set; } - public string? DocUrl { get; set; } } } \ No newline at end of file diff --git a/src/Domain/Contracts/Notice/CreateNoticeInput.cs b/src/Domain/Contracts/Notice/CreateNoticeInput.cs index 3c0d25ae..4ec51856 100644 --- a/src/Domain/Contracts/Notice/CreateNoticeInput.cs +++ b/src/Domain/Contracts/Notice/CreateNoticeInput.cs @@ -1,11 +1,9 @@ using Domain.Contracts.Activity; using Microsoft.AspNetCore.Http; -namespace Domain.Contracts.Notice +namespace Domain.Contracts.Notice; +public class CreateNoticeInput : BaseNoticeContract { - public class CreateNoticeInput : BaseNoticeContract - { - public IFormFile? File { get; set; } - virtual public IList? Activities { get; set; } - } + public IFormFile? File { get; set; } + public IList? Activities { get; set; } } \ No newline at end of file diff --git a/src/Domain/Contracts/Notice/DetailedReadNoticeOutput.cs b/src/Domain/Contracts/Notice/DetailedReadNoticeOutput.cs index 8fbc2bc5..207733bb 100644 --- a/src/Domain/Contracts/Notice/DetailedReadNoticeOutput.cs +++ b/src/Domain/Contracts/Notice/DetailedReadNoticeOutput.cs @@ -3,6 +3,7 @@ public class DetailedReadNoticeOutput : BaseNoticeContract { public Guid? Id { get; set; } + public string? DocUrl { get; set; } public DateTime? DeletedAt { get; set; } } } \ No newline at end of file diff --git a/src/Domain/Contracts/Notice/ResumedReadNoticeOutput.cs b/src/Domain/Contracts/Notice/ResumedReadNoticeOutput.cs index 2fa55889..628f013c 100644 --- a/src/Domain/Contracts/Notice/ResumedReadNoticeOutput.cs +++ b/src/Domain/Contracts/Notice/ResumedReadNoticeOutput.cs @@ -3,5 +3,6 @@ public class ResumedReadNoticeOutput : BaseNoticeContract { public Guid? Id { get; set; } + public string? DocUrl { get; set; } } } diff --git a/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs b/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs index 6cc20075..5415bc2e 100644 --- a/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs +++ b/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs @@ -5,7 +5,7 @@ namespace Domain.Interfaces.Repositories { public interface IActivityTypeRepository : IGenericCRUDRepository { - Task> GetByNoticeId(Guid? noticeId); - Task> GetLastNoticeActivities(); + Task> GetByNoticeId(Guid? noticeId); + Task> GetLastNoticeActivities(); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Notice/CreateNotice.cs b/src/Domain/UseCases/Notice/CreateNotice.cs index 4a6c0913..cc60b23b 100644 --- a/src/Domain/UseCases/Notice/CreateNotice.cs +++ b/src/Domain/UseCases/Notice/CreateNotice.cs @@ -33,7 +33,8 @@ public CreateNotice( public async Task Execute(CreateNoticeInput input) { // Verifica se atividades foram informadas - UseCaseException.BusinessRuleViolation(input.Activities == null, "As atividades devem ser informadas."); + UseCaseException.BusinessRuleViolation(input.Activities == null || input.Activities.Count == 0, + "As atividades devem ser informadas."); // Mapeia input para entidade var notice = new Entities.Notice( @@ -51,8 +52,8 @@ public async Task Execute(CreateNoticeInput input) ); // Verifica se já existe um edital para o período indicado - var projectFound = await _repository.GetNoticeByPeriod((DateTime)input.RegistrationStartDate!, (DateTime)input.RegistrationEndDate!); - UseCaseException.BusinessRuleViolation(projectFound != null, "Já existe um Edital para o período indicado."); + var noticeFound = await _repository.GetNoticeByPeriod((DateTime)input.RegistrationStartDate!, (DateTime)input.RegistrationEndDate!); + UseCaseException.BusinessRuleViolation(noticeFound != null, "Já existe um Edital para o período indicado."); // Salva arquivo no repositório e atualiza atributo DocUrl if (input.File != null) diff --git a/src/Domain/UseCases/Notice/UpdateNotice.cs b/src/Domain/UseCases/Notice/UpdateNotice.cs index 186a9517..e3dc3f88 100644 --- a/src/Domain/UseCases/Notice/UpdateNotice.cs +++ b/src/Domain/UseCases/Notice/UpdateNotice.cs @@ -4,6 +4,7 @@ using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; using Domain.Validation; +using Domain.Contracts.Activity; namespace Domain.UseCases { @@ -35,12 +36,16 @@ public async Task Execute(Guid? id, UpdateNoticeInput // Verifica se o id foi informado UseCaseException.NotInformedParam(id == null, nameof(id)); + // Verifica se atividades foram informadas + UseCaseException.BusinessRuleViolation(input.Activities == null || input.Activities.Count == 0, + "As atividades devem ser informadas."); + // Recupera entidade que será atualizada var notice = await _repository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Notice)); // Verifica se a entidade foi excluída - UseCaseException.BusinessRuleViolation(notice.DeletedAt != null, "The notice entered has already been deleted."); + UseCaseException.BusinessRuleViolation(notice.DeletedAt != null, "O Edital inserido já foi excluído."); // Salva arquivo no repositório e atualiza atributo DocUrl if (input.File != null) @@ -75,86 +80,115 @@ public async Task Execute(Guid? id, UpdateNoticeInput await _repository.Update(notice); // Recupera atividades do edital - var noticeActivities = (await _activityTypeRepository.GetByNoticeId(notice.Id)).ToList(); + var noticeActivities = await _activityTypeRepository.GetByNoticeId(notice.Id); // Atualiza atividades - foreach (var activityType in input.Activities) + await HandleActivityType(input.Activities!, noticeActivities, notice.Id); + + // Retorna entidade atualizada + return _mapper.Map(notice); + } + + /// + /// Atualiza tipos de atividades e atividades. + /// + /// Lista de tipos de atividades que serão atualizados. + /// Lista de tipos de atividades que serão excluídos. + /// Id do edital. + async Task HandleActivityType(IList newActivityTypes, IList oldActivityTypes, Guid? noticeId) + { + foreach (var newActivityType in newActivityTypes) { - // Verifica se o tipo de atividade é novo - if (activityType.Id is null) + // Verifica se o tipo de atividade já existe + var activityType = oldActivityTypes.FirstOrDefault(x => x.Id == newActivityType.Id); + + // Se o tipo de atividade não existir, cria um novo + if (activityType is null) { // Cria tipo de atividade - var activityTypeEntity = new Entities.ActivityType(activityType.Name, activityType.Unity, notice.Id); + activityType = new Entities.ActivityType(newActivityType.Name, newActivityType.Unity, noticeId); // Salva tipo de atividade no banco - await _activityTypeRepository.Create(activityTypeEntity); + await _activityTypeRepository.Create(activityType); // Cria atividades - foreach (var activity in activityType.Activities!) - { - // Cria atividade - var activityEntity = new Entities.Activity(activity.Name, activity.Points, activity.Limits, activityTypeEntity.Id); - - // Salva atividade no banco - await _activityRepository.Create(activityEntity); - } + await HandleActivity(newActivityType.Activities!, new List(), activityType.Id); } + + // Se o tipo de atividade existir, atualiza else { - // Verifica se o tipo de atividade foi excluído - var activityTypeEntity = noticeActivities.Find(x => x.Id == activityType.Id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ActivityType)); - // Atualiza tipo de atividade - activityTypeEntity.Name = activityType.Name; - activityTypeEntity.Unity = activityType.Unity; - - // Atualiza atividades - foreach (var activity in activityType.Activities!) - { - // Verifica se a atividade foi excluída - var activityEntity = activityTypeEntity.Activities!.FirstOrDefault(x => x.Id == activity.Id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Activity)); - - // Atualiza atividade - activityEntity.Name = activity.Name; - activityEntity.Points = activity.Points; - activityEntity.Limits = activity.Limits; - - // Salva atividade atualizada no banco - await _activityRepository.Update(activityEntity); - - // Remove atividade da lista de atividades do tipo de atividade - activityTypeEntity.Activities!.Remove(activityEntity); - } + activityType.Name = newActivityType.Name; + activityType.Unity = newActivityType.Unity; // Salva tipo de atividade atualizado no banco - await _activityTypeRepository.Update(activityTypeEntity); + await _activityTypeRepository.Update(activityType); + + // Atualiza atividades + await HandleActivity(newActivityType.Activities!, activityType.Activities!, activityType.Id); // Remove tipo de atividade da lista de tipos de atividades do edital - noticeActivities.Remove(activityTypeEntity); + oldActivityTypes.Remove(activityType); } } + // TODO: Validar remoção de tipos de atividade. // Verifica se existem tipos de atividades que foram excluídos - foreach (var activityTypeToRemove in noticeActivities) + foreach (var activityTypeToRemove in oldActivityTypes) + { + // Remove tipo de atividade do banco + await _activityTypeRepository.Delete(activityTypeToRemove.Id); + } + } + + /// + /// Atualiza atividades. + /// + /// Lista de atividades que serão atualizadas. + /// Lista de atividades que serão excluídas. + /// Id do tipo de atividade. + async Task HandleActivity(IList newActivities, IList oldActivities, Guid? activityTypeId) + { + // Verifica se existem atividades que foram criadas ou atualizadas + foreach (var newActivity in newActivities) { - foreach (var activityToRemove in activityTypeToRemove.Activities!) + // Verifica se o tipo de atividade já existe + var activity = oldActivities.FirstOrDefault(x => x.Id == newActivity.Id); + + // Se o tipo de atividade não existir, cria um novo + if (activity is null) { - // Verifica se a atividade foi excluída - var activityEntity = activityTypeToRemove.Activities!.FirstOrDefault(x => x.Id == activityToRemove.Id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Activity)); + // Cria atividade + activity = new Entities.Activity(newActivity.Name, newActivity.Points, newActivity.Limits, activityTypeId); - // Remove atividade do banco - await _activityRepository.Delete(activityEntity.Id); + // Salva atividade no banco + await _activityRepository.Create(activity); } - // Remove tipo de atividade do banco - await _activityTypeRepository.Delete(activityTypeToRemove.Id); + // Se o tipo de atividade existir, atualiza + else + { + // Atualiza atividade + activity.Name = newActivity.Name; + activity.Points = newActivity.Points; + activity.Limits = newActivity.Limits; + + // Salva atividade atualizada no banco + await _activityRepository.Update(activity); + + // Remove atividade da lista de atividades do tipo de atividade + oldActivities.Remove(activity); + } } - // Retorna entidade atualizada - return _mapper.Map(notice); + // TODO: Validar remoção de atividades. + // Verifica se existem atividades que foram excluídas + foreach (var activityToRemove in oldActivities) + { + // Remove atividade do banco + await _activityRepository.Delete(activityToRemove.Id); + } } } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs index 5fac5656..53561f44 100644 --- a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs +++ b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs @@ -15,24 +15,7 @@ public class ApplicationDbContext : DbContext /// Using DbContextOptions for more information and examples. /// /// The options for this context. - public ApplicationDbContext(DbContextOptions options) : base(options) - { - Areas = Set(); - Activities = Set(); - ActivityTypes = Set(); - Campuses = Set(); - Courses = Set(); - MainAreas = Set(); - Notices = Set(); - Professors = Set(); - Projects = Set(); - ProjectEvaluations = Set(); - ProgramTypes = Set(); - AssistanceTypes = Set(); - Students = Set(); - SubAreas = Set(); - Users = Set(); - } + public ApplicationDbContext(DbContextOptions options) : base(options) { } public DbSet Areas { get; set; } public DbSet Activities { get; set; } @@ -56,5 +39,7 @@ protected override void OnModelCreating(ModelBuilder builder) base.OnModelCreating(builder); builder.ApplyConfigurationsFromAssembly(typeof(ApplicationDbContext).Assembly); } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseLazyLoadingProxies(); } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityConfiguration.cs index 56be2400..ccdbeeef 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityConfiguration.cs @@ -20,7 +20,7 @@ public void Configure(EntityTypeBuilder builder) builder.Property(p => p.DeletedAt); builder.HasOne(a => a.ActivityType) - .WithMany() + .WithMany(t => t.Activities) .HasForeignKey(a => a.ActivityTypeId); builder.HasQueryFilter(x => x.DeletedAt == null); diff --git a/src/Infrastructure/Persistence/Persistence.csproj b/src/Infrastructure/Persistence/Persistence.csproj index 8a763b61..319052f6 100644 --- a/src/Infrastructure/Persistence/Persistence.csproj +++ b/src/Infrastructure/Persistence/Persistence.csproj @@ -36,11 +36,12 @@ runtime; build; native; contentfiles; analyzers; buildtransitive none - - + + + - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index a84ca2c5..bfb3248a 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add AddActivities --project ../Persistence/Persistence.csproj +dotnet ef migrations add UpdateActivities --project ../Persistence/Persistence.csproj ``` Executando as Migrations: diff --git a/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs b/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs index 0415741e..f4adc738 100644 --- a/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs @@ -37,17 +37,27 @@ public async Task Delete(Guid? id) ?? throw new Exception($"Nenhum tipo de atividade encontrado para o id {id}"); } - public async Task> GetByNoticeId(Guid? noticeId) + public async Task> GetByNoticeId(Guid? noticeId) { - return await _context.ActivityTypes - .Include(x => x.Notice) + var activityTypes = await _context.ActivityTypes .Include(x => x.Activities) .Where(x => x.NoticeId == noticeId) .ToListAsync() ?? throw new Exception("Nenhum tipo de atividade encontrado."); + + // Force loading of the Activities collection for each ActivityType + foreach (var activityType in activityTypes) + { + // Explicitly load the Activities collection + await _context.Entry(activityType) + .Collection(x => x.Activities!) + .LoadAsync(); + } + + return activityTypes; } - public async Task> GetLastNoticeActivities() + public async Task> GetLastNoticeActivities() { var lastNoticeId = await _context.Notices .AsAsyncEnumerable() diff --git a/src/Infrastructure/WebAPI/Controllers/ActivityController.cs b/src/Infrastructure/WebAPI/Controllers/ActivityController.cs new file mode 100644 index 00000000..f2a8a0b0 --- /dev/null +++ b/src/Infrastructure/WebAPI/Controllers/ActivityController.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Adapters.Interfaces; +using Microsoft.AspNetCore.Mvc; + +namespace WebAPI.Controllers +{ + /// + /// Controller responsável por gerenciar as atividades. + /// + [ApiController] + [Route("api/v1/[controller]")] + public class ActivityController : ControllerBase + { + private readonly IActivityPresenterController _activityPresenterController; + private readonly ILogger _logger; + /// + /// Construtor da classe. + /// + /// + /// + public ActivityController(IActivityPresenterController activityPresenterController, ILogger logger) + { + _activityPresenterController = activityPresenterController; + _logger = logger; + } + + /// + /// Obtém as últimas atividades em uso pelo edital anterior. + /// + /// Lista de atividades mais recentes. + /// Retorna a lista de atividades mais recentes. + /// Erro interno do servidor. + [HttpGet] + public async Task GetLastNoticeActivities() + { + try + { + var result = await _activityPresenterController.GetLastNoticeActivities(); + _logger.LogInformation("Atividades encontradas."); + return Ok(result); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); + } + } + + /// + /// Obtém as atividades de um edital. + /// + /// Id do edital. + /// Lista de atividades. + /// Retorna a lista de atividades. + /// Erro interno do servidor. + [HttpGet] + [Route("notice/{noticeId}")] + public async Task GetActivitiesByNoticeId(Guid? noticeId) + { + try + { + var result = await _activityPresenterController.GetActivitiesByNoticeId(noticeId); + _logger.LogInformation("Atividades encontradas para o edital {noticeId}.", noticeId); + return Ok(result); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); + } + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/WebAPI/Controllers/NoticeController.cs b/src/Infrastructure/WebAPI/Controllers/NoticeController.cs index 4d4c26c6..eee95ea7 100644 --- a/src/Infrastructure/WebAPI/Controllers/NoticeController.cs +++ b/src/Infrastructure/WebAPI/Controllers/NoticeController.cs @@ -88,7 +88,7 @@ public async Task>> GetAll(i [HttpPost] [ProducesResponseType(StatusCodes.Status200OK)] [Authorize(Roles = "ADMIN")] - public async Task> Create([FromForm] CreateNoticeRequest request) + public async Task> Create([FromBody] CreateNoticeRequest request) { try { @@ -111,7 +111,7 @@ public async Task> Create([FromForm] Cr /// Retorna edital atualizado [HttpPut("{id}")] [Authorize(Roles = "ADMIN")] - public async Task> Update(Guid? id, [FromForm] UpdateNoticeRequest request) + public async Task> Update(Guid? id, [FromBody] UpdateNoticeRequest request) { try { From 993f624290c4621b3d351d976a06cf2937014498 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 24 Jul 2023 10:23:54 -0300 Subject: [PATCH 042/201] fix: adjust api endpoints --- src/Infrastructure/WebAPI/Controllers/ActivityController.cs | 6 +----- src/Infrastructure/WebAPI/Controllers/AreaController.cs | 2 +- .../WebAPI/Controllers/AssistanceTypeController.cs | 2 +- src/Infrastructure/WebAPI/Controllers/AuthController.cs | 2 +- src/Infrastructure/WebAPI/Controllers/CampusController.cs | 2 +- src/Infrastructure/WebAPI/Controllers/CourseController.cs | 2 +- src/Infrastructure/WebAPI/Controllers/MainAreaController.cs | 2 +- src/Infrastructure/WebAPI/Controllers/NoticeController.cs | 6 +++--- .../WebAPI/Controllers/ProfessorController.cs | 2 +- .../WebAPI/Controllers/ProgramTypeController.cs | 2 +- src/Infrastructure/WebAPI/Controllers/ProjectController.cs | 2 +- .../WebAPI/Controllers/ProjectEvaluationController.cs | 2 +- src/Infrastructure/WebAPI/Controllers/StudentController.cs | 2 +- src/Infrastructure/WebAPI/Controllers/SubAreaController.cs | 2 +- src/Infrastructure/WebAPI/Controllers/UserController.cs | 2 +- src/Infrastructure/WebAPI/Controllers/VersionController.cs | 4 ++-- 16 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/Infrastructure/WebAPI/Controllers/ActivityController.cs b/src/Infrastructure/WebAPI/Controllers/ActivityController.cs index f2a8a0b0..754c1203 100644 --- a/src/Infrastructure/WebAPI/Controllers/ActivityController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ActivityController.cs @@ -1,11 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Adapters.Interfaces; using Microsoft.AspNetCore.Mvc; -namespace WebAPI.Controllers +namespace Infrastructure.WebAPI.Controllers { /// /// Controller responsável por gerenciar as atividades. diff --git a/src/Infrastructure/WebAPI/Controllers/AreaController.cs b/src/Infrastructure/WebAPI/Controllers/AreaController.cs index d943a372..186cffa6 100644 --- a/src/Infrastructure/WebAPI/Controllers/AreaController.cs +++ b/src/Infrastructure/WebAPI/Controllers/AreaController.cs @@ -9,7 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de Área. /// [ApiController] - [Route("Api/[controller]")] + [Route("api/v1/[controller]")] [Authorize] public class AreaController : ControllerBase { diff --git a/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs b/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs index 1a9f86cb..ab97bc10 100644 --- a/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs +++ b/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs @@ -9,7 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de Bolsa de Assistência. /// [ApiController] - [Route("Api/[controller]")] + [Route("api/v1/[controller]")] [Authorize] public class AssistanceTypeController : ControllerBase { diff --git a/src/Infrastructure/WebAPI/Controllers/AuthController.cs b/src/Infrastructure/WebAPI/Controllers/AuthController.cs index 26bcbbdc..77d5f1a6 100644 --- a/src/Infrastructure/WebAPI/Controllers/AuthController.cs +++ b/src/Infrastructure/WebAPI/Controllers/AuthController.cs @@ -9,7 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de Autenticação. /// [ApiController] - [Route("Api/[controller]")] + [Route("api/v1/[controller]")] public class AuthController : ControllerBase { #region Global Scope diff --git a/src/Infrastructure/WebAPI/Controllers/CampusController.cs b/src/Infrastructure/WebAPI/Controllers/CampusController.cs index ba68e92d..53bf689e 100644 --- a/src/Infrastructure/WebAPI/Controllers/CampusController.cs +++ b/src/Infrastructure/WebAPI/Controllers/CampusController.cs @@ -9,7 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de Campus. /// [ApiController] - [Route("Api/[controller]")] + [Route("api/v1/[controller]")] [Authorize] public class CampusController : ControllerBase { diff --git a/src/Infrastructure/WebAPI/Controllers/CourseController.cs b/src/Infrastructure/WebAPI/Controllers/CourseController.cs index baba970d..55326397 100644 --- a/src/Infrastructure/WebAPI/Controllers/CourseController.cs +++ b/src/Infrastructure/WebAPI/Controllers/CourseController.cs @@ -9,7 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de Curso. /// [ApiController] - [Route("Api/[controller]")] + [Route("api/v1/[controller]")] [Authorize] public class CourseController : ControllerBase { diff --git a/src/Infrastructure/WebAPI/Controllers/MainAreaController.cs b/src/Infrastructure/WebAPI/Controllers/MainAreaController.cs index b41f1b6c..058dca53 100644 --- a/src/Infrastructure/WebAPI/Controllers/MainAreaController.cs +++ b/src/Infrastructure/WebAPI/Controllers/MainAreaController.cs @@ -9,7 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de Área Principal. /// [ApiController] - [Route("Api/[controller]")] + [Route("api/v1/[controller]")] [Authorize] public class MainAreaController : ControllerBase { diff --git a/src/Infrastructure/WebAPI/Controllers/NoticeController.cs b/src/Infrastructure/WebAPI/Controllers/NoticeController.cs index eee95ea7..9978faa6 100644 --- a/src/Infrastructure/WebAPI/Controllers/NoticeController.cs +++ b/src/Infrastructure/WebAPI/Controllers/NoticeController.cs @@ -9,7 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de Edital. /// [ApiController] - [Route("Api/[controller]")] + [Route("api/v1/[controller]")] [Authorize] public class NoticeController : ControllerBase { @@ -88,7 +88,7 @@ public async Task>> GetAll(i [HttpPost] [ProducesResponseType(StatusCodes.Status200OK)] [Authorize(Roles = "ADMIN")] - public async Task> Create([FromBody] CreateNoticeRequest request) + public async Task> Create([FromForm] CreateNoticeRequest request) { try { @@ -111,7 +111,7 @@ public async Task> Create([FromBody] Cr /// Retorna edital atualizado [HttpPut("{id}")] [Authorize(Roles = "ADMIN")] - public async Task> Update(Guid? id, [FromBody] UpdateNoticeRequest request) + public async Task> Update(Guid? id, [FromForm] UpdateNoticeRequest request) { try { diff --git a/src/Infrastructure/WebAPI/Controllers/ProfessorController.cs b/src/Infrastructure/WebAPI/Controllers/ProfessorController.cs index 4cd26eca..e9f6ab55 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProfessorController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProfessorController.cs @@ -9,7 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de Professor. /// [ApiController] - [Route("Api/[controller]")] + [Route("api/v1/[controller]")] [Authorize] public class ProfessorController : ControllerBase { diff --git a/src/Infrastructure/WebAPI/Controllers/ProgramTypeController.cs b/src/Infrastructure/WebAPI/Controllers/ProgramTypeController.cs index 1ea5efe3..17652f6c 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProgramTypeController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProgramTypeController.cs @@ -9,7 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de Tipo de Programa. /// [ApiController] - [Route("Api/[controller]")] + [Route("api/v1/[controller]")] [Authorize] public class ProgramTypeController : ControllerBase { diff --git a/src/Infrastructure/WebAPI/Controllers/ProjectController.cs b/src/Infrastructure/WebAPI/Controllers/ProjectController.cs index f222e3d9..c4e82e5a 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProjectController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProjectController.cs @@ -9,7 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de projetos. /// [ApiController] - [Route("api/[controller]")] + [Route("api/v1/[controller]")] [Authorize] public class ProjectController : ControllerBase { diff --git a/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs b/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs index 6ce4dd3a..6fcefc98 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs @@ -10,7 +10,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de projetos. /// [ApiController] - [Route("api/[controller]")] + [Route("api/v1/[controller]")] [Authorize] public class ProjectEvaluationController : ControllerBase { diff --git a/src/Infrastructure/WebAPI/Controllers/StudentController.cs b/src/Infrastructure/WebAPI/Controllers/StudentController.cs index ff916d32..1dda9188 100644 --- a/src/Infrastructure/WebAPI/Controllers/StudentController.cs +++ b/src/Infrastructure/WebAPI/Controllers/StudentController.cs @@ -9,7 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de Estudante. /// [ApiController] - [Route("Api/[controller]")] + [Route("api/v1/[controller]")] [Authorize] public class StudentController : ControllerBase { diff --git a/src/Infrastructure/WebAPI/Controllers/SubAreaController.cs b/src/Infrastructure/WebAPI/Controllers/SubAreaController.cs index b10d343a..c7977eee 100644 --- a/src/Infrastructure/WebAPI/Controllers/SubAreaController.cs +++ b/src/Infrastructure/WebAPI/Controllers/SubAreaController.cs @@ -9,7 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de Sub Área. /// [ApiController] - [Route("Api/[controller]")] + [Route("api/v1/[controller]")] [Authorize] public class SubAreaController : ControllerBase { diff --git a/src/Infrastructure/WebAPI/Controllers/UserController.cs b/src/Infrastructure/WebAPI/Controllers/UserController.cs index 5bc9dc5b..869763a1 100644 --- a/src/Infrastructure/WebAPI/Controllers/UserController.cs +++ b/src/Infrastructure/WebAPI/Controllers/UserController.cs @@ -9,7 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// Controller de Usuário. /// [ApiController] - [Route("Api/[controller]")] + [Route("api/v1/[controller]")] [Authorize] public class UserController : ControllerBase { diff --git a/src/Infrastructure/WebAPI/Controllers/VersionController.cs b/src/Infrastructure/WebAPI/Controllers/VersionController.cs index b2f7f1d1..b16887a0 100644 --- a/src/Infrastructure/WebAPI/Controllers/VersionController.cs +++ b/src/Infrastructure/WebAPI/Controllers/VersionController.cs @@ -1,12 +1,12 @@ using Microsoft.AspNetCore.Mvc; -namespace WebAPI.Controllers +namespace Infrastructure.WebAPI.Controllers { /// /// Controller de validação. /// [ApiController] - [Route("api/[controller]")] + [Route("api/v1/[controller]")] public class Version : ControllerBase { /// From d9c8da5e0754d560bf5e11c6e32273bd1901aa47 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 24 Jul 2023 10:45:57 -0300 Subject: [PATCH 043/201] merge: add activity files from development --- .../Gateways/Activity/ActivityResponse.cs | 6 ++ .../Gateways/Activity/ActivityTypeResponse.cs | 7 ++ .../Gateways/Activity/BaseActivity.cs | 11 +++ .../Gateways/Activity/BaseActivityType.cs | 12 +++ .../Activity/CreateActivityRequest.cs | 12 +++ .../Activity/CreateActivityTypeRequest.cs | 12 +++ .../Gateways/Notice/CreateNoticeRequest.cs | 5 +- .../IActivityPresenterController.cs | 10 +++ .../ActivityPresenterController.cs | 35 ++++++++ .../Contracts/Activity/ActivityOutput.cs | 6 ++ .../Contracts/Activity/ActivityTypeOutput.cs | 7 ++ src/Domain/Contracts/Activity/BaseActivity.cs | 11 +++ .../Contracts/Activity/BaseActivityType.cs | 12 +++ .../Contracts/Activity/CreateActivityInput.cs | 2 + .../Contracts/Activity/UpdateActivityInput.cs | 6 ++ .../Contracts/Notice/CreateNoticeInput.cs | 3 +- .../Contracts/Notice/UpdateNoticeInput.cs | 4 +- src/Domain/Entities/Activity.cs | 88 +++++++++++++++++++ src/Domain/Entities/ActivityType.cs | 1 + .../Repositories/IActivityRepository.cs | 5 ++ .../Repositories/IProfessorRepository.cs | 4 +- .../ActivityType/IGetActivitiesByNoticeId.cs | 7 ++ .../ActivityType/IGetLastNoticeActivities.cs | 9 ++ src/Domain/Mappings/ActivityMappings.cs | 23 +++++ .../ActivityType/GetActivitiesByNoticeId.cs | 60 +++++++++++++ .../ActivityType/GetLastNoticeActivities.cs | 60 +++++++++++++ src/Domain/UseCases/Notice/CreateNotice.cs | 48 ++++++++-- src/Domain/UseCases/Notice/UpdateNotice.cs | 51 +++++++---- .../IoC/DependencyAdaptersInjection.cs | 2 + .../IoC/DependencyDomainInjection.cs | 8 ++ src/Infrastructure/IoC/DependencyInjection.cs | 2 + .../Context/ApplicationDbContext.cs | 3 +- .../ActivityTypeConfiguration.cs | 28 ++++++ .../EntitiesConfiguration/EntityBuilder.cs | 0 .../Repositories/ActivityRepository.cs | 48 ++++++++++ 35 files changed, 579 insertions(+), 29 deletions(-) create mode 100644 src/Adapters/Gateways/Activity/ActivityResponse.cs create mode 100644 src/Adapters/Gateways/Activity/ActivityTypeResponse.cs create mode 100644 src/Adapters/Gateways/Activity/BaseActivity.cs create mode 100644 src/Adapters/Gateways/Activity/BaseActivityType.cs create mode 100644 src/Adapters/Gateways/Activity/CreateActivityRequest.cs create mode 100644 src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs create mode 100644 src/Adapters/Interfaces/IActivityPresenterController.cs create mode 100644 src/Adapters/PresenterController/ActivityPresenterController.cs create mode 100644 src/Domain/Contracts/Activity/ActivityOutput.cs create mode 100644 src/Domain/Contracts/Activity/ActivityTypeOutput.cs create mode 100644 src/Domain/Contracts/Activity/BaseActivity.cs create mode 100644 src/Domain/Contracts/Activity/BaseActivityType.cs create mode 100644 src/Domain/Contracts/Activity/CreateActivityInput.cs create mode 100644 src/Domain/Contracts/Activity/UpdateActivityInput.cs create mode 100644 src/Domain/Entities/Activity.cs create mode 100644 src/Domain/Interfaces/Repositories/IActivityRepository.cs create mode 100644 src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs create mode 100644 src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs create mode 100644 src/Domain/Mappings/ActivityMappings.cs create mode 100644 src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs create mode 100644 src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs create mode 100644 src/Infrastructure/Persistence/EntitiesConfiguration/ActivityTypeConfiguration.cs create mode 100644 src/Infrastructure/Persistence/EntitiesConfiguration/EntityBuilder.cs create mode 100644 src/Infrastructure/Persistence/Repositories/ActivityRepository.cs diff --git a/src/Adapters/Gateways/Activity/ActivityResponse.cs b/src/Adapters/Gateways/Activity/ActivityResponse.cs new file mode 100644 index 00000000..6f06f044 --- /dev/null +++ b/src/Adapters/Gateways/Activity/ActivityResponse.cs @@ -0,0 +1,6 @@ +namespace Adapters.Gateways.Activity; +public class ActivityResponse : BaseActivity +{ + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/ActivityTypeResponse.cs b/src/Adapters/Gateways/Activity/ActivityTypeResponse.cs new file mode 100644 index 00000000..9fc68f9d --- /dev/null +++ b/src/Adapters/Gateways/Activity/ActivityTypeResponse.cs @@ -0,0 +1,7 @@ +namespace Adapters.Gateways.Activity; +public class ActivityTypeResponse : BaseActivityType +{ + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } + new public IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/BaseActivity.cs b/src/Adapters/Gateways/Activity/BaseActivity.cs new file mode 100644 index 00000000..00b864d4 --- /dev/null +++ b/src/Adapters/Gateways/Activity/BaseActivity.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace Adapters.Gateways.Activity; +public class BaseActivity +{ + [Required] + public string? Name { get; set; } + [Required] + public double? Points { get; set; } + public double? Limits { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/BaseActivityType.cs b/src/Adapters/Gateways/Activity/BaseActivityType.cs new file mode 100644 index 00000000..34331f24 --- /dev/null +++ b/src/Adapters/Gateways/Activity/BaseActivityType.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Adapters.Gateways.Activity; +public class BaseActivityType +{ + [Required] + public string? Name { get; set; } + [Required] + public string? Unity { get; set; } + [Required] + public virtual IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/CreateActivityRequest.cs b/src/Adapters/Gateways/Activity/CreateActivityRequest.cs new file mode 100644 index 00000000..333157a8 --- /dev/null +++ b/src/Adapters/Gateways/Activity/CreateActivityRequest.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Adapters.Gateways.Activity; +public class CreateActivityRequest +{ + [Required] + public string? Name { get; set; } + [Required] + public double? Points { get; set; } + [Required] + public double? Limits { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs b/src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs new file mode 100644 index 00000000..e6c6c4cd --- /dev/null +++ b/src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Adapters.Gateways.Activity; +public class CreateActivityTypeRequest +{ + [Required] + public string? Name { get; set; } + [Required] + public string? Unity { get; set; } + [Required] + public virtual IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs b/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs index fe7ebc70..992730e8 100644 --- a/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs +++ b/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs @@ -1,4 +1,5 @@ -using Adapters.Gateways.Base; +using Adapters.Gateways.Activity; +using Adapters.Gateways.Base; using Domain.Contracts.Notice; using Microsoft.AspNetCore.Http; @@ -7,4 +8,4 @@ public class CreateNoticeRequest : BaseNoticeContract, IRequest { public IFormFile? File { get; set; } public IList? Activities { get; set; } -} +} \ No newline at end of file diff --git a/src/Adapters/Interfaces/IActivityPresenterController.cs b/src/Adapters/Interfaces/IActivityPresenterController.cs new file mode 100644 index 00000000..5e9f3c46 --- /dev/null +++ b/src/Adapters/Interfaces/IActivityPresenterController.cs @@ -0,0 +1,10 @@ +using Adapters.Gateways.Activity; + +namespace Adapters.Interfaces +{ + public interface IActivityPresenterController + { + Task> GetActivitiesByNoticeId(Guid? noticeId); + Task> GetLastNoticeActivities(); + } +} \ No newline at end of file diff --git a/src/Adapters/PresenterController/ActivityPresenterController.cs b/src/Adapters/PresenterController/ActivityPresenterController.cs new file mode 100644 index 00000000..325ee85c --- /dev/null +++ b/src/Adapters/PresenterController/ActivityPresenterController.cs @@ -0,0 +1,35 @@ +using Adapters.Gateways.Activity; +using Adapters.Interfaces; +using AutoMapper; +using Domain.Interfaces.UseCases.ActivityType; + +namespace Adapters.PresenterController +{ + public class ActivityPresenterController : IActivityPresenterController + { + private readonly IGetActivitiesByNoticeId _getActivitiesByNoticeId; + private readonly IGetLastNoticeActivities _getLastNoticeActivities; + private readonly IMapper _mapper; + public ActivityPresenterController( + IGetActivitiesByNoticeId getActivitiesByNoticeId, + IGetLastNoticeActivities getLastNoticeActivities, + IMapper mapper) + { + _getActivitiesByNoticeId = getActivitiesByNoticeId; + _getLastNoticeActivities = getLastNoticeActivities; + _mapper = mapper; + } + + public async Task> GetActivitiesByNoticeId(Guid? noticeId) + { + var activityTypes = await _getActivitiesByNoticeId.GetActivitiesByNoticeId(noticeId); + return _mapper.Map>(activityTypes); + } + + public async Task> GetLastNoticeActivities() + { + var activityTypes = await _getLastNoticeActivities.GetLastNoticeActivities(); + return _mapper.Map>(activityTypes); + } + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/ActivityOutput.cs b/src/Domain/Contracts/Activity/ActivityOutput.cs new file mode 100644 index 00000000..5b3364f0 --- /dev/null +++ b/src/Domain/Contracts/Activity/ActivityOutput.cs @@ -0,0 +1,6 @@ +namespace Domain.Contracts.Activity; +public class ActivityOutput : BaseActivity +{ + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/ActivityTypeOutput.cs b/src/Domain/Contracts/Activity/ActivityTypeOutput.cs new file mode 100644 index 00000000..bc070298 --- /dev/null +++ b/src/Domain/Contracts/Activity/ActivityTypeOutput.cs @@ -0,0 +1,7 @@ +namespace Domain.Contracts.Activity; +public class ActivityTypeOutput : BaseActivityType +{ + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } + new public IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/BaseActivity.cs b/src/Domain/Contracts/Activity/BaseActivity.cs new file mode 100644 index 00000000..3c50f5e0 --- /dev/null +++ b/src/Domain/Contracts/Activity/BaseActivity.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.Contracts.Activity; +public class BaseActivity +{ + [Required] + public string? Name { get; set; } + [Required] + public double? Points { get; set; } + public double? Limits { get; set; } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/BaseActivityType.cs b/src/Domain/Contracts/Activity/BaseActivityType.cs new file mode 100644 index 00000000..441b6998 --- /dev/null +++ b/src/Domain/Contracts/Activity/BaseActivityType.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.Contracts.Activity; +public class BaseActivityType +{ + [Required] + public string? Name { get; set; } + [Required] + public string? Unity { get; set; } + [Required] + public virtual IList? Activities { get; set; } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/CreateActivityInput.cs b/src/Domain/Contracts/Activity/CreateActivityInput.cs new file mode 100644 index 00000000..f18f710d --- /dev/null +++ b/src/Domain/Contracts/Activity/CreateActivityInput.cs @@ -0,0 +1,2 @@ +namespace Domain.Contracts.Activity; +public class CreateActivityInput : BaseActivity { } \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/UpdateActivityInput.cs b/src/Domain/Contracts/Activity/UpdateActivityInput.cs new file mode 100644 index 00000000..6590d4a6 --- /dev/null +++ b/src/Domain/Contracts/Activity/UpdateActivityInput.cs @@ -0,0 +1,6 @@ +namespace Domain.Contracts.Activity; +public class UpdateActivityInput : BaseActivity +{ + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Notice/CreateNoticeInput.cs b/src/Domain/Contracts/Notice/CreateNoticeInput.cs index 7a362d05..4ec51856 100644 --- a/src/Domain/Contracts/Notice/CreateNoticeInput.cs +++ b/src/Domain/Contracts/Notice/CreateNoticeInput.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Http; +using Domain.Contracts.Activity; +using Microsoft.AspNetCore.Http; namespace Domain.Contracts.Notice; public class CreateNoticeInput : BaseNoticeContract diff --git a/src/Domain/Contracts/Notice/UpdateNoticeInput.cs b/src/Domain/Contracts/Notice/UpdateNoticeInput.cs index a916a6e0..897c5e92 100644 --- a/src/Domain/Contracts/Notice/UpdateNoticeInput.cs +++ b/src/Domain/Contracts/Notice/UpdateNoticeInput.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Http; +using Domain.Contracts.Activity; +using Microsoft.AspNetCore.Http; namespace Domain.Contracts.Notice { @@ -6,5 +7,6 @@ public class UpdateNoticeInput : BaseNoticeContract { public Guid? Id { get; set; } public IFormFile? File { get; set; } + public IList? Activities { get; set; } } } \ No newline at end of file diff --git a/src/Domain/Entities/Activity.cs b/src/Domain/Entities/Activity.cs new file mode 100644 index 00000000..2575ecf4 --- /dev/null +++ b/src/Domain/Entities/Activity.cs @@ -0,0 +1,88 @@ +using Domain.Entities.Primitives; +using Domain.Validation; + +namespace Domain.Entities +{ + public class Activity : Entity + { + #region Properties + private string? _name; + /// + /// Nome da atividade + /// + public string? Name + { + get => _name; + set + { + EntityExceptionValidation.When(string.IsNullOrEmpty(value), + ExceptionMessageFactory.Required(nameof(Name))); + EntityExceptionValidation.When(value?.Length < 3, + ExceptionMessageFactory.MinLength(nameof(Name), 3)); + EntityExceptionValidation.When(value?.Length > 300, + ExceptionMessageFactory.MaxLength(nameof(Name), 300)); + _name = value; + } + } + + private double? _points; + /// + /// Pontuação da atividade + /// + public double? Points + { + get => _points; + set + { + EntityExceptionValidation.When(value is null, + ExceptionMessageFactory.Required(nameof(Points))); + _points = value; + } + } + + private double? _limits; + /// + /// Limite de pontuação da atividade + /// + public double? Limits + { + get => _limits; + set => _limits = value ?? double.MaxValue; + } + + private Guid? _activityTypeId; + /// + /// Id do tipo de atividade + /// + public Guid? ActivityTypeId + { + get => _activityTypeId; + private set + { + { + EntityExceptionValidation.When(value == null, + ExceptionMessageFactory.Required(nameof(ActivityTypeId))); + _activityTypeId = value; + } + } + } + + public virtual ActivityType? ActivityType { get; } + #endregion + + #region Constructors + public Activity(string? name, double? points, double? limits, Guid? activityTypeId) + { + Name = name; + Points = points; + Limits = limits; + ActivityTypeId = activityTypeId; + } + + /// + /// Constructor to dbcontext EF instancing. + /// + protected Activity() { } + #endregion + } +} \ No newline at end of file diff --git a/src/Domain/Entities/ActivityType.cs b/src/Domain/Entities/ActivityType.cs index 44e5658f..2b63c440 100644 --- a/src/Domain/Entities/ActivityType.cs +++ b/src/Domain/Entities/ActivityType.cs @@ -53,6 +53,7 @@ private set } public virtual Notice? Notice { get; } + public virtual IList? Activities { get; } #endregion #region Constructors diff --git a/src/Domain/Interfaces/Repositories/IActivityRepository.cs b/src/Domain/Interfaces/Repositories/IActivityRepository.cs new file mode 100644 index 00000000..65cf6aba --- /dev/null +++ b/src/Domain/Interfaces/Repositories/IActivityRepository.cs @@ -0,0 +1,5 @@ +using Domain.Entities; +using Domain.Interfaces.Repositories.Bases; + +namespace Domain.Interfaces.Repositories; +public interface IActivityRepository : IGenericCRUDRepository { } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs index 47b37147..baf6effe 100644 --- a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs @@ -3,7 +3,5 @@ namespace Domain.Interfaces.Repositories { - public interface IProfessorRepository : IGenericCRUDRepository - { - } + public interface IProfessorRepository : IGenericCRUDRepository { } } \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs b/src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs new file mode 100644 index 00000000..3d978e15 --- /dev/null +++ b/src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs @@ -0,0 +1,7 @@ +using Domain.Contracts.Activity; + +namespace Domain.Interfaces.UseCases.ActivityType; +public interface IGetActivitiesByNoticeId +{ + Task> GetActivitiesByNoticeId(Guid? id); +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs b/src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs new file mode 100644 index 00000000..b79452ae --- /dev/null +++ b/src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs @@ -0,0 +1,9 @@ +using Domain.Contracts.Activity; + +namespace Domain.Interfaces.UseCases.ActivityType +{ + public interface IGetLastNoticeActivities + { + Task> GetLastNoticeActivities(); + } +} \ No newline at end of file diff --git a/src/Domain/Mappings/ActivityMappings.cs b/src/Domain/Mappings/ActivityMappings.cs new file mode 100644 index 00000000..8b955641 --- /dev/null +++ b/src/Domain/Mappings/ActivityMappings.cs @@ -0,0 +1,23 @@ +using AutoMapper; +using Domain.Contracts.Activity; +using Domain.Entities; + +namespace Domain.Mappings +{ + public class ActivityMappings : Profile + { + public ActivityMappings() + { + CreateMap(); + CreateMap() + .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) + .ForMember(dest => dest.DeletedAt, opt => opt.MapFrom(src => src.DeletedAt)); + + CreateMap(); + CreateMap() + .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) + .ForMember(dest => dest.DeletedAt, opt => opt.MapFrom(src => src.DeletedAt)) + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)); + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs b/src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs new file mode 100644 index 00000000..b9128a08 --- /dev/null +++ b/src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs @@ -0,0 +1,60 @@ +using AutoMapper; +using Domain.Contracts.Activity; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.UseCases.ActivityType; + +namespace Domain.UseCases.ActivityType +{ + public class GetActivitiesByNoticeId : IGetActivitiesByNoticeId + { + private readonly IActivityTypeRepository _activityTypeRepository; + private readonly IMapper _mapper; + public GetActivitiesByNoticeId(IActivityTypeRepository activityTypeRepository, IMapper mapper) + { + _activityTypeRepository = activityTypeRepository; + _mapper = mapper; + } + + async Task> IGetActivitiesByNoticeId.GetActivitiesByNoticeId(Guid? id) + { + // Obtém os tipos de atividades do edital + var activityTypes = await _activityTypeRepository.GetByNoticeId(id); + + // Mapeia os tipos de atividades para o output + var output = _mapper.Map>(activityTypes); + + // return output; + + // Mapeia os tipos de atividades para o output + var activityTypesOutput = new List(); + foreach (var activityType in activityTypes) + { + // Mapeia as atividades para o output + var activitiesOutput = new List(); + foreach (var activity in activityType.Activities!) + { + activitiesOutput.Add(new ActivityOutput + { + Id = activity.Id, + Name = activity.Name, + Points = activity.Points, + Limits = activity.Limits, + DeletedAt = activity.DeletedAt + }); + } + + // Adiciona o tipo de atividade ao output + activityTypesOutput.Add(new ActivityTypeOutput + { + Id = activityType.Id, + Name = activityType.Name, + Unity = activityType.Unity, + DeletedAt = activityType.DeletedAt, + Activities = activitiesOutput + }); + } + + return activityTypesOutput; + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs b/src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs new file mode 100644 index 00000000..10db5f6e --- /dev/null +++ b/src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs @@ -0,0 +1,60 @@ +using AutoMapper; +using Domain.Contracts.Activity; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.UseCases.ActivityType; + +namespace Domain.UseCases.ActivityType +{ + public class GetLastNoticeActivities : IGetLastNoticeActivities + { + private readonly IActivityTypeRepository _activityTypeRepository; + private readonly IMapper _mapper; + public GetLastNoticeActivities(IActivityTypeRepository activityTypeRepository, IMapper mapper) + { + _activityTypeRepository = activityTypeRepository; + _mapper = mapper; + } + async Task> IGetLastNoticeActivities.GetLastNoticeActivities() + { + // Obtém os tipos de atividades do último edital + var activityTypes = await _activityTypeRepository.GetLastNoticeActivities(); + + // Mapeia os tipos de atividades para o output + var output = _mapper.Map>(activityTypes); + + // return output; + + // Mapeia os tipos de atividades para o output + var activityTypesOutput = new List(); + foreach (var type in activityTypes) + { + // Mapeia as atividades para o output + var activitiesOutput = new List(); + foreach (var activity in type.Activities!) + { + activitiesOutput.Add(new ActivityOutput + { + Id = activity.Id, + Name = activity.Name, + Points = activity.Points, + Limits = activity.Limits, + DeletedAt = activity.DeletedAt + }); + } + + // Adiciona o tipo de atividade ao output + activityTypesOutput.Add(new ActivityTypeOutput + { + Id = type.Id, + Name = type.Name, + Unity = type.Unity, + DeletedAt = type.DeletedAt, + Activities = activitiesOutput + }); + } + + // Retorna os tipos de atividades do último edital + return activityTypesOutput; + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Notice/CreateNotice.cs b/src/Domain/UseCases/Notice/CreateNotice.cs index 6d5272b4..cc60b23b 100644 --- a/src/Domain/UseCases/Notice/CreateNotice.cs +++ b/src/Domain/UseCases/Notice/CreateNotice.cs @@ -12,11 +12,20 @@ public class CreateNotice : ICreateNotice #region Global Scope private readonly INoticeRepository _repository; private readonly IStorageFileService _storageFileService; + private readonly IActivityTypeRepository _activityTypeRepository; + private readonly IActivityRepository _activityRepository; private readonly IMapper _mapper; - public CreateNotice(INoticeRepository repository, IStorageFileService storageFileService, IMapper mapper) + public CreateNotice( + INoticeRepository repository, + IStorageFileService storageFileService, + IActivityTypeRepository activityTypeRepository, + IActivityRepository activityRepository, + IMapper mapper) { _repository = repository; _storageFileService = storageFileService; + _activityTypeRepository = activityTypeRepository; + _activityRepository = activityRepository; _mapper = mapper; } #endregion @@ -28,7 +37,7 @@ public async Task Execute(CreateNoticeInput input) "As atividades devem ser informadas."); // Mapeia input para entidade - var entity = new Entities.Notice( + var notice = new Entities.Notice( input.RegistrationStartDate, input.RegistrationEndDate, input.EvaluationStartDate, @@ -48,13 +57,40 @@ public async Task Execute(CreateNoticeInput input) // Salva arquivo no repositório e atualiza atributo DocUrl if (input.File != null) - entity.DocUrl = await _storageFileService.UploadFileAsync(input.File); + notice.DocUrl = await _storageFileService.UploadFileAsync(input.File); - // Cria entidade - entity = await _repository.Create(entity); + // Converte as atividades para entidades antes de prosseguir + // com o cadastro no banco, apenas para fins de validação. + foreach (var activityType in input.Activities!) + { + // Converte atividades para entidades + foreach (var activity in activityType.Activities!) + _ = new Entities.Activity(activity.Name, activity.Points, activity.Limits, Guid.Empty); + + // Converte tipo de atividade para entidade + _ = new Entities.ActivityType(activityType.Name, activityType.Unity, Guid.Empty); + } + + // Cria edital no banco + notice = await _repository.Create(notice); + + // Salva atividades no banco + foreach (var activityType in input.Activities!) + { + // Salva tipo de atividade no banco + var activityTypeEntity = new Entities.ActivityType(activityType.Name, activityType.Unity, notice.Id); + activityTypeEntity = await _activityTypeRepository.Create(activityTypeEntity); + + // Salva atividades no banco + foreach (var activity in activityType.Activities!) + { + var activityEntity = new Entities.Activity(activity.Name, activity.Points, activity.Limits, activityTypeEntity.Id); + await _activityRepository.Create(activityEntity); + } + } // Salva entidade no banco - return _mapper.Map(entity); + return _mapper.Map(notice); } } } \ No newline at end of file diff --git a/src/Domain/UseCases/Notice/UpdateNotice.cs b/src/Domain/UseCases/Notice/UpdateNotice.cs index 576679da..e3dc3f88 100644 --- a/src/Domain/UseCases/Notice/UpdateNotice.cs +++ b/src/Domain/UseCases/Notice/UpdateNotice.cs @@ -13,11 +13,20 @@ public class UpdateNotice : IUpdateNotice #region Global Scope private readonly INoticeRepository _repository; private readonly IStorageFileService _storageFileService; + private readonly IActivityTypeRepository _activityTypeRepository; + private readonly IActivityRepository _activityRepository; private readonly IMapper _mapper; - public UpdateNotice(INoticeRepository repository, IStorageFileService storageFileService, IMapper mapper) + public UpdateNotice( + INoticeRepository repository, + IStorageFileService storageFileService, + IActivityTypeRepository activityTypeRepository, + IActivityRepository activityRepository, + IMapper mapper) { _repository = repository; _storageFileService = storageFileService; + _activityTypeRepository = activityTypeRepository; + _activityRepository = activityRepository; _mapper = mapper; } #endregion @@ -32,7 +41,7 @@ public async Task Execute(Guid? id, UpdateNoticeInput "As atividades devem ser informadas."); // Recupera entidade que será atualizada - var entity = await _repository.GetById(id) + var notice = await _repository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Notice)); // Verifica se a entidade foi excluída @@ -40,20 +49,32 @@ public async Task Execute(Guid? id, UpdateNoticeInput // Salva arquivo no repositório e atualiza atributo DocUrl if (input.File != null) - entity.DocUrl = await _storageFileService.UploadFileAsync(input.File, entity.DocUrl); + notice.DocUrl = await _storageFileService.UploadFileAsync(input.File, notice.DocUrl); // Atualiza atributos permitidos - entity.RegistrationStartDate = input.RegistrationStartDate ?? entity.RegistrationStartDate; - entity.RegistrationEndDate = input.RegistrationEndDate ?? entity.RegistrationEndDate; - entity.EvaluationStartDate = input.EvaluationStartDate ?? entity.EvaluationStartDate; - entity.EvaluationEndDate = input.EvaluationEndDate ?? entity.EvaluationEndDate; - entity.AppealStartDate = input.AppealStartDate ?? entity.AppealStartDate; - entity.AppealEndDate = input.AppealEndDate ?? entity.AppealEndDate; - entity.SendingDocsStartDate = input.SendingDocsStartDate ?? entity.SendingDocsStartDate; - entity.SendingDocsEndDate = input.SendingDocsEndDate ?? entity.SendingDocsEndDate; - entity.PartialReportDeadline = input.PartialReportDeadline ?? entity.PartialReportDeadline; - entity.FinalReportDeadline = input.FinalReportDeadline ?? entity.FinalReportDeadline; - entity.SuspensionYears = input.SuspensionYears ?? entity.SuspensionYears; + notice.RegistrationStartDate = input.RegistrationStartDate ?? notice.RegistrationStartDate; + notice.RegistrationEndDate = input.RegistrationEndDate ?? notice.RegistrationEndDate; + notice.EvaluationStartDate = input.EvaluationStartDate ?? notice.EvaluationStartDate; + notice.EvaluationEndDate = input.EvaluationEndDate ?? notice.EvaluationEndDate; + notice.AppealStartDate = input.AppealStartDate ?? notice.AppealStartDate; + notice.AppealEndDate = input.AppealEndDate ?? notice.AppealEndDate; + notice.SendingDocsStartDate = input.SendingDocsStartDate ?? notice.SendingDocsStartDate; + notice.SendingDocsEndDate = input.SendingDocsEndDate ?? notice.SendingDocsEndDate; + notice.PartialReportDeadline = input.PartialReportDeadline ?? notice.PartialReportDeadline; + notice.FinalReportDeadline = input.FinalReportDeadline ?? notice.FinalReportDeadline; + notice.SuspensionYears = input.SuspensionYears ?? notice.SuspensionYears; + + // Converte as atividades para entidades antes de prosseguir + // com a atualização no banco, apenas para fins de validação. + foreach (var activityType in input.Activities!) + { + // Converte atividades para entidades + foreach (var activity in activityType.Activities!) + _ = new Entities.Activity(activity.Name, activity.Points, activity.Limits, Guid.Empty); + + // Converte tipo de atividade para entidade + _ = new Entities.ActivityType(activityType.Name, activityType.Unity, Guid.Empty); + } // Salva entidade atualizada no banco await _repository.Update(notice); @@ -65,7 +86,7 @@ public async Task Execute(Guid? id, UpdateNoticeInput await HandleActivityType(input.Activities!, noticeActivities, notice.Id); // Retorna entidade atualizada - return _mapper.Map(entity); + return _mapper.Map(notice); } /// diff --git a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs index 1d086c78..bead8dc3 100644 --- a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs +++ b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs @@ -10,6 +10,7 @@ public static IServiceCollection AddAdapters(this IServiceCollection services) { #region PresenterControllers services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -28,6 +29,7 @@ public static IServiceCollection AddAdapters(this IServiceCollection services) #region Gateways Mappers services.AddAutoMapper(typeof(AreaMappings)); + services.AddAutoMapper(typeof(ActivityMappings)); services.AddAutoMapper(typeof(AssistanceTypeMappings)); services.AddAutoMapper(typeof(AuthMappings)); services.AddAutoMapper(typeof(CampusMappings)); diff --git a/src/Infrastructure/IoC/DependencyDomainInjection.cs b/src/Infrastructure/IoC/DependencyDomainInjection.cs index b12739ea..f8805b62 100644 --- a/src/Infrastructure/IoC/DependencyDomainInjection.cs +++ b/src/Infrastructure/IoC/DependencyDomainInjection.cs @@ -1,9 +1,11 @@ using Domain.Interfaces.Services; using Domain.Interfaces.UseCases; +using Domain.Interfaces.UseCases.ActivityType; using Domain.Interfaces.UseCases.Project; using Domain.Interfaces.UseCases.ProjectEvaluation; using Domain.Mappings; using Domain.UseCases; +using Domain.UseCases.ActivityType; using Domain.UseCases.Project; using Domain.UseCases.ProjectEvaluation; using Infrastructure.Services; @@ -31,6 +33,11 @@ public static IServiceCollection AddDomain(this IServiceCollection services) services.AddScoped(); #endregion + #region ActivityType + services.AddScoped(); + services.AddScoped(); + #endregion + #region AssistanceType services.AddScoped(); services.AddScoped(); @@ -149,6 +156,7 @@ public static IServiceCollection AddDomain(this IServiceCollection services) #region Contract Mappers services.AddAutoMapper(typeof(AreaMappings)); + services.AddAutoMapper(typeof(ActivityMappings)); services.AddAutoMapper(typeof(AssistanceTypeMappings)); services.AddAutoMapper(typeof(CampusMappings)); services.AddAutoMapper(typeof(CourseMappings)); diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs index c8c2a0c6..708128df 100644 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ b/src/Infrastructure/IoC/DependencyInjection.cs @@ -58,6 +58,8 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi #region Repositórios services.AddScoped(); + services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs index f141c5dc..53561f44 100644 --- a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs +++ b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs @@ -18,7 +18,8 @@ public class ApplicationDbContext : DbContext public ApplicationDbContext(DbContextOptions options) : base(options) { } public DbSet Areas { get; set; } - public DbSet AssistanceScholarships { get; set; } + public DbSet Activities { get; set; } + public DbSet ActivityTypes { get; set; } public DbSet Campuses { get; set; } public DbSet Courses { get; set; } public DbSet MainAreas { get; set; } diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityTypeConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityTypeConfiguration.cs new file mode 100644 index 00000000..968e873d --- /dev/null +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ActivityTypeConfiguration.cs @@ -0,0 +1,28 @@ +using Domain.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Persistence.EntitiesConfiguration +{ + public class ActivityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("ActivityTypes"); + + builder.HasKey(t => t.Id); + builder.Property(p => p.Id).ValueGeneratedOnAdd(); + + builder.Property(p => p.Name).HasMaxLength(300).IsRequired(); + builder.Property(p => p.Unity).HasMaxLength(300).IsRequired(); + builder.Property(p => p.NoticeId).IsRequired(); + builder.Property(p => p.DeletedAt); + + builder.HasOne(a => a.Notice) + .WithMany() + .HasForeignKey(a => a.NoticeId); + + builder.HasQueryFilter(x => x.DeletedAt == null); + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/EntityBuilder.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/EntityBuilder.cs new file mode 100644 index 00000000..e69de29b diff --git a/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs b/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs new file mode 100644 index 00000000..b70b1c97 --- /dev/null +++ b/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs @@ -0,0 +1,48 @@ +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Infrastructure.Persistence.Context; +using Microsoft.EntityFrameworkCore; + +namespace Infrastructure.Persistence.Repositories +{ + public class ActivityRepository : IActivityRepository + { + private readonly ApplicationDbContext _context; + public ActivityRepository(ApplicationDbContext context) => _context = context; + + public async Task Create(Activity model) + { + _context.Add(model); + await _context.SaveChangesAsync(); + return model; + } + + public async Task> GetAll(int skip, int take) => await _context.Activities + .Skip(skip) + .Take(take) + .AsAsyncEnumerable() + .OrderBy(x => x.Name) + .ToListAsync(); + + public async Task GetById(Guid? id) => + await _context.Activities + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.Id == id); + + public async Task Delete(Guid? id) + { + var model = await GetById(id) + ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); + model.DeactivateEntity(); + return await Update(model); + } + + public async Task Update(Activity model) + { + _context.Update(model); + await _context.SaveChangesAsync(); + return model; + } + } +} \ No newline at end of file From 3ff2d3654866da67cdd00b10d49eb483e3edf4b0 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 24 Jul 2023 10:57:52 -0300 Subject: [PATCH 044/201] fix(webapi): adjust error type in activity controller --- src/Infrastructure/IoC/Utils/DotEnvSecrets.cs | 3 --- .../WebAPI/Controllers/ActivityController.cs | 10 ++++++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs index c85c3a10..11993b09 100644 --- a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs +++ b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs @@ -10,9 +10,6 @@ public DotEnvSecrets() // Carrega informações de ambiente (.env) DotNetEnv.Env.Load(Path.Combine(basePath!, ".env")); - - // Testa se o arquivo .env foi carregado - Console.WriteLine(DotNetEnv.Env.GetString("TESTE")); } public string GetBlobStorageConnectionString() => DotNetEnv.Env.GetString("AZURE_BLOB_STORAGE_CONNECTION_STRING"); diff --git a/src/Infrastructure/WebAPI/Controllers/ActivityController.cs b/src/Infrastructure/WebAPI/Controllers/ActivityController.cs index 754c1203..2cd4414c 100644 --- a/src/Infrastructure/WebAPI/Controllers/ActivityController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ActivityController.cs @@ -1,4 +1,5 @@ using Adapters.Interfaces; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Infrastructure.WebAPI.Controllers @@ -8,6 +9,7 @@ namespace Infrastructure.WebAPI.Controllers /// [ApiController] [Route("api/v1/[controller]")] + [Authorize] public class ActivityController : ControllerBase { private readonly IActivityPresenterController _activityPresenterController; @@ -28,8 +30,10 @@ public ActivityController(IActivityPresenterController activityPresenterControll /// /// Lista de atividades mais recentes. /// Retorna a lista de atividades mais recentes. - /// Erro interno do servidor. + /// Requisição incorreta. [HttpGet] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task GetLastNoticeActivities() { try @@ -51,9 +55,11 @@ public async Task GetLastNoticeActivities() /// Id do edital. /// Lista de atividades. /// Retorna a lista de atividades. - /// Erro interno do servidor. + /// Requisição incorreta. [HttpGet] [Route("notice/{noticeId}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task GetActivitiesByNoticeId(Guid? noticeId) { try From 9a6b5257be790b8104b4bbb93dd0f5b5c5e12d2c Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 24 Jul 2023 22:05:43 -0300 Subject: [PATCH 045/201] fix(entities): change EF constructors --- src/Domain/Entities/AssistanceType.cs | 2 +- src/Domain/Entities/Campus.cs | 2 +- src/Domain/Entities/Course.cs | 2 +- src/Domain/Entities/Notice.cs | 2 +- src/Domain/Entities/ProgramType.cs | 2 +- src/Domain/Entities/Project.cs | 2 +- src/Domain/Entities/Student.cs | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Domain/Entities/AssistanceType.cs b/src/Domain/Entities/AssistanceType.cs index 8a960ea1..1440e0d1 100644 --- a/src/Domain/Entities/AssistanceType.cs +++ b/src/Domain/Entities/AssistanceType.cs @@ -56,6 +56,6 @@ public AssistanceType(Guid? id, string? name, string? description) /// /// Constructor to dbcontext EF instancing. /// - public AssistanceType() { } + protected AssistanceType() { } } } \ No newline at end of file diff --git a/src/Domain/Entities/Campus.cs b/src/Domain/Entities/Campus.cs index ff4d5d28..0744d471 100644 --- a/src/Domain/Entities/Campus.cs +++ b/src/Domain/Entities/Campus.cs @@ -38,6 +38,6 @@ public Campus(Guid? id, string? name) /// /// Constructor to dbcontext EF instancing. /// - public Campus() { } + protected Campus() { } } } \ No newline at end of file diff --git a/src/Domain/Entities/Course.cs b/src/Domain/Entities/Course.cs index d11e3f2c..75395da8 100644 --- a/src/Domain/Entities/Course.cs +++ b/src/Domain/Entities/Course.cs @@ -38,6 +38,6 @@ public Course(Guid? id, string? name) /// /// Constructor to dbcontext EF instancing. /// - public Course() { } + protected Course() { } } } \ No newline at end of file diff --git a/src/Domain/Entities/Notice.cs b/src/Domain/Entities/Notice.cs index 2d3f6cd3..86e6cde9 100644 --- a/src/Domain/Entities/Notice.cs +++ b/src/Domain/Entities/Notice.cs @@ -227,7 +227,7 @@ public Notice(DateTime? registrationStartDate, /// /// Constructor to dbcontext EF instancing. /// - public Notice() { } + protected Notice() { } #endregion } } \ No newline at end of file diff --git a/src/Domain/Entities/ProgramType.cs b/src/Domain/Entities/ProgramType.cs index 466a4e27..07d7a428 100644 --- a/src/Domain/Entities/ProgramType.cs +++ b/src/Domain/Entities/ProgramType.cs @@ -57,6 +57,6 @@ public ProgramType(Guid? id, string name, string description) /// /// Constructor to dbcontext EF instancing. /// - public ProgramType() { } + protected ProgramType() { } } } \ No newline at end of file diff --git a/src/Domain/Entities/Project.cs b/src/Domain/Entities/Project.cs index eece2cd9..e97d38be 100644 --- a/src/Domain/Entities/Project.cs +++ b/src/Domain/Entities/Project.cs @@ -595,7 +595,7 @@ public Project(string title, string keyWord1, string keyWord2, string keyWord3, /// /// Constructor to dbcontext EF instancing. /// - public Project() { } + protected Project() { } #endregion } } \ No newline at end of file diff --git a/src/Domain/Entities/Student.cs b/src/Domain/Entities/Student.cs index db24e5d7..84f8cdb6 100644 --- a/src/Domain/Entities/Student.cs +++ b/src/Domain/Entities/Student.cs @@ -368,7 +368,7 @@ public Student( /// /// Constructor to dbcontext EF instancing. /// - public Student() { } + protected Student() { } #endregion } } \ No newline at end of file From d757dac09f9e8a8d58c4bb25f8a8c21173ec16ff Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 24 Jul 2023 22:06:14 -0300 Subject: [PATCH 046/201] feat(entities): add ProjectActivity --- src/Domain/Entities/ProjectActivity.cs | 85 ++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/Domain/Entities/ProjectActivity.cs diff --git a/src/Domain/Entities/ProjectActivity.cs b/src/Domain/Entities/ProjectActivity.cs new file mode 100644 index 00000000..ac1bd32f --- /dev/null +++ b/src/Domain/Entities/ProjectActivity.cs @@ -0,0 +1,85 @@ +using System.Diagnostics; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Domain.Entities.Primitives; +using Domain.Validation; + +namespace Domain.Entities +{ + public class ProjectActivity : Entity + { + #region Properties + private Guid? _projectId; + public Guid? ProjectId + { + get => _projectId; + set + { + { + EntityExceptionValidation.When(value == null, + ExceptionMessageFactory.Required(nameof(ProjectId))); + _projectId = value; + } + } + } + + private Guid? _activityId; + public Guid? ActivityId + { + get => _activityId; + set + { + { + EntityExceptionValidation.When(value == null, + ExceptionMessageFactory.Required(nameof(ActivityId))); + _activityId = value; + } + } + } + + private int? _informedActivities; + public int? InformedActivities + { + get => _informedActivities; + set + { + { + EntityExceptionValidation.When(value == null, + ExceptionMessageFactory.Required(nameof(InformedActivities))); + _informedActivities = value; + } + } + } + private int? _foundActivities; + public int? FoundActivities + { + get => _foundActivities; + set + { + { + EntityExceptionValidation.When(value == null, + ExceptionMessageFactory.Required(nameof(FoundActivities))); + _foundActivities = value; + } + } + } + #endregion + + #region Constructors + public ProjectActivity(Guid? projectId, Guid? activityId, int? informedActivities, int? foundActivities) + { + ProjectId = projectId; + ActivityId = activityId; + InformedActivities = informedActivities; + FoundActivities = foundActivities; + } + + /// + /// Constructor to dbcontext EF instancing. + /// + protected ProjectActivity() { } + #endregion + } +} \ No newline at end of file From e230ab7d499a86484c191c0ae1a7992122cfb593 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 24 Jul 2023 22:12:51 -0300 Subject: [PATCH 047/201] feat(proj-activity): add contracts and repository interface --- .../BaseProjectActivityContract.cs | 12 +++++ .../CreateProjectActivityInput.cs | 10 +++++ .../DetailedReadProjectActivityOutput.cs | 10 +++++ .../ResumedReadProjectActivityOutput.cs | 9 ++++ .../UpdateProjectActivityInput.cs | 8 ++++ src/Domain/Entities/ProjectActivity.cs | 45 ++++++++++--------- .../IProjectActivityRepository.cs | 5 +++ 7 files changed, 78 insertions(+), 21 deletions(-) create mode 100644 src/Domain/Contracts/ProjectActivity/BaseProjectActivityContract.cs create mode 100644 src/Domain/Contracts/ProjectActivity/CreateProjectActivityInput.cs create mode 100644 src/Domain/Contracts/ProjectActivity/DetailedReadProjectActivityOutput.cs create mode 100644 src/Domain/Contracts/ProjectActivity/ResumedReadProjectActivityOutput.cs create mode 100644 src/Domain/Contracts/ProjectActivity/UpdateProjectActivityInput.cs create mode 100644 src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs diff --git a/src/Domain/Contracts/ProjectActivity/BaseProjectActivityContract.cs b/src/Domain/Contracts/ProjectActivity/BaseProjectActivityContract.cs new file mode 100644 index 00000000..c519ff11 --- /dev/null +++ b/src/Domain/Contracts/ProjectActivity/BaseProjectActivityContract.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.Contracts.ProjectActivity +{ + public abstract class BaseProjectActivityContract + { + [Required] + public Guid? ProjectId { get; set; } + [Required] + public Guid? ActivityId { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/CreateProjectActivityInput.cs b/src/Domain/Contracts/ProjectActivity/CreateProjectActivityInput.cs new file mode 100644 index 00000000..00d96d97 --- /dev/null +++ b/src/Domain/Contracts/ProjectActivity/CreateProjectActivityInput.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.Contracts.ProjectActivity +{ + public class CreateProjectActivityInput : BaseProjectActivityContract + { + [Required] + public int? InformedActivities { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/DetailedReadProjectActivityOutput.cs b/src/Domain/Contracts/ProjectActivity/DetailedReadProjectActivityOutput.cs new file mode 100644 index 00000000..f6f9d400 --- /dev/null +++ b/src/Domain/Contracts/ProjectActivity/DetailedReadProjectActivityOutput.cs @@ -0,0 +1,10 @@ +namespace Domain.Contracts.ProjectActivity +{ + public class DetailedReadProjectActivityOutput : BaseProjectActivityContract + { + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } + public int? InformedActivities { get; set; } + public int? FoundActivities { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/ResumedReadProjectActivityOutput.cs b/src/Domain/Contracts/ProjectActivity/ResumedReadProjectActivityOutput.cs new file mode 100644 index 00000000..b706d91e --- /dev/null +++ b/src/Domain/Contracts/ProjectActivity/ResumedReadProjectActivityOutput.cs @@ -0,0 +1,9 @@ +namespace Domain.Contracts.ProjectActivity +{ + public class ResumedReadProjectActivityOutput : BaseProjectActivityContract + { + public Guid? Id { get; set; } + public int? InformedActivities { get; set; } + public int? FoundActivities { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/UpdateProjectActivityInput.cs b/src/Domain/Contracts/ProjectActivity/UpdateProjectActivityInput.cs new file mode 100644 index 00000000..86539133 --- /dev/null +++ b/src/Domain/Contracts/ProjectActivity/UpdateProjectActivityInput.cs @@ -0,0 +1,8 @@ +namespace Domain.Contracts.ProjectActivity +{ + public class UpdateProjectActivityInput : BaseProjectActivityContract + { + public int? InformedActivities { get; set; } + public int? FoundActivities { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/Entities/ProjectActivity.cs b/src/Domain/Entities/ProjectActivity.cs index ac1bd32f..fa6ef43a 100644 --- a/src/Domain/Entities/ProjectActivity.cs +++ b/src/Domain/Entities/ProjectActivity.cs @@ -11,60 +11,63 @@ namespace Domain.Entities public class ProjectActivity : Entity { #region Properties - private Guid? _projectId; - public Guid? ProjectId + private int? _informedActivities; + public int? InformedActivities { - get => _projectId; + get => _informedActivities; set { { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(ProjectId))); - _projectId = value; + ExceptionMessageFactory.Required(nameof(InformedActivities))); + _informedActivities = value; } } } - - private Guid? _activityId; - public Guid? ActivityId + private int? _foundActivities; + public int? FoundActivities { - get => _activityId; + get => _foundActivities; set { { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(ActivityId))); - _activityId = value; + ExceptionMessageFactory.Required(nameof(FoundActivities))); + _foundActivities = value; } } } - private int? _informedActivities; - public int? InformedActivities + private Guid? _projectId; + public Guid? ProjectId { - get => _informedActivities; + get => _projectId; set { { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(InformedActivities))); - _informedActivities = value; + ExceptionMessageFactory.Required(nameof(ProjectId))); + _projectId = value; } } } - private int? _foundActivities; - public int? FoundActivities + + private Guid? _activityId; + public Guid? ActivityId { - get => _foundActivities; + get => _activityId; set { { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(FoundActivities))); - _foundActivities = value; + ExceptionMessageFactory.Required(nameof(ActivityId))); + _activityId = value; } } } + + public virtual Project? Project { get; set; } + public virtual Activity? Activity { get; set; } #endregion #region Constructors diff --git a/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs b/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs new file mode 100644 index 00000000..7c75b032 --- /dev/null +++ b/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs @@ -0,0 +1,5 @@ +using Domain.Entities; +using Domain.Interfaces.Repositories.Bases; + +namespace Domain.Interfaces.Repositories; +public interface IProjectActivityRepository : IGenericCRUDRepository { } \ No newline at end of file From 418862c312e1b1b0d2fc34eb13fc4d31ec50273c Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 24 Jul 2023 22:35:22 -0300 Subject: [PATCH 048/201] fix(entities): remove evaluation fields from project --- .../Contracts/Project/BaseProjectContract.cs | 26 -- .../Contracts/Project/OpenProjectInput.cs | 27 -- .../Contracts/Project/UpdateProjectInput.cs | 26 -- .../DetailedReadProjectEvaluationOutput.cs | 26 -- .../EvaluateSubmissionProjectInput.cs | 26 -- src/Domain/Entities/Project.cs | 312 +----------------- src/Domain/Entities/ProjectEvaluation.cs | 223 +------------ src/Domain/UseCases/Project/AppealProject.cs | 2 +- .../UseCases/Project/GetClosedProjects.cs | 4 +- .../UseCases/Project/GetOpenProjects.cs | 4 +- src/Domain/UseCases/Project/OpenProject.cs | 41 ++- src/Domain/UseCases/Project/SubmitProject.cs | 25 +- src/Domain/UseCases/Project/UpdateProject.cs | 21 +- .../EvaluateAppealProject.cs | 8 +- .../EvaluateSubmissionProject.cs | 28 +- 15 files changed, 63 insertions(+), 736 deletions(-) diff --git a/src/Domain/Contracts/Project/BaseProjectContract.cs b/src/Domain/Contracts/Project/BaseProjectContract.cs index 3ad5cfb0..4de0daf0 100644 --- a/src/Domain/Contracts/Project/BaseProjectContract.cs +++ b/src/Domain/Contracts/Project/BaseProjectContract.cs @@ -14,32 +14,6 @@ public abstract class BaseProjectContract public string? ActivitiesExecutionSchedule { get; set; } #endregion - #region Produção Científica - Trabalhos Publicados - public int? WorkType1 { get; set; } - public int? WorkType2 { get; set; } - public int? IndexedConferenceProceedings { get; set; } - public int? NotIndexedConferenceProceedings { get; set; } - public int? CompletedBook { get; set; } - public int? OrganizedBook { get; set; } - public int? BookChapters { get; set; } - public int? BookTranslations { get; set; } - public int? ParticipationEditorialCommittees { get; set; } - #endregion - - #region Produção Artístca e Cultural - Produção Apresentada - public int? FullComposerSoloOrchestraAllTracks { get; set; } - public int? FullComposerSoloOrchestraCompilation { get; set; } - public int? ChamberOrchestraInterpretation { get; set; } - public int? IndividualAndCollectiveArtPerformances { get; set; } - public int? ScientificCulturalArtisticCollectionsCuratorship { get; set; } - #endregion - - #region Produção Técnica - Produtos Registrados - public int? PatentLetter { get; set; } - public int? PatentDeposit { get; set; } - public int? SoftwareRegistration { get; set; } - #endregion - #region Resultados da Avaliação public int? Status { get; set; } public string? StatusDescription { get; set; } diff --git a/src/Domain/Contracts/Project/OpenProjectInput.cs b/src/Domain/Contracts/Project/OpenProjectInput.cs index 00a38935..4d54b0a9 100644 --- a/src/Domain/Contracts/Project/OpenProjectInput.cs +++ b/src/Domain/Contracts/Project/OpenProjectInput.cs @@ -8,39 +8,12 @@ public class OpenProjectInput public string? KeyWord2 { get; set; } public string? KeyWord3 { get; set; } public bool IsScholarshipCandidate { get; set; } - // public bool IsProductivityFellow { get; set; } // Manter? public string? Objective { get; set; } public string? Methodology { get; set; } public string? ExpectedResults { get; set; } public string? ActivitiesExecutionSchedule { get; set; } #endregion - #region Produção Científica - Trabalhos Publicados - public int? WorkType1 { get; set; } - public int? WorkType2 { get; set; } - public int? IndexedConferenceProceedings { get; set; } - public int? NotIndexedConferenceProceedings { get; set; } - public int? CompletedBook { get; set; } - public int? OrganizedBook { get; set; } - public int? BookChapters { get; set; } - public int? BookTranslations { get; set; } - public int? ParticipationEditorialCommittees { get; set; } - #endregion - - #region Produção Artístca e Cultural - Produção Apresentada - public int? FullComposerSoloOrchestraAllTracks { get; set; } - public int? FullComposerSoloOrchestraCompilation { get; set; } - public int? ChamberOrchestraInterpretation { get; set; } - public int? IndividualAndCollectiveArtPerformances { get; set; } - public int? ScientificCulturalArtisticCollectionsCuratorship { get; set; } - #endregion - - #region Produção Técnica - Produtos Registrados - public int? PatentLetter { get; set; } - public int? PatentDeposit { get; set; } - public int? SoftwareRegistration { get; set; } - #endregion - #region Relacionamentos public Guid? ProgramTypeId { get; set; } public Guid? ProfessorId { get; set; } diff --git a/src/Domain/Contracts/Project/UpdateProjectInput.cs b/src/Domain/Contracts/Project/UpdateProjectInput.cs index fe5fed83..d4e50fd5 100644 --- a/src/Domain/Contracts/Project/UpdateProjectInput.cs +++ b/src/Domain/Contracts/Project/UpdateProjectInput.cs @@ -15,32 +15,6 @@ public class UpdateProjectInput public string? ActivitiesExecutionSchedule { get; set; } #endregion - #region Produção Científica - Trabalhos Publicados - public int? WorkType1 { get; set; } - public int? WorkType2 { get; set; } - public int? IndexedConferenceProceedings { get; set; } - public int? NotIndexedConferenceProceedings { get; set; } - public int? CompletedBook { get; set; } - public int? OrganizedBook { get; set; } - public int? BookChapters { get; set; } - public int? BookTranslations { get; set; } - public int? ParticipationEditorialCommittees { get; set; } - #endregion - - #region Produção Artístca e Cultural - Produção Apresentada - public int? FullComposerSoloOrchestraAllTracks { get; set; } - public int? FullComposerSoloOrchestraCompilation { get; set; } - public int? ChamberOrchestraInterpretation { get; set; } - public int? IndividualAndCollectiveArtPerformances { get; set; } - public int? ScientificCulturalArtisticCollectionsCuratorship { get; set; } - #endregion - - #region Produção Técnica - Produtos Registrados - public int? PatentLetter { get; set; } - public int? PatentDeposit { get; set; } - public int? SoftwareRegistration { get; set; } - #endregion - #region Relacionamentos public Guid? ProgramTypeId { get; set; } public Guid? StudentId { get; set; } diff --git a/src/Domain/Contracts/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs b/src/Domain/Contracts/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs index 1ccef820..d4a83029 100644 --- a/src/Domain/Contracts/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs +++ b/src/Domain/Contracts/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs @@ -14,32 +14,6 @@ public class DetailedReadProjectEvaluationOutput public string? AppealEvaluationDescription { get; set; } #endregion - #region (Resultados) Produção Científica - Trabalhos Publicados - public int? FoundWorkType1 { get; set; } - public int? FoundWorkType2 { get; set; } - public int? FoundIndexedConferenceProceedings { get; set; } - public int? FoundNotIndexedConferenceProceedings { get; set; } - public int? FoundCompletedBook { get; set; } - public int? FoundOrganizedBook { get; set; } - public int? FoundBookChapters { get; set; } - public int? FoundBookTranslations { get; set; } - public int? FoundParticipationEditorialCommittees { get; set; } - #endregion - - #region (Resultados) Produção Artístca e Cultural - Produção Apresentada - public int? FoundFullComposerSoloOrchestraAllTracks { get; set; } - public int? FoundFullComposerSoloOrchestraCompilation { get; set; } - public int? FoundChamberOrchestraInterpretation { get; set; } - public int? FoundIndividualAndCollectiveArtPerformances { get; set; } - public int? FoundScientificCulturalArtisticCollectionsCuratorship { get; set; } - #endregion - - #region (Resultados) Produção Técnica - Produtos Registrados - public int? FoundPatentLetter { get; set; } - public int? FoundPatentDeposit { get; set; } - public int? FoundSoftwareRegistration { get; set; } - #endregion - #region Critérios de Avaliação public int? APIndex { get; set; } public int? Qualification { get; set; } diff --git a/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs b/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs index 437062cc..151734b6 100644 --- a/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs +++ b/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs @@ -8,32 +8,6 @@ public class EvaluateSubmissionProjectInput public string? SubmissionEvaluationDescription { get; set; } #endregion - #region (Resultados) Produção Científica - Trabalhos Publicados - public int? FoundWorkType1 { get; set; } - public int? FoundWorkType2 { get; set; } - public int? FoundIndexedConferenceProceedings { get; set; } - public int? FoundNotIndexedConferenceProceedings { get; set; } - public int? FoundCompletedBook { get; set; } - public int? FoundOrganizedBook { get; set; } - public int? FoundBookChapters { get; set; } - public int? FoundBookTranslations { get; set; } - public int? FoundParticipationEditorialCommittees { get; set; } - #endregion - - #region (Resultados) Produção Artístca e Cultural - Produção Apresentada - public int? FoundFullComposerSoloOrchestraAllTracks { get; set; } - public int? FoundFullComposerSoloOrchestraCompilation { get; set; } - public int? FoundChamberOrchestraInterpretation { get; set; } - public int? FoundIndividualAndCollectiveArtPerformances { get; set; } - public int? FoundScientificCulturalArtisticCollectionsCuratorship { get; set; } - #endregion - - #region (Resultados) Produção Técnica - Produtos Registrados - public int? FoundPatentLetter { get; set; } - public int? FoundPatentDeposit { get; set; } - public int? FoundSoftwareRegistration { get; set; } - #endregion - #region Critérios de Avaliação public int? Qualification { get; set; } public int? ProjectProposalObjectives { get; set; } diff --git a/src/Domain/Entities/Project.cs b/src/Domain/Entities/Project.cs index e97d38be..2787c270 100644 --- a/src/Domain/Entities/Project.cs +++ b/src/Domain/Entities/Project.cs @@ -140,284 +140,6 @@ public string? ActivitiesExecutionSchedule } #endregion - #region Produção Científica - Trabalhos Publicados - private int? _workType1; - /// - /// Periódicos indexados nas bases do tipo 1 ou constantes na base QUALIS do estrato superior (A1, A2 e B1) (1). - /// - public int? WorkType1 - { - get => _workType1; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _workType1 = value; - } - } - - private int? _workType2; - /// - /// Periódicos indexados nas bases do tipo 2 ou constantes na base QUALIS do estrato inferior (B2, B3, B4, B5) (2). - /// - public int? WorkType2 - { - get => _workType2; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _workType2 = value; - } - } - - private int? _indexedConferenceProceedings; - /// - /// Anais de Congressos indexados (3a). - /// - public int? IndexedConferenceProceedings - { - get => _indexedConferenceProceedings; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _indexedConferenceProceedings = value; - } - } - - private int? _notIndexedConferenceProceedings; - /// - /// Anais de Congressos não indexados (3b). - /// - public int? NotIndexedConferenceProceedings - { - get => _notIndexedConferenceProceedings; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _notIndexedConferenceProceedings = value; - } - } - - private int? _completedBook; - /// - /// Livros - Completos - /// - public int? CompletedBook - { - get => _completedBook; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _completedBook = value; - } - } - - private int? _organizedBook; - /// - /// Livros - Organizados - /// - public int? OrganizedBook - { - get => _organizedBook; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _organizedBook = value; - } - } - - private int? _bookChapters; - /// - /// Livros - Capítulos - /// - public int? BookChapters - { - get => _bookChapters; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _bookChapters = value; - } - } - - private int? _bookTranslations; - /// - /// Livros - Tradução - /// - public int? BookTranslations - { - get => _bookTranslations; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _bookTranslations = value; - } - } - - private int? _participationEditorialCommittees; - /// - /// Participação em comissão editorial de editoras e instituições acadêmicas. - /// - public int? ParticipationEditorialCommittees - { - get => _participationEditorialCommittees; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _participationEditorialCommittees = value; - } - } - #endregion - - #region Produção Artístca e Cultural - Produção Apresentada - private int? _fullComposerSoloOrchestraAllTracks; - /// - /// Autoria ou coautoria de CD ou DVD publicado como compositor ou intérprete principal (solo, duo ou regência) em todas as faixas. - /// - public int? FullComposerSoloOrchestraAllTracks - { - get => _fullComposerSoloOrchestraAllTracks; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _fullComposerSoloOrchestraAllTracks = value; - } - } - - private int? _fullComposerSoloOrchestraCompilation; - /// - /// Autoria ou coautoria de CD ou DVD publicado como compositor ou intérprete principal (solo, duo ou regência) em coletânea (sem participação em todas as faixas). - /// - public int? FullComposerSoloOrchestraCompilation - { - get => _fullComposerSoloOrchestraCompilation; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _fullComposerSoloOrchestraCompilation = value; - } - } - - private int? _chamberOrchestraInterpretation; - /// - /// Participação em CD ou DVD como intérprete em grupo de câmara ou orquestra. - /// - public int? ChamberOrchestraInterpretation - { - get => _chamberOrchestraInterpretation; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _chamberOrchestraInterpretation = value; - } - } - - private int? _individualAndCollectiveArtPerformances; - /// - /// Apresentações individuais e coletivas no campo das artes. - /// - public int? IndividualAndCollectiveArtPerformances - { - get => _individualAndCollectiveArtPerformances; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _individualAndCollectiveArtPerformances = value; - } - } - - private int? _scientificCulturalArtisticCollectionsCuratorship; - /// - /// Curadoria de coleções ou exposições científicas, culturais e artísticas. - /// - public int? ScientificCulturalArtisticCollectionsCuratorship - { - get => _scientificCulturalArtisticCollectionsCuratorship; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _scientificCulturalArtisticCollectionsCuratorship = value; - } - } - #endregion - - #region Produção Técnica - Produtos Registrados - private int? _patentLetter; - /// - /// Carta patente com titularidade do CEFET/RJ. - /// - public int? PatentLetter - { - get => _patentLetter; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _patentLetter = value; - } - } - - private int? _patentDeposit; - /// - /// Depósito de patente com titularidade do CEFET/RJ. - /// - public int? PatentDeposit - { - get => _patentDeposit; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _patentDeposit = value; - } - } - - private int? _softwareRegistration; - /// - /// Registro de Software. - /// - public int? SoftwareRegistration - { - get => _softwareRegistration; - set - { - value ??= 0; - EntityExceptionValidation.When(value < 0, - ExceptionMessageFactory.Invalid(nameof(value))); - _softwareRegistration = value; - } - } - #endregion - #region Relacionamentos public Guid? StudentId; @@ -482,6 +204,7 @@ private set public virtual Student? Student { get; } public virtual SubArea? SubArea { get; } public virtual Notice? Notice { get; } + public virtual IList? ProjectActivities { get; } #endregion #region Informações de Controle @@ -538,18 +261,12 @@ public DateTime? CancellationDate #endregion #region Constructors - public Project(string title, string keyWord1, string keyWord2, string keyWord3, bool isScholarshipCandidate, - string objective, string methodology, string expectedResults, string activitiesExecutionSchedule, - int? workType1, int? workType2, int? indexedConferenceProceedings, int? notIndexedConferenceProceedings, - int? completedBook, int? organizedBook, int? bookChapters, int? bookTranslations, - int? participationEditorialCommittees, int? fullComposerSoloOrchestraAllTracks, - int? fullComposerSoloOrchestraCompilation, int? chamberOrchestraInterpretation, - int? individualAndCollectiveArtPerformances, int? scientificCulturalArtisticCollectionsCuratorship, - int? patentLetter, int? patentDeposit, int? softwareRegistration, - Guid studentId, Guid programTypeId, Guid professorId, Guid subAreaId, Guid noticeId, - EProjectStatus? status, string statusDescription, string appealDescription, + public Project(string? title, string? keyWord1, string? keyWord2, string? keyWord3, bool isScholarshipCandidate, + string? objective, string? methodology, string? expectedResults, string? activitiesExecutionSchedule, + Guid? studentId, Guid? programTypeId, Guid? professorId, Guid? subAreaId, Guid? noticeId, + EProjectStatus? status, string? statusDescription, string? appealDescription, DateTime? submitionDate, DateTime? ressubmissionDate, DateTime? cancellationDate, - string cancellationReason) + string? cancellationReason) { // Inicializar as propriedades Title = title; @@ -561,23 +278,6 @@ public Project(string title, string keyWord1, string keyWord2, string keyWord3, Methodology = methodology; ExpectedResults = expectedResults; ActivitiesExecutionSchedule = activitiesExecutionSchedule; - WorkType1 = workType1; - WorkType2 = workType2; - IndexedConferenceProceedings = indexedConferenceProceedings; - NotIndexedConferenceProceedings = notIndexedConferenceProceedings; - CompletedBook = completedBook; - OrganizedBook = organizedBook; - BookChapters = bookChapters; - BookTranslations = bookTranslations; - ParticipationEditorialCommittees = participationEditorialCommittees; - FullComposerSoloOrchestraAllTracks = fullComposerSoloOrchestraAllTracks; - FullComposerSoloOrchestraCompilation = fullComposerSoloOrchestraCompilation; - ChamberOrchestraInterpretation = chamberOrchestraInterpretation; - IndividualAndCollectiveArtPerformances = individualAndCollectiveArtPerformances; - ScientificCulturalArtisticCollectionsCuratorship = scientificCulturalArtisticCollectionsCuratorship; - PatentLetter = patentLetter; - PatentDeposit = patentDeposit; - SoftwareRegistration = softwareRegistration; StudentId = studentId; ProgramTypeId = programTypeId; ProfessorId = professorId; diff --git a/src/Domain/Entities/ProjectEvaluation.cs b/src/Domain/Entities/ProjectEvaluation.cs index dc149402..82ef0eb2 100644 --- a/src/Domain/Entities/ProjectEvaluation.cs +++ b/src/Domain/Entities/ProjectEvaluation.cs @@ -147,146 +147,6 @@ public DateTime? DocumentsEvaluationDate public virtual User? DocumentsEvaluator { get; } #endregion Informações Gerais da Avaliação - #region (Resultados) Produção Científica - Trabalhos Publicados - public int? FoundWorkType1 - { - get => FoundWorkType1; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundWorkType1))); - } - - public int? FoundWorkType2 - { - get => FoundWorkType2; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundWorkType2))); - } - - public int? FoundIndexedConferenceProceedings - { - get => FoundIndexedConferenceProceedings; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundIndexedConferenceProceedings))); - } - - public int? FoundNotIndexedConferenceProceedings - { - get => FoundNotIndexedConferenceProceedings; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundNotIndexedConferenceProceedings))); - } - - public int? FoundCompletedBook - { - get => FoundCompletedBook; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundCompletedBook))); - } - - public int? FoundOrganizedBook - { - get => FoundOrganizedBook; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundOrganizedBook))); - } - - public int? FoundBookChapters - { - get => FoundBookChapters; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundBookChapters))); - } - - public int? FoundBookTranslations - { - get => FoundBookTranslations; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundBookTranslations))); - } - - public int? FoundParticipationEditorialCommittees - { - get => FoundParticipationEditorialCommittees; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundParticipationEditorialCommittees))); - } - #endregion - - #region (Resultados) Produção Artístca e Cultural - Produção Apresentada - /// - /// Autoria ou coautoria de CD ou DVD publicado como compositor ou intérprete principal (solo, duo ou regência) em todas as faixas. - /// - public int? FoundFullComposerSoloOrchestraAllTracks - { - get => FoundFullComposerSoloOrchestraAllTracks; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundFullComposerSoloOrchestraAllTracks))); - } - - /// - /// Autoria ou coautoria de CD ou DVD publicado como compositor ou intérprete principal (solo, duo ou regência) em coletânea (sem participação em todas as faixas). - /// - public int? FoundFullComposerSoloOrchestraCompilation - { - get => FoundFullComposerSoloOrchestraCompilation; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundFullComposerSoloOrchestraCompilation))); - } - - /// - /// Participação em CD ou DVD como intérprete em grupo de câmara ou orquestra. - /// - public int? FoundChamberOrchestraInterpretation - { - get => FoundChamberOrchestraInterpretation; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundChamberOrchestraInterpretation))); - } - - /// - /// Apresentações individuais e coletivas no campo das artes. - /// - public int? FoundIndividualAndCollectiveArtPerformances - { - get => FoundIndividualAndCollectiveArtPerformances; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundIndividualAndCollectiveArtPerformances))); - } - - /// - /// Curadoria de coleções ou exposições científicas, culturais e artísticas. - /// - public int? FoundScientificCulturalArtisticCollectionsCuratorship - { - get => FoundScientificCulturalArtisticCollectionsCuratorship; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundScientificCulturalArtisticCollectionsCuratorship))); - } - #endregion - - #region (Resultados) Produção Técnica - Produtos Registrados - public int? FoundPatentLetter - { - get => FoundPatentLetter; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundPatentLetter))); - } - - public int? FoundPatentDeposit - { - get => FoundPatentDeposit; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundPatentDeposit))); - } - - public int? FoundSoftwareRegistration - { - get => FoundSoftwareRegistration; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(FoundSoftwareRegistration))); - } - #endregion - #region Critérios de Avaliação /// /// Pontuação Total (Índice AP). @@ -362,28 +222,12 @@ public ProjectEvaluation(Guid? projectId, EProjectStatus? submissionEvaluationStatus, DateTime? submissionEvaluationDate, string? submissionEvaluationDescription, - int? foundWorkType1, - int? foundWorkType2, - int? foundIndexedConferenceProceedings, - int? foundNotIndexedConferenceProceedings, - int? foundCompletedBook, - int? foundOrganizedBook, - int? foundBookChapters, - int? foundBookTranslations, - int? foundParticipationEditorialCommittees, - int? foundFullComposerSoloOrchestraAllTracks, - int? foundFullComposerSoloOrchestraCompilation, - int? foundChamberOrchestraInterpretation, - int? foundIndividualAndCollectiveArtPerformances, - int? foundScientificCulturalArtisticCollectionsCuratorship, - int? foundPatentLetter, - int? foundPatentDeposit, - int? foundSoftwareRegistration, EQualification? qualification, EScore? projectProposalObjectives, EScore? academicScientificProductionCoherence, EScore? proposalMethodologyAdaptation, - EScore? effectiveContributionToResearch) + EScore? effectiveContributionToResearch, + double apIndex) { ProjectId = projectId; IsProductivityFellow = isProductivityFellow; @@ -391,74 +235,13 @@ public ProjectEvaluation(Guid? projectId, SubmissionEvaluationStatus = submissionEvaluationStatus; SubmissionEvaluationDate = submissionEvaluationDate; SubmissionEvaluationDescription = submissionEvaluationDescription; - FoundWorkType1 = foundWorkType1; - FoundWorkType2 = foundWorkType2; - FoundIndexedConferenceProceedings = foundIndexedConferenceProceedings; - FoundNotIndexedConferenceProceedings = foundNotIndexedConferenceProceedings; - FoundCompletedBook = foundCompletedBook; - FoundOrganizedBook = foundOrganizedBook; - FoundBookChapters = foundBookChapters; - FoundBookTranslations = foundBookTranslations; - FoundParticipationEditorialCommittees = foundParticipationEditorialCommittees; - FoundFullComposerSoloOrchestraAllTracks = foundFullComposerSoloOrchestraAllTracks; - FoundFullComposerSoloOrchestraCompilation = foundFullComposerSoloOrchestraCompilation; - FoundChamberOrchestraInterpretation = foundChamberOrchestraInterpretation; - FoundIndividualAndCollectiveArtPerformances = foundIndividualAndCollectiveArtPerformances; - FoundScientificCulturalArtisticCollectionsCuratorship = foundScientificCulturalArtisticCollectionsCuratorship; - FoundPatentLetter = foundPatentLetter; - FoundPatentDeposit = foundPatentDeposit; - FoundSoftwareRegistration = foundSoftwareRegistration; Qualification = qualification; ProjectProposalObjectives = projectProposalObjectives; AcademicScientificProductionCoherence = academicScientificProductionCoherence; ProposalMethodologyAdaptation = proposalMethodologyAdaptation; EffectiveContributionToResearch = effectiveContributionToResearch; - CalculateAPIndex(); + APIndex = apIndex; } #endregion - - /// - /// Multiplica o valor pela pontuação e retorna o valor ou o limite, o que for menor. - /// - /// Valor - /// Limite - /// Pontuação - /// Valor multiplicado - private static double MultiplyValue(int? value, int? limit, double points) - { - if (!value.HasValue) return 0; - var total = value.Value * points; - return total > limit ? limit.Value : total; - } - - /// - /// Pontuação das Atividades (Índice AP) Edital PIBIC. - /// - private void CalculateAPIndex() - { - APIndex = 0; - - // Produção Científica - Trabalhos Publicados - APIndex += MultiplyValue(FoundWorkType1, null, 10); - APIndex += MultiplyValue(FoundWorkType2, 20, 4); - APIndex += MultiplyValue(FoundIndexedConferenceProceedings, 12, 3); - APIndex += MultiplyValue(FoundNotIndexedConferenceProceedings, 12, 2); - APIndex += MultiplyValue(FoundCompletedBook, null, 8); - APIndex += MultiplyValue(FoundOrganizedBook, 12, 2); - APIndex += MultiplyValue(FoundBookChapters, 12, 2); - APIndex += MultiplyValue(FoundBookTranslations, 12, 2); - APIndex += MultiplyValue(FoundParticipationEditorialCommittees, 1, 0.25); - - // Produção Artístca e Cultural - Produção Apresentada - APIndex += MultiplyValue(FoundFullComposerSoloOrchestraAllTracks, null, 8); - APIndex += MultiplyValue(FoundChamberOrchestraInterpretation, 12, 2); - APIndex += MultiplyValue(FoundIndividualAndCollectiveArtPerformances, 12, 2); - APIndex += MultiplyValue(FoundScientificCulturalArtisticCollectionsCuratorship, 6, 2); - - // Produção Técnica - Produtos Registrados - APIndex += MultiplyValue(FoundPatentLetter, null, 10); - APIndex += MultiplyValue(FoundPatentDeposit, null, 5); - APIndex += MultiplyValue(FoundSoftwareRegistration, null, 0.5); - } } } \ No newline at end of file diff --git a/src/Domain/UseCases/Project/AppealProject.cs b/src/Domain/UseCases/Project/AppealProject.cs index f22c63db..16314eff 100644 --- a/src/Domain/UseCases/Project/AppealProject.cs +++ b/src/Domain/UseCases/Project/AppealProject.cs @@ -55,7 +55,7 @@ public async Task Execute(Guid? projectId, string? app } else { - throw UseCaseException.BusinessRuleViolation("The project is not at a stage that allows appeal."); + throw UseCaseException.BusinessRuleViolation("O projeto não está em uma fase que permita recurso."); } } } diff --git a/src/Domain/UseCases/Project/GetClosedProjects.cs b/src/Domain/UseCases/Project/GetClosedProjects.cs index ce6cd87f..4b30208f 100644 --- a/src/Domain/UseCases/Project/GetClosedProjects.cs +++ b/src/Domain/UseCases/Project/GetClosedProjects.cs @@ -31,7 +31,7 @@ public async Task> Execute(int skip, int take, b // Se o usuário não estiver autenticado, lança uma exceção. UseCaseException.BusinessRuleViolation(userClaims == null || userClaims.Role == null, - "Not authorized user."); + "Usuário não autorizado."); // Obtém o tipo de usuário. var userRole = Enum.Parse(userClaims?.Role!); @@ -57,7 +57,7 @@ public async Task> Execute(int skip, int take, b // Se o usuário não for nenhum dos tipos acima, lança uma exceção. else - throw UseCaseException.BusinessRuleViolation("Not authorized user."); + throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); // Mapeia a lista de projetos para uma lista de projetos resumidos e retorna. return _mapper.Map>(projects); diff --git a/src/Domain/UseCases/Project/GetOpenProjects.cs b/src/Domain/UseCases/Project/GetOpenProjects.cs index c9d504ed..d76e2e24 100644 --- a/src/Domain/UseCases/Project/GetOpenProjects.cs +++ b/src/Domain/UseCases/Project/GetOpenProjects.cs @@ -31,7 +31,7 @@ public async Task> Execute(int skip, int take, b // Se o usuário não estiver autenticado, lança uma exceção. UseCaseException.BusinessRuleViolation(userClaims == null || userClaims.Role == null, - "Not authorized user."); + "Usuário não autorizado."); // Obtém o tipo de usuário. var userRole = Enum.Parse(userClaims?.Role!); @@ -57,7 +57,7 @@ public async Task> Execute(int skip, int take, b // Se o usuário não for nenhum dos tipos acima, lança uma exceção. else - throw UseCaseException.BusinessRuleViolation("Not authorized user."); + throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); // Mapeia a lista de projetos para uma lista de projetos resumidos e retorna. return _mapper.Map>(projects); diff --git a/src/Domain/UseCases/Project/OpenProject.cs b/src/Domain/UseCases/Project/OpenProject.cs index f1bdf084..e4bc5d1c 100644 --- a/src/Domain/UseCases/Project/OpenProject.cs +++ b/src/Domain/UseCases/Project/OpenProject.cs @@ -36,10 +36,31 @@ public OpenProject(IProjectRepository projectRepository, public async Task Execute(OpenProjectInput input) { // Mapeia input para entidade e realiza validação dos campos informados - var entity = _mapper.Map(input); + var project = new Entities.Project( + input.Title, + input.KeyWord1, + input.KeyWord2, + input.KeyWord3, + input.IsScholarshipCandidate, + input.Objective, + input.Methodology, + input.ExpectedResults, + input.ActivitiesExecutionSchedule, + input.StudentId, + input.ProgramTypeId, + input.ProfessorId, + input.SubAreaId, + input.NoticeId, + EProjectStatus.Opened, + EProjectStatus.Opened.GetDescription(), + null, + DateTime.UtcNow, + null, + null, + null); // Verifica se Edital existe - var notice = await _noticeRepository.GetById(input.NoticeId) + var notice = await _noticeRepository.GetById(project.NoticeId) ?? throw new ArgumentException("Edital não encontrado."); // Verifica se o período do edital é válido @@ -47,22 +68,22 @@ public async Task Execute(OpenProjectInput input) throw new ArgumentException("Fora do período de inscrição no edital."); // Verifica se a Subárea existe - _ = await _subAreaRepository.GetById(input.SubAreaId) + _ = await _subAreaRepository.GetById(project.SubAreaId) ?? throw new ArgumentException("Subárea não encontrada."); // Verifica se o Tipo de Programa existe - _ = await _programTypeRepository.GetById(input.ProgramTypeId) + _ = await _programTypeRepository.GetById(project.ProgramTypeId) ?? throw new ArgumentException("Tipo de Programa não encontrado."); // Verifica se o Professor existe - _ = await _professorRepository.GetById(input.ProfessorId) + _ = await _professorRepository.GetById(project.ProfessorId) ?? throw new ArgumentException("Professor não encontrado."); // Caso tenha sido informado algum aluno no processo de abertura do projeto - if (input.StudentId.HasValue) + if (project.StudentId.HasValue) { // Verifica se o aluno existe - var student = await _studentRepository.GetById(input.StudentId) + var student = await _studentRepository.GetById(project.StudentId) ?? throw new ArgumentException("Aluno não encontrado."); // Verifica se o aluno já está em um projeto @@ -71,12 +92,10 @@ public async Task Execute(OpenProjectInput input) throw new ArgumentException("Aluno já está em um projeto."); } - // Atualiza o status do projeto - entity.Status = EProjectStatus.Opened; - entity.StatusDescription = EProjectStatus.Opened.GetDescription(); + // TODO: Inserir criação das atividades (ProjectActivities) // Cria o projeto - var project = await _projectRepository.Create(entity); + project = await _projectRepository.Create(project); // Mapeia o projeto para o retorno e retorna return _mapper.Map(project); diff --git a/src/Domain/UseCases/Project/SubmitProject.cs b/src/Domain/UseCases/Project/SubmitProject.cs index a497bc73..829939ed 100644 --- a/src/Domain/UseCases/Project/SubmitProject.cs +++ b/src/Domain/UseCases/Project/SubmitProject.cs @@ -29,28 +29,13 @@ public async Task Execute(Guid? projectId) var project = await _projectRepository.GetById(projectId!.Value) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + // Verifica se edital está em fase de inscrição + UseCaseException.BusinessRuleViolation(project.Notice?.RegistrationStartDate > DateTime.UtcNow || project.Notice?.RegistrationEndDate < DateTime.UtcNow, + "O edital não está na fase de inscrição."); + // Verifica se o projeto está aberto if (project.Status == EProjectStatus.Opened) { - // Verifica se todos os campos do projeto foram preenchidos - project.WorkType1 ??= 0; - project.WorkType2 ??= 0; - project.IndexedConferenceProceedings ??= 0; - project.NotIndexedConferenceProceedings ??= 0; - project.CompletedBook ??= 0; - project.OrganizedBook ??= 0; - project.BookChapters ??= 0; - project.BookTranslations ??= 0; - project.ParticipationEditorialCommittees ??= 0; - project.FullComposerSoloOrchestraAllTracks ??= 0; - project.FullComposerSoloOrchestraCompilation ??= 0; - project.ChamberOrchestraInterpretation ??= 0; - project.IndividualAndCollectiveArtPerformances ??= 0; - project.ScientificCulturalArtisticCollectionsCuratorship ??= 0; - project.PatentLetter ??= 0; - project.PatentDeposit ??= 0; - project.SoftwareRegistration ??= 0; - // Altera o status do projeto para submetido project.Status = EProjectStatus.Submitted; project.StatusDescription = EProjectStatus.Submitted.GetDescription(); @@ -64,7 +49,7 @@ public async Task Execute(Guid? projectId) } else { - throw UseCaseException.BusinessRuleViolation("The project is not at a stage that allows submission."); + throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); } } } diff --git a/src/Domain/UseCases/Project/UpdateProject.cs b/src/Domain/UseCases/Project/UpdateProject.cs index ae8fc026..adc9a2a6 100644 --- a/src/Domain/UseCases/Project/UpdateProject.cs +++ b/src/Domain/UseCases/Project/UpdateProject.cs @@ -72,6 +72,8 @@ public async Task Execute(Guid? id, UpdateProjectInput UseCaseException.BusinessRuleViolation(studentProjects.Any(), "Student is already on a project."); } + // TODO: Inserir atualização das atividades (ProjectActivities) + // Atualiza campos permitidos project.Title = input.Title; project.KeyWord1 = input.KeyWord1; @@ -82,23 +84,6 @@ public async Task Execute(Guid? id, UpdateProjectInput project.Methodology = input.Methodology; project.ExpectedResults = input.ExpectedResults; project.ActivitiesExecutionSchedule = input.ActivitiesExecutionSchedule; - project.WorkType1 = input.WorkType1; - project.WorkType2 = input.WorkType2; - project.IndexedConferenceProceedings = input.IndexedConferenceProceedings; - project.NotIndexedConferenceProceedings = input.NotIndexedConferenceProceedings; - project.CompletedBook = input.CompletedBook; - project.OrganizedBook = input.OrganizedBook; - project.BookChapters = input.BookChapters; - project.BookTranslations = input.BookTranslations; - project.ParticipationEditorialCommittees = input.ParticipationEditorialCommittees; - project.FullComposerSoloOrchestraAllTracks = input.FullComposerSoloOrchestraAllTracks; - project.FullComposerSoloOrchestraCompilation = input.FullComposerSoloOrchestraCompilation; - project.ChamberOrchestraInterpretation = input.ChamberOrchestraInterpretation; - project.IndividualAndCollectiveArtPerformances = input.IndividualAndCollectiveArtPerformances; - project.ScientificCulturalArtisticCollectionsCuratorship = input.ScientificCulturalArtisticCollectionsCuratorship; - project.PatentLetter = input.PatentLetter; - project.PatentDeposit = input.PatentDeposit; - project.SoftwareRegistration = input.SoftwareRegistration; project.ProgramTypeId = input.ProgramTypeId; project.StudentId = input.StudentId; project.SubAreaId = input.SubAreaId; @@ -111,7 +96,7 @@ public async Task Execute(Guid? id, UpdateProjectInput } else { - throw UseCaseException.BusinessRuleViolation("The project is not at a stage that allows for changes."); + throw UseCaseException.BusinessRuleViolation("O projeto não está em um estágio que permita mudanças."); } } } \ No newline at end of file diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs index cb6151ca..9089a6b0 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs @@ -35,7 +35,7 @@ public async Task Execute(EvaluateAppealProjectInput // Verifica se o usuário logado é um avaliador. UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN.GetDescription() || user.Role != ERole.PROFESSOR.GetDescription(), - "User is not an evaluator."); + "O usuário não é um avaliador."); // Busca avaliação do projeto pelo Id. var projectEvaluation = await _projectEvaluationRepository.GetByProjectId(input.ProjectId) @@ -47,15 +47,15 @@ public async Task Execute(EvaluateAppealProjectInput // Verifica se o avaliador é o professor orientador do projeto. UseCaseException.BusinessRuleViolation(projectEvaluation.Project?.ProfessorId == user.Id, - "Evaluator is the project advisor."); + "Avaliador é o orientador do projeto."); // Verifica se o projeto está na fase de recurso. UseCaseException.BusinessRuleViolation(projectEvaluation.Project?.Status != EProjectStatus.Evaluation, - "Project is not in the evaluation phase."); + "Projeto não está em fase de avaliação."); // Verifica se o edital está na fase de recurso. UseCaseException.BusinessRuleViolation(projectEvaluation?.Project?.Notice?.AppealStartDate > DateTime.UtcNow || projectEvaluation?.Project?.Notice?.AppealEndDate < DateTime.UtcNow, - "Notice isn't in the appeal stage."); + "O edital não está na fase de recurso."); // Verifica se o status da avaliação foi informado. UseCaseException.NotInformedParam(input.AppealEvaluationStatus is null, diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs index a819698e..092e051c 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -49,14 +49,14 @@ public async Task Execute(EvaluateSubmissionProjectIn // Verifica se o avaliador é o professor orientador do projeto. UseCaseException.BusinessRuleViolation(project.ProfessorId == user.Id, - "Avaliador é o orientador do projeto."); + "Avaliador é o orientador do projeto."); // Verifica se o projeto está na fase de submissão. UseCaseException.BusinessRuleViolation(project.Status != EProjectStatus.Submitted, "O projeto não está em fase de submissão."); - // Verifica se o edital ainda está aberto. - UseCaseException.BusinessRuleViolation(project.Notice?.RegistrationStartDate > DateTime.UtcNow || project.Notice?.RegistrationEndDate < DateTime.UtcNow, + // Verifica se o edital está em fase de avaliação. + UseCaseException.BusinessRuleViolation(project.Notice?.EvaluationStartDate > DateTime.UtcNow || project.Notice?.EvaluationEndDate < DateTime.UtcNow, "Edital encerrado."); // Verifica se o status da avaliação foi informado. @@ -67,6 +67,8 @@ public async Task Execute(EvaluateSubmissionProjectIn UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.SubmissionEvaluationDescription), nameof(input.SubmissionEvaluationDescription)); + // TODO: Processar atividades do projeto e calcular pontuação. + // Mapeia dados de entrada para entidade. projectEvaluation = new Entities.ProjectEvaluation(input.ProjectId, input.IsProductivityFellow, @@ -74,28 +76,12 @@ public async Task Execute(EvaluateSubmissionProjectIn TryCastEnum(input.SubmissionEvaluationStatus), DateTime.UtcNow, input.SubmissionEvaluationDescription, - input.FoundWorkType1, - input.FoundWorkType2, - input.FoundIndexedConferenceProceedings, - input.FoundNotIndexedConferenceProceedings, - input.FoundCompletedBook, - input.FoundOrganizedBook, - input.FoundBookChapters, - input.FoundBookTranslations, - input.FoundParticipationEditorialCommittees, - input.FoundFullComposerSoloOrchestraAllTracks, - input.FoundFullComposerSoloOrchestraCompilation, - input.FoundChamberOrchestraInterpretation, - input.FoundIndividualAndCollectiveArtPerformances, - input.FoundScientificCulturalArtisticCollectionsCuratorship, - input.FoundPatentLetter, - input.FoundPatentDeposit, - input.FoundSoftwareRegistration, TryCastEnum(input.Qualification), TryCastEnum(input.ProjectProposalObjectives), TryCastEnum(input.AcademicScientificProductionCoherence), TryCastEnum(input.ProposalMethodologyAdaptation), - TryCastEnum(input.EffectiveContributionToResearch)); + TryCastEnum(input.EffectiveContributionToResearch), + 0); // Adiciona avaliação do projeto. await _projectEvaluationRepository.Create(projectEvaluation); From 6915fb32e86d2c89c23b05c2b7b7f422475a73a0 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 24 Jul 2023 22:36:40 -0300 Subject: [PATCH 049/201] fix: adjust repositories for new project entity --- .../ProjectConfiguration.cs | 17 ----------------- .../ProjectEvaluationConfiguration.cs | 18 ------------------ 2 files changed, 35 deletions(-) diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs index abbd41c4..e42b9b73 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs @@ -21,23 +21,6 @@ public void Configure(EntityTypeBuilder builder) builder.Property(p => p.Methodology).HasMaxLength(1500); builder.Property(p => p.ExpectedResults).HasMaxLength(1500); builder.Property(p => p.ActivitiesExecutionSchedule).HasMaxLength(1500); - builder.Property(p => p.WorkType1).HasDefaultValue(0); - builder.Property(p => p.WorkType2).HasDefaultValue(0); - builder.Property(p => p.IndexedConferenceProceedings).HasDefaultValue(0); - builder.Property(p => p.NotIndexedConferenceProceedings).HasDefaultValue(0); - builder.Property(p => p.CompletedBook).HasDefaultValue(0); - builder.Property(p => p.OrganizedBook).HasDefaultValue(0); - builder.Property(p => p.BookChapters).HasDefaultValue(0); - builder.Property(p => p.BookTranslations).HasDefaultValue(0); - builder.Property(p => p.ParticipationEditorialCommittees).HasDefaultValue(0); - builder.Property(p => p.FullComposerSoloOrchestraAllTracks).HasDefaultValue(0); - builder.Property(p => p.FullComposerSoloOrchestraCompilation).HasDefaultValue(0); - builder.Property(p => p.ChamberOrchestraInterpretation).HasDefaultValue(0); - builder.Property(p => p.IndividualAndCollectiveArtPerformances).HasDefaultValue(0); - builder.Property(p => p.ScientificCulturalArtisticCollectionsCuratorship).HasDefaultValue(0); - builder.Property(p => p.PatentLetter).HasDefaultValue(0); - builder.Property(p => p.PatentDeposit).HasDefaultValue(0); - builder.Property(p => p.SoftwareRegistration).HasDefaultValue(0); builder.Property(p => p.StudentId); builder.Property(p => p.ProgramTypeId).IsRequired(); builder.Property(p => p.ProfessorId).IsRequired(); diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs index 989afdd4..8666afe1 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs @@ -22,25 +22,7 @@ public void Configure(EntityTypeBuilder builder) builder.Property(p => p.DocumentsEvaluationDate); builder.Property(p => p.DocumentsEvaluationDescription); - builder.Property(p => p.FoundWorkType1).HasDefaultValue(0); - builder.Property(p => p.FoundWorkType2).HasDefaultValue(0); - builder.Property(p => p.FoundIndexedConferenceProceedings).HasDefaultValue(0); - builder.Property(p => p.FoundNotIndexedConferenceProceedings).HasDefaultValue(0); - builder.Property(p => p.FoundCompletedBook).HasDefaultValue(0); - builder.Property(p => p.FoundOrganizedBook).HasDefaultValue(0); - builder.Property(p => p.FoundBookChapters).HasDefaultValue(0); - builder.Property(p => p.FoundBookTranslations).HasDefaultValue(0); - builder.Property(p => p.FoundParticipationEditorialCommittees).HasDefaultValue(0); - builder.Property(p => p.FoundFullComposerSoloOrchestraAllTracks).HasDefaultValue(0); - builder.Property(p => p.FoundFullComposerSoloOrchestraCompilation).HasDefaultValue(0); - builder.Property(p => p.FoundChamberOrchestraInterpretation).HasDefaultValue(0); - builder.Property(p => p.FoundIndividualAndCollectiveArtPerformances).HasDefaultValue(0); - builder.Property(p => p.FoundScientificCulturalArtisticCollectionsCuratorship).HasDefaultValue(0); - builder.Property(p => p.FoundPatentLetter).HasDefaultValue(0); - builder.Property(p => p.FoundPatentDeposit).HasDefaultValue(0); - builder.Property(p => p.FoundSoftwareRegistration).HasDefaultValue(0); builder.Property(p => p.APIndex).HasDefaultValue(0); - builder.Property(p => p.Qualification).IsRequired(); builder.Property(p => p.ProjectProposalObjectives).IsRequired(); builder.Property(p => p.AcademicScientificProductionCoherence).IsRequired(); From b57d8e740e6f39795ea2e88efb60f05ef583c8b5 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 25 Jul 2023 13:47:43 -0300 Subject: [PATCH 050/201] feat: add ProjectActivities to Project usecases --- .../Gateways/Project/OpenProjectRequest.cs | 41 +++++++++++++- .../Gateways/Project/UpdateProjectRequest.cs | 37 +++++++++++- .../ProjectActivity/BaseProjectActivity.cs | 10 ++++ .../CreateProjectActivityRequest.cs | 2 + .../DetailedReadProjectActivityResponse.cs | 8 +++ .../ResumedReadProjectActivityResponse.cs | 7 +++ .../UpdateProjectActivityRequest.cs | 8 +++ src/Adapters/Mappings/ActivityMappings.cs | 2 +- src/Adapters/Mappings/NoticeMappings.cs | 2 - .../Mappings/ProjectActivityMappings.cs | 17 ++++++ .../Mappings/ProjectEvaluationMapping.cs | 2 +- src/Adapters/Mappings/ProjectMappings.cs | 8 ++- .../Contracts/Project/OpenProjectInput.cs | 20 ++++++- .../Contracts/Project/UpdateProjectInput.cs | 19 ++++++- .../BaseProjectActivityContract.cs | 14 ++--- .../CreateProjectActivityInput.cs | 12 +--- .../DetailedReadProjectActivityOutput.cs | 14 ++--- .../ResumedReadProjectActivityOutput.cs | 12 ++-- .../UpdateProjectActivityInput.cs | 12 ++-- src/Domain/Entities/Project.cs | 36 ++++++------ .../IProjectActivityRepository.cs | 5 +- src/Domain/UseCases/Project/OpenProject.cs | 56 ++++++++++++++++--- src/Domain/UseCases/Project/SubmitProject.cs | 4 ++ src/Domain/UseCases/Project/UpdateProject.cs | 51 ++++++++++++++++- .../IoC/DependencyAdaptersInjection.cs | 1 + src/Infrastructure/IoC/DependencyInjection.cs | 1 + .../Context/ApplicationDbContext.cs | 1 + .../ProjectActivityConfiguration.cs | 32 +++++++++++ src/Infrastructure/Persistence/README.md | 2 +- .../Repositories/ProjectActivityRepository.cs | 54 ++++++++++++++++++ 30 files changed, 408 insertions(+), 82 deletions(-) create mode 100644 src/Adapters/Gateways/ProjectActivity/BaseProjectActivity.cs create mode 100644 src/Adapters/Gateways/ProjectActivity/CreateProjectActivityRequest.cs create mode 100644 src/Adapters/Gateways/ProjectActivity/DetailedReadProjectActivityResponse.cs create mode 100644 src/Adapters/Gateways/ProjectActivity/ResumedReadProjectActivityResponse.cs create mode 100644 src/Adapters/Gateways/ProjectActivity/UpdateProjectActivityRequest.cs create mode 100755 src/Adapters/Mappings/ProjectActivityMappings.cs create mode 100644 src/Infrastructure/Persistence/EntitiesConfiguration/ProjectActivityConfiguration.cs create mode 100644 src/Infrastructure/Persistence/Repositories/ProjectActivityRepository.cs diff --git a/src/Adapters/Gateways/Project/OpenProjectRequest.cs b/src/Adapters/Gateways/Project/OpenProjectRequest.cs index 5581eb40..8e02584d 100644 --- a/src/Adapters/Gateways/Project/OpenProjectRequest.cs +++ b/src/Adapters/Gateways/Project/OpenProjectRequest.cs @@ -1,5 +1,42 @@ +using System.ComponentModel.DataAnnotations; using Adapters.Gateways.Base; -using Domain.Contracts.Project; +using Adapters.Gateways.ProjectActivity; namespace Adapters.Gateways.Project; -public class OpenProjectRequest : OpenProjectInput, IRequest { } \ No newline at end of file +public class OpenProjectRequest : IRequest +{ + #region Informações do Projeto + [Required] + public string? Title { get; set; } + [Required] + public string? KeyWord1 { get; set; } + [Required] + public string? KeyWord2 { get; set; } + [Required] + public string? KeyWord3 { get; set; } + [Required] + public bool IsScholarshipCandidate { get; set; } + [Required] + public string? Objective { get; set; } + [Required] + public string? Methodology { get; set; } + [Required] + public string? ExpectedResults { get; set; } + [Required] + public string? ActivitiesExecutionSchedule { get; set; } + [Required] + public virtual IList? Activities { get; set; } + #endregion + + #region Relacionamentos + [Required] + public Guid? ProgramTypeId { get; set; } + [Required] + public Guid? ProfessorId { get; set; } + [Required] + public Guid? SubAreaId { get; set; } + [Required] + public Guid? NoticeId { get; set; } + public Guid? StudentId { get; set; } + #endregion +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Project/UpdateProjectRequest.cs b/src/Adapters/Gateways/Project/UpdateProjectRequest.cs index 2b1adb9f..44bcba42 100644 --- a/src/Adapters/Gateways/Project/UpdateProjectRequest.cs +++ b/src/Adapters/Gateways/Project/UpdateProjectRequest.cs @@ -1,5 +1,38 @@ +using System.ComponentModel.DataAnnotations; using Adapters.Gateways.Base; -using Domain.Contracts.Project; +using Adapters.Gateways.ProjectActivity; namespace Adapters.Gateways.Project; -public class UpdateProjectRequest : UpdateProjectInput, IRequest { } \ No newline at end of file +public class UpdateProjectRequest : IRequest +{ + #region Informações do Projeto + [Required] + public string? Title { get; set; } + [Required] + public string? KeyWord1 { get; set; } + [Required] + public string? KeyWord2 { get; set; } + [Required] + public string? KeyWord3 { get; set; } + [Required] + public bool IsScholarshipCandidate { get; set; } + [Required] + public string? Objective { get; set; } + [Required] + public string? Methodology { get; set; } + [Required] + public string? ExpectedResults { get; set; } + [Required] + public string? ActivitiesExecutionSchedule { get; set; } + [Required] + public IList? Activities { get; set; } + #endregion + + #region Relacionamentos + [Required] + public Guid? ProgramTypeId { get; set; } + [Required] + public Guid? SubAreaId { get; set; } + public Guid? StudentId { get; set; } + #endregion +} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectActivity/BaseProjectActivity.cs b/src/Adapters/Gateways/ProjectActivity/BaseProjectActivity.cs new file mode 100644 index 00000000..1519b144 --- /dev/null +++ b/src/Adapters/Gateways/ProjectActivity/BaseProjectActivity.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; + +namespace Adapters.Gateways.ProjectActivity; +public abstract class BaseProjectActivity +{ + [Required] + public Guid? ActivityId { get; set; } + [Required] + public int? InformedActivities { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectActivity/CreateProjectActivityRequest.cs b/src/Adapters/Gateways/ProjectActivity/CreateProjectActivityRequest.cs new file mode 100644 index 00000000..95f738f7 --- /dev/null +++ b/src/Adapters/Gateways/ProjectActivity/CreateProjectActivityRequest.cs @@ -0,0 +1,2 @@ +namespace Adapters.Gateways.ProjectActivity; +public class CreateProjectActivityRequest : BaseProjectActivity { } \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectActivity/DetailedReadProjectActivityResponse.cs b/src/Adapters/Gateways/ProjectActivity/DetailedReadProjectActivityResponse.cs new file mode 100644 index 00000000..89cb1607 --- /dev/null +++ b/src/Adapters/Gateways/ProjectActivity/DetailedReadProjectActivityResponse.cs @@ -0,0 +1,8 @@ +namespace Adapters.Gateways.ProjectActivity; +public class DetailedReadProjectActivityResponse : BaseProjectActivity +{ + public Guid? Id { get; set; } + public Guid? ProjectId { get; set; } + public int? FoundActivities { get; set; } + public DateTime? DeletedAt { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectActivity/ResumedReadProjectActivityResponse.cs b/src/Adapters/Gateways/ProjectActivity/ResumedReadProjectActivityResponse.cs new file mode 100644 index 00000000..ccf6011b --- /dev/null +++ b/src/Adapters/Gateways/ProjectActivity/ResumedReadProjectActivityResponse.cs @@ -0,0 +1,7 @@ +namespace Adapters.Gateways.ProjectActivity; +public class ResumedReadProjectActivityResponse : BaseProjectActivity +{ + public Guid? Id { get; set; } + public Guid? ProjectId { get; set; } + public int? FoundActivities { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectActivity/UpdateProjectActivityRequest.cs b/src/Adapters/Gateways/ProjectActivity/UpdateProjectActivityRequest.cs new file mode 100644 index 00000000..7b0d4ade --- /dev/null +++ b/src/Adapters/Gateways/ProjectActivity/UpdateProjectActivityRequest.cs @@ -0,0 +1,8 @@ +using System.ComponentModel.DataAnnotations; + +namespace Adapters.Gateways.ProjectActivity; +public class UpdateProjectActivityRequest : BaseProjectActivity +{ + [Required] + public Guid? ProjectId { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Mappings/ActivityMappings.cs b/src/Adapters/Mappings/ActivityMappings.cs index 20172e2e..58171c31 100644 --- a/src/Adapters/Mappings/ActivityMappings.cs +++ b/src/Adapters/Mappings/ActivityMappings.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.Activity; using AutoMapper; +using Adapters.Gateways.Activity; using Domain.Contracts.Activity; namespace Adapters.Mappings diff --git a/src/Adapters/Mappings/NoticeMappings.cs b/src/Adapters/Mappings/NoticeMappings.cs index 0301b2c1..7dd1804c 100755 --- a/src/Adapters/Mappings/NoticeMappings.cs +++ b/src/Adapters/Mappings/NoticeMappings.cs @@ -1,8 +1,6 @@ using AutoMapper; using Adapters.Gateways.Notice; using Domain.Contracts.Notice; -using Domain.Contracts.Activity; -using Adapters.Gateways.Activity; namespace Adapters.Mappings; public class NoticeMappings : Profile diff --git a/src/Adapters/Mappings/ProjectActivityMappings.cs b/src/Adapters/Mappings/ProjectActivityMappings.cs new file mode 100755 index 00000000..635a3375 --- /dev/null +++ b/src/Adapters/Mappings/ProjectActivityMappings.cs @@ -0,0 +1,17 @@ +using AutoMapper; +using Adapters.Gateways.ProjectActivity; +using Domain.Contracts.ProjectActivity; + +namespace Adapters.Mappings +{ + public class ProjectActivityMappings : Profile + { + public ProjectActivityMappings() + { + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + } + } +} \ No newline at end of file diff --git a/src/Adapters/Mappings/ProjectEvaluationMapping.cs b/src/Adapters/Mappings/ProjectEvaluationMapping.cs index 460c9d25..103d74cd 100644 --- a/src/Adapters/Mappings/ProjectEvaluationMapping.cs +++ b/src/Adapters/Mappings/ProjectEvaluationMapping.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.ProjectEvaluation; using AutoMapper; +using Adapters.Gateways.ProjectEvaluation; using Domain.Contracts.ProjectEvaluation; namespace Adapters.Mappings diff --git a/src/Adapters/Mappings/ProjectMappings.cs b/src/Adapters/Mappings/ProjectMappings.cs index 0f5a5cd7..0a2d5b65 100755 --- a/src/Adapters/Mappings/ProjectMappings.cs +++ b/src/Adapters/Mappings/ProjectMappings.cs @@ -8,8 +8,12 @@ public class ProjectMappings : Profile { public ProjectMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + CreateMap() + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) + .ReverseMap(); + CreateMap() + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) + .ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); } diff --git a/src/Domain/Contracts/Project/OpenProjectInput.cs b/src/Domain/Contracts/Project/OpenProjectInput.cs index 4d54b0a9..453c3933 100644 --- a/src/Domain/Contracts/Project/OpenProjectInput.cs +++ b/src/Domain/Contracts/Project/OpenProjectInput.cs @@ -1,25 +1,43 @@ +using System.ComponentModel.DataAnnotations; +using Domain.Contracts.ProjectActivity; + namespace Domain.Contracts.Project { public class OpenProjectInput { #region Informações do Projeto + [Required] public string? Title { get; set; } + [Required] public string? KeyWord1 { get; set; } + [Required] public string? KeyWord2 { get; set; } + [Required] public string? KeyWord3 { get; set; } + [Required] public bool IsScholarshipCandidate { get; set; } + [Required] public string? Objective { get; set; } + [Required] public string? Methodology { get; set; } + [Required] public string? ExpectedResults { get; set; } + [Required] public string? ActivitiesExecutionSchedule { get; set; } + [Required] + public virtual IList? Activities { get; set; } #endregion #region Relacionamentos + [Required] public Guid? ProgramTypeId { get; set; } + [Required] public Guid? ProfessorId { get; set; } - public Guid? StudentId { get; set; } + [Required] public Guid? SubAreaId { get; set; } + [Required] public Guid? NoticeId { get; set; } + public Guid? StudentId { get; set; } #endregion } } \ No newline at end of file diff --git a/src/Domain/Contracts/Project/UpdateProjectInput.cs b/src/Domain/Contracts/Project/UpdateProjectInput.cs index d4e50fd5..47922686 100644 --- a/src/Domain/Contracts/Project/UpdateProjectInput.cs +++ b/src/Domain/Contracts/Project/UpdateProjectInput.cs @@ -1,24 +1,39 @@ +using System.ComponentModel.DataAnnotations; +using Domain.Contracts.ProjectActivity; + namespace Domain.Contracts.Project { public class UpdateProjectInput { #region Informações do Projeto + [Required] public string? Title { get; set; } + [Required] public string? KeyWord1 { get; set; } + [Required] public string? KeyWord2 { get; set; } + [Required] public string? KeyWord3 { get; set; } + [Required] public bool IsScholarshipCandidate { get; set; } - public bool IsProductivityFellow { get; set; } + [Required] public string? Objective { get; set; } + [Required] public string? Methodology { get; set; } + [Required] public string? ExpectedResults { get; set; } + [Required] public string? ActivitiesExecutionSchedule { get; set; } + [Required] + public IList? Activities { get; set; } #endregion #region Relacionamentos + [Required] public Guid? ProgramTypeId { get; set; } - public Guid? StudentId { get; set; } + [Required] public Guid? SubAreaId { get; set; } + public Guid? StudentId { get; set; } #endregion } } \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/BaseProjectActivityContract.cs b/src/Domain/Contracts/ProjectActivity/BaseProjectActivityContract.cs index c519ff11..101dbdc6 100644 --- a/src/Domain/Contracts/ProjectActivity/BaseProjectActivityContract.cs +++ b/src/Domain/Contracts/ProjectActivity/BaseProjectActivityContract.cs @@ -1,12 +1,10 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.ProjectActivity +namespace Domain.Contracts.ProjectActivity; +public abstract class BaseProjectActivityContract { - public abstract class BaseProjectActivityContract - { - [Required] - public Guid? ProjectId { get; set; } - [Required] - public Guid? ActivityId { get; set; } - } + [Required] + public Guid? ActivityId { get; set; } + [Required] + public int? InformedActivities { get; set; } } \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/CreateProjectActivityInput.cs b/src/Domain/Contracts/ProjectActivity/CreateProjectActivityInput.cs index 00d96d97..876cd90a 100644 --- a/src/Domain/Contracts/ProjectActivity/CreateProjectActivityInput.cs +++ b/src/Domain/Contracts/ProjectActivity/CreateProjectActivityInput.cs @@ -1,10 +1,2 @@ -using System.ComponentModel.DataAnnotations; - -namespace Domain.Contracts.ProjectActivity -{ - public class CreateProjectActivityInput : BaseProjectActivityContract - { - [Required] - public int? InformedActivities { get; set; } - } -} \ No newline at end of file +namespace Domain.Contracts.ProjectActivity; +public class CreateProjectActivityInput : BaseProjectActivityContract { } \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/DetailedReadProjectActivityOutput.cs b/src/Domain/Contracts/ProjectActivity/DetailedReadProjectActivityOutput.cs index f6f9d400..73e51036 100644 --- a/src/Domain/Contracts/ProjectActivity/DetailedReadProjectActivityOutput.cs +++ b/src/Domain/Contracts/ProjectActivity/DetailedReadProjectActivityOutput.cs @@ -1,10 +1,8 @@ -namespace Domain.Contracts.ProjectActivity +namespace Domain.Contracts.ProjectActivity; +public class DetailedReadProjectActivityOutput : BaseProjectActivityContract { - public class DetailedReadProjectActivityOutput : BaseProjectActivityContract - { - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } - public int? InformedActivities { get; set; } - public int? FoundActivities { get; set; } - } + public Guid? Id { get; set; } + public Guid? ProjectId { get; set; } + public int? FoundActivities { get; set; } + public DateTime? DeletedAt { get; set; } } \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/ResumedReadProjectActivityOutput.cs b/src/Domain/Contracts/ProjectActivity/ResumedReadProjectActivityOutput.cs index b706d91e..71d6558a 100644 --- a/src/Domain/Contracts/ProjectActivity/ResumedReadProjectActivityOutput.cs +++ b/src/Domain/Contracts/ProjectActivity/ResumedReadProjectActivityOutput.cs @@ -1,9 +1,7 @@ -namespace Domain.Contracts.ProjectActivity +namespace Domain.Contracts.ProjectActivity; +public class ResumedReadProjectActivityOutput : BaseProjectActivityContract { - public class ResumedReadProjectActivityOutput : BaseProjectActivityContract - { - public Guid? Id { get; set; } - public int? InformedActivities { get; set; } - public int? FoundActivities { get; set; } - } + public Guid? Id { get; set; } + public Guid? ProjectId { get; set; } + public int? FoundActivities { get; set; } } \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/UpdateProjectActivityInput.cs b/src/Domain/Contracts/ProjectActivity/UpdateProjectActivityInput.cs index 86539133..6deeb347 100644 --- a/src/Domain/Contracts/ProjectActivity/UpdateProjectActivityInput.cs +++ b/src/Domain/Contracts/ProjectActivity/UpdateProjectActivityInput.cs @@ -1,8 +1,8 @@ -namespace Domain.Contracts.ProjectActivity +using System.ComponentModel.DataAnnotations; + +namespace Domain.Contracts.ProjectActivity; +public class UpdateProjectActivityInput : BaseProjectActivityContract { - public class UpdateProjectActivityInput : BaseProjectActivityContract - { - public int? InformedActivities { get; set; } - public int? FoundActivities { get; set; } - } + [Required] + public Guid? ProjectId { get; set; } } \ No newline at end of file diff --git a/src/Domain/Entities/Project.cs b/src/Domain/Entities/Project.cs index 2787c270..9caf41cf 100644 --- a/src/Domain/Entities/Project.cs +++ b/src/Domain/Entities/Project.cs @@ -21,7 +21,7 @@ public string? Title set { EntityExceptionValidation.When(string.IsNullOrWhiteSpace(value), - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid(nameof(Title))); _title = value; } } @@ -33,9 +33,9 @@ public string? KeyWord1 set { EntityExceptionValidation.When(string.IsNullOrWhiteSpace(value), - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid(nameof(KeyWord1))); EntityExceptionValidation.When(value!.Length > 100, - ExceptionMessageFactory.MaxLength(nameof(value), 100)); + ExceptionMessageFactory.MaxLength(nameof(KeyWord1), 100)); _keyWord1 = value; } } @@ -47,9 +47,9 @@ public string? KeyWord2 set { EntityExceptionValidation.When(string.IsNullOrWhiteSpace(value), - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid(nameof(KeyWord2))); EntityExceptionValidation.When(value!.Length > 100, - ExceptionMessageFactory.MaxLength(nameof(value), 100)); + ExceptionMessageFactory.MaxLength(nameof(KeyWord2), 100)); _keyWord2 = value; } } @@ -61,9 +61,9 @@ public string? KeyWord3 set { EntityExceptionValidation.When(string.IsNullOrWhiteSpace(value), - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid(nameof(KeyWord3))); EntityExceptionValidation.When(value!.Length > 100, - ExceptionMessageFactory.MaxLength(nameof(value), 100)); + ExceptionMessageFactory.MaxLength(nameof(KeyWord3), 100)); _keyWord3 = value; } } @@ -83,9 +83,9 @@ public string? Objective set { EntityExceptionValidation.When(string.IsNullOrWhiteSpace(value), - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid(nameof(Objective))); EntityExceptionValidation.When(value?.Length > 1500, - ExceptionMessageFactory.MaxLength(nameof(value), 1500)); + ExceptionMessageFactory.MaxLength(nameof(Objective), 1500)); _objective = value; } } @@ -100,9 +100,9 @@ public string? Methodology set { EntityExceptionValidation.When(string.IsNullOrWhiteSpace(value), - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid(nameof(Methodology))); EntityExceptionValidation.When(value?.Length > 1500, - ExceptionMessageFactory.MaxLength(nameof(value), 1500)); + ExceptionMessageFactory.MaxLength(nameof(Methodology), 1500)); _methodology = value; } } @@ -117,9 +117,9 @@ public string? ExpectedResults set { EntityExceptionValidation.When(string.IsNullOrWhiteSpace(value), - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid(nameof(ExpectedResults))); EntityExceptionValidation.When(value?.Length > 1500, - ExceptionMessageFactory.MaxLength(nameof(value), 1500)); + ExceptionMessageFactory.MaxLength(nameof(ExpectedResults), 1500)); _expectedResults = value; } } @@ -134,7 +134,7 @@ public string? ActivitiesExecutionSchedule set { EntityExceptionValidation.When(string.IsNullOrWhiteSpace(value), - ExceptionMessageFactory.Invalid(nameof(value))); + ExceptionMessageFactory.Invalid(nameof(ActivitiesExecutionSchedule))); _activitiesExecutionSchedule = value; } } @@ -151,7 +151,7 @@ public Guid? ProgramTypeId { { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required(nameof(ProgramTypeId))); _programTypeId = value; } } @@ -165,7 +165,7 @@ private set { { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required(nameof(ProfessorId))); _professorId = value; } } @@ -179,7 +179,7 @@ public Guid? SubAreaId { { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required(nameof(SubAreaId))); _subAreaId = value; } } @@ -193,7 +193,7 @@ private set { { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(value))); + ExceptionMessageFactory.Required(nameof(NoticeId))); _noticeId = value; } } diff --git a/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs b/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs index 7c75b032..5a1b87f5 100644 --- a/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs @@ -2,4 +2,7 @@ using Domain.Interfaces.Repositories.Bases; namespace Domain.Interfaces.Repositories; -public interface IProjectActivityRepository : IGenericCRUDRepository { } \ No newline at end of file +public interface IProjectActivityRepository : IGenericCRUDRepository +{ + Task> GetByProjectId(Guid? projectId); +} \ No newline at end of file diff --git a/src/Domain/UseCases/Project/OpenProject.cs b/src/Domain/UseCases/Project/OpenProject.cs index e4bc5d1c..782313a2 100644 --- a/src/Domain/UseCases/Project/OpenProject.cs +++ b/src/Domain/UseCases/Project/OpenProject.cs @@ -3,6 +3,7 @@ using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Domain.Interfaces.UseCases.Project; +using Domain.Validation; namespace Domain.UseCases.Project; public class OpenProject : IOpenProject @@ -14,6 +15,8 @@ public class OpenProject : IOpenProject private readonly INoticeRepository _noticeRepository; private readonly ISubAreaRepository _subAreaRepository; private readonly IProgramTypeRepository _programTypeRepository; + private readonly IActivityTypeRepository _activityTypeRepository; + private readonly IProjectActivityRepository _projectActivityRepository; private readonly IMapper _mapper; public OpenProject(IProjectRepository projectRepository, IStudentRepository studentRepository, @@ -21,6 +24,8 @@ public OpenProject(IProjectRepository projectRepository, INoticeRepository noticeRepository, ISubAreaRepository subAreaRepository, IProgramTypeRepository programTypeRepository, + IActivityTypeRepository activityTypeRepository, + IProjectActivityRepository projectActivityRepository, IMapper mapper) { _projectRepository = projectRepository; @@ -29,6 +34,8 @@ public OpenProject(IProjectRepository projectRepository, _noticeRepository = noticeRepository; _subAreaRepository = subAreaRepository; _programTypeRepository = programTypeRepository; + _activityTypeRepository = activityTypeRepository; + _projectActivityRepository = projectActivityRepository; _mapper = mapper; } #endregion @@ -61,42 +68,75 @@ public async Task Execute(OpenProjectInput input) // Verifica se Edital existe var notice = await _noticeRepository.GetById(project.NoticeId) - ?? throw new ArgumentException("Edital não encontrado."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Notice)); // Verifica se o período do edital é válido if (notice.RegistrationStartDate > DateTime.UtcNow || notice.RegistrationEndDate < DateTime.UtcNow) - throw new ArgumentException("Fora do período de inscrição no edital."); + throw UseCaseException.BusinessRuleViolation("Fora do período de inscrição no edital."); // Verifica se a Subárea existe _ = await _subAreaRepository.GetById(project.SubAreaId) - ?? throw new ArgumentException("Subárea não encontrada."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); // Verifica se o Tipo de Programa existe _ = await _programTypeRepository.GetById(project.ProgramTypeId) - ?? throw new ArgumentException("Tipo de Programa não encontrado."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); // Verifica se o Professor existe _ = await _professorRepository.GetById(project.ProfessorId) - ?? throw new ArgumentException("Professor não encontrado."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Professor)); // Caso tenha sido informado algum aluno no processo de abertura do projeto if (project.StudentId.HasValue) { // Verifica se o aluno existe var student = await _studentRepository.GetById(project.StudentId) - ?? throw new ArgumentException("Aluno não encontrado."); + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); // Verifica se o aluno já está em um projeto var studentProjects = await _projectRepository.GetStudentProjects(0, 1, student.Id); if (studentProjects.Any()) - throw new ArgumentException("Aluno já está em um projeto."); + throw UseCaseException.BusinessRuleViolation("Aluno já está em um projeto."); } - // TODO: Inserir criação das atividades (ProjectActivities) + // Verifica se foram informadas atividades + if (input.Activities?.Any() != true) + throw UseCaseException.BusinessRuleViolation("Atividades não informadas."); + + // Obtém atividades do Edital + var noticeActivities = await _activityTypeRepository.GetByNoticeId(notice.Id); + + // Valida se todas as atividades do projeto foram informadas corretamente + var newProjectActivities = new List(); + foreach (var activityType in noticeActivities) + { + // Verifica se as atividades que o professor informou existem no edital + // e se todas as atividades do edital foram informadas. + foreach (var activity in activityType.Activities!) + { + // Verifica se professor informou valor para essa atividade do edital + var inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) + ?? throw UseCaseException.BusinessRuleViolation($"Não foi informado valor para a atividade {activity.Name}."); + + // Adiciona atividade do projeto na lista para ser criada posteriormente + newProjectActivities.Add(new Entities.ProjectActivity( + Guid.Empty, // Id do projeto será gerado na etapa seguinte + inputActivity.ActivityId, + inputActivity.InformedActivities, + 0)); + } + } // Cria o projeto project = await _projectRepository.Create(project); + // Cria as atividades do projeto + foreach (var projectActivity in newProjectActivities) + { + projectActivity.ProjectId = project.Id; + await _projectActivityRepository.Create(projectActivity); + } + // Mapeia o projeto para o retorno e retorna return _mapper.Map(project); } diff --git a/src/Domain/UseCases/Project/SubmitProject.cs b/src/Domain/UseCases/Project/SubmitProject.cs index 829939ed..1209973c 100644 --- a/src/Domain/UseCases/Project/SubmitProject.cs +++ b/src/Domain/UseCases/Project/SubmitProject.cs @@ -33,6 +33,10 @@ public async Task Execute(Guid? projectId) UseCaseException.BusinessRuleViolation(project.Notice?.RegistrationStartDate > DateTime.UtcNow || project.Notice?.RegistrationEndDate < DateTime.UtcNow, "O edital não está na fase de inscrição."); + // Verifica se aluno está preenchido + UseCaseException.BusinessRuleViolation(project.StudentId is null, + "O projeto não possui aluno vinculado."); + // Verifica se o projeto está aberto if (project.Status == EProjectStatus.Opened) { diff --git a/src/Domain/UseCases/Project/UpdateProject.cs b/src/Domain/UseCases/Project/UpdateProject.cs index adc9a2a6..9c1f2955 100644 --- a/src/Domain/UseCases/Project/UpdateProject.cs +++ b/src/Domain/UseCases/Project/UpdateProject.cs @@ -15,6 +15,8 @@ public class UpdateProject : IUpdateProject private readonly INoticeRepository _noticeRepository; private readonly ISubAreaRepository _subAreaRepository; private readonly IProgramTypeRepository _programTypeRepository; + private readonly IActivityTypeRepository _activityTypeRepository; + private readonly IProjectActivityRepository _projectActivityRepository; private readonly IMapper _mapper; public UpdateProject(IProjectRepository projectRepository, IStudentRepository studentRepository, @@ -22,6 +24,8 @@ public UpdateProject(IProjectRepository projectRepository, INoticeRepository noticeRepository, ISubAreaRepository subAreaRepository, IProgramTypeRepository programTypeRepository, + IActivityTypeRepository activityTypeRepository, + IProjectActivityRepository projectActivityRepository, IMapper mapper) { _projectRepository = projectRepository; @@ -30,6 +34,8 @@ public UpdateProject(IProjectRepository projectRepository, _noticeRepository = noticeRepository; _subAreaRepository = subAreaRepository; _programTypeRepository = programTypeRepository; + _activityTypeRepository = activityTypeRepository; + _projectActivityRepository = projectActivityRepository; _mapper = mapper; } #endregion @@ -43,6 +49,10 @@ public async Task Execute(Guid? id, UpdateProjectInput var project = await _projectRepository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + // Verifica se o edital está no período de inscrições + if (project.Notice!.RegistrationStartDate > DateTime.UtcNow || project.Notice?.RegistrationEndDate < DateTime.UtcNow) + throw UseCaseException.BusinessRuleViolation("Fora do período de inscrição no edital."); + // Verifica se o projeto está aberto if (project!.Status == EProjectStatus.Opened) { @@ -72,8 +82,6 @@ public async Task Execute(Guid? id, UpdateProjectInput UseCaseException.BusinessRuleViolation(studentProjects.Any(), "Student is already on a project."); } - // TODO: Inserir atualização das atividades (ProjectActivities) - // Atualiza campos permitidos project.Title = input.Title; project.KeyWord1 = input.KeyWord1; @@ -88,9 +96,48 @@ public async Task Execute(Guid? id, UpdateProjectInput project.StudentId = input.StudentId; project.SubAreaId = input.SubAreaId; + // Verifica se foram informadas atividades + if (input.Activities?.Any() != true) + throw UseCaseException.BusinessRuleViolation("Atividades não informadas."); + + // Obtém atividades do Edital + var noticeActivities = await _activityTypeRepository.GetByNoticeId(project.Notice!.Id); + + // Obtém atividades do projeto + var projectActivities = await _projectActivityRepository.GetByProjectId(project.Id); + + // Valida se todas as atividades do projeto foram informadas corretamente + var updateProjectActivities = new List(); + foreach (var activityType in noticeActivities) + { + // Verifica se as atividades que o professor informou existem no edital + // e se todas as atividades do edital foram informadas. + foreach (var activity in activityType.Activities!) + { + // Verifica se professor informou valor para essa atividade do edital + var inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) + ?? throw UseCaseException.BusinessRuleViolation($"Não foi informado valor para a atividade {activity.Name}."); + + // Obtém atividade do projeto + var updateProjectActivity = projectActivities.FirstOrDefault(x => x.ActivityId == activity.Id); + + // Atualiza valores da entidade + updateProjectActivity!.InformedActivities = inputActivity.InformedActivities; + + // Atualiza atividade do projeto no banco de dados + await _projectActivityRepository.Update(updateProjectActivity); + } + } + // Atualiza o projeto await _projectRepository.Update(project); + // Atualiza atividades do projeto no banco + foreach (var projectActivity in updateProjectActivities) + { + await _projectActivityRepository.Update(projectActivity); + } + // Mapeia o projeto para o retorno e retorna return _mapper.Map(project); } diff --git a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs index bead8dc3..3242a07b 100644 --- a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs +++ b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs @@ -40,6 +40,7 @@ public static IServiceCollection AddAdapters(this IServiceCollection services) services.AddAutoMapper(typeof(ProgramTypeMappings)); services.AddAutoMapper(typeof(ProjectEvaluationMapping)); services.AddAutoMapper(typeof(ProjectMappings)); + services.AddAutoMapper(typeof(ProjectActivityMappings)); services.AddAutoMapper(typeof(StudentDocumentsMappings)); services.AddAutoMapper(typeof(StudentMappings)); services.AddAutoMapper(typeof(SubAreaMappings)); diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs index 708128df..9d964d4f 100644 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ b/src/Infrastructure/IoC/DependencyInjection.cs @@ -68,6 +68,7 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs index 53561f44..345cafba 100644 --- a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs +++ b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs @@ -27,6 +27,7 @@ public ApplicationDbContext(DbContextOptions options) : ba public DbSet Professors { get; set; } public DbSet Projects { get; set; } public DbSet ProjectEvaluations { get; set; } + public DbSet ProjectActivities { get; set; } public DbSet ProgramTypes { get; set; } public DbSet AssistanceTypes { get; set; } public DbSet Students { get; set; } diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectActivityConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectActivityConfiguration.cs new file mode 100644 index 00000000..dfad62b3 --- /dev/null +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectActivityConfiguration.cs @@ -0,0 +1,32 @@ +using Domain.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Persistence.EntitiesConfiguration +{ + public class ProjectActivityConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("ProjectActivities"); + + builder.HasKey(t => t.Id); + builder.Property(p => p.Id).ValueGeneratedOnAdd(); + + builder.Property(p => p.ActivityId).IsRequired(); + builder.Property(p => p.ProjectId).IsRequired(); + builder.Property(p => p.InformedActivities).IsRequired(); + builder.Property(p => p.FoundActivities); + builder.Property(p => p.DeletedAt); + + builder.HasOne(a => a.Project) + .WithMany() + .HasForeignKey(a => a.ProjectId); + builder.HasOne(a => a.Activity) + .WithMany() + .HasForeignKey(a => a.ActivityId); + + builder.HasQueryFilter(x => x.DeletedAt == null); + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index bfb3248a..70ab2d2b 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add UpdateActivities --project ../Persistence/Persistence.csproj +dotnet ef migrations add UpdateProjectActivities --project ../Persistence/Persistence.csproj ``` Executando as Migrations: diff --git a/src/Infrastructure/Persistence/Repositories/ProjectActivityRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectActivityRepository.cs new file mode 100644 index 00000000..0caa5fe4 --- /dev/null +++ b/src/Infrastructure/Persistence/Repositories/ProjectActivityRepository.cs @@ -0,0 +1,54 @@ +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Infrastructure.Persistence.Context; +using Microsoft.EntityFrameworkCore; + +namespace Infrastructure.Persistence.Repositories +{ + public class ProjectActivityRepository : IProjectActivityRepository + { + private readonly ApplicationDbContext _context; + public ProjectActivityRepository(ApplicationDbContext context) => _context = context; + + public async Task Create(ProjectActivity model) + { + _context.Add(model); + await _context.SaveChangesAsync(); + return model; + } + + public async Task> GetAll(int skip, int take) => + await _context.ProjectActivities + .Skip(skip) + .Take(take) + .AsAsyncEnumerable() + .ToListAsync(); + + public async Task GetById(Guid? id) => + await _context.ProjectActivities + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.Id == id); + + public async Task Delete(Guid? id) + { + var model = await GetById(id) + ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); + model.DeactivateEntity(); + return await Update(model); + } + + public async Task Update(ProjectActivity model) + { + _context.Update(model); + await _context.SaveChangesAsync(); + return model; + } + + public async Task> GetByProjectId(Guid? projectId) => + await _context.ProjectActivities + .AsAsyncEnumerable() + .Where(x => x.ProjectId == projectId) + .ToListAsync(); + } +} \ No newline at end of file From 5be084dac205a5de6d8571e7baab62c7b7cc94fb Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 25 Jul 2023 13:48:49 -0300 Subject: [PATCH 051/201] chore(persistence): upgrade Microsoft.EntityFrameworkCore packs --- src/Infrastructure/Persistence/Persistence.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Infrastructure/Persistence/Persistence.csproj b/src/Infrastructure/Persistence/Persistence.csproj index 319052f6..f7d0387a 100644 --- a/src/Infrastructure/Persistence/Persistence.csproj +++ b/src/Infrastructure/Persistence/Persistence.csproj @@ -32,7 +32,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive none @@ -42,7 +42,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all From 42609e47e85769224cf51cda6a5c47b9fa101d30 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 25 Jul 2023 21:54:59 -0300 Subject: [PATCH 052/201] feat: add activities to project evaluation --- .../EvaluateProjectActivityRequest.cs | 10 +++++ .../EvaluateSubmissionProjectRequest.cs | 32 +++++++++++++- .../Mappings/ProjectActivityMappings.cs | 1 + .../Mappings/ProjectEvaluationMapping.cs | 10 +++-- .../EvaluateProjectActivityInput.cs | 10 +++++ .../EvaluateAppealProjectInput.cs | 5 +++ .../EvaluateSubmissionProjectInput.cs | 14 ++++++ src/Domain/Entities/ProjectActivity.cs | 22 ++++++++++ src/Domain/Entities/ProjectEvaluation.cs | 19 ++++++++ .../EvaluateSubmissionProject.cs | 43 ++++++++++++++++++- .../Validation/ExceptionMessageFactory.cs | 1 + .../ProjectEvaluationConfiguration.cs | 1 + 12 files changed, 161 insertions(+), 7 deletions(-) create mode 100644 src/Adapters/Gateways/ProjectActivity/EvaluateProjectActivityRequest.cs create mode 100644 src/Domain/Contracts/ProjectActivity/EvaluateProjectActivityInput.cs diff --git a/src/Adapters/Gateways/ProjectActivity/EvaluateProjectActivityRequest.cs b/src/Adapters/Gateways/ProjectActivity/EvaluateProjectActivityRequest.cs new file mode 100644 index 00000000..68e53d2c --- /dev/null +++ b/src/Adapters/Gateways/ProjectActivity/EvaluateProjectActivityRequest.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; + +namespace Adapters.Gateways.ProjectActivity; +public class EvaluateProjectActivityRequest : BaseProjectActivity +{ + [Required] + public Guid? ProjectId { get; set; } + [Required] + public int? FoundActivities { get; set; } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectEvaluation/EvaluateSubmissionProjectRequest.cs b/src/Adapters/Gateways/ProjectEvaluation/EvaluateSubmissionProjectRequest.cs index ef3118c9..e79c980a 100644 --- a/src/Adapters/Gateways/ProjectEvaluation/EvaluateSubmissionProjectRequest.cs +++ b/src/Adapters/Gateways/ProjectEvaluation/EvaluateSubmissionProjectRequest.cs @@ -1,5 +1,33 @@ +using System.ComponentModel.DataAnnotations; using Adapters.Gateways.Base; -using Domain.Contracts.ProjectEvaluation; +using Adapters.Gateways.ProjectActivity; namespace Adapters.Gateways.ProjectEvaluation; -public class EvaluateSubmissionProjectRequest : EvaluateSubmissionProjectInput, IRequest { } \ No newline at end of file +public class EvaluateSubmissionProjectRequest : IRequest +{ + #region Informações Gerais da Avaliação + [Required] + public Guid? ProjectId { get; set; } + [Required] + public bool IsProductivityFellow { get; set; } + [Required] + public int? SubmissionEvaluationStatus { get; set; } + [Required] + public string? SubmissionEvaluationDescription { get; set; } + [Required] + public IList? Activities { get; set; } + #endregion + + #region Critérios de Avaliação + [Required] + public int? Qualification { get; set; } + [Required] + public int? ProjectProposalObjectives { get; set; } + [Required] + public int? AcademicScientificProductionCoherence { get; set; } + [Required] + public int? ProposalMethodologyAdaptation { get; set; } + [Required] + public int? EffectiveContributionToResearch { get; set; } + #endregion +} \ No newline at end of file diff --git a/src/Adapters/Mappings/ProjectActivityMappings.cs b/src/Adapters/Mappings/ProjectActivityMappings.cs index 635a3375..3df91a62 100755 --- a/src/Adapters/Mappings/ProjectActivityMappings.cs +++ b/src/Adapters/Mappings/ProjectActivityMappings.cs @@ -10,6 +10,7 @@ public ProjectActivityMappings() { CreateMap().ReverseMap(); CreateMap().ReverseMap(); + CreateMap().ReverseMap(); CreateMap().ReverseMap(); CreateMap().ReverseMap(); } diff --git a/src/Adapters/Mappings/ProjectEvaluationMapping.cs b/src/Adapters/Mappings/ProjectEvaluationMapping.cs index 103d74cd..2b02668c 100644 --- a/src/Adapters/Mappings/ProjectEvaluationMapping.cs +++ b/src/Adapters/Mappings/ProjectEvaluationMapping.cs @@ -8,9 +8,13 @@ public class ProjectEvaluationMapping : Profile { public ProjectEvaluationMapping() { - CreateMap(); - CreateMap(); - CreateMap(); + CreateMap() + .ReverseMap(); + CreateMap() + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) + .ReverseMap(); + CreateMap() + .ReverseMap(); } } } \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/EvaluateProjectActivityInput.cs b/src/Domain/Contracts/ProjectActivity/EvaluateProjectActivityInput.cs new file mode 100644 index 00000000..6e55f38d --- /dev/null +++ b/src/Domain/Contracts/ProjectActivity/EvaluateProjectActivityInput.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.Contracts.ProjectActivity; +public class EvaluateProjectActivityInput : BaseProjectActivityContract +{ + [Required] + public Guid? ProjectId { get; set; } + [Required] + public int? FoundActivities { get; set; } +} \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectEvaluation/EvaluateAppealProjectInput.cs b/src/Domain/Contracts/ProjectEvaluation/EvaluateAppealProjectInput.cs index 74e4158b..74270d63 100644 --- a/src/Domain/Contracts/ProjectEvaluation/EvaluateAppealProjectInput.cs +++ b/src/Domain/Contracts/ProjectEvaluation/EvaluateAppealProjectInput.cs @@ -1,7 +1,12 @@ +using System.ComponentModel.DataAnnotations; + namespace Domain.Contracts.ProjectEvaluation; public class EvaluateAppealProjectInput { + [Required] public Guid? ProjectId { get; set; } + [Required] public int? AppealEvaluationStatus { get; set; } + [Required] public string? AppealEvaluationDescription { get; set; } } \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs b/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs index 151734b6..aa730625 100644 --- a/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs +++ b/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs @@ -1,18 +1,32 @@ +using System.ComponentModel.DataAnnotations; +using Domain.Contracts.ProjectActivity; + namespace Domain.Contracts.ProjectEvaluation; public class EvaluateSubmissionProjectInput { #region Informações Gerais da Avaliação + [Required] public Guid? ProjectId { get; set; } + [Required] public bool IsProductivityFellow { get; set; } + [Required] public int? SubmissionEvaluationStatus { get; set; } + [Required] public string? SubmissionEvaluationDescription { get; set; } + [Required] + public IList? Activities { get; set; } #endregion #region Critérios de Avaliação + [Required] public int? Qualification { get; set; } + [Required] public int? ProjectProposalObjectives { get; set; } + [Required] public int? AcademicScientificProductionCoherence { get; set; } + [Required] public int? ProposalMethodologyAdaptation { get; set; } + [Required] public int? EffectiveContributionToResearch { get; set; } #endregion } \ No newline at end of file diff --git a/src/Domain/Entities/ProjectActivity.cs b/src/Domain/Entities/ProjectActivity.cs index fa6ef43a..1b727797 100644 --- a/src/Domain/Entities/ProjectActivity.cs +++ b/src/Domain/Entities/ProjectActivity.cs @@ -84,5 +84,27 @@ public ProjectActivity(Guid? projectId, Guid? activityId, int? informedActivitie /// protected ProjectActivity() { } #endregion + + #region Methods + /// + /// Calcula a pontuação da Atividade. + /// + /// Total obtido com o cálculo. + public double CalculatePoints() + { + // Verifica se a Atividade está preenchida para calcular a pontuação. + EntityExceptionValidation.When(Activity is null, + ExceptionMessageFactory.BusinessRuleViolation("Atividade não informada, não é possível calcular a pontuação.")); + + // A pontuação é calculada multiplicando a quantidade de atividades encontradas pela pontuação da atividade. + double points = Activity!.Points!.Value * FoundActivities!.Value; + + // Verifica se limite foi informado, caso não tenha sido, utiliza o valor máximo do tipo. + double limits = Activity!.Limits.HasValue ? (double)Activity.Limits.Value : double.MaxValue; + + // Se a pontuação calculada for maior que o limite da atividade, retorna o limite da atividade, caso contrário, retorna a pontuação calculada. + return limits < points ? limits : points; + } + #endregion } } \ No newline at end of file diff --git a/src/Domain/Entities/ProjectEvaluation.cs b/src/Domain/Entities/ProjectEvaluation.cs index 82ef0eb2..f67e13ac 100644 --- a/src/Domain/Entities/ProjectEvaluation.cs +++ b/src/Domain/Entities/ProjectEvaluation.cs @@ -153,6 +153,11 @@ public DateTime? DocumentsEvaluationDate /// public double APIndex { get; set; } + /// + /// Pontuação Total Final. + /// + public double FinalScore { get; set; } + /// /// Titulação do Orientador. /// Doutor (2); Mestre (1). @@ -243,5 +248,19 @@ public ProjectEvaluation(Guid? projectId, APIndex = apIndex; } #endregion + + #region Methods + /// + /// Calcula a pontuação final do projeto considerando todos os critérios. + /// + public void CalculateFinalScore() + { + FinalScore = (double)Qualification! + + (double)ProjectProposalObjectives! + + (double)AcademicScientificProductionCoherence! + + (double)ProposalMethodologyAdaptation! + + (double)EffectiveContributionToResearch!; + } + #endregion } } \ No newline at end of file diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs index 092e051c..72d79de1 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -15,15 +15,21 @@ public class EvaluateSubmissionProject : IEvaluateSubmissionProject private readonly IMapper _mapper; private readonly IProjectRepository _projectRepository; private readonly ITokenAuthenticationService _tokenAuthenticationService; + private readonly IProjectActivityRepository _projectActivityRepository; + private readonly IActivityTypeRepository _activityTypeRepository; private readonly IProjectEvaluationRepository _projectEvaluationRepository; public EvaluateSubmissionProject(IMapper mapper, IProjectRepository projectRepository, ITokenAuthenticationService tokenAuthenticationService, + IProjectActivityRepository projectActivityRepository, + IActivityTypeRepository activityTypeRepository, IProjectEvaluationRepository projectEvaluationRepository) { _mapper = mapper; _projectRepository = projectRepository; _tokenAuthenticationService = tokenAuthenticationService; + _projectActivityRepository = projectActivityRepository; + _activityTypeRepository = activityTypeRepository; _projectEvaluationRepository = projectEvaluationRepository; } #endregion @@ -67,8 +73,6 @@ public async Task Execute(EvaluateSubmissionProjectIn UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.SubmissionEvaluationDescription), nameof(input.SubmissionEvaluationDescription)); - // TODO: Processar atividades do projeto e calcular pontuação. - // Mapeia dados de entrada para entidade. projectEvaluation = new Entities.ProjectEvaluation(input.ProjectId, input.IsProductivityFellow, @@ -83,6 +87,41 @@ public async Task Execute(EvaluateSubmissionProjectIn TryCastEnum(input.EffectiveContributionToResearch), 0); + // Obtém atividades do Edital + var noticeActivities = await _activityTypeRepository.GetByNoticeId(project.Notice!.Id); + + // Obtém atividades do projeto + var projectActivities = await _projectActivityRepository.GetByProjectId(project.Id); + + // Valida se todas as atividades do projeto foram informadas corretamente + var updateProjectActivities = new List(); + foreach (var activityType in noticeActivities) + { + // Verifica se as atividades que o professor informou existem no edital + // e se todas as atividades do edital foram informadas. + foreach (var activity in activityType.Activities!) + { + // Verifica se professor informou valor para essa atividade do edital + var inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) + ?? throw UseCaseException.BusinessRuleViolation($"Não foi informado valor para a atividade {activity.Name}."); + + // Obtém atividade do projeto + var updateProjectActivity = projectActivities.FirstOrDefault(x => x.ActivityId == activity.Id); + + // Atualiza valores da entidade + updateProjectActivity!.FoundActivities = inputActivity.FoundActivities; + + // Calcula pontuação da atividade + projectEvaluation.APIndex += updateProjectActivity.CalculatePoints(); + + // Atualiza atividade do projeto no banco de dados + await _projectActivityRepository.Update(updateProjectActivity); + } + } + + // Calcula pontuação da avaliação + projectEvaluation.CalculateFinalScore(); + // Adiciona avaliação do projeto. await _projectEvaluationRepository.Create(projectEvaluation); diff --git a/src/Domain/Validation/ExceptionMessageFactory.cs b/src/Domain/Validation/ExceptionMessageFactory.cs index 6593ecff..7994deb5 100644 --- a/src/Domain/Validation/ExceptionMessageFactory.cs +++ b/src/Domain/Validation/ExceptionMessageFactory.cs @@ -9,4 +9,5 @@ public static class ExceptionMessageFactory public static string InvalidEmail(string prop) => $"Valor inválido para ({prop}). O email fornecido não é válido."; public static string InvalidCpf() => "Valor de CPF inválido. A sequência numérica não é um CPF válido de acordo com a lógica do governo."; public static string LessThan(string prop, string value) => $"O valor de ({prop}) não pode ser menor que {value}."; + public static string BusinessRuleViolation(string message) => message; } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs index 8666afe1..368b4d02 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs @@ -23,6 +23,7 @@ public void Configure(EntityTypeBuilder builder) builder.Property(p => p.DocumentsEvaluationDescription); builder.Property(p => p.APIndex).HasDefaultValue(0); + builder.Property(p => p.FinalScore).HasDefaultValue(0); builder.Property(p => p.Qualification).IsRequired(); builder.Property(p => p.ProjectProposalObjectives).IsRequired(); builder.Property(p => p.AcademicScientificProductionCoherence).IsRequired(); From 8dc8dee3a4cf9acb8248e14f63321a8d3804b103 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 25 Jul 2023 21:55:11 -0300 Subject: [PATCH 053/201] feat: add activities seeder --- .../Persistence/Persistence.csproj | 6 + src/Infrastructure/Persistence/README.md | 2 +- .../Persistence/Seeds/ActivitiesSeeder.cs | 128 ++++++++++++++++++ .../Persistence/Seeds/Data/activities.txt | 15 ++ .../Persistence/Seeds/Data/activity-types.txt | 3 + 5 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs create mode 100644 src/Infrastructure/Persistence/Seeds/Data/activities.txt create mode 100644 src/Infrastructure/Persistence/Seeds/Data/activity-types.txt diff --git a/src/Infrastructure/Persistence/Persistence.csproj b/src/Infrastructure/Persistence/Persistence.csproj index f7d0387a..4e6f34ec 100644 --- a/src/Infrastructure/Persistence/Persistence.csproj +++ b/src/Infrastructure/Persistence/Persistence.csproj @@ -53,6 +53,12 @@ + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index 70ab2d2b..d01c2019 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add UpdateProjectActivities --project ../Persistence/Persistence.csproj +dotnet ef migrations add AddFieldToProjectEvaluation --project ../Persistence/Persistence.csproj ``` Executando as Migrations: diff --git a/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs b/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs new file mode 100644 index 00000000..a619597a --- /dev/null +++ b/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs @@ -0,0 +1,128 @@ +using Domain.Entities; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Persistence.Seeds +{ + public static class ActivitiesSeeder + { + public static void Seed(MigrationBuilder builder) + { + // Carrega tipos de atividades + string activityTypePath = Path.Combine(AppContext.BaseDirectory, "Seeds", "Data", "activity-types.txt"); + string[] activityTypeLines = File.ReadAllLines(activityTypePath); + + // Carrega atividades + string activitiesPath = Path.Combine(AppContext.BaseDirectory, "Seeds", "Data", "activities.txt"); + string[] activitiesLines = File.ReadAllLines(activitiesPath); + + // Cria edital base no banco + var noticeId = AddDefaultNotice(builder); + + // Cria tipos de atividades e atividades + foreach (string activityTypeLine in activityTypeLines) + { + // Carrega dados do tipo de atividade + var codeAT = activityTypeLine.Split(";")[0].Trim(); + var nameAT = activityTypeLine.Split(";")[1].Trim(); + var unityAT = activityTypeLine.Split(";")[2].Trim(); + + // Cria tipo de atividade no banco + var newActivityTypeId = AddActivityType(builder, nameAT, unityAT, noticeId); + + // Cria atividades + foreach (var activity in activitiesLines.Where(a => a.Split(";")[0] == codeAT)) + { + // Carrega dados da atividade + var codeA = activity.Split(";")[0].Trim(); + var nameA = activity.Split(";")[1].Trim(); + var pointsA = activity.Split(";")[2].Trim(); + var limitsA = activity.Split(";")[2].Trim(); + + // Trata valores nulos + if (limitsA == "NULL") + limitsA = null; + + // Cria atividade no banco + AddActivity(builder, newActivityTypeId, nameA, pointsA, limitsA); + } + } + } + + private static Guid AddDefaultNotice(MigrationBuilder builder) + { + var newNoticeId = Guid.NewGuid(); + builder.InsertData( + table: "Notices", + columns: new[] + { + "Id", "DeletedAt", + "RegistrationStartDate", "RegistrationEndDate", + "EvaluationStartDate", "EvaluationEndDate", + "AppealStartDate", "AppealEndDate", + "SendingDocsStartDate", "SendingDocsEndDate", + "PartialReportDeadline", "FinalReportDeadline", + "SuspensionYears", "DocUrl", "CreatedAt" + }, + values: new object[,] + { + { + newNoticeId, + null!, + new DateTime(1990, 8, 1).ToUniversalTime(), // Registration Start Date + new DateTime(1990, 8, 31).ToUniversalTime(), // Registration End Date + new DateTime(1990, 9, 15).ToUniversalTime(), // Evaluation Start Date + new DateTime(1990, 9, 30).ToUniversalTime(), // Evaluation End Date + new DateTime(1990, 10, 10).ToUniversalTime(), // Appeal Start Date + new DateTime(1990, 10, 15).ToUniversalTime(), // Appeal End Date + new DateTime(1990, 11, 1).ToUniversalTime(), // Sending Docs Start Date + new DateTime(1990, 11, 15).ToUniversalTime(), // Sending Docs End Date + new DateTime(1991, 1, 15).ToUniversalTime(), // Partial Report Deadline + new DateTime(1991, 3, 15).ToUniversalTime(), // Final Report Deadline + 1, // Suspension Years + null!, // Doc URL + DateTime.UtcNow + }, + }, + schema: "public"); + return newNoticeId; + } + + private static Guid AddActivityType(MigrationBuilder builder, string name, string unity, Guid noticeId) + { + var newActivityTypeId = Guid.NewGuid(); + + builder.InsertData( + table: "ActivityTypes", + columns: new[] { "Id", "DeletedAt", "Name", "Unity", "NoticeId" }, + values: new object[,] + { + { newActivityTypeId, null!, name, unity, noticeId }, + }, + schema: "public"); + + return newActivityTypeId; + } + + private static void AddActivity(MigrationBuilder builder, Guid newActivityTypeId, string name, string points, string? limits) + { + builder.InsertData( + table: "Activities", + columns: new[] + { + "Id", "DeletedAt", "Name", "Points", "Limits", "ActivityTypeId" + }, + values: new object[,] + { + { + Guid.NewGuid(), + null!, + name, + points, + limits!, + newActivityTypeId + }, + }, + schema: "public"); + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Seeds/Data/activities.txt b/src/Infrastructure/Persistence/Seeds/Data/activities.txt new file mode 100644 index 00000000..c9df7aef --- /dev/null +++ b/src/Infrastructure/Persistence/Seeds/Data/activities.txt @@ -0,0 +1,15 @@ +001;Periódicos indexados nas bases do tipo 1 ou constrantes na base QUALIS A1 a A4;10;NULL +001;Periódicos indexados nas bases do tipo 2 ou constrantes na base QUALIS B1 e B2;6;30 +001;Periódicos constantes na base QUALIS B3 e B4;4;20 +001;Anais de Congressos;3;12 +001;Livros Completo;12;NULL +001;Livros Organizado;6;36 +001;Livros Capítulo;5;30 +001;Livros Tradução;4;24 +001;Participação em comissão editorial de editoras e instituições acadêmicas;2;8 +002;Autoria, coautoria, curadoria, direção de produções artísticas e culturais demostradas publicamente por meios típicos e característicos das áreas de artes visuais, dança, música, teatro, fotografia, cinema e afins - participação completa em todo trabalho;8;NULL +002;Autoria, coautoria, curadoria, direção de produções artísticas e culturais demostradas publicamente por meios típicos e característicos das áreas de artes visuais, dança, música, teatro, fotografia, cinema e afins - participação parcial no trabalho;1.5;4.5 +002;Composição ou Apresentação individual ou coletiva;2;12 +003;Carta patente com titularidade do CEFET/RJ;15;NULL +003;Depósito de patente com titularidade do CEFET/RJ;7.5;NULL +003;Registro de Software;1;2 \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Seeds/Data/activity-types.txt b/src/Infrastructure/Persistence/Seeds/Data/activity-types.txt new file mode 100644 index 00000000..bd819513 --- /dev/null +++ b/src/Infrastructure/Persistence/Seeds/Data/activity-types.txt @@ -0,0 +1,3 @@ +001;Produção Científica; Trabalhos Publicados +002;Produção Artística e Cultural; Produção Apresentada +003;Produção Técnica; Produtos Registrados \ No newline at end of file From 599f961235613967831e39d2360820ec47dfb534 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 26 Jul 2023 16:11:18 -0300 Subject: [PATCH 054/201] chore(ci): remove test variable --- .github/workflows/azure-webapps-dotnet-core.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index a15240df..f9ff66ee 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -47,8 +47,7 @@ jobs: JWT_ISSUER=${{ secrets.JWT_ISSUER }} JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }} SMTP_EMAIL_PASSWORD=${{ secrets.SMTP_EMAIL_PASSWORD }} - SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }} - TEST_SECRETS=${{ secrets.TESTE }}" > src/Infrastructure/WebAPI/.env + SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }}" > src/Infrastructure/WebAPI/.env - name: Set environment variable run: echo "ASPNETCORE_ENVIRONMENT=${{ env.ASPNETCORE_ENVIRONMENT }}" >> $GITHUB_ENV From 9db07910f8ea3e8ca42543ee5137a85389a8aeba Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 26 Jul 2023 16:11:36 -0300 Subject: [PATCH 055/201] fix: adjust project evaluation usecases --- src/Domain/Entities/Enums/EProjectStatus.cs | 2 +- src/Domain/Entities/ProjectEvaluation.cs | 6 +++++- .../ProjectEvaluation/EvaluateAppealProject.cs | 10 ++++++---- .../ProjectEvaluation/EvaluateSubmissionProject.cs | 10 ++++------ 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/Domain/Entities/Enums/EProjectStatus.cs b/src/Domain/Entities/Enums/EProjectStatus.cs index f54acc07..e6700328 100644 --- a/src/Domain/Entities/Enums/EProjectStatus.cs +++ b/src/Domain/Entities/Enums/EProjectStatus.cs @@ -31,7 +31,7 @@ public enum EProjectStatus [Description("Cancelado: Projeto cancelado pelo professor ou administrador.")] Canceled, - [Description("Encerrado: Projeto concluído, o Orientador possui 30 dias para entregar o Relatório Final, do contrário sua conta será suspensa.")] + [Description("Encerrado: Projeto concluído, o Orientador deve entregar o Relatório Final dentro do período estipulado no Edital, do contrário sua conta será suspensa.")] Closed } } \ No newline at end of file diff --git a/src/Domain/Entities/ProjectEvaluation.cs b/src/Domain/Entities/ProjectEvaluation.cs index f67e13ac..2843492d 100644 --- a/src/Domain/Entities/ProjectEvaluation.cs +++ b/src/Domain/Entities/ProjectEvaluation.cs @@ -239,13 +239,17 @@ public ProjectEvaluation(Guid? projectId, SubmissionEvaluatorId = submissionEvaluatorId; SubmissionEvaluationStatus = submissionEvaluationStatus; SubmissionEvaluationDate = submissionEvaluationDate; - SubmissionEvaluationDescription = submissionEvaluationDescription; Qualification = qualification; ProjectProposalObjectives = projectProposalObjectives; AcademicScientificProductionCoherence = academicScientificProductionCoherence; ProposalMethodologyAdaptation = proposalMethodologyAdaptation; EffectiveContributionToResearch = effectiveContributionToResearch; APIndex = apIndex; + + // Define a descrição da avaliação da submissão. + SubmissionEvaluationDescription = submissionEvaluationStatus == EProjectStatus.Accepted + ? EProjectStatus.Accepted.GetDescription() + : submissionEvaluationDescription; } #endregion diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs index 9089a6b0..80adc581 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs @@ -79,15 +79,17 @@ public async Task Execute(EvaluateAppealProjectInput // Se projeto foi aceito, adiciona prazo para envio da documentação. if ((EProjectStatus)input.AppealEvaluationStatus == EProjectStatus.Accepted) { - project.Status = EProjectStatus.DocumentAnalysis; - project.StatusDescription = EProjectStatus.DocumentAnalysis.GetDescription(); + project.Status = EProjectStatus.Accepted; + project.StatusDescription = EProjectStatus.Accepted.GetDescription(); } else { - project.Status = EProjectStatus.Rejected; - project.StatusDescription = EProjectStatus.Rejected.GetDescription(); + project.Status = EProjectStatus.Canceled; + project.StatusDescription = EProjectStatus.Canceled.GetDescription(); } + // TODO: Informar ao professor o resultado da avaliação. + // Atualiza projeto. var output = await _projectRepository.Update(project); diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs index 72d79de1..29a2ce37 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -69,10 +69,6 @@ public async Task Execute(EvaluateSubmissionProjectIn UseCaseException.NotInformedParam(input.SubmissionEvaluationStatus is null, nameof(input.SubmissionEvaluationStatus)); - // Verifica se a descrição da avaliação foi informada. - UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.SubmissionEvaluationDescription), - nameof(input.SubmissionEvaluationDescription)); - // Mapeia dados de entrada para entidade. projectEvaluation = new Entities.ProjectEvaluation(input.ProjectId, input.IsProductivityFellow, @@ -128,8 +124,8 @@ public async Task Execute(EvaluateSubmissionProjectIn // Se projeto foi aceito, adiciona prazo para envio da documentação. if (projectEvaluation.SubmissionEvaluationStatus == EProjectStatus.Accepted) { - project.Status = EProjectStatus.DocumentAnalysis; - project.StatusDescription = EProjectStatus.DocumentAnalysis.GetDescription(); + project.Status = EProjectStatus.Accepted; + project.StatusDescription = EProjectStatus.Accepted.GetDescription(); } else { @@ -137,6 +133,8 @@ public async Task Execute(EvaluateSubmissionProjectIn project.StatusDescription = EProjectStatus.Rejected.GetDescription(); } + // TODO: Informar ao professor o resultado da avaliação. + // Atualiza projeto. var output = await _projectRepository.Update(project); From 12aa2c32ae9dddd2b0f7215c28323dc4d7253a38 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 27 Jul 2023 09:37:56 -0300 Subject: [PATCH 056/201] feat(entities): add SuspensionEndDate to professor --- src/Domain/Entities/Professor.cs | 13 +++++++++++++ .../Interfaces/Repositories/IProfessorRepository.cs | 5 ++++- .../EntitiesConfiguration/ProfessorConfiguration.cs | 1 + .../Persistence/Repositories/ProfessorRepository.cs | 10 ++++++++-- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/Domain/Entities/Professor.cs b/src/Domain/Entities/Professor.cs index d42965ab..61f0169c 100644 --- a/src/Domain/Entities/Professor.cs +++ b/src/Domain/Entities/Professor.cs @@ -59,6 +59,19 @@ public Guid? UserId } } + /// + /// Data de início da suspensão do professor + /// + private DateTime? _suspensionEndDate; + public DateTime? SuspensionEndDate + { + get => _suspensionEndDate; + set + { + _suspensionEndDate = value.HasValue ? value.Value.ToUniversalTime() : null; + } + } + public virtual User? User { get; } #endregion diff --git a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs index baf6effe..2d6daf5f 100644 --- a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs @@ -3,5 +3,8 @@ namespace Domain.Interfaces.Repositories { - public interface IProfessorRepository : IGenericCRUDRepository { } + public interface IProfessorRepository : IGenericCRUDRepository + { + Task> GetAllActiveProfessors(); + } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ProfessorConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ProfessorConfiguration.cs index f24833bb..46983e9f 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/ProfessorConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ProfessorConfiguration.cs @@ -20,6 +20,7 @@ public void Configure(EntityTypeBuilder builder) builder.Property(p => p.UserId) .IsRequired(); builder.Property(p => p.DeletedAt); + builder.Property(p => p.SuspensionEndDate); builder.HasOne(a => a.User) .WithOne() diff --git a/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs b/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs index 2fba22f0..4d80ded3 100644 --- a/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs @@ -22,10 +22,10 @@ public async Task Create(Professor model) public async Task> GetAll(int skip, int take) => await _context.Professors .Include(x => x.User) + .OrderBy(x => x.User!.Name) + .AsAsyncEnumerable() .Skip(skip) .Take(take) - .AsAsyncEnumerable() - .OrderBy(x => x.User?.Name) .ToListAsync(); public async Task GetById(Guid? id) => @@ -49,6 +49,12 @@ public async Task Update(Professor model) await _context.SaveChangesAsync(); return model; } + + public async Task> GetAllActiveProfessors() => await _context.Professors + .Include(x => x.User) + .AsAsyncEnumerable() + .Where(x => x.SuspensionEndDate < DateTime.UtcNow || x.SuspensionEndDate == null) + .ToListAsync(); #endregion } } \ No newline at end of file From a494d2a8293e5e26eb04f5f7deb3a0c3ab045bcf Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 27 Jul 2023 09:38:30 -0300 Subject: [PATCH 057/201] feat(entities): add DeletedAt to ProjectEvaluation --- src/Domain/Entities/ProjectEvaluation.cs | 5 ++--- .../EntitiesConfiguration/ProjectEvaluationConfiguration.cs | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Domain/Entities/ProjectEvaluation.cs b/src/Domain/Entities/ProjectEvaluation.cs index 2843492d..4ad99afc 100644 --- a/src/Domain/Entities/ProjectEvaluation.cs +++ b/src/Domain/Entities/ProjectEvaluation.cs @@ -1,12 +1,11 @@ using Domain.Entities.Enums; +using Domain.Entities.Primitives; using Domain.Validation; namespace Domain.Entities { - public class ProjectEvaluation + public class ProjectEvaluation : Entity { - public Guid? Id { get; protected set; } - #region Properties #region Informações Gerais da Avaliação private Guid? _projectId; diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs index 368b4d02..d535f882 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectEvaluationConfiguration.cs @@ -47,6 +47,8 @@ public void Configure(EntityTypeBuilder builder) builder.HasOne(a => a.DocumentsEvaluator) .WithMany() .HasForeignKey(a => a.DocumentsEvaluatorId); + + builder.HasQueryFilter(x => x.DeletedAt == null); } } } \ No newline at end of file From 4e53848cc77996cad46a231821e89c09888fa898 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 27 Jul 2023 09:39:16 -0300 Subject: [PATCH 058/201] feat(usecases): add email alerts to Notice and ProjectEvaluation --- .../Interfaces/Services/IEmailService.cs | 2 + src/Domain/UseCases/Notice/CreateNotice.cs | 21 ++++ .../EvaluateAppealProject.cs | 11 +- .../EvaluateSubmissionProject.cs | 11 +- src/Infrastructure/Persistence/README.md | 2 +- .../Repositories/ProjectRepository.cs | 5 +- .../Services/Email/EmailService.cs | 119 +++++++++++------- .../Services/Email/Templates/NewEdital.html | 87 +++++++++++++ .../Email/Templates/ProjectStatusChange.html | 64 ++++++++++ 9 files changed, 273 insertions(+), 49 deletions(-) create mode 100644 src/Infrastructure/Services/Email/Templates/NewEdital.html create mode 100644 src/Infrastructure/Services/Email/Templates/ProjectStatusChange.html diff --git a/src/Domain/Interfaces/Services/IEmailService.cs b/src/Domain/Interfaces/Services/IEmailService.cs index f227562c..7bed2729 100644 --- a/src/Domain/Interfaces/Services/IEmailService.cs +++ b/src/Domain/Interfaces/Services/IEmailService.cs @@ -3,4 +3,6 @@ public interface IEmailService { Task SendConfirmationEmail(string? email, string? name, string? token); Task SendResetPasswordEmail(string? email, string? name, string? token); + Task SendNoticeEmail(string? email, string? name, DateTime? registrationStartDate, DateTime? registrationEndDate, string? noticeUrl); + Task SendProjectNotificationEmail(string? email, string? name, string? projectTitle, string? status, string? description); } \ No newline at end of file diff --git a/src/Domain/UseCases/Notice/CreateNotice.cs b/src/Domain/UseCases/Notice/CreateNotice.cs index cc60b23b..22fd763a 100644 --- a/src/Domain/UseCases/Notice/CreateNotice.cs +++ b/src/Domain/UseCases/Notice/CreateNotice.cs @@ -14,18 +14,24 @@ public class CreateNotice : ICreateNotice private readonly IStorageFileService _storageFileService; private readonly IActivityTypeRepository _activityTypeRepository; private readonly IActivityRepository _activityRepository; + private readonly IProfessorRepository _professorRepository; + private readonly IEmailService _emailService; private readonly IMapper _mapper; public CreateNotice( INoticeRepository repository, IStorageFileService storageFileService, IActivityTypeRepository activityTypeRepository, IActivityRepository activityRepository, + IProfessorRepository professorRepository, + IEmailService emailService, IMapper mapper) { _repository = repository; _storageFileService = storageFileService; _activityTypeRepository = activityTypeRepository; _activityRepository = activityRepository; + _professorRepository = professorRepository; + _emailService = emailService; _mapper = mapper; } #endregion @@ -89,6 +95,21 @@ public async Task Execute(CreateNoticeInput input) } } + // Obtém professores ativos + var professors = await _professorRepository.GetAllActiveProfessors(); + + // Envia email de notificação para todos os professores ativos + foreach (var professor in professors) + { + // Envia email de notificação + await _emailService.SendNoticeEmail( + professor.User!.Email, + professor.User!.Name, + notice.RegistrationStartDate, + notice.RegistrationEndDate, + notice.DocUrl); + } + // Salva entidade no banco return _mapper.Map(notice); } diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs index 80adc581..5642042b 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs @@ -14,15 +14,18 @@ public class EvaluateAppealProject : IEvaluateAppealProject #region Global Scope private readonly IMapper _mapper; private readonly IProjectRepository _projectRepository; + private readonly IEmailService _emailService; private readonly ITokenAuthenticationService _tokenAuthenticationService; private readonly IProjectEvaluationRepository _projectEvaluationRepository; public EvaluateAppealProject(IMapper mapper, IProjectRepository projectRepository, + IEmailService emailService, ITokenAuthenticationService tokenAuthenticationService, IProjectEvaluationRepository projectEvaluationRepository) { _mapper = mapper; _projectRepository = projectRepository; + _emailService = emailService; _tokenAuthenticationService = tokenAuthenticationService; _projectEvaluationRepository = projectEvaluationRepository; } @@ -88,7 +91,13 @@ public async Task Execute(EvaluateAppealProjectInput project.StatusDescription = EProjectStatus.Canceled.GetDescription(); } - // TODO: Informar ao professor o resultado da avaliação. + // Informa ao professor o resultado da avaliação. + await _emailService.SendProjectNotificationEmail( + project.Professor!.User!.Email, + project.Professor!.User!.Name, + project.Title, + project.StatusDescription, + projectEvaluation.SubmissionEvaluationDescription); // Atualiza projeto. var output = await _projectRepository.Update(project); diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs index 29a2ce37..3ec883fa 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -17,12 +17,14 @@ public class EvaluateSubmissionProject : IEvaluateSubmissionProject private readonly ITokenAuthenticationService _tokenAuthenticationService; private readonly IProjectActivityRepository _projectActivityRepository; private readonly IActivityTypeRepository _activityTypeRepository; + private readonly IEmailService _emailService; private readonly IProjectEvaluationRepository _projectEvaluationRepository; public EvaluateSubmissionProject(IMapper mapper, IProjectRepository projectRepository, ITokenAuthenticationService tokenAuthenticationService, IProjectActivityRepository projectActivityRepository, IActivityTypeRepository activityTypeRepository, + IEmailService emailService, IProjectEvaluationRepository projectEvaluationRepository) { _mapper = mapper; @@ -30,6 +32,7 @@ public EvaluateSubmissionProject(IMapper mapper, _tokenAuthenticationService = tokenAuthenticationService; _projectActivityRepository = projectActivityRepository; _activityTypeRepository = activityTypeRepository; + _emailService = emailService; _projectEvaluationRepository = projectEvaluationRepository; } #endregion @@ -133,7 +136,13 @@ public async Task Execute(EvaluateSubmissionProjectIn project.StatusDescription = EProjectStatus.Rejected.GetDescription(); } - // TODO: Informar ao professor o resultado da avaliação. + // Informa ao professor o resultado da avaliação. + await _emailService.SendProjectNotificationEmail( + project.Professor!.User!.Email, + project.Professor!.User!.Name, + project.Title, + project.StatusDescription, + projectEvaluation.SubmissionEvaluationDescription); // Atualiza projeto. var output = await _projectRepository.Update(project); diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index d01c2019..c8f8881f 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add AddFieldToProjectEvaluation --project ../Persistence/Persistence.csproj +dotnet ef migrations add AddDeletedAtToProjectEvaluation --project ../Persistence/Persistence.csproj ``` Executando as Migrations: diff --git a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs index fa4894bc..ebd2fbef 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs @@ -36,11 +36,12 @@ public async Task Delete(Guid? id) public async Task GetById(Guid? id) { return await _context.Projects + .Include(x => x.Notice) + .Include(x => x.SubArea) .Include(x => x.Student) .Include(x => x.Professor) - .Include(x => x.SubArea) .Include(x => x.ProgramType) - .Include(x => x.Notice) + .Include(x => x.Professor!.User) .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id) diff --git a/src/Infrastructure/Services/Email/EmailService.cs b/src/Infrastructure/Services/Email/EmailService.cs index 5d04793b..bcba3090 100644 --- a/src/Infrastructure/Services/Email/EmailService.cs +++ b/src/Infrastructure/Services/Email/EmailService.cs @@ -10,6 +10,7 @@ public class EmailService : IEmailService private readonly int _smtpPort; private readonly string? _smtpUsername; private readonly string? _smtpPassword; + private readonly string? _currentDirectory; public EmailService(string? smtpServer, int smtpPort, string? smtpUsername, string? smtpPassword) { @@ -17,6 +18,7 @@ public EmailService(string? smtpServer, int smtpPort, string? smtpUsername, stri _smtpPort = smtpPort; _smtpUsername = smtpUsername; _smtpPassword = smtpPassword; + _currentDirectory = Path.GetDirectoryName(typeof(EmailService).Assembly.Location); } #endregion @@ -27,25 +29,15 @@ public async Task SendConfirmationEmail(string? email, string? name, strin throw new Exception("Parâmetros inválidos. Email, nome e token são obrigatórios."); // Lê mensagem do template em html salvo localmente - string? currentDirectory = Path.GetDirectoryName(typeof(EmailService).Assembly.Location) ?? throw new Exception("Não foi possível encontrar o diretório atual do projeto."); - - // Lê mensagem do template em html salvo localmente - string template = await File.ReadAllTextAsync(Path.Combine(currentDirectory!, "Email/Templates/ConfirmEmail.html")); + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ConfirmEmail.html")); // Gera mensagem de envio const string subject = "Confirmação de Cadastro"; string body = template.Replace("#USER_NAME#", name).Replace("#USER_TOKEN#", token); // Tentativa de envio de email - try - { - await SendEmailAsync(email, subject, body); - return true; - } - catch (Exception ex) - { - throw new Exception($"Não foi possível enviar o email de confirmação. {ex.Message}"); - } + await SendEmailAsync(email, subject, body); + return true; } public async Task SendResetPasswordEmail(string? email, string? name, string? token) @@ -55,50 +47,89 @@ public async Task SendResetPasswordEmail(string? email, string? name, stri throw new Exception("Parâmetros inválidos. Email, nome e token são obrigatórios."); // Lê mensagem do template em html salvo localmente - string? currentDirectory = Path.GetDirectoryName(typeof(EmailService).Assembly.Location) ?? throw new Exception("Não foi possível encontrar o diretório atual do projeto."); - - // Lê mensagem do template em html salvo localmente - string template = await File.ReadAllTextAsync(Path.Combine(currentDirectory!, "Email/Templates/ResetPassword.html")); + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ResetPassword.html")); // Gera mensagem de envio const string subject = "Recuperação de Senha"; string body = template.Replace("#USER_NAME#", name).Replace("#USER_TOKEN#", token); // Tentativa de envio de email - try - { - await SendEmailAsync(email, subject, body); - return true; - } - catch (Exception ex) - { - throw new Exception($"Não foi possível enviar o email de recuperação de senha. {ex.Message}"); - } + await SendEmailAsync(email, subject, body); + return true; + } + + public async Task SendNoticeEmail(string? email, string? name, DateTime? registrationStartDate, DateTime? registrationEndDate, string? noticeUrl) + { + // Verifica se os parâmetros são nulos ou vazios + if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || registrationStartDate == null || registrationEndDate == null || string.IsNullOrEmpty(noticeUrl)) + throw new Exception("Parâmetros inválidos. Email, nome, data de início e fim das inscrições e url do edital são obrigatórios."); + + // Lê mensagem do template em html salvo localmente + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/NewEdital.html")); + + // Gera mensagem de envio + const string subject = "Novo Edital"; + string body = template + .Replace("#PROFESSOR_NAME#", name) + .Replace("#START_DATE#", registrationStartDate.Value.ToString("dd/MM/yyyy")) + .Replace("#END_DATE#", registrationEndDate.Value.ToString("dd/MM/yyyy")) + .Replace("#NOTICE_URL#", noticeUrl); + + // Tentativa de envio de email + await SendEmailAsync(email, subject, body); + } + + public async Task SendProjectNotificationEmail(string? email, string? name, string? projectTitle, string? status, string? description) + { + // Verifica se os parâmetros são nulos ou vazios + if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(projectTitle) || string.IsNullOrEmpty(status) || string.IsNullOrEmpty(description)) + throw new Exception("Parâmetros inválidos. Email, título do projeto, status e descrição são obrigatórios."); + + // Lê mensagem do template em html salvo localmente + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ProjectStatusChange.html")); + + // Gera mensagem de envio + const string subject = "Alteração de Status de Projeto"; + string body = template + .Replace("#PROFESSOR_NAME#", name) + .Replace("#PROJECT_TITLE#", projectTitle) + .Replace("#PROJECT_STATUS#", status) + .Replace("#PROJECT_DESCRIPTION#", description); + + // Tentativa de envio de email + await SendEmailAsync(email, subject, body); } #region Private Methods public async Task SendEmailAsync(string email, string subject, string message) { - // Verifica se os parâmetros são nulos ou vazios - if (_smtpServer == null || _smtpUsername == null || _smtpPassword == null) - throw new Exception("Parâmetros de configuração de email não foram encontrados."); + try + { + // Verifica se os parâmetros são nulos ou vazios + if (_smtpServer == null || _smtpUsername == null || _smtpPassword == null) + throw new Exception("Parâmetros de configuração de email não foram encontrados."); + + // Cria objeto de mensagem + var mc = new MailMessage(_smtpUsername, email) + { + Subject = subject, + Body = message, + IsBodyHtml = true + }; - // Cria objeto de mensagem - var mc = new MailMessage(_smtpUsername, email) + // Envia mensagem + using var smtpClient = new SmtpClient(_smtpServer, _smtpPort); + smtpClient.Timeout = 1000000; + smtpClient.EnableSsl = true; + smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; + smtpClient.UseDefaultCredentials = false; + smtpClient.Credentials = new NetworkCredential(_smtpUsername, _smtpPassword); + await smtpClient.SendMailAsync(mc); + } + catch (Exception ex) { - Subject = subject, - Body = message, - IsBodyHtml = true - }; - - // Envia mensagem - using var smtpClient = new SmtpClient(_smtpServer, _smtpPort); - smtpClient.Timeout = 1000000; - smtpClient.EnableSsl = true; - smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; - smtpClient.UseDefaultCredentials = false; - smtpClient.Credentials = new NetworkCredential(_smtpUsername, _smtpPassword); - await smtpClient.SendMailAsync(mc); + throw new Exception($"Não foi possível enviar o email de notificação de novo edital. {ex.Message}"); + } } #endregion } \ No newline at end of file diff --git a/src/Infrastructure/Services/Email/Templates/NewEdital.html b/src/Infrastructure/Services/Email/Templates/NewEdital.html new file mode 100644 index 00000000..c2811cc6 --- /dev/null +++ b/src/Infrastructure/Services/Email/Templates/NewEdital.html @@ -0,0 +1,87 @@ + + + + + + Novo Edital Disponível + + + +
+

Novo Edital Disponível

+

Olá #PROFESSOR_NAME#,

+

Informamos que um novo edital está disponível em nossa plataforma.

+

+ O período para registrar seu projeto de pesquisa é de + #START_DATE# até #END_DATE#. +

+

+ Para mais informações acesse a plataforma do G-PIC ou consulte as + informações do Edital através do link abaixo. +

+ +

Atenciosamente,
G-PIC

+

+ Este e-mail foi enviado automaticamente. Por favor, não responda. + +
Gerenciador de Projetos de Iniciação Científica, CEFET +
+

+
+ + diff --git a/src/Infrastructure/Services/Email/Templates/ProjectStatusChange.html b/src/Infrastructure/Services/Email/Templates/ProjectStatusChange.html new file mode 100644 index 00000000..036336e6 --- /dev/null +++ b/src/Infrastructure/Services/Email/Templates/ProjectStatusChange.html @@ -0,0 +1,64 @@ + + + + + + Status do Projeto Alterado + + + +
+

Status do Projeto Alterado

+

Olá #PROFESSOR_NAME#,

+

+ Informamos que o status do seu projeto com o título + "#PROJECT_TITLE#" foi alterado pelo avaliador. +

+

Novo Status: #PROJECT_STATUS#

+

Descrição do Status: #PROJECT_DESCRIPTION#

+

+ Para mais detalhes, você pode acessar o projeto na nossa plataforma. +

+

Atenciosamente,
G-PIC

+

+ Este e-mail foi enviado automaticamente. Por favor, não responda. + +
Gerenciador de Projetos de Iniciação Científica, CEFET +
+

+
+ + From ab75a240e303ea4cf0b0273aa76f4bc02ebc3e99 Mon Sep 17 00:00:00 2001 From: PSThiago Date: Sun, 30 Jul 2023 17:36:14 -0300 Subject: [PATCH 059/201] feat(CORS): add CORS policy. --- src/Infrastructure/WebAPI/Startup.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Infrastructure/WebAPI/Startup.cs b/src/Infrastructure/WebAPI/Startup.cs index 993f9687..8b5171f9 100644 --- a/src/Infrastructure/WebAPI/Startup.cs +++ b/src/Infrastructure/WebAPI/Startup.cs @@ -27,6 +27,18 @@ public void ConfigureServices(IServiceCollection services) // Configuração do JWT services.AddInfrastructureJWT(); + // Configuração do CORS + services.AddCors(options => + { + options.AddDefaultPolicy( + policy => + { + policy.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader(); + }); + }); + // Permite que rotas sejam acessíveis em lowercase services.AddRouting(options => options.LowercaseUrls = true); } From 4375b354316d8f53cdefd61f435eb4fc55e2ec13 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sun, 30 Jul 2023 21:44:48 -0300 Subject: [PATCH 060/201] feat: add cors configuration --- src/Infrastructure/WebAPI/Program.cs | 27 +++--- src/Infrastructure/WebAPI/Startup.cs | 130 +++++++++++++++------------ 2 files changed, 89 insertions(+), 68 deletions(-) diff --git a/src/Infrastructure/WebAPI/Program.cs b/src/Infrastructure/WebAPI/Program.cs index 0b7531cb..7639d45b 100644 --- a/src/Infrastructure/WebAPI/Program.cs +++ b/src/Infrastructure/WebAPI/Program.cs @@ -1,15 +1,20 @@ -namespace Infrastructure.WebAPI; -/// -/// Classe de iniciação da WebAPI. -/// -public static class Program +namespace WebAPI { /// - /// Método principal da WebAPI. + /// Classe de iniciação da WebAPI. /// - public static void Main(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup()) - .Build() - .Run(); + public static class Program + { + /// + /// Método principal da WebAPI. + /// + /// + public static void Main(string[] args) + { + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup()) + .Build() + .Run(); + } + } } \ No newline at end of file diff --git a/src/Infrastructure/WebAPI/Startup.cs b/src/Infrastructure/WebAPI/Startup.cs index d24512f3..7736c427 100644 --- a/src/Infrastructure/WebAPI/Startup.cs +++ b/src/Infrastructure/WebAPI/Startup.cs @@ -2,77 +2,93 @@ using Infrastructure.IoC; using Infrastructure.WebAPI.Middleware; -namespace Infrastructure.WebAPI; - -/// -/// Classe de iniciação da WebAPI. -/// -public class Startup +namespace WebAPI { /// - /// Realiza a configuração dos serviços de injeção de dependência. + /// Classe de iniciação da WebAPI. /// - public void ConfigureServices(IServiceCollection services) + public class Startup { - // Adição dos Controllers - services.AddControllers(); - - // Realiza comunicação com os demais Projetos. - services.AddInfrastructure(); - services.AddAdapters(); - services.AddDomain(); - - // Configuração do Swagger - services.AddInfrastructureSwagger(); - - // Configuração do JWT - services.AddInfrastructureJWT(); - - // Permite que rotas sejam acessíveis em lowercase - services.AddRouting(options => options.LowercaseUrls = true); - } + /// + /// Realiza a configuração dos serviços de injeção de dependência. + /// + /// + public void ConfigureServices(IServiceCollection services) + { + // Adição dos Controllers + _ = services.AddControllers(); + + // Realiza comunicação com os demais Projetos. + _ = services.AddInfrastructure(); + _ = services.AddAdapters(); + _ = services.AddDomain(); + + // Configuração do Swagger + _ = services.AddInfrastructureSwagger(); + + // Configuração do JWT + _ = services.AddInfrastructureJWT(); + + // Permite que rotas sejam acessíveis em lowercase + _ = services.AddRouting(options => options.LowercaseUrls = true); + + // Configuração do CORS + _ = services.AddCors(options => + { + options.AddDefaultPolicy( + policy => + { + _ = policy.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader(); + }); + }); + } - /// - /// Adiciona as configurações de segurança, documentação e roteamento. - /// - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) + /// + /// Adiciona as configurações de segurança, documentação e roteamento. + /// + /// + /// + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - // Show detailed error page in development mode - app.UseDeveloperExceptionPage(); + if (env.IsDevelopment()) + { + // Show detailed error page in development mode + _ = app.UseDeveloperExceptionPage(); - // Enable Swagger middleware for API documentation in development mode - app.UseSwagger(); - app.UseSwaggerUI(); + // Enable Swagger middleware for API documentation in development mode + _ = app.UseSwagger(); + _ = app.UseSwaggerUI(); - // Show development mode message - Console.WriteLine("Development mode"); - } + // Show development mode message + Console.WriteLine("Development mode"); + } - // UseExceptionHandler for non-development environments - app.UseMiddleware(); + // UseExceptionHandler for non-development environments + _ = app.UseMiddleware(); - // Enable HTTP Strict Transport Security (HSTS) headers for secure communication - app.UseHsts(); + // Enable HTTP Strict Transport Security (HSTS) headers for secure communication + _ = app.UseHsts(); - // Redirect HTTP requests to HTTPS for secure communication - app.UseHttpsRedirection(); + // Redirect HTTP requests to HTTPS for secure communication + _ = app.UseHttpsRedirection(); - // Enable routing for incoming requests - app.UseRouting(); + // Enable routing for incoming requests + _ = app.UseRouting(); - // Enable authentication for the API - app.UseAuthentication(); + // Enable authentication for the API + _ = app.UseAuthentication(); - // Enable authorization for the API - app.UseAuthorization(); + // Enable authorization for the API + _ = app.UseAuthorization(); - // Apply rate limiting middleware to control the number of requests allowed - app.UseClientRateLimiting(); - app.UseIpRateLimiting(); + // Apply rate limiting middleware to control the number of requests allowed + _ = app.UseClientRateLimiting(); + _ = app.UseIpRateLimiting(); - // Configure API endpoints - app.UseEndpoints(endpoints => endpoints.MapControllers()); + // Configure API endpoints + _ = app.UseEndpoints(endpoints => endpoints.MapControllers()); + } } -} +} \ No newline at end of file From 5aa712b1e5ee7d35b1b5c83571957ec2b8d7cc11 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 31 Jul 2023 21:03:39 -0300 Subject: [PATCH 061/201] fix: adjust all namespaces --- .../Gateways/Area/CreateAreaRequest.cs | 8 +- .../Gateways/Area/DetailedReadAreaResponse.cs | 4 +- .../Gateways/Area/ResumedReadAreaResponse.cs | 8 +- .../Gateways/Area/UpdateAreaRequest.cs | 8 +- .../CreateTypeAssistanceRequest.cs | 8 +- .../DetailedReadTypeAssistanceResponse.cs | 8 +- .../ResumedReadTypeAssistanceResponse.cs | 8 +- .../UpdateTypeAssistanceRequest.cs | 8 +- .../Gateways/Auth/UserLoginRequest.cs | 8 +- .../Gateways/Auth/UserLoginResponse.cs | 8 +- .../Gateways/Auth/UserResetPasswordRequest.cs | 8 +- .../Gateways/Campus/CreateCampusRequest.cs | 8 +- .../Campus/DetailedReadCampusResponse.cs | 8 +- .../Campus/ResumedReadCampusResponse.cs | 8 +- .../Gateways/Campus/UpdateCampusRequest.cs | 8 +- .../Gateways/Course/CreateCourseRequest.cs | 8 +- .../Course/DetailedReadCourseResponse.cs | 8 +- .../Course/ResumedReadCourseResponse.cs | 8 +- .../Gateways/Course/UpdateCourseRequest.cs | 8 +- .../MainArea/CreateMainAreaRequest.cs | 8 +- .../MainArea/DetailedReadMainAreaResponse.cs | 8 +- .../MainArea/ResumedReadMainAreaResponse.cs | 8 +- .../MainArea/UpdateMainAreaRequest.cs | 8 +- .../Gateways/Notice/CreateNoticeRequest.cs | 12 +- .../Notice/DetailedReadNoticeResponse.cs | 8 +- .../Notice/ResumedReadNoticeResponse.cs | 8 +- .../Gateways/Notice/UpdateNoticeRequest.cs | 14 +- .../Professor/CreateProfessorRequest.cs | 8 +- .../DetailedReadProfessorResponse.cs | 2 +- .../Professor/ResumedReadProfessorResponse.cs | 8 +- .../Professor/UpdateProfessorRequest.cs | 8 +- .../ProgramType/CreateProgramTypeRequest.cs | 8 +- .../DetailedReadProgramTypeResponse.cs | 8 +- .../ResumedReadProgramTypeResponse.cs | 8 +- .../ProgramType/UpdateProgramTypeRequest.cs | 8 +- .../Project/DetailedReadProjectResponse.cs | 8 +- .../Project/ResumedReadProjectResponse.cs | 8 +- .../DetailedReadProjectEvaluationResponse.cs | 8 +- .../EvaluateAppealProjectRequest.cs | 8 +- .../Gateways/Student/CreateStudentRequest.cs | 8 +- .../Student/ResumedReadStudentResponse.cs | 8 +- .../Gateways/Student/UpdateStudentRequest.cs | 8 +- .../CreateStudentDocumentsRequest.cs | 8 +- .../DetailedReadStudentDocumentsResponse.cs | 8 +- .../ResumedReadStudentDocumentsResponse.cs | 8 +- .../UpdateStudentDocumentsRequest.cs | 8 +- .../Gateways/SubArea/CreateSubAreaRequest.cs | 8 +- .../SubArea/ResumedReadSubAreaResponse.cs | 8 +- .../Gateways/SubArea/UpdateSubAreaRequest.cs | 8 +- .../Gateways/User/UserReadResponse.cs | 8 +- .../Gateways/User/UserUpdateRequest.cs | 8 +- src/Adapters/Mappings/ActivityMappings.cs | 18 +- src/Adapters/Mappings/AreaMappings.cs | 15 +- src/Adapters/Mappings/AuthMappings.cs | 12 +- src/Adapters/Mappings/CampusMappings.cs | 14 +- src/Adapters/Mappings/CourseMappings.cs | 15 +- src/Adapters/Mappings/MainAreaMappings.cs | 14 +- src/Adapters/Mappings/NoticeMappings.cs | 30 +- src/Adapters/Mappings/ProfessorMappings.cs | 14 +- src/Adapters/Mappings/ProgramTypeMappings.cs | 14 +- .../Mappings/ProjectActivityMappings.cs | 16 +- .../Mappings/ProjectEvaluationMapping.cs | 10 +- src/Adapters/Mappings/ProjectMappings.cs | 14 +- .../Mappings/StudentDocumentsMappings.cs | 15 +- src/Adapters/Mappings/StudentMappings.cs | 14 +- src/Adapters/Mappings/SubAreaMappings.cs | 14 +- .../Mappings/TypeAssistanceMappings.cs | 14 +- src/Adapters/Mappings/UserMappings.cs | 10 +- .../ActivityPresenterController.cs | 6 +- .../AreaPresenterController.cs | 25 +- .../AuthPresenterController.cs | 26 +- .../CampusPresenterController.cs | 24 +- .../CoursePresenterController.cs | 25 +- .../MainAreaPresenterController.cs | 24 +- .../NoticePresenterController.cs | 21 +- .../ProfessorPresenterController.cs | 24 +- .../ProgramTypePresenterController.cs | 24 +- .../ProjectEvaluationPresenterController.cs | 16 +- .../ProjectPresenterController.cs | 26 +- .../StudentDocumentsPresenterController.cs | 20 +- .../StudentPresenterController.cs | 24 +- .../SubAreaPresenterController.cs | 24 +- .../TypeAssistancePresenterController.cs | 26 +- .../UserPresenterController.cs | 20 +- .../UseCases/Area/CreateAreaTests.cs | 10 +- .../UseCases/Area/DeleteAreaTests.cs | 10 +- .../UseCases/Area/GetAreaByIdTests.cs | 10 +- .../UseCases/Area/UpdateAreaTests.cs | 10 +- .../Contracts/Activity/ActivityTypeOutput.cs | 7 - src/Domain/Contracts/Activity/BaseActivity.cs | 11 - .../Contracts/Activity/BaseActivityType.cs | 12 - .../Contracts/Activity/CreateActivityInput.cs | 2 - .../Activity/CreateActivityTypeInput.cs | 12 - .../Activity/UpdateActivityTypeInput.cs | 15 - .../Contracts/MainArea/CreateMainAreaInput.cs | 7 - .../Contracts/Notice/CreateNoticeInput.cs | 9 - .../Project/ResumedReadProjectOutput.cs | 5 - .../BaseProjectActivityContract.cs | 10 - .../CreateProjectActivityInput.cs | 2 - .../DetailedReadProjectActivityOutput.cs | 8 - .../EvaluateProjectActivityInput.cs | 10 - .../ResumedReadProjectActivityOutput.cs | 7 - .../UpdateProjectActivityInput.cs | 8 - .../DetailedReadProjectEvaluationOutput.cs | 25 -- .../EvaluateAppealProjectInput.cs | 12 - .../EvaluateSubmissionProjectInput.cs | 32 -- .../CreateStudentDocumentsInput.cs | 63 --- .../DetailedReadStudentDocumentsOutput.cs | 5 - .../ResumedReadStudentDocumentsOutput.cs | 2 - .../UpdateStudentDocumentsInput.cs | 49 --- .../Bases/IGenericCRUDRepository.cs | 2 + .../Repositories/IActivityRepository.cs | 6 +- .../IProjectActivityRepository.cs | 8 +- .../Repositories/IProjectRepository.cs | 6 + .../IStudentDocumentsRepository.cs | 10 +- .../Repositories/IStudentRepository.cs | 4 +- .../Repositories/IUserRepository.cs | 4 + .../Interfaces/Services/IEmailService.cs | 14 +- .../Interfaces/Services/IHashService.cs | 10 +- .../Services/IStorageFileService.cs | 30 +- .../Services/ITokenAuthenticationService.cs | 32 +- .../ActivityType/IGetActivitiesByNoticeId.cs | 7 - .../Interfaces/UseCases/Area/IGetAreaById.cs | 11 - .../Interfaces/UseCases/Area/IUpdateArea.cs | 11 - .../AssistanceType/IUpdateAssistanceType.cs | 9 - .../Interfaces/UseCases/Auth/IConfirmEmail.cs | 5 - .../UseCases/Auth/IForgotPassword.cs | 5 - src/Domain/Interfaces/UseCases/Auth/ILogin.cs | 7 - .../UseCases/Auth/IResetPassword.cs | 7 - .../UseCases/MainArea/IUpdateMainArea.cs | 11 - .../UseCases/Professor/ICreateProfessor.cs | 7 - .../UseCases/Professor/IDeleteProfessor.cs | 7 - .../UseCases/Professor/IGetProfessorById.cs | 7 - .../UseCases/Professor/IGetProfessors.cs | 7 - .../UseCases/Professor/IUpdateProfessor.cs | 7 - .../UseCases/SubArea/IGetSubAreaById.cs | 11 - .../UseCases/SubArea/IUpdateSubArea.cs | 11 - src/Domain/Mappings/ActivityMappings.cs | 11 +- src/Domain/Mappings/AreaMappings.cs | 11 +- src/Domain/Mappings/AssistanceTypeMappings.cs | 10 +- src/Domain/Mappings/CampusMappings.cs | 10 +- src/Domain/Mappings/CourseMappings.cs | 11 +- src/Domain/Mappings/MainAreaMappings.cs | 10 +- src/Domain/Mappings/NoticeMappings.cs | 10 +- src/Domain/Mappings/ProfessorMappings.cs | 10 +- src/Domain/Mappings/ProgramTypeMappings.cs | 10 +- .../Mappings/ProjectEvaluationMappings.cs | 6 +- src/Domain/Mappings/ProjectMappings.cs | 10 +- .../Mappings/StudentDocumentsMappings.cs | 6 +- src/Domain/Mappings/StudentMappings.cs | 10 +- src/Domain/Mappings/SubAreaMappings.cs | 10 +- src/Domain/Mappings/UserMappings.cs | 9 +- .../ActivityType/GetActivitiesByNoticeId.cs | 19 +- .../ActivityType/GetLastNoticeActivities.cs | 19 +- .../{ => Interactors}/Area/CreateArea.cs | 4 +- .../{ => Interactors}/Area/DeleteArea.cs | 10 +- .../{ => Interactors}/Area/GetAreaById.cs | 10 +- .../Area/GetAreasByMainArea.cs | 10 +- .../{ => Interactors}/Area/UpdateArea.cs | 13 +- .../AssistanceType/CreateAssistanceType.cs | 16 +- .../AssistanceType/DeleteAssistanceType.cs | 10 +- .../AssistanceType/GetAssistanceTypeById.cs | 10 +- .../AssistanceType/GetAssistanceTypes.cs | 10 +- .../AssistanceType/UpdateAssistanceType.cs | 12 +- .../{ => Interactors}/Auth/ConfirmEmail.cs | 11 +- .../{ => Interactors}/Auth/ForgotPassword.cs | 8 +- .../UseCases/{ => Interactors}/Auth/Login.cs | 10 +- .../{ => Interactors}/Auth/ResetPassword.cs | 16 +- .../{ => Interactors}/Campus/CreateCampus.cs | 4 +- .../{ => Interactors}/Campus/DeleteCampus.cs | 10 +- .../{ => Interactors}/Campus/GetCampusById.cs | 10 +- .../{ => Interactors}/Campus/GetCampuses.cs | 10 +- .../{ => Interactors}/Campus/UpdateCampus.cs | 16 +- .../{ => Interactors}/Course/CreateCourse.cs | 19 +- .../{ => Interactors}/Course/DeleteCourse.cs | 10 +- .../{ => Interactors}/Course/GetCourseById.cs | 10 +- .../{ => Interactors}/Course/GetCourses.cs | 10 +- .../{ => Interactors}/Course/UpdateCourse.cs | 16 +- .../MainArea/CreateMainArea.cs | 20 +- .../MainArea/DeleteMainArea.cs | 10 +- .../MainArea/GetMainAreaById.cs | 10 +- .../MainArea/GetMainAreas.cs | 10 +- .../MainArea/UpdateMainArea.cs | 12 +- .../{ => Interactors}/Notice/CreateNotice.cs | 4 +- .../{ => Interactors}/Notice/DeleteNotice.cs | 12 +- .../{ => Interactors}/Notice/GetNoticeById.cs | 10 +- .../{ => Interactors}/Notice/GetNotices.cs | 10 +- .../{ => Interactors}/Notice/UpdateNotice.cs | 89 +++-- .../Professor/CreateProfessor.cs | 4 +- .../Professor/DeleteProfessor.cs | 10 +- .../Professor/GetProfessorById.cs | 10 +- .../Professor/GetProfessors.cs | 10 +- .../Professor/UpdateProfessor.cs | 18 +- .../ProgramType/CreateProgramType.cs | 18 +- .../ProgramType/DeleteProgramType.cs | 10 +- .../ProgramType/GetProgramTypeById.cs | 10 +- .../ProgramType/GetProgramTypes.cs | 10 +- .../ProgramType/UpdateProgramType.cs | 12 +- .../Project/AppealProject.cs | 18 +- .../Project/CancelProject.cs | 12 +- .../Project/GetClosedProjects.cs | 36 +- .../Project/GetOpenProjects.cs | 36 +- .../Project/GetProjectById.cs | 10 +- .../Interactors/Project/OpenProject.cs | 151 ++++++++ .../Project/SubmitProject.cs | 18 +- .../Interactors/Project/UpdateProject.cs | 153 ++++++++ .../EvaluateAppealProject.cs | 20 +- .../EvaluateSubmissionProject.cs | 36 +- .../GetEvaluationByProjectId.cs | 10 +- .../Student/CreateStudent.cs | 64 ++-- .../Student/DeleteStudent.cs | 10 +- .../Student/GetStudentById.cs | 10 +- .../{ => Interactors}/Student/GetStudents.cs | 10 +- .../Student/UpdateStudent.cs | 50 +-- .../CreateStudentDocuments.cs | 6 +- .../DeleteStudentDocuments.cs | 10 +- .../GetStudentDocumentsByProjectId.cs | 10 +- .../GetStudentDocumentsByStudentId.cs | 10 +- .../UpdateStudentDocuments.cs | 48 +-- .../SubArea/CreateSubArea.cs | 4 +- .../SubArea/DeleteSubArea.cs | 10 +- .../SubArea/GetSubAreaById.cs | 10 +- .../SubArea/GetSubAreasByArea.cs | 10 +- .../SubArea/UpdateSubArea.cs | 12 +- .../{ => Interactors}/User/ActivateUser.cs | 12 +- .../{ => Interactors}/User/DeactivateUser.cs | 12 +- .../{ => Interactors}/User/GetActiveUsers.cs | 10 +- .../User/GetInactiveUsers.cs | 10 +- .../{ => Interactors}/User/GetUserById.cs | 10 +- .../{ => Interactors}/User/UpdateUser.cs | 14 +- .../ActivityType/IGetActivitiesByNoticeId.cs | 9 + .../ActivityType/IGetLastNoticeActivities.cs | 4 +- .../Interfaces}/Area/ICreateArea.cs | 4 +- .../Interfaces}/Area/IDeleteArea.cs | 4 +- .../UseCases/Interfaces/Area/IGetAreaById.cs | 9 + .../Interfaces}/Area/IGetAreasByMainArea.cs | 7 +- .../UseCases/Interfaces/Area/IUpdateArea.cs | 10 + .../AssistanceType/ICreateAssistanceType.cs | 4 +- .../AssistanceType/IDeleteAssistanceType.cs | 4 +- .../AssistanceType/IGetAssistanceTypeById.cs | 4 +- .../AssistanceType/IGetAssistanceTypes.cs | 4 +- .../AssistanceType/IUpdateAssistanceType.cs | 9 + .../UseCases/Interfaces/Auth/IConfirmEmail.cs | 7 + .../Interfaces/Auth/IForgotPassword.cs | 7 + src/Domain/UseCases/Interfaces/Auth/ILogin.cs | 9 + .../Interfaces/Auth/IResetPassword.cs | 9 + .../Interfaces}/Campus/ICreateCampus.cs | 4 +- .../Interfaces}/Campus/IDeleteCampus.cs | 4 +- .../Interfaces}/Campus/IGetCampusById.cs | 4 +- .../Interfaces}/Campus/IGetCampuses.cs | 4 +- .../Interfaces}/Campus/IUpdateCampus.cs | 6 +- .../Interfaces}/Course/ICreateCourse.cs | 5 +- .../Interfaces}/Course/IDeleteCourse.cs | 4 +- .../Interfaces}/Course/IGetCourseById.cs | 4 +- .../Interfaces}/Course/IGetCourses.cs | 4 +- .../Interfaces}/Course/IUpdateCourse.cs | 6 +- .../Interfaces}/MainArea/ICreateMainArea.cs | 5 +- .../Interfaces}/MainArea/IDeleteMainArea.cs | 4 +- .../Interfaces}/MainArea/IGetMainAreaById.cs | 4 +- .../Interfaces}/MainArea/IGetMainAreas.cs | 6 +- .../Interfaces/MainArea/IUpdateMainArea.cs | 9 + .../Interfaces}/Notice/ICreateNotice.cs | 4 +- .../Interfaces}/Notice/IDeleteNotice.cs | 4 +- .../Interfaces}/Notice/IGetNoticeById.cs | 4 +- .../Interfaces}/Notice/IGetNotices.cs | 4 +- .../Interfaces}/Notice/IUpdateNotice.cs | 4 +- .../Interfaces/Professor/ICreateProfessor.cs | 9 + .../Interfaces/Professor/IDeleteProfessor.cs | 9 + .../Interfaces/Professor/IGetProfessorById.cs | 9 + .../Interfaces/Professor/IGetProfessors.cs | 9 + .../Interfaces/Professor/IUpdateProfessor.cs | 9 + .../ProgramType/ICreateProgramType.cs | 4 +- .../ProgramType/IDeleteProgramType.cs | 4 +- .../ProgramType/IGetProgramTypeById.cs | 4 +- .../ProgramType/IGetProgramTypes.cs | 4 +- .../ProgramType/IUpdateProgramType.cs | 6 +- .../Interfaces}/Project/IAppealProject.cs | 4 +- .../Interfaces}/Project/ICancelProject.cs | 4 +- .../Interfaces}/Project/IGetClosedProjects.cs | 4 +- .../Interfaces}/Project/IGetOpenProjects.cs | 4 +- .../Interfaces}/Project/IGetProjectById.cs | 4 +- .../Interfaces}/Project/IOpenProject.cs | 4 +- .../Interfaces}/Project/ISubmitProject.cs | 4 +- .../Interfaces}/Project/IUpdateProject.cs | 4 +- .../IEvaluateAppealProject.cs | 6 +- .../IEvaluateSubmissionProject.cs | 6 +- .../IGetEvaluationByProjectId.cs | 4 +- .../Interfaces}/Student/ICreateStudent.cs | 4 +- .../Interfaces}/Student/IDeleteStudent.cs | 4 +- .../Interfaces}/Student/IGetStudentById.cs | 4 +- .../Interfaces}/Student/IGetStudents.cs | 4 +- .../Interfaces}/Student/IUpdateStudent.cs | 4 +- .../ICreateStudentDocuments.cs | 4 +- .../IDeleteStudentDocuments.cs | 4 +- .../IGetStudentDocumentsByProjectId.cs | 4 +- .../IGetStudentDocumentsByStudentId.cs | 4 +- .../IUpdateStudentDocuments.cs | 4 +- .../Interfaces}/SubArea/ICreateSubArea.cs | 4 +- .../Interfaces}/SubArea/IDeleteSubArea.cs | 4 +- .../Interfaces/SubArea/IGetSubAreaById.cs | 9 + .../Interfaces}/SubArea/IGetSubAreasByArea.cs | 7 +- .../Interfaces/SubArea/IUpdateSubArea.cs | 9 + .../Interfaces}/User/IActivateUser.cs | 4 +- .../Interfaces}/User/IDeactivateUser.cs | 4 +- .../Interfaces}/User/IGetActiveUsers.cs | 4 +- .../Interfaces}/User/IGetInactiveUsers.cs | 4 +- .../Interfaces}/User/IGetUserById.cs | 4 +- .../Interfaces}/User/IUpdateUser.cs | 4 +- .../Ports}/Activity/ActivityOutput.cs | 4 +- .../Ports/Activity/ActivityTypeOutput.cs | 11 + .../UseCases/Ports/Activity/BaseActivity.cs | 13 + .../Ports/Activity/BaseActivityType.cs | 14 + .../Ports/Activity/CreateActivityInput.cs | 4 + .../Ports/Activity/CreateActivityTypeInput.cs | 14 + .../Ports}/Activity/UpdateActivityInput.cs | 4 +- .../Ports/Activity/UpdateActivityTypeInput.cs | 18 + .../Ports}/Area/BaseAreaContract.cs | 2 +- .../Ports}/Area/CreateAreaInput.cs | 2 +- .../Ports}/Area/DetailedReadAreaOutput.cs | 4 +- .../Ports}/Area/ResumedReadAreaOutput.cs | 2 +- .../Ports}/Area/UpdateAreaInput.cs | 3 +- .../BaseAssistanceTypeContract.cs | 2 +- .../CreateAssistanceTypeInput.cs | 2 +- .../DetailedReadAssistanceTypeOutput.cs | 2 +- .../ResumedReadAssistanceTypeOutput.cs | 2 +- .../UpdateAssistanceTypeInput.cs | 2 +- .../Ports}/Auth/UserClaimsOutput.cs | 2 +- .../Ports}/Auth/UserLoginInput.cs | 5 +- .../Ports}/Auth/UserLoginOutput.cs | 2 +- .../Ports}/Auth/UserResetPasswordInput.cs | 2 +- .../Ports}/Campus/BaseCampusContract.cs | 2 +- .../Ports}/Campus/CreateCampusInput.cs | 2 +- .../Ports}/Campus/DetailedReadCampusOutput.cs | 2 +- .../Ports}/Campus/ResumedReadCampusOutput.cs | 2 +- .../Ports}/Campus/UpdateCampusInput.cs | 2 +- .../Ports}/Course/BaseCourseContract.cs | 2 +- .../Ports}/Course/CreateCourseInput.cs | 4 +- .../Ports}/Course/DetailedReadCourseOutput.cs | 2 +- .../Ports}/Course/ResumedReadCourseOutput.cs | 2 +- .../Ports}/Course/UpdateCourseInput.cs | 2 +- .../Ports}/MainArea/BaseMainAreaContract.cs | 2 +- .../Ports/MainArea/CreateMainAreaInput.cs | 4 + .../Ports}/MainArea/DetailedMainAreaOutput.cs | 2 +- .../MainArea/ResumedReadMainAreaOutput.cs | 2 +- .../Ports}/MainArea/UpdateMainAreaInput.cs | 5 +- .../Ports}/Notice/BaseNoticeContract.cs | 2 +- .../Ports/Notice/CreateNoticeInput.cs | 11 + .../Ports}/Notice/DetailedReadNoticeOutput.cs | 2 +- .../Ports}/Notice/ResumedReadNoticeOutput.cs | 2 +- .../Ports}/Notice/UpdateNoticeInput.cs | 4 +- .../Ports}/Professor/BaseProfessorContract.cs | 2 +- .../Ports}/Professor/CreateProfessorInput.cs | 4 +- .../Professor/DetailedReadStudentOutput.cs | 4 +- .../Professor/ResumedReadStudentOutput.cs | 2 +- .../Ports}/Professor/UpdateStudentInput.cs | 2 +- .../ProgramType/BaseProgramTypeContract.cs | 2 +- .../ProgramType/CreateProgramTypeInput.cs | 2 +- .../DetailedReadProgramTypeOutput.cs | 2 +- .../ResumedReadProgramTypeOutput.cs | 2 +- .../ProgramType/UpdateProgramTypeInput.cs | 2 +- .../Ports}/Project/BaseProjectContract.cs | 10 +- .../Project/DetailedReadProjectOutput.cs | 2 +- .../Ports}/Project/OpenProjectInput.cs | 8 +- .../Ports}/Project/ProjectReportInput.cs | 2 +- .../Ports}/Project/ProjectReportOutput.cs | 2 +- .../Ports/Project/ResumedReadProjectOutput.cs | 7 + .../Ports}/Project/UpdateProjectInput.cs | 8 +- .../BaseProjectActivityContract.cs | 12 + .../CreateProjectActivityInput.cs | 4 + .../DetailedReadProjectActivityOutput.cs | 10 + .../EvaluateProjectActivityInput.cs | 12 + .../ResumedReadProjectActivityOutput.cs | 9 + .../UpdateProjectActivityInput.cs | 10 + .../DetailedReadProjectEvaluationOutput.cs | 27 ++ .../EvaluateAppealProjectInput.cs | 14 + .../EvaluateSubmissionProjectInput.cs | 34 ++ .../Ports}/Student/BaseStudentContract.cs | 6 +- .../Ports}/Student/CreateStudentInput.cs | 4 +- .../Student/DetailedReadStudentOutput.cs | 8 +- .../Student/ResumedReadStudentOutput.cs | 2 +- .../Ports}/Student/UpdateStudentInput.cs | 2 +- .../BaseStudentDocumentsOutput.cs | 6 +- .../CreateStudentDocumentsInput.cs | 65 ++++ .../DetailedReadStudentDocumentsOutput.cs | 7 + .../ResumedReadStudentDocumentsOutput.cs | 4 + .../UpdateStudentDocumentsInput.cs | 51 +++ .../Ports}/SubArea/BaseSubAreaContract.cs | 2 +- .../Ports}/SubArea/CreateSubAreaInput.cs | 5 +- .../SubArea/DetailedReadSubAreaOutput.cs | 4 +- .../SubArea/ResumedReadSubAreaOutput.cs | 2 +- .../Ports}/SubArea/UpdateSubAreaInput.cs | 2 +- .../Ports}/User/UserReadOutput.cs | 2 +- .../Ports}/User/UserUpdateInput.cs | 2 +- src/Domain/UseCases/Project/OpenProject.cs | 143 ------- src/Domain/UseCases/Project/UpdateProject.cs | 149 -------- .../IoC/DependencyAdaptersInjection.cs | 88 ++--- .../IoC/DependencyDomainInjection.cs | 361 ++++++++++-------- src/Infrastructure/IoC/DependencyInjection.cs | 140 +++---- .../IoC/DependencyInjectionJWT.cs | 84 ++-- .../IoC/DependencyInjectionSwagger.cs | 8 +- src/Infrastructure/IoC/Utils/DotEnvSecrets.cs | 82 ++-- .../IoC/Utils/SettingsConfiguration.cs | 28 +- .../Repositories/ActivityRepository.cs | 28 +- .../Repositories/ActivityTypeRepository.cs | 30 +- .../Repositories/AreaRepository.cs | 31 +- .../Repositories/AssistanceTypeRepository.cs | 38 +- .../Repositories/CampusRepository.cs | 38 +- .../Repositories/CourseRepository.cs | 44 ++- .../Repositories/MainAreaRepository.cs | 37 +- .../Repositories/NoticeRepository.cs | 38 +- .../Repositories/ProfessorRepository.cs | 37 +- .../Repositories/ProgramTypeRepository.cs | 38 +- .../Repositories/ProjectActivityRepository.cs | 35 +- .../ProjectEvaluationRepository.cs | 15 +- .../Repositories/ProjectRepository.cs | 54 ++- .../Repositories/StudentRepository.cs | 35 +- .../Repositories/SubAreaRepository.cs | 37 +- .../Repositories/UserRepository.cs | 48 ++- .../Services/AzureStorageService.cs | 51 +-- .../Email/Configs/SmtpConfiguration.cs | 14 +- .../Services/Email/EmailService.cs | 234 ++++++------ .../Email/Factories/EmailServiceFactory.cs | 21 +- .../Email/Factories/IEmailServiceFactory.cs | 4 +- src/Infrastructure/Services/HashService.cs | 84 ++-- src/Infrastructure/Services/IDotEnvSecrets.cs | 2 +- .../Services/StorageFileService.cs | 40 +- .../Services/TokenAuthenticationService.cs | 195 +++++----- .../WebAPI/Controllers/ActivityController.cs | 6 +- .../WebAPI/Controllers/AreaController.cs | 14 +- .../Controllers/AssistanceTypeController.cs | 14 +- .../WebAPI/Controllers/AuthController.cs | 12 +- .../WebAPI/Controllers/CampusController.cs | 14 +- .../WebAPI/Controllers/CourseController.cs | 14 +- .../WebAPI/Controllers/MainAreaController.cs | 14 +- .../WebAPI/Controllers/NoticeController.cs | 14 +- .../WebAPI/Controllers/ProfessorController.cs | 14 +- .../Controllers/ProgramTypeController.cs | 14 +- .../WebAPI/Controllers/ProjectController.cs | 20 +- .../ProjectEvaluationController.cs | 10 +- .../WebAPI/Controllers/StudentController.cs | 14 +- .../WebAPI/Controllers/SubAreaController.cs | 14 +- .../WebAPI/Controllers/UserController.cs | 16 +- .../WebAPI/Controllers/VersionController.cs | 7 +- .../ExceptionHandlingMiddleware.cs | 2 +- .../WebAPI/Properties/launchSettings.json | 2 +- src/Infrastructure/WebAPI/Startup.cs | 4 +- 446 files changed, 3592 insertions(+), 3103 deletions(-) delete mode 100644 src/Domain/Contracts/Activity/ActivityTypeOutput.cs delete mode 100644 src/Domain/Contracts/Activity/BaseActivity.cs delete mode 100644 src/Domain/Contracts/Activity/BaseActivityType.cs delete mode 100644 src/Domain/Contracts/Activity/CreateActivityInput.cs delete mode 100644 src/Domain/Contracts/Activity/CreateActivityTypeInput.cs delete mode 100644 src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs delete mode 100644 src/Domain/Contracts/MainArea/CreateMainAreaInput.cs delete mode 100644 src/Domain/Contracts/Notice/CreateNoticeInput.cs delete mode 100644 src/Domain/Contracts/Project/ResumedReadProjectOutput.cs delete mode 100644 src/Domain/Contracts/ProjectActivity/BaseProjectActivityContract.cs delete mode 100644 src/Domain/Contracts/ProjectActivity/CreateProjectActivityInput.cs delete mode 100644 src/Domain/Contracts/ProjectActivity/DetailedReadProjectActivityOutput.cs delete mode 100644 src/Domain/Contracts/ProjectActivity/EvaluateProjectActivityInput.cs delete mode 100644 src/Domain/Contracts/ProjectActivity/ResumedReadProjectActivityOutput.cs delete mode 100644 src/Domain/Contracts/ProjectActivity/UpdateProjectActivityInput.cs delete mode 100644 src/Domain/Contracts/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs delete mode 100644 src/Domain/Contracts/ProjectEvaluation/EvaluateAppealProjectInput.cs delete mode 100644 src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs delete mode 100644 src/Domain/Contracts/StudentDocuments/CreateStudentDocumentsInput.cs delete mode 100644 src/Domain/Contracts/StudentDocuments/DetailedReadStudentDocumentsOutput.cs delete mode 100644 src/Domain/Contracts/StudentDocuments/ResumedReadStudentDocumentsOutput.cs delete mode 100644 src/Domain/Contracts/StudentDocuments/UpdateStudentDocumentsInput.cs delete mode 100644 src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs delete mode 100644 src/Domain/Interfaces/UseCases/Area/IGetAreaById.cs delete mode 100644 src/Domain/Interfaces/UseCases/Area/IUpdateArea.cs delete mode 100644 src/Domain/Interfaces/UseCases/AssistanceType/IUpdateAssistanceType.cs delete mode 100644 src/Domain/Interfaces/UseCases/Auth/IConfirmEmail.cs delete mode 100644 src/Domain/Interfaces/UseCases/Auth/IForgotPassword.cs delete mode 100644 src/Domain/Interfaces/UseCases/Auth/ILogin.cs delete mode 100644 src/Domain/Interfaces/UseCases/Auth/IResetPassword.cs delete mode 100644 src/Domain/Interfaces/UseCases/MainArea/IUpdateMainArea.cs delete mode 100644 src/Domain/Interfaces/UseCases/Professor/ICreateProfessor.cs delete mode 100644 src/Domain/Interfaces/UseCases/Professor/IDeleteProfessor.cs delete mode 100644 src/Domain/Interfaces/UseCases/Professor/IGetProfessorById.cs delete mode 100644 src/Domain/Interfaces/UseCases/Professor/IGetProfessors.cs delete mode 100644 src/Domain/Interfaces/UseCases/Professor/IUpdateProfessor.cs delete mode 100644 src/Domain/Interfaces/UseCases/SubArea/IGetSubAreaById.cs delete mode 100644 src/Domain/Interfaces/UseCases/SubArea/IUpdateSubArea.cs rename src/Domain/UseCases/{ => Interactors}/ActivityType/GetActivitiesByNoticeId.cs (72%) rename src/Domain/UseCases/{ => Interactors}/ActivityType/GetLastNoticeActivities.cs (72%) rename src/Domain/UseCases/{ => Interactors}/Area/CreateArea.cs (95%) rename src/Domain/UseCases/{ => Interactors}/Area/DeleteArea.cs (78%) rename src/Domain/UseCases/{ => Interactors}/Area/GetAreaById.cs (76%) rename src/Domain/UseCases/{ => Interactors}/Area/GetAreasByMainArea.cs (72%) rename src/Domain/UseCases/{ => Interactors}/Area/UpdateArea.cs (77%) rename src/Domain/UseCases/{ => Interactors}/AssistanceType/CreateAssistanceType.cs (74%) rename src/Domain/UseCases/{ => Interactors}/AssistanceType/DeleteAssistanceType.cs (77%) rename src/Domain/UseCases/{ => Interactors}/AssistanceType/GetAssistanceTypeById.cs (73%) rename src/Domain/UseCases/{ => Interactors}/AssistanceType/GetAssistanceTypes.cs (67%) rename src/Domain/UseCases/{ => Interactors}/AssistanceType/UpdateAssistanceType.cs (84%) rename src/Domain/UseCases/{ => Interactors}/Auth/ConfirmEmail.cs (81%) rename src/Domain/UseCases/{ => Interactors}/Auth/ForgotPassword.cs (91%) rename src/Domain/UseCases/{ => Interactors}/Auth/Login.cs (87%) rename src/Domain/UseCases/{ => Interactors}/Auth/ResetPassword.cs (84%) rename src/Domain/UseCases/{ => Interactors}/Campus/CreateCampus.cs (94%) rename src/Domain/UseCases/{ => Interactors}/Campus/DeleteCampus.cs (78%) rename src/Domain/UseCases/{ => Interactors}/Campus/GetCampusById.cs (74%) rename src/Domain/UseCases/{ => Interactors}/Campus/GetCampuses.cs (69%) rename src/Domain/UseCases/{ => Interactors}/Campus/UpdateCampus.cs (79%) rename src/Domain/UseCases/{ => Interactors}/Course/CreateCourse.cs (71%) rename src/Domain/UseCases/{ => Interactors}/Course/DeleteCourse.cs (78%) rename src/Domain/UseCases/{ => Interactors}/Course/GetCourseById.cs (74%) rename src/Domain/UseCases/{ => Interactors}/Course/GetCourses.cs (71%) rename src/Domain/UseCases/{ => Interactors}/Course/UpdateCourse.cs (82%) rename src/Domain/UseCases/{ => Interactors}/MainArea/CreateMainArea.cs (68%) rename src/Domain/UseCases/{ => Interactors}/MainArea/DeleteMainArea.cs (77%) rename src/Domain/UseCases/{ => Interactors}/MainArea/GetMainAreaById.cs (74%) rename src/Domain/UseCases/{ => Interactors}/MainArea/GetMainAreas.cs (68%) rename src/Domain/UseCases/{ => Interactors}/MainArea/UpdateMainArea.cs (75%) rename src/Domain/UseCases/{ => Interactors}/Notice/CreateNotice.cs (98%) rename src/Domain/UseCases/{ => Interactors}/Notice/DeleteNotice.cs (82%) rename src/Domain/UseCases/{ => Interactors}/Notice/GetNoticeById.cs (74%) rename src/Domain/UseCases/{ => Interactors}/Notice/GetNotices.cs (68%) rename src/Domain/UseCases/{ => Interactors}/Notice/UpdateNotice.cs (67%) rename src/Domain/UseCases/{ => Interactors}/Professor/CreateProfessor.cs (97%) rename src/Domain/UseCases/{ => Interactors}/Professor/DeleteProfessor.cs (87%) rename src/Domain/UseCases/{ => Interactors}/Professor/GetProfessorById.cs (74%) rename src/Domain/UseCases/{ => Interactors}/Professor/GetProfessors.cs (68%) rename src/Domain/UseCases/{ => Interactors}/Professor/UpdateProfessor.cs (75%) rename src/Domain/UseCases/{ => Interactors}/ProgramType/CreateProgramType.cs (73%) rename src/Domain/UseCases/{ => Interactors}/ProgramType/DeleteProgramType.cs (77%) rename src/Domain/UseCases/{ => Interactors}/ProgramType/GetProgramTypeById.cs (74%) rename src/Domain/UseCases/{ => Interactors}/ProgramType/GetProgramTypes.cs (68%) rename src/Domain/UseCases/{ => Interactors}/ProgramType/UpdateProgramType.cs (85%) rename src/Domain/UseCases/{ => Interactors}/Project/AppealProject.cs (82%) rename src/Domain/UseCases/{ => Interactors}/Project/CancelProject.cs (82%) rename src/Domain/UseCases/{ => Interactors}/Project/GetClosedProjects.cs (61%) rename src/Domain/UseCases/{ => Interactors}/Project/GetOpenProjects.cs (61%) rename src/Domain/UseCases/{ => Interactors}/Project/GetProjectById.cs (78%) create mode 100644 src/Domain/UseCases/Interactors/Project/OpenProject.cs rename src/Domain/UseCases/{ => Interactors}/Project/SubmitProject.cs (82%) create mode 100644 src/Domain/UseCases/Interactors/Project/UpdateProject.cs rename src/Domain/UseCases/{ => Interactors}/ProjectEvaluation/EvaluateAppealProject.cs (86%) rename src/Domain/UseCases/{ => Interactors}/ProjectEvaluation/EvaluateSubmissionProject.cs (81%) rename src/Domain/UseCases/{ => Interactors}/ProjectEvaluation/GetEvaluationByProjectId.cs (76%) rename src/Domain/UseCases/{ => Interactors}/Student/CreateStudent.cs (68%) rename src/Domain/UseCases/{ => Interactors}/Student/DeleteStudent.cs (87%) rename src/Domain/UseCases/{ => Interactors}/Student/GetStudentById.cs (74%) rename src/Domain/UseCases/{ => Interactors}/Student/GetStudents.cs (68%) rename src/Domain/UseCases/{ => Interactors}/Student/UpdateStudent.cs (54%) rename src/Domain/UseCases/{ => Interactors}/StudentDocuments/CreateStudentDocuments.cs (97%) rename src/Domain/UseCases/{ => Interactors}/StudentDocuments/DeleteStudentDocuments.cs (76%) rename src/Domain/UseCases/{ => Interactors}/StudentDocuments/GetStudentDocumentsByProjectId.cs (77%) rename src/Domain/UseCases/{ => Interactors}/StudentDocuments/GetStudentDocumentsByStudentId.cs (77%) rename src/Domain/UseCases/{ => Interactors}/StudentDocuments/UpdateStudentDocuments.cs (66%) rename src/Domain/UseCases/{ => Interactors}/SubArea/CreateSubArea.cs (95%) rename src/Domain/UseCases/{ => Interactors}/SubArea/DeleteSubArea.cs (78%) rename src/Domain/UseCases/{ => Interactors}/SubArea/GetSubAreaById.cs (72%) rename src/Domain/UseCases/{ => Interactors}/SubArea/GetSubAreasByArea.cs (71%) rename src/Domain/UseCases/{ => Interactors}/SubArea/UpdateSubArea.cs (76%) rename src/Domain/UseCases/{ => Interactors}/User/ActivateUser.cs (75%) rename src/Domain/UseCases/{ => Interactors}/User/DeactivateUser.cs (76%) rename src/Domain/UseCases/{ => Interactors}/User/GetActiveUsers.cs (68%) rename src/Domain/UseCases/{ => Interactors}/User/GetInactiveUsers.cs (68%) rename src/Domain/UseCases/{ => Interactors}/User/GetUserById.cs (80%) rename src/Domain/UseCases/{ => Interactors}/User/UpdateUser.cs (76%) create mode 100644 src/Domain/UseCases/Interfaces/ActivityType/IGetActivitiesByNoticeId.cs rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/ActivityType/IGetLastNoticeActivities.cs (60%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Area/ICreateArea.cs (60%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Area/IDeleteArea.cs (58%) create mode 100644 src/Domain/UseCases/Interfaces/Area/IGetAreaById.cs rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Area/IGetAreasByMainArea.cs (54%) create mode 100644 src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/AssistanceType/ICreateAssistanceType.cs (60%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/AssistanceType/IDeleteAssistanceType.cs (56%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/AssistanceType/IGetAssistanceTypeById.cs (56%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/AssistanceType/IGetAssistanceTypes.cs (60%) create mode 100644 src/Domain/UseCases/Interfaces/AssistanceType/IUpdateAssistanceType.cs create mode 100644 src/Domain/UseCases/Interfaces/Auth/IConfirmEmail.cs create mode 100644 src/Domain/UseCases/Interfaces/Auth/IForgotPassword.cs create mode 100644 src/Domain/UseCases/Interfaces/Auth/ILogin.cs create mode 100644 src/Domain/UseCases/Interfaces/Auth/IResetPassword.cs rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Campus/ICreateCampus.cs (60%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Campus/IDeleteCampus.cs (57%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Campus/IGetCampusById.cs (57%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Campus/IGetCampuses.cs (61%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Campus/IUpdateCampus.cs (53%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Course/ICreateCourse.cs (53%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Course/IDeleteCourse.cs (57%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Course/IGetCourseById.cs (57%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Course/IGetCourses.cs (61%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Course/IUpdateCourse.cs (53%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/MainArea/ICreateMainArea.cs (55%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/MainArea/IDeleteMainArea.cs (56%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/MainArea/IGetMainAreaById.cs (56%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/MainArea/IGetMainAreas.cs (52%) create mode 100644 src/Domain/UseCases/Interfaces/MainArea/IUpdateMainArea.cs rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Notice/ICreateNotice.cs (60%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Notice/IDeleteNotice.cs (57%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Notice/IGetNoticeById.cs (57%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Notice/IGetNotices.cs (61%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Notice/IUpdateNotice.cs (62%) create mode 100644 src/Domain/UseCases/Interfaces/Professor/ICreateProfessor.cs create mode 100644 src/Domain/UseCases/Interfaces/Professor/IDeleteProfessor.cs create mode 100644 src/Domain/UseCases/Interfaces/Professor/IGetProfessorById.cs create mode 100644 src/Domain/UseCases/Interfaces/Professor/IGetProfessors.cs create mode 100644 src/Domain/UseCases/Interfaces/Professor/IUpdateProfessor.cs rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/ProgramType/ICreateProgramType.cs (60%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/ProgramType/IDeleteProgramType.cs (56%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/ProgramType/IGetProgramTypeById.cs (57%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/ProgramType/IGetProgramTypes.cs (60%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/ProgramType/IUpdateProgramType.cs (50%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Project/IAppealProject.cs (63%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Project/ICancelProject.cs (61%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Project/IGetClosedProjects.cs (65%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Project/IGetOpenProjects.cs (65%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Project/IGetProjectById.cs (57%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Project/IOpenProject.cs (59%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Project/ISubmitProject.cs (58%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Project/IUpdateProject.cs (62%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/ProjectEvaluation/IEvaluateAppealProject.cs (50%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/ProjectEvaluation/IEvaluateSubmissionProject.cs (52%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/ProjectEvaluation/IGetEvaluationByProjectId.cs (57%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Student/ICreateStudent.cs (60%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Student/IDeleteStudent.cs (57%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Student/IGetStudentById.cs (57%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Student/IGetStudents.cs (61%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/Student/IUpdateStudent.cs (62%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/StudentDocuments/ICreateStudentDocuments.cs (60%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/StudentDocuments/IDeleteStudentDocuments.cs (56%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/StudentDocuments/IGetStudentDocumentsByProjectId.cs (58%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/StudentDocuments/IGetStudentDocumentsByStudentId.cs (58%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/StudentDocuments/IUpdateStudentDocuments.cs (62%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/SubArea/ICreateSubArea.cs (60%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/SubArea/IDeleteSubArea.cs (57%) create mode 100644 src/Domain/UseCases/Interfaces/SubArea/IGetSubAreaById.cs rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/SubArea/IGetSubAreasByArea.cs (53%) create mode 100644 src/Domain/UseCases/Interfaces/SubArea/IUpdateSubArea.cs rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/User/IActivateUser.cs (56%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/User/IDeactivateUser.cs (57%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/User/IGetActiveUsers.cs (62%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/User/IGetInactiveUsers.cs (62%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/User/IGetUserById.cs (56%) rename src/Domain/{Interfaces/UseCases => UseCases/Interfaces}/User/IUpdateUser.cs (59%) rename src/Domain/{Contracts => UseCases/Ports}/Activity/ActivityOutput.cs (63%) create mode 100644 src/Domain/UseCases/Ports/Activity/ActivityTypeOutput.cs create mode 100644 src/Domain/UseCases/Ports/Activity/BaseActivity.cs create mode 100644 src/Domain/UseCases/Ports/Activity/BaseActivityType.cs create mode 100644 src/Domain/UseCases/Ports/Activity/CreateActivityInput.cs create mode 100644 src/Domain/UseCases/Ports/Activity/CreateActivityTypeInput.cs rename src/Domain/{Contracts => UseCases/Ports}/Activity/UpdateActivityInput.cs (64%) create mode 100644 src/Domain/UseCases/Ports/Activity/UpdateActivityTypeInput.cs rename src/Domain/{Contracts => UseCases/Ports}/Area/BaseAreaContract.cs (86%) rename src/Domain/{Contracts => UseCases/Ports}/Area/CreateAreaInput.cs (83%) rename src/Domain/{Contracts => UseCases/Ports}/Area/DetailedReadAreaOutput.cs (74%) rename src/Domain/{Contracts => UseCases/Ports}/Area/ResumedReadAreaOutput.cs (73%) rename src/Domain/{Contracts => UseCases/Ports}/Area/UpdateAreaInput.cs (77%) rename src/Domain/{Contracts => UseCases/Ports}/AssistanceType/BaseAssistanceTypeContract.cs (82%) rename src/Domain/{Contracts => UseCases/Ports}/AssistanceType/CreateAssistanceTypeInput.cs (63%) rename src/Domain/{Contracts => UseCases/Ports}/AssistanceType/DetailedReadAssistanceTypeOutput.cs (78%) rename src/Domain/{Contracts => UseCases/Ports}/AssistanceType/ResumedReadAssistanceTypeOutput.cs (72%) rename src/Domain/{Contracts => UseCases/Ports}/AssistanceType/UpdateAssistanceTypeInput.cs (71%) rename src/Domain/{Contracts => UseCases/Ports}/Auth/UserClaimsOutput.cs (82%) rename src/Domain/{Contracts => UseCases/Ports}/Auth/UserLoginInput.cs (65%) rename src/Domain/{Contracts => UseCases/Ports}/Auth/UserLoginOutput.cs (77%) rename src/Domain/{Contracts => UseCases/Ports}/Auth/UserResetPasswordInput.cs (88%) rename src/Domain/{Contracts => UseCases/Ports}/Campus/BaseCampusContract.cs (81%) rename src/Domain/{Contracts => UseCases/Ports}/Campus/CreateCampusInput.cs (62%) rename src/Domain/{Contracts => UseCases/Ports}/Campus/DetailedReadCampusOutput.cs (79%) rename src/Domain/{Contracts => UseCases/Ports}/Campus/ResumedReadCampusOutput.cs (73%) rename src/Domain/{Contracts => UseCases/Ports}/Campus/UpdateCampusInput.cs (72%) rename src/Domain/{Contracts => UseCases/Ports}/Course/BaseCourseContract.cs (81%) rename src/Domain/{Contracts => UseCases/Ports}/Course/CreateCourseInput.cs (50%) rename src/Domain/{Contracts => UseCases/Ports}/Course/DetailedReadCourseOutput.cs (79%) rename src/Domain/{Contracts => UseCases/Ports}/Course/ResumedReadCourseOutput.cs (73%) rename src/Domain/{Contracts => UseCases/Ports}/Course/UpdateCourseInput.cs (72%) rename src/Domain/{Contracts => UseCases/Ports}/MainArea/BaseMainAreaContract.cs (85%) create mode 100644 src/Domain/UseCases/Ports/MainArea/CreateMainAreaInput.cs rename src/Domain/{Contracts => UseCases/Ports}/MainArea/DetailedMainAreaOutput.cs (78%) rename src/Domain/{Contracts => UseCases/Ports}/MainArea/ResumedReadMainAreaOutput.cs (74%) rename src/Domain/{Contracts => UseCases/Ports}/MainArea/UpdateMainAreaInput.cs (53%) rename src/Domain/{Contracts => UseCases/Ports}/Notice/BaseNoticeContract.cs (96%) create mode 100644 src/Domain/UseCases/Ports/Notice/CreateNoticeInput.cs rename src/Domain/{Contracts => UseCases/Ports}/Notice/DetailedReadNoticeOutput.cs (83%) rename src/Domain/{Contracts => UseCases/Ports}/Notice/ResumedReadNoticeOutput.cs (79%) rename src/Domain/{Contracts => UseCases/Ports}/Notice/UpdateNoticeInput.cs (76%) rename src/Domain/{Contracts => UseCases/Ports}/Professor/BaseProfessorContract.cs (85%) rename src/Domain/{Contracts => UseCases/Ports}/Professor/CreateProfessorInput.cs (83%) rename src/Domain/{Contracts => UseCases/Ports}/Professor/DetailedReadStudentOutput.cs (74%) rename src/Domain/{Contracts => UseCases/Ports}/Professor/ResumedReadStudentOutput.cs (82%) rename src/Domain/{Contracts => UseCases/Ports}/Professor/UpdateStudentInput.cs (73%) rename src/Domain/{Contracts => UseCases/Ports}/ProgramType/BaseProgramTypeContract.cs (83%) rename src/Domain/{Contracts => UseCases/Ports}/ProgramType/CreateProgramTypeInput.cs (63%) rename src/Domain/{Contracts => UseCases/Ports}/ProgramType/DetailedReadProgramTypeOutput.cs (78%) rename src/Domain/{Contracts => UseCases/Ports}/ProgramType/ResumedReadProgramTypeOutput.cs (72%) rename src/Domain/{Contracts => UseCases/Ports}/ProgramType/UpdateProgramTypeInput.cs (71%) rename src/Domain/{Contracts => UseCases/Ports}/Project/BaseProjectContract.cs (87%) rename src/Domain/{Contracts => UseCases/Ports}/Project/DetailedReadProjectOutput.cs (80%) rename src/Domain/{Contracts => UseCases/Ports}/Project/OpenProjectInput.cs (87%) rename src/Domain/{Contracts => UseCases/Ports}/Project/ProjectReportInput.cs (56%) rename src/Domain/{Contracts => UseCases/Ports}/Project/ProjectReportOutput.cs (56%) create mode 100644 src/Domain/UseCases/Ports/Project/ResumedReadProjectOutput.cs rename src/Domain/{Contracts => UseCases/Ports}/Project/UpdateProjectInput.cs (86%) create mode 100644 src/Domain/UseCases/Ports/ProjectActivity/BaseProjectActivityContract.cs create mode 100644 src/Domain/UseCases/Ports/ProjectActivity/CreateProjectActivityInput.cs create mode 100644 src/Domain/UseCases/Ports/ProjectActivity/DetailedReadProjectActivityOutput.cs create mode 100644 src/Domain/UseCases/Ports/ProjectActivity/EvaluateProjectActivityInput.cs create mode 100644 src/Domain/UseCases/Ports/ProjectActivity/ResumedReadProjectActivityOutput.cs create mode 100644 src/Domain/UseCases/Ports/ProjectActivity/UpdateProjectActivityInput.cs create mode 100644 src/Domain/UseCases/Ports/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs create mode 100644 src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateAppealProjectInput.cs create mode 100644 src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateSubmissionProjectInput.cs rename src/Domain/{Contracts => UseCases/Ports}/Student/BaseStudentContract.cs (91%) rename src/Domain/{Contracts => UseCases/Ports}/Student/CreateStudentInput.cs (84%) rename src/Domain/{Contracts => UseCases/Ports}/Student/DetailedReadStudentOutput.cs (70%) rename src/Domain/{Contracts => UseCases/Ports}/Student/ResumedReadStudentOutput.cs (83%) rename src/Domain/{Contracts => UseCases/Ports}/Student/UpdateStudentInput.cs (73%) rename src/Domain/{Contracts => UseCases/Ports}/StudentDocuments/BaseStudentDocumentsOutput.cs (93%) create mode 100644 src/Domain/UseCases/Ports/StudentDocuments/CreateStudentDocumentsInput.cs create mode 100644 src/Domain/UseCases/Ports/StudentDocuments/DetailedReadStudentDocumentsOutput.cs create mode 100644 src/Domain/UseCases/Ports/StudentDocuments/ResumedReadStudentDocumentsOutput.cs create mode 100644 src/Domain/UseCases/Ports/StudentDocuments/UpdateStudentDocumentsInput.cs rename src/Domain/{Contracts => UseCases/Ports}/SubArea/BaseSubAreaContract.cs (85%) rename src/Domain/{Contracts => UseCases/Ports}/SubArea/CreateSubAreaInput.cs (58%) rename src/Domain/{Contracts => UseCases/Ports}/SubArea/DetailedReadSubAreaOutput.cs (75%) rename src/Domain/{Contracts => UseCases/Ports}/SubArea/ResumedReadSubAreaOutput.cs (73%) rename src/Domain/{Contracts => UseCases/Ports}/SubArea/UpdateSubAreaInput.cs (84%) rename src/Domain/{Contracts => UseCases/Ports}/User/UserReadOutput.cs (88%) rename src/Domain/{Contracts => UseCases/Ports}/User/UserUpdateInput.cs (85%) delete mode 100644 src/Domain/UseCases/Project/OpenProject.cs delete mode 100644 src/Domain/UseCases/Project/UpdateProject.cs diff --git a/src/Adapters/Gateways/Area/CreateAreaRequest.cs b/src/Adapters/Gateways/Area/CreateAreaRequest.cs index c860057f..c59b9542 100644 --- a/src/Adapters/Gateways/Area/CreateAreaRequest.cs +++ b/src/Adapters/Gateways/Area/CreateAreaRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Area; +using Domain.UseCases.Ports.Area; -namespace Adapters.Gateways.Area; -public class CreateAreaRequest : CreateAreaInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.Area +{ + public class CreateAreaRequest : CreateAreaInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Area/DetailedReadAreaResponse.cs b/src/Adapters/Gateways/Area/DetailedReadAreaResponse.cs index f35b5ff5..d0f959c4 100644 --- a/src/Adapters/Gateways/Area/DetailedReadAreaResponse.cs +++ b/src/Adapters/Gateways/Area/DetailedReadAreaResponse.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.MainArea; -using Adapters.Gateways.Base; +using Adapters.Gateways.Base; +using Adapters.Gateways.MainArea; namespace Adapters.Gateways.Area { diff --git a/src/Adapters/Gateways/Area/ResumedReadAreaResponse.cs b/src/Adapters/Gateways/Area/ResumedReadAreaResponse.cs index 7327fec1..51c46b34 100644 --- a/src/Adapters/Gateways/Area/ResumedReadAreaResponse.cs +++ b/src/Adapters/Gateways/Area/ResumedReadAreaResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Area; +using Domain.UseCases.Ports.Area; -namespace Adapters.Gateways.Area; -public class ResumedReadAreaResponse : ResumedReadAreaOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.Area +{ + public class ResumedReadAreaResponse : ResumedReadAreaOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Area/UpdateAreaRequest.cs b/src/Adapters/Gateways/Area/UpdateAreaRequest.cs index e1ecb8ed..307c5ce0 100644 --- a/src/Adapters/Gateways/Area/UpdateAreaRequest.cs +++ b/src/Adapters/Gateways/Area/UpdateAreaRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Area; +using Domain.Ports.Area; -namespace Adapters.Gateways.Area; -public class UpdateAreaRequest : UpdateAreaInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.Area +{ + public class UpdateAreaRequest : UpdateAreaInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/AssistanceType/CreateTypeAssistanceRequest.cs b/src/Adapters/Gateways/AssistanceType/CreateTypeAssistanceRequest.cs index 63a23c0d..8ad3ae7b 100644 --- a/src/Adapters/Gateways/AssistanceType/CreateTypeAssistanceRequest.cs +++ b/src/Adapters/Gateways/AssistanceType/CreateTypeAssistanceRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; -namespace Adapters.Gateways.AssistanceType; -public class CreateAssistanceTypeRequest : CreateAssistanceTypeInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.AssistanceType +{ + public class CreateAssistanceTypeRequest : CreateAssistanceTypeInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/AssistanceType/DetailedReadTypeAssistanceResponse.cs b/src/Adapters/Gateways/AssistanceType/DetailedReadTypeAssistanceResponse.cs index c50dcaa0..709d81f4 100644 --- a/src/Adapters/Gateways/AssistanceType/DetailedReadTypeAssistanceResponse.cs +++ b/src/Adapters/Gateways/AssistanceType/DetailedReadTypeAssistanceResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; -namespace Adapters.Gateways.AssistanceType; -public class DetailedReadAssistanceTypeResponse : DetailedReadAssistanceTypeOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.AssistanceType +{ + public class DetailedReadAssistanceTypeResponse : DetailedReadAssistanceTypeOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/AssistanceType/ResumedReadTypeAssistanceResponse.cs b/src/Adapters/Gateways/AssistanceType/ResumedReadTypeAssistanceResponse.cs index b301f451..278a2ba3 100644 --- a/src/Adapters/Gateways/AssistanceType/ResumedReadTypeAssistanceResponse.cs +++ b/src/Adapters/Gateways/AssistanceType/ResumedReadTypeAssistanceResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; -namespace Adapters.Gateways.AssistanceType; -public class ResumedReadAssistanceTypeResponse : ResumedReadAssistanceTypeOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.AssistanceType +{ + public class ResumedReadAssistanceTypeResponse : ResumedReadAssistanceTypeOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/AssistanceType/UpdateTypeAssistanceRequest.cs b/src/Adapters/Gateways/AssistanceType/UpdateTypeAssistanceRequest.cs index 15f9f440..1ecfa08b 100644 --- a/src/Adapters/Gateways/AssistanceType/UpdateTypeAssistanceRequest.cs +++ b/src/Adapters/Gateways/AssistanceType/UpdateTypeAssistanceRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; -namespace Adapters.Gateways.AssistanceType; -public class UpdateAssistanceTypeRequest : UpdateAssistanceTypeInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.AssistanceType +{ + public class UpdateAssistanceTypeRequest : UpdateAssistanceTypeInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Auth/UserLoginRequest.cs b/src/Adapters/Gateways/Auth/UserLoginRequest.cs index 2925b4ef..0129a7ae 100644 --- a/src/Adapters/Gateways/Auth/UserLoginRequest.cs +++ b/src/Adapters/Gateways/Auth/UserLoginRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Auth; +using Domain.UseCases.Ports.Auth; -namespace Adapters.Gateways.Auth; -public class UserLoginRequest : UserLoginInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.Auth +{ + public class UserLoginRequest : UserLoginInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Auth/UserLoginResponse.cs b/src/Adapters/Gateways/Auth/UserLoginResponse.cs index 2d1c8e22..d1079fae 100644 --- a/src/Adapters/Gateways/Auth/UserLoginResponse.cs +++ b/src/Adapters/Gateways/Auth/UserLoginResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Auth; +using Domain.UseCases.Ports.Auth; -namespace Adapters.Gateways.Auth; -public class UserLoginResponse : UserLoginOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.Auth +{ + public class UserLoginResponse : UserLoginOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Auth/UserResetPasswordRequest.cs b/src/Adapters/Gateways/Auth/UserResetPasswordRequest.cs index 56353c5f..a3b15c85 100644 --- a/src/Adapters/Gateways/Auth/UserResetPasswordRequest.cs +++ b/src/Adapters/Gateways/Auth/UserResetPasswordRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Auth; +using Domain.UseCases.Ports.Auth; -namespace Adapters.Gateways.Auth; -public class UserResetPasswordRequest : UserResetPasswordInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.Auth +{ + public class UserResetPasswordRequest : UserResetPasswordInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Campus/CreateCampusRequest.cs b/src/Adapters/Gateways/Campus/CreateCampusRequest.cs index 9c3474eb..b1959790 100644 --- a/src/Adapters/Gateways/Campus/CreateCampusRequest.cs +++ b/src/Adapters/Gateways/Campus/CreateCampusRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Campus; +using Domain.UseCases.Ports.Campus; -namespace Adapters.Gateways.Campus; -public class CreateCampusRequest : CreateCampusInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.Campus +{ + public class CreateCampusRequest : CreateCampusInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Campus/DetailedReadCampusResponse.cs b/src/Adapters/Gateways/Campus/DetailedReadCampusResponse.cs index 177a0c80..f421b987 100644 --- a/src/Adapters/Gateways/Campus/DetailedReadCampusResponse.cs +++ b/src/Adapters/Gateways/Campus/DetailedReadCampusResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Campus; +using Domain.UseCases.Ports.Campus; -namespace Adapters.Gateways.Campus; -public class DetailedReadCampusResponse : DetailedReadCampusOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.Campus +{ + public class DetailedReadCampusResponse : DetailedReadCampusOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Campus/ResumedReadCampusResponse.cs b/src/Adapters/Gateways/Campus/ResumedReadCampusResponse.cs index b2f85732..40f00fdc 100644 --- a/src/Adapters/Gateways/Campus/ResumedReadCampusResponse.cs +++ b/src/Adapters/Gateways/Campus/ResumedReadCampusResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Campus; +using Domain.UseCases.Ports.Campus; -namespace Adapters.Gateways.Campus; -public class ResumedReadCampusResponse : ResumedReadCampusOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.Campus +{ + public class ResumedReadCampusResponse : ResumedReadCampusOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Campus/UpdateCampusRequest.cs b/src/Adapters/Gateways/Campus/UpdateCampusRequest.cs index 788cff37..89dac53f 100644 --- a/src/Adapters/Gateways/Campus/UpdateCampusRequest.cs +++ b/src/Adapters/Gateways/Campus/UpdateCampusRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Campus; +using Domain.UseCases.Ports.Campus; -namespace Adapters.Gateways.Campus; -public class UpdateCampusRequest : UpdateCampusInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.Campus +{ + public class UpdateCampusRequest : UpdateCampusInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Course/CreateCourseRequest.cs b/src/Adapters/Gateways/Course/CreateCourseRequest.cs index 10aa47d6..3d49b07e 100644 --- a/src/Adapters/Gateways/Course/CreateCourseRequest.cs +++ b/src/Adapters/Gateways/Course/CreateCourseRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Course; +using Domain.Ports.Course; -namespace Adapters.Gateways.Course; -public class CreateCourseRequest : CreateCourseInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.Course +{ + public class CreateCourseRequest : CreateCourseInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Course/DetailedReadCourseResponse.cs b/src/Adapters/Gateways/Course/DetailedReadCourseResponse.cs index 8585a523..a3817bc7 100644 --- a/src/Adapters/Gateways/Course/DetailedReadCourseResponse.cs +++ b/src/Adapters/Gateways/Course/DetailedReadCourseResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Course; +using Domain.UseCases.Ports.Course; -namespace Adapters.Gateways.Course; -public class DetailedReadCourseResponse : DetailedReadCourseOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.Course +{ + public class DetailedReadCourseResponse : DetailedReadCourseOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Course/ResumedReadCourseResponse.cs b/src/Adapters/Gateways/Course/ResumedReadCourseResponse.cs index a5c0a4e9..08aa4cb9 100644 --- a/src/Adapters/Gateways/Course/ResumedReadCourseResponse.cs +++ b/src/Adapters/Gateways/Course/ResumedReadCourseResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Course; +using Domain.UseCases.Ports.Course; -namespace Adapters.Gateways.Course; -public class ResumedReadCourseResponse : ResumedReadCourseOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.Course +{ + public class ResumedReadCourseResponse : ResumedReadCourseOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Course/UpdateCourseRequest.cs b/src/Adapters/Gateways/Course/UpdateCourseRequest.cs index 3c9b6a6a..8cc9d8e2 100644 --- a/src/Adapters/Gateways/Course/UpdateCourseRequest.cs +++ b/src/Adapters/Gateways/Course/UpdateCourseRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Course; +using Domain.UseCases.Ports.Course; -namespace Adapters.Gateways.Course; -public class UpdateCourseRequest : UpdateCourseInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.Course +{ + public class UpdateCourseRequest : UpdateCourseInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/MainArea/CreateMainAreaRequest.cs b/src/Adapters/Gateways/MainArea/CreateMainAreaRequest.cs index 841bf092..b581ec22 100644 --- a/src/Adapters/Gateways/MainArea/CreateMainAreaRequest.cs +++ b/src/Adapters/Gateways/MainArea/CreateMainAreaRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.MainArea; +using Domain.UseCases.Ports.MainArea; -namespace Adapters.Gateways.MainArea; -public class CreateMainAreaRequest : CreateMainAreaInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.MainArea +{ + public class CreateMainAreaRequest : CreateMainAreaInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/MainArea/DetailedReadMainAreaResponse.cs b/src/Adapters/Gateways/MainArea/DetailedReadMainAreaResponse.cs index 7868cda5..fcb76451 100644 --- a/src/Adapters/Gateways/MainArea/DetailedReadMainAreaResponse.cs +++ b/src/Adapters/Gateways/MainArea/DetailedReadMainAreaResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.MainArea; +using Domain.UseCases.Ports.MainArea; -namespace Adapters.Gateways.MainArea; -public class DetailedReadMainAreaResponse : DetailedMainAreaOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.MainArea +{ + public class DetailedReadMainAreaResponse : DetailedMainAreaOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/MainArea/ResumedReadMainAreaResponse.cs b/src/Adapters/Gateways/MainArea/ResumedReadMainAreaResponse.cs index 9136d943..6c8d9dc3 100644 --- a/src/Adapters/Gateways/MainArea/ResumedReadMainAreaResponse.cs +++ b/src/Adapters/Gateways/MainArea/ResumedReadMainAreaResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.MainArea; +using Domain.UseCases.Ports.MainArea; -namespace Adapters.Gateways.MainArea; -public class ResumedReadMainAreaResponse : ResumedReadMainAreaOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.MainArea +{ + public class ResumedReadMainAreaResponse : ResumedReadMainAreaOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/MainArea/UpdateMainAreaRequest.cs b/src/Adapters/Gateways/MainArea/UpdateMainAreaRequest.cs index 7f0017b9..3b7a8e27 100644 --- a/src/Adapters/Gateways/MainArea/UpdateMainAreaRequest.cs +++ b/src/Adapters/Gateways/MainArea/UpdateMainAreaRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.MainArea; +using Domain.UseCases.Ports.MainArea; -namespace Adapters.Gateways.MainArea; -public class UpdateMainAreaRequest : UpdateMainAreaInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.MainArea +{ + public class UpdateMainAreaRequest : UpdateMainAreaInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs b/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs index 992730e8..05f42fdd 100644 --- a/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs +++ b/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs @@ -1,11 +1,13 @@ using Adapters.Gateways.Activity; using Adapters.Gateways.Base; -using Domain.Contracts.Notice; +using Domain.UseCases.Ports.Notice; using Microsoft.AspNetCore.Http; -namespace Adapters.Gateways.Notice; -public class CreateNoticeRequest : BaseNoticeContract, IRequest +namespace Adapters.Gateways.Notice { - public IFormFile? File { get; set; } - public IList? Activities { get; set; } + public class CreateNoticeRequest : BaseNoticeContract, IRequest + { + public IFormFile? File { get; set; } + public IList? Activities { get; set; } + } } \ No newline at end of file diff --git a/src/Adapters/Gateways/Notice/DetailedReadNoticeResponse.cs b/src/Adapters/Gateways/Notice/DetailedReadNoticeResponse.cs index 029b4335..9ed9cb6f 100644 --- a/src/Adapters/Gateways/Notice/DetailedReadNoticeResponse.cs +++ b/src/Adapters/Gateways/Notice/DetailedReadNoticeResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Notice; +using Domain.UseCases.Ports.Notice; -namespace Adapters.Gateways.Notice; -public class DetailedReadNoticeResponse : DetailedReadNoticeOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.Notice +{ + public class DetailedReadNoticeResponse : DetailedReadNoticeOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Notice/ResumedReadNoticeResponse.cs b/src/Adapters/Gateways/Notice/ResumedReadNoticeResponse.cs index becd366f..fbd2a7c9 100644 --- a/src/Adapters/Gateways/Notice/ResumedReadNoticeResponse.cs +++ b/src/Adapters/Gateways/Notice/ResumedReadNoticeResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Notice; +using Domain.UseCases.Ports.Notice; -namespace Adapters.Gateways.Notice; -public class ResumedReadNoticeResponse : ResumedReadNoticeOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.Notice +{ + public class ResumedReadNoticeResponse : ResumedReadNoticeOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Notice/UpdateNoticeRequest.cs b/src/Adapters/Gateways/Notice/UpdateNoticeRequest.cs index 473d5f01..9c8f48e4 100644 --- a/src/Adapters/Gateways/Notice/UpdateNoticeRequest.cs +++ b/src/Adapters/Gateways/Notice/UpdateNoticeRequest.cs @@ -1,12 +1,14 @@ using Adapters.Gateways.Activity; using Adapters.Gateways.Base; -using Domain.Contracts.Notice; +using Domain.UseCases.Ports.Notice; using Microsoft.AspNetCore.Http; -namespace Adapters.Gateways.Notice; -public class UpdateNoticeRequest : BaseNoticeContract, IRequest +namespace Adapters.Gateways.Notice { - public Guid? Id { get; set; } - public IFormFile? File { get; set; } - public IList? Activities { get; set; } + public class UpdateNoticeRequest : BaseNoticeContract, IRequest + { + public Guid? Id { get; set; } + public IFormFile? File { get; set; } + public IList? Activities { get; set; } + } } \ No newline at end of file diff --git a/src/Adapters/Gateways/Professor/CreateProfessorRequest.cs b/src/Adapters/Gateways/Professor/CreateProfessorRequest.cs index 89c5fa4f..7dbbc2c7 100644 --- a/src/Adapters/Gateways/Professor/CreateProfessorRequest.cs +++ b/src/Adapters/Gateways/Professor/CreateProfessorRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Professor; +using Domain.UseCases.Ports.Professor; -namespace Adapters.Gateways.Professor; -public class CreateProfessorRequest : CreateProfessorInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.Professor +{ + public class CreateProfessorRequest : CreateProfessorInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Professor/DetailedReadProfessorResponse.cs b/src/Adapters/Gateways/Professor/DetailedReadProfessorResponse.cs index cd3b1ea5..4788898d 100644 --- a/src/Adapters/Gateways/Professor/DetailedReadProfessorResponse.cs +++ b/src/Adapters/Gateways/Professor/DetailedReadProfessorResponse.cs @@ -12,6 +12,6 @@ public class DetailedReadProfessorResponse : IResponse #region Required Properties public string? SIAPEEnrollment { get; set; } public long IdentifyLattes { get; set; } - #endregion + #endregion Required Properties } } \ No newline at end of file diff --git a/src/Adapters/Gateways/Professor/ResumedReadProfessorResponse.cs b/src/Adapters/Gateways/Professor/ResumedReadProfessorResponse.cs index 922a4b54..fc14091f 100644 --- a/src/Adapters/Gateways/Professor/ResumedReadProfessorResponse.cs +++ b/src/Adapters/Gateways/Professor/ResumedReadProfessorResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Professor; +using Domain.UseCases.Ports.Professor; -namespace Adapters.Gateways.Professor; -public class ResumedReadProfessorResponse : ResumedReadProfessorOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.Professor +{ + public class ResumedReadProfessorResponse : ResumedReadProfessorOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Professor/UpdateProfessorRequest.cs b/src/Adapters/Gateways/Professor/UpdateProfessorRequest.cs index f301356c..1f6bae69 100644 --- a/src/Adapters/Gateways/Professor/UpdateProfessorRequest.cs +++ b/src/Adapters/Gateways/Professor/UpdateProfessorRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Professor; +using Domain.UseCases.Ports.Professor; -namespace Adapters.Gateways.Professor; -public class UpdateProfessorRequest : UpdateProfessorInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.Professor +{ + public class UpdateProfessorRequest : UpdateProfessorInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProgramType/CreateProgramTypeRequest.cs b/src/Adapters/Gateways/ProgramType/CreateProgramTypeRequest.cs index 2f999f4d..844f2319 100644 --- a/src/Adapters/Gateways/ProgramType/CreateProgramTypeRequest.cs +++ b/src/Adapters/Gateways/ProgramType/CreateProgramTypeRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.ProgramType; +using Domain.UseCases.Ports.ProgramType; -namespace Adapters.Gateways.ProgramType; -public class CreateProgramTypeRequest : CreateProgramTypeInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.ProgramType +{ + public class CreateProgramTypeRequest : CreateProgramTypeInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProgramType/DetailedReadProgramTypeResponse.cs b/src/Adapters/Gateways/ProgramType/DetailedReadProgramTypeResponse.cs index c79c1e27..35594977 100644 --- a/src/Adapters/Gateways/ProgramType/DetailedReadProgramTypeResponse.cs +++ b/src/Adapters/Gateways/ProgramType/DetailedReadProgramTypeResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.ProgramType; +using Domain.UseCases.Ports.ProgramType; -namespace Adapters.Gateways.ProgramType; -public class DetailedReadProgramTypeResponse : DetailedReadProgramTypeOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.ProgramType +{ + public class DetailedReadProgramTypeResponse : DetailedReadProgramTypeOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProgramType/ResumedReadProgramTypeResponse.cs b/src/Adapters/Gateways/ProgramType/ResumedReadProgramTypeResponse.cs index ebf1a418..86d538c8 100644 --- a/src/Adapters/Gateways/ProgramType/ResumedReadProgramTypeResponse.cs +++ b/src/Adapters/Gateways/ProgramType/ResumedReadProgramTypeResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.ProgramType; +using Domain.UseCases.Ports.ProgramType; -namespace Adapters.Gateways.ProgramType; -public class ResumedReadProgramTypeResponse : ResumedReadProgramTypeOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.ProgramType +{ + public class ResumedReadProgramTypeResponse : ResumedReadProgramTypeOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProgramType/UpdateProgramTypeRequest.cs b/src/Adapters/Gateways/ProgramType/UpdateProgramTypeRequest.cs index a7d9c8c2..744505df 100644 --- a/src/Adapters/Gateways/ProgramType/UpdateProgramTypeRequest.cs +++ b/src/Adapters/Gateways/ProgramType/UpdateProgramTypeRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.ProgramType; +using Domain.UseCases.Ports.ProgramType; -namespace Adapters.Gateways.ProgramType; -public class UpdateProgramTypeRequest : UpdateProgramTypeInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.ProgramType +{ + public class UpdateProgramTypeRequest : UpdateProgramTypeInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Project/DetailedReadProjectResponse.cs b/src/Adapters/Gateways/Project/DetailedReadProjectResponse.cs index e3855e0f..a4758ffc 100644 --- a/src/Adapters/Gateways/Project/DetailedReadProjectResponse.cs +++ b/src/Adapters/Gateways/Project/DetailedReadProjectResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Project; +using Domain.UseCases.Ports.Project; -namespace Adapters.Gateways.Project; -public class DetailedReadProjectResponse : DetailedReadProjectOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.Project +{ + public class DetailedReadProjectResponse : DetailedReadProjectOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Project/ResumedReadProjectResponse.cs b/src/Adapters/Gateways/Project/ResumedReadProjectResponse.cs index a7e56f60..2939055c 100644 --- a/src/Adapters/Gateways/Project/ResumedReadProjectResponse.cs +++ b/src/Adapters/Gateways/Project/ResumedReadProjectResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Project; +using Domain.UseCases.Ports.Project; -namespace Adapters.Gateways.Project; -public class ResumedReadProjectResponse : ResumedReadProjectOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.Project +{ + public class ResumedReadProjectResponse : ResumedReadProjectOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectEvaluation/DetailedReadProjectEvaluationResponse.cs b/src/Adapters/Gateways/ProjectEvaluation/DetailedReadProjectEvaluationResponse.cs index c7a6791a..a97fde4f 100644 --- a/src/Adapters/Gateways/ProjectEvaluation/DetailedReadProjectEvaluationResponse.cs +++ b/src/Adapters/Gateways/ProjectEvaluation/DetailedReadProjectEvaluationResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.ProjectEvaluation; +using Domain.UseCases.Ports.ProjectEvaluation; -namespace Adapters.Gateways.ProjectEvaluation; -public class DetailedReadProjectEvaluationResponse : DetailedReadProjectEvaluationOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.ProjectEvaluation +{ + public class DetailedReadProjectEvaluationResponse : DetailedReadProjectEvaluationOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectEvaluation/EvaluateAppealProjectRequest.cs b/src/Adapters/Gateways/ProjectEvaluation/EvaluateAppealProjectRequest.cs index 8a643003..6f6a5d15 100644 --- a/src/Adapters/Gateways/ProjectEvaluation/EvaluateAppealProjectRequest.cs +++ b/src/Adapters/Gateways/ProjectEvaluation/EvaluateAppealProjectRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.ProjectEvaluation; +using Domain.UseCases.Ports.ProjectEvaluation; -namespace Adapters.Gateways.ProjectEvaluation; -public class EvaluateAppealProjectRequest : EvaluateAppealProjectInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.ProjectEvaluation +{ + public class EvaluateAppealProjectRequest : EvaluateAppealProjectInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Student/CreateStudentRequest.cs b/src/Adapters/Gateways/Student/CreateStudentRequest.cs index fd4431bd..834d0e87 100644 --- a/src/Adapters/Gateways/Student/CreateStudentRequest.cs +++ b/src/Adapters/Gateways/Student/CreateStudentRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Student; +using Domain.UseCases.Ports.Student; -namespace Adapters.Gateways.Student; -public class CreateStudentRequest : CreateStudentInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.Student +{ + public class CreateStudentRequest : CreateStudentInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Student/ResumedReadStudentResponse.cs b/src/Adapters/Gateways/Student/ResumedReadStudentResponse.cs index 7d572b4a..bd9d47f5 100644 --- a/src/Adapters/Gateways/Student/ResumedReadStudentResponse.cs +++ b/src/Adapters/Gateways/Student/ResumedReadStudentResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Student; +using Domain.UseCases.Ports.Student; -namespace Adapters.Gateways.Student; -public class ResumedReadStudentResponse : ResumedReadStudentOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.Student +{ + public class ResumedReadStudentResponse : ResumedReadStudentOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/Student/UpdateStudentRequest.cs b/src/Adapters/Gateways/Student/UpdateStudentRequest.cs index 65123897..fb736af8 100644 --- a/src/Adapters/Gateways/Student/UpdateStudentRequest.cs +++ b/src/Adapters/Gateways/Student/UpdateStudentRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.Student; +using Domain.UseCases.Ports.Student; -namespace Adapters.Gateways.Student; -public class UpdateStudentRequest : UpdateStudentInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.Student +{ + public class UpdateStudentRequest : UpdateStudentInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/StudentDocuments/CreateStudentDocumentsRequest.cs b/src/Adapters/Gateways/StudentDocuments/CreateStudentDocumentsRequest.cs index 7fe19815..7c56c42f 100644 --- a/src/Adapters/Gateways/StudentDocuments/CreateStudentDocumentsRequest.cs +++ b/src/Adapters/Gateways/StudentDocuments/CreateStudentDocumentsRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; -namespace Adapters.Gateways.StudentDocuments; -public class CreateStudentDocumentsRequest : CreateStudentDocumentsInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.StudentDocuments +{ + public class CreateStudentDocumentsRequest : CreateStudentDocumentsInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/StudentDocuments/DetailedReadStudentDocumentsResponse.cs b/src/Adapters/Gateways/StudentDocuments/DetailedReadStudentDocumentsResponse.cs index 4403e5bb..7cedff9e 100644 --- a/src/Adapters/Gateways/StudentDocuments/DetailedReadStudentDocumentsResponse.cs +++ b/src/Adapters/Gateways/StudentDocuments/DetailedReadStudentDocumentsResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; -namespace Adapters.Gateways.StudentDocuments; -public class DetailedReadStudentDocumentsResponse : DetailedReadStudentDocumentsOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.StudentDocuments +{ + public class DetailedReadStudentDocumentsResponse : DetailedReadStudentDocumentsOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/StudentDocuments/ResumedReadStudentDocumentsResponse.cs b/src/Adapters/Gateways/StudentDocuments/ResumedReadStudentDocumentsResponse.cs index cc4b5a05..10081c30 100644 --- a/src/Adapters/Gateways/StudentDocuments/ResumedReadStudentDocumentsResponse.cs +++ b/src/Adapters/Gateways/StudentDocuments/ResumedReadStudentDocumentsResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; -namespace Adapters.Gateways.StudentDocuments; -public class ResumedReadStudentDocumentsResponse : ResumedReadStudentDocumentsOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.StudentDocuments +{ + public class ResumedReadStudentDocumentsResponse : ResumedReadStudentDocumentsOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/StudentDocuments/UpdateStudentDocumentsRequest.cs b/src/Adapters/Gateways/StudentDocuments/UpdateStudentDocumentsRequest.cs index 069e11cf..73452cea 100644 --- a/src/Adapters/Gateways/StudentDocuments/UpdateStudentDocumentsRequest.cs +++ b/src/Adapters/Gateways/StudentDocuments/UpdateStudentDocumentsRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; -namespace Adapters.Gateways.StudentDocuments; -public class UpdateStudentDocumentsRequest : UpdateStudentDocumentsInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.StudentDocuments +{ + public class UpdateStudentDocumentsRequest : UpdateStudentDocumentsInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/SubArea/CreateSubAreaRequest.cs b/src/Adapters/Gateways/SubArea/CreateSubAreaRequest.cs index e6e0ed67..9bef8dab 100644 --- a/src/Adapters/Gateways/SubArea/CreateSubAreaRequest.cs +++ b/src/Adapters/Gateways/SubArea/CreateSubAreaRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.SubArea; +using Domain.UseCases.Ports.SubArea; -namespace Adapters.Gateways.SubArea; -public class CreateSubAreaRequest : CreateSubAreaInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.SubArea +{ + public class CreateSubAreaRequest : CreateSubAreaInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/SubArea/ResumedReadSubAreaResponse.cs b/src/Adapters/Gateways/SubArea/ResumedReadSubAreaResponse.cs index abc26575..c142ea96 100644 --- a/src/Adapters/Gateways/SubArea/ResumedReadSubAreaResponse.cs +++ b/src/Adapters/Gateways/SubArea/ResumedReadSubAreaResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.SubArea; +using Domain.UseCases.Ports.SubArea; -namespace Adapters.Gateways.SubArea; -public class ResumedReadSubAreaResponse : ResumedReadSubAreaOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.SubArea +{ + public class ResumedReadSubAreaResponse : ResumedReadSubAreaOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/SubArea/UpdateSubAreaRequest.cs b/src/Adapters/Gateways/SubArea/UpdateSubAreaRequest.cs index c73ffee1..25f436eb 100644 --- a/src/Adapters/Gateways/SubArea/UpdateSubAreaRequest.cs +++ b/src/Adapters/Gateways/SubArea/UpdateSubAreaRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.SubArea; +using Domain.UseCases.Ports.SubArea; -namespace Adapters.Gateways.SubArea; -public class UpdateSubAreaRequest : UpdateSubAreaInput, IRequest { } +namespace Adapters.Gateways.SubArea +{ + public class UpdateSubAreaRequest : UpdateSubAreaInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/User/UserReadResponse.cs b/src/Adapters/Gateways/User/UserReadResponse.cs index bbf5c23c..b1eaee1c 100644 --- a/src/Adapters/Gateways/User/UserReadResponse.cs +++ b/src/Adapters/Gateways/User/UserReadResponse.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.User; +using Domain.UseCases.Ports.User; -namespace Adapters.Gateways.User; -public class UserReadResponse : UserReadOutput, IResponse { } \ No newline at end of file +namespace Adapters.Gateways.User +{ + public class UserReadResponse : UserReadOutput, IResponse { } +} \ No newline at end of file diff --git a/src/Adapters/Gateways/User/UserUpdateRequest.cs b/src/Adapters/Gateways/User/UserUpdateRequest.cs index d68d87b3..aa5d5610 100644 --- a/src/Adapters/Gateways/User/UserUpdateRequest.cs +++ b/src/Adapters/Gateways/User/UserUpdateRequest.cs @@ -1,5 +1,7 @@ using Adapters.Gateways.Base; -using Domain.Contracts.User; +using Domain.UseCases.Ports.User; -namespace Adapters.Gateways.User; -public class UserUpdateRequest : UserUpdateInput, IRequest { } \ No newline at end of file +namespace Adapters.Gateways.User +{ + public class UserUpdateRequest : UserUpdateInput, IRequest { } +} \ No newline at end of file diff --git a/src/Adapters/Mappings/ActivityMappings.cs b/src/Adapters/Mappings/ActivityMappings.cs index 58171c31..8925bb17 100644 --- a/src/Adapters/Mappings/ActivityMappings.cs +++ b/src/Adapters/Mappings/ActivityMappings.cs @@ -1,24 +1,24 @@ -using AutoMapper; using Adapters.Gateways.Activity; -using Domain.Contracts.Activity; - +using AutoMapper; +using Domain.Ports.Activity; +using Domain.UseCases.Ports.Activity; namespace Adapters.Mappings { public class ActivityMappings : Profile { public ActivityMappings() { - CreateMap().ReverseMap(); - CreateMap() + _ = CreateMap().ReverseMap(); + _ = CreateMap() .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) .ReverseMap(); - CreateMap().ReverseMap(); - CreateMap() + _ = CreateMap().ReverseMap(); + _ = CreateMap() .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) .ForPath(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) .ReverseMap(); - CreateMap().ReverseMap(); - CreateMap() + _ = CreateMap().ReverseMap(); + _ = CreateMap() .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) .ReverseMap(); } diff --git a/src/Adapters/Mappings/AreaMappings.cs b/src/Adapters/Mappings/AreaMappings.cs index bf389e13..908f6584 100755 --- a/src/Adapters/Mappings/AreaMappings.cs +++ b/src/Adapters/Mappings/AreaMappings.cs @@ -1,6 +1,7 @@ -using AutoMapper; -using Adapters.Gateways.Area; -using Domain.Contracts.Area; +using Adapters.Gateways.Area; +using AutoMapper; +using Domain.Ports.Area; +using Domain.UseCases.Ports.Area; namespace Adapters.Mappings { @@ -8,10 +9,10 @@ public class AreaMappings : Profile { public AreaMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap() + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap() .ForMember(dest => dest.MainArea, opt => opt.MapFrom(src => src.MainArea)) .ReverseMap(); } diff --git a/src/Adapters/Mappings/AuthMappings.cs b/src/Adapters/Mappings/AuthMappings.cs index 1bc010e1..1062fc7b 100755 --- a/src/Adapters/Mappings/AuthMappings.cs +++ b/src/Adapters/Mappings/AuthMappings.cs @@ -1,6 +1,6 @@ -using AutoMapper; -using Adapters.Gateways.Auth; -using Domain.Contracts.Auth; +using Adapters.Gateways.Auth; +using AutoMapper; +using Domain.UseCases.Ports.Auth; namespace Adapters.Mappings { @@ -8,9 +8,9 @@ public class AuthMappings : Profile { public AuthMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Adapters/Mappings/CampusMappings.cs b/src/Adapters/Mappings/CampusMappings.cs index f073b4e6..5c380808 100755 --- a/src/Adapters/Mappings/CampusMappings.cs +++ b/src/Adapters/Mappings/CampusMappings.cs @@ -1,6 +1,6 @@ -using AutoMapper; -using Adapters.Gateways.Campus; -using Domain.Contracts.Campus; +using Adapters.Gateways.Campus; +using AutoMapper; +using Domain.UseCases.Ports.Campus; namespace Adapters.Mappings { @@ -8,10 +8,10 @@ public class CampusMappings : Profile { public CampusMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Adapters/Mappings/CourseMappings.cs b/src/Adapters/Mappings/CourseMappings.cs index 00ea98e5..52ada4ff 100755 --- a/src/Adapters/Mappings/CourseMappings.cs +++ b/src/Adapters/Mappings/CourseMappings.cs @@ -1,6 +1,7 @@ -using AutoMapper; -using Adapters.Gateways.Course; -using Domain.Contracts.Course; +using Adapters.Gateways.Course; +using AutoMapper; +using Domain.Ports.Course; +using Domain.UseCases.Ports.Course; namespace Adapters.Mappings { @@ -8,10 +9,10 @@ public class CourseMappings : Profile { public CourseMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Adapters/Mappings/MainAreaMappings.cs b/src/Adapters/Mappings/MainAreaMappings.cs index 7460be78..874f1677 100755 --- a/src/Adapters/Mappings/MainAreaMappings.cs +++ b/src/Adapters/Mappings/MainAreaMappings.cs @@ -1,6 +1,6 @@ -using AutoMapper; -using Adapters.Gateways.MainArea; -using Domain.Contracts.MainArea; +using Adapters.Gateways.MainArea; +using AutoMapper; +using Domain.UseCases.Ports.MainArea; namespace Adapters.Mappings { @@ -8,10 +8,10 @@ public class MainAreaMappings : Profile { public MainAreaMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Adapters/Mappings/NoticeMappings.cs b/src/Adapters/Mappings/NoticeMappings.cs index 7dd1804c..4de7cf9c 100755 --- a/src/Adapters/Mappings/NoticeMappings.cs +++ b/src/Adapters/Mappings/NoticeMappings.cs @@ -1,19 +1,21 @@ -using AutoMapper; -using Adapters.Gateways.Notice; -using Domain.Contracts.Notice; +using Adapters.Gateways.Notice; +using AutoMapper; +using Domain.UseCases.Ports.Notice; -namespace Adapters.Mappings; -public class NoticeMappings : Profile +namespace Adapters.Mappings { - public NoticeMappings() + public class NoticeMappings : Profile { - CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) - .ReverseMap(); - CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) - .ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + public NoticeMappings() + { + _ = CreateMap() + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) + .ReverseMap(); + _ = CreateMap() + .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) + .ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + } } } \ No newline at end of file diff --git a/src/Adapters/Mappings/ProfessorMappings.cs b/src/Adapters/Mappings/ProfessorMappings.cs index 21a625b4..5c41c732 100755 --- a/src/Adapters/Mappings/ProfessorMappings.cs +++ b/src/Adapters/Mappings/ProfessorMappings.cs @@ -1,6 +1,6 @@ -using AutoMapper; -using Adapters.Gateways.Professor; -using Domain.Contracts.Professor; +using Adapters.Gateways.Professor; +using AutoMapper; +using Domain.UseCases.Ports.Professor; namespace Adapters.Mappings { @@ -8,10 +8,10 @@ public class ProfessorMappings : Profile { public ProfessorMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap() + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap() .ForMember(dest => dest.User, opt => opt.MapFrom(src => src.User)) .ReverseMap(); diff --git a/src/Adapters/Mappings/ProgramTypeMappings.cs b/src/Adapters/Mappings/ProgramTypeMappings.cs index c3712dfb..5f0cf2dd 100755 --- a/src/Adapters/Mappings/ProgramTypeMappings.cs +++ b/src/Adapters/Mappings/ProgramTypeMappings.cs @@ -1,6 +1,6 @@ -using AutoMapper; -using Adapters.Gateways.ProgramType; -using Domain.Contracts.ProgramType; +using Adapters.Gateways.ProgramType; +using AutoMapper; +using Domain.UseCases.Ports.ProgramType; namespace Adapters.Mappings { @@ -8,10 +8,10 @@ public class ProgramTypeMappings : Profile { public ProgramTypeMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Adapters/Mappings/ProjectActivityMappings.cs b/src/Adapters/Mappings/ProjectActivityMappings.cs index 3df91a62..cb85ec1b 100755 --- a/src/Adapters/Mappings/ProjectActivityMappings.cs +++ b/src/Adapters/Mappings/ProjectActivityMappings.cs @@ -1,6 +1,6 @@ -using AutoMapper; -using Adapters.Gateways.ProjectActivity; -using Domain.Contracts.ProjectActivity; +using Adapters.Gateways.ProjectActivity; +using AutoMapper; +using Domain.UseCases.Ports.ProjectActivity; namespace Adapters.Mappings { @@ -8,11 +8,11 @@ public class ProjectActivityMappings : Profile { public ProjectActivityMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Adapters/Mappings/ProjectEvaluationMapping.cs b/src/Adapters/Mappings/ProjectEvaluationMapping.cs index 2b02668c..a854e36c 100644 --- a/src/Adapters/Mappings/ProjectEvaluationMapping.cs +++ b/src/Adapters/Mappings/ProjectEvaluationMapping.cs @@ -1,6 +1,6 @@ -using AutoMapper; using Adapters.Gateways.ProjectEvaluation; -using Domain.Contracts.ProjectEvaluation; +using AutoMapper; +using Domain.UseCases.Ports.ProjectEvaluation; namespace Adapters.Mappings { @@ -8,12 +8,12 @@ public class ProjectEvaluationMapping : Profile { public ProjectEvaluationMapping() { - CreateMap() + _ = CreateMap() .ReverseMap(); - CreateMap() + _ = CreateMap() .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) .ReverseMap(); - CreateMap() + _ = CreateMap() .ReverseMap(); } } diff --git a/src/Adapters/Mappings/ProjectMappings.cs b/src/Adapters/Mappings/ProjectMappings.cs index 0a2d5b65..0cbdc7be 100755 --- a/src/Adapters/Mappings/ProjectMappings.cs +++ b/src/Adapters/Mappings/ProjectMappings.cs @@ -1,6 +1,6 @@ -using AutoMapper; -using Adapters.Gateways.Project; -using Domain.Contracts.Project; +using Adapters.Gateways.Project; +using AutoMapper; +using Domain.UseCases.Ports.Project; namespace Adapters.Mappings { @@ -8,14 +8,14 @@ public class ProjectMappings : Profile { public ProjectMappings() { - CreateMap() + _ = CreateMap() .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) .ReverseMap(); - CreateMap() + _ = CreateMap() .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) .ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Adapters/Mappings/StudentDocumentsMappings.cs b/src/Adapters/Mappings/StudentDocumentsMappings.cs index ac90ccd3..b6f9a1e0 100755 --- a/src/Adapters/Mappings/StudentDocumentsMappings.cs +++ b/src/Adapters/Mappings/StudentDocumentsMappings.cs @@ -1,6 +1,6 @@ -using AutoMapper; -using Adapters.Gateways.StudentDocuments; -using Domain.Contracts.StudentDocuments; +using Adapters.Gateways.StudentDocuments; +using AutoMapper; +using Domain.UseCases.Ports.StudentDocuments; namespace Adapters.Mappings { @@ -8,10 +8,11 @@ public class StudentDocumentsMappings : Profile { public StudentDocumentsMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Adapters/Mappings/StudentMappings.cs b/src/Adapters/Mappings/StudentMappings.cs index 6ef7296b..be5a1045 100755 --- a/src/Adapters/Mappings/StudentMappings.cs +++ b/src/Adapters/Mappings/StudentMappings.cs @@ -1,6 +1,6 @@ -using AutoMapper; -using Adapters.Gateways.Student; -using Domain.Contracts.Student; +using Adapters.Gateways.Student; +using AutoMapper; +using Domain.UseCases.Ports.Student; namespace Adapters.Mappings { @@ -8,10 +8,10 @@ public class StudentMappings : Profile { public StudentMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap() + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap() .ForMember(dest => dest.User, opt => opt.MapFrom(src => src.User)) .ForMember(dest => dest.Campus, diff --git a/src/Adapters/Mappings/SubAreaMappings.cs b/src/Adapters/Mappings/SubAreaMappings.cs index 0abf0238..43d76bfc 100755 --- a/src/Adapters/Mappings/SubAreaMappings.cs +++ b/src/Adapters/Mappings/SubAreaMappings.cs @@ -1,6 +1,6 @@ -using AutoMapper; -using Adapters.Gateways.SubArea; -using Domain.Contracts.SubArea; +using Adapters.Gateways.SubArea; +using AutoMapper; +using Domain.UseCases.Ports.SubArea; namespace Adapters.Mappings { @@ -8,10 +8,10 @@ public class SubAreaMappings : Profile { public SubAreaMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap() + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap() .ForMember(dest => dest.Area, opt => opt.MapFrom(src => src.Area)) .ForPath(dest => dest.Area!.MainArea, opt => opt.MapFrom(src => src.Area!.MainArea)) .ReverseMap(); diff --git a/src/Adapters/Mappings/TypeAssistanceMappings.cs b/src/Adapters/Mappings/TypeAssistanceMappings.cs index 3be08cb0..104c53cd 100755 --- a/src/Adapters/Mappings/TypeAssistanceMappings.cs +++ b/src/Adapters/Mappings/TypeAssistanceMappings.cs @@ -1,6 +1,6 @@ -using AutoMapper; -using Adapters.Gateways.AssistanceType; -using Domain.Contracts.AssistanceType; +using Adapters.Gateways.AssistanceType; +using AutoMapper; +using Domain.UseCases.Ports.AssistanceType; namespace Adapters.Mappings { @@ -8,10 +8,10 @@ public class AssistanceTypeMappings : Profile { public AssistanceTypeMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Adapters/Mappings/UserMappings.cs b/src/Adapters/Mappings/UserMappings.cs index e5e05eaf..fe25179b 100755 --- a/src/Adapters/Mappings/UserMappings.cs +++ b/src/Adapters/Mappings/UserMappings.cs @@ -1,6 +1,6 @@ -using AutoMapper; -using Adapters.Gateways.User; -using Domain.Contracts.User; +using Adapters.Gateways.User; +using AutoMapper; +using Domain.UseCases.Ports.User; namespace Adapters.Mappings { @@ -8,8 +8,8 @@ public class UserMappings : Profile { public UserMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Adapters/PresenterController/ActivityPresenterController.cs b/src/Adapters/PresenterController/ActivityPresenterController.cs index 325ee85c..12cdf1c8 100644 --- a/src/Adapters/PresenterController/ActivityPresenterController.cs +++ b/src/Adapters/PresenterController/ActivityPresenterController.cs @@ -1,7 +1,7 @@ using Adapters.Gateways.Activity; using Adapters.Interfaces; using AutoMapper; -using Domain.Interfaces.UseCases.ActivityType; +using Domain.UseCases.Interfaces.ActivityType; namespace Adapters.PresenterController { @@ -22,13 +22,13 @@ public ActivityPresenterController( public async Task> GetActivitiesByNoticeId(Guid? noticeId) { - var activityTypes = await _getActivitiesByNoticeId.GetActivitiesByNoticeId(noticeId); + IEnumerable activityTypes = await _getActivitiesByNoticeId.GetActivitiesByNoticeId(noticeId); return _mapper.Map>(activityTypes); } public async Task> GetLastNoticeActivities() { - var activityTypes = await _getLastNoticeActivities.GetLastNoticeActivities(); + IEnumerable activityTypes = await _getLastNoticeActivities.GetLastNoticeActivities(); return _mapper.Map>(activityTypes); } } diff --git a/src/Adapters/PresenterController/AreaPresenterController.cs b/src/Adapters/PresenterController/AreaPresenterController.cs index 4547775c..88a10d78 100755 --- a/src/Adapters/PresenterController/AreaPresenterController.cs +++ b/src/Adapters/PresenterController/AreaPresenterController.cs @@ -2,8 +2,9 @@ using Adapters.Gateways.Base; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.Area; -using Domain.Interfaces.UseCases; +using Domain.Ports.Area; +using Domain.UseCases.Interfaces.Area; +using Domain.UseCases.Ports.Area; namespace Adapters.PresenterController { @@ -26,25 +27,25 @@ public AreaPresenterController(ICreateArea createArea, IUpdateArea updateArea, I _getAreaById = getAreaById; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Create(IRequest request) { - var dto = request as CreateAreaRequest; - var input = _mapper.Map(dto); - var result = await _createArea.Execute(input); + CreateAreaRequest? dto = request as CreateAreaRequest; + CreateAreaInput input = _mapper.Map(dto); + DetailedReadAreaOutput result = await _createArea.Execute(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - var result = await _deleteArea.Execute(id); + DetailedReadAreaOutput result = await _deleteArea.Execute(id); return _mapper.Map(result); } public async Task> GetAreasByMainArea(Guid? mainAreaId, int skip, int take) { - var result = await _getAreasByMainArea.Execute(mainAreaId, skip, take); + IQueryable result = await _getAreasByMainArea.Execute(mainAreaId, skip, take); return _mapper.Map>(result); } @@ -55,15 +56,15 @@ public Task> GetAll(int skip, int take) public async Task GetById(Guid? id) { - var result = await _getAreaById.Execute(id); + DetailedReadAreaOutput result = await _getAreaById.Execute(id); return _mapper.Map(result); } public async Task Update(Guid? id, IRequest request) { - var dto = request as UpdateAreaRequest; - var input = _mapper.Map(dto); - var result = await _updateArea.Execute(id, input); + UpdateAreaRequest? dto = request as UpdateAreaRequest; + UpdateAreaInput input = _mapper.Map(dto); + DetailedReadAreaOutput result = await _updateArea.Execute(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/AuthPresenterController.cs b/src/Adapters/PresenterController/AuthPresenterController.cs index 95b81892..73ced67d 100755 --- a/src/Adapters/PresenterController/AuthPresenterController.cs +++ b/src/Adapters/PresenterController/AuthPresenterController.cs @@ -1,8 +1,8 @@ using Adapters.Gateways.Auth; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.Auth; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.Auth; +using Domain.UseCases.Ports.Auth; namespace Adapters.PresenterController { @@ -23,17 +23,29 @@ public AuthPresenterController(IMapper mapper, IConfirmEmail confirmUserEmail, I _login = login; _resetPassword = resetPassword; } - #endregion + #endregion Global Scope - public async Task ConfirmEmail(string? email, string? token) => await _confirmUserEmail.Execute(email, token); + public async Task ConfirmEmail(string? email, string? token) + { + return await _confirmUserEmail.Execute(email, token); + } - public async Task ForgotPassword(string? email) => await _forgotPassword.Execute(email); + public async Task ForgotPassword(string? email) + { + return await _forgotPassword.Execute(email); + } - public async Task Login(UserLoginRequest request) => _mapper + public async Task Login(UserLoginRequest request) + { + return _mapper .Map(await _login .Execute(_mapper .Map(request))); + } - public async Task ResetPassword(UserResetPasswordRequest request) => await _resetPassword.Execute(_mapper.Map(request)); + public async Task ResetPassword(UserResetPasswordRequest request) + { + return await _resetPassword.Execute(_mapper.Map(request)); + } } } \ No newline at end of file diff --git a/src/Adapters/PresenterController/CampusPresenterController.cs b/src/Adapters/PresenterController/CampusPresenterController.cs index 89e1e210..0f821bf2 100755 --- a/src/Adapters/PresenterController/CampusPresenterController.cs +++ b/src/Adapters/PresenterController/CampusPresenterController.cs @@ -2,8 +2,8 @@ using Adapters.Gateways.Campus; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.Campus; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.Campus; +using Domain.UseCases.Ports.Campus; namespace Adapters.PresenterController { @@ -26,39 +26,39 @@ public CampusPresenterController(ICreateCampus createCampus, IUpdateCampus updat _getCampusById = getCampusById; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Create(IRequest request) { - var dto = request as CreateCampusRequest; - var input = _mapper.Map(dto); - var result = await _createCampus.Execute(input); + CreateCampusRequest? dto = request as CreateCampusRequest; + CreateCampusInput input = _mapper.Map(dto); + DetailedReadCampusOutput result = await _createCampus.Execute(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - var result = await _deleteCampus.Execute(id); + DetailedReadCampusOutput result = await _deleteCampus.Execute(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - var result = await _getCampuses.Execute(skip, take); + IQueryable result = await _getCampuses.Execute(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - var result = await _getCampusById.Execute(id); + DetailedReadCampusOutput result = await _getCampusById.Execute(id); return _mapper.Map(result); } public async Task Update(Guid? id, IRequest request) { - var dto = request as UpdateCampusRequest; - var input = _mapper.Map(dto); - var result = await _updateCampus.Execute(id, input); + UpdateCampusRequest? dto = request as UpdateCampusRequest; + UpdateCampusInput input = _mapper.Map(dto); + DetailedReadCampusOutput result = await _updateCampus.Execute(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/CoursePresenterController.cs b/src/Adapters/PresenterController/CoursePresenterController.cs index 12904a90..9b4aff7c 100755 --- a/src/Adapters/PresenterController/CoursePresenterController.cs +++ b/src/Adapters/PresenterController/CoursePresenterController.cs @@ -2,8 +2,9 @@ using Adapters.Gateways.Course; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.Course; -using Domain.Interfaces.UseCases; +using Domain.Ports.Course; +using Domain.UseCases.Interfaces.Course; +using Domain.UseCases.Ports.Course; namespace Adapters.PresenterController { @@ -26,39 +27,39 @@ public CoursePresenterController(ICreateCourse createCourse, IUpdateCourse updat _getCourseById = getCourseById; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Create(IRequest request) { - var dto = request as CreateCourseRequest; - var input = _mapper.Map(dto); - var result = await _createCourse.Execute(input); + CreateCourseRequest? dto = request as CreateCourseRequest; + CreateCourseInput input = _mapper.Map(dto); + DetailedReadCourseOutput result = await _createCourse.Execute(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - var result = await _deleteCourse.Execute(id); + DetailedReadCourseOutput result = await _deleteCourse.Execute(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - var result = await _getCourses.Execute(skip, take); + IQueryable result = await _getCourses.Execute(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - var result = await _getCourseById.Execute(id); + DetailedReadCourseOutput result = await _getCourseById.Execute(id); return _mapper.Map(result); } public async Task Update(Guid? id, IRequest request) { - var dto = request as UpdateCourseRequest; - var input = _mapper.Map(dto); - var result = await _updateCourse.Execute(id, input); + UpdateCourseRequest? dto = request as UpdateCourseRequest; + UpdateCourseInput input = _mapper.Map(dto); + DetailedReadCourseOutput result = await _updateCourse.Execute(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/MainAreaPresenterController.cs b/src/Adapters/PresenterController/MainAreaPresenterController.cs index 4864f15e..89e7fdf8 100755 --- a/src/Adapters/PresenterController/MainAreaPresenterController.cs +++ b/src/Adapters/PresenterController/MainAreaPresenterController.cs @@ -2,8 +2,8 @@ using Adapters.Gateways.MainArea; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.MainArea; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.MainArea; +using Domain.UseCases.Ports.MainArea; namespace Adapters.PresenterController { @@ -26,39 +26,39 @@ public MainAreaPresenterController(ICreateMainArea createMainArea, IUpdateMainAr _getMainAreaById = getMainAreaById; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Create(IRequest request) { - var dto = request as CreateMainAreaRequest; - var input = _mapper.Map(dto); - var result = await _createMainArea.Execute(input); + CreateMainAreaRequest? dto = request as CreateMainAreaRequest; + CreateMainAreaInput input = _mapper.Map(dto); + DetailedMainAreaOutput result = await _createMainArea.Execute(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - var result = await _deleteMainArea.Execute(id); + DetailedMainAreaOutput result = await _deleteMainArea.Execute(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - var result = await _getMainAreas.Execute(skip, take); + IQueryable result = await _getMainAreas.Execute(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - var result = await _getMainAreaById.Execute(id); + DetailedMainAreaOutput result = await _getMainAreaById.Execute(id); return _mapper.Map(result); } public async Task Update(Guid? id, IRequest request) { - var dto = request as UpdateMainAreaRequest; - var input = _mapper.Map(dto); - var result = await _updateMainArea.Execute(id, input); + UpdateMainAreaRequest? dto = request as UpdateMainAreaRequest; + UpdateMainAreaInput input = _mapper.Map(dto); + DetailedMainAreaOutput result = await _updateMainArea.Execute(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/NoticePresenterController.cs b/src/Adapters/PresenterController/NoticePresenterController.cs index 153e4492..05c59c11 100755 --- a/src/Adapters/PresenterController/NoticePresenterController.cs +++ b/src/Adapters/PresenterController/NoticePresenterController.cs @@ -2,9 +2,8 @@ using Adapters.Gateways.Notice; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.Activity; -using Domain.Contracts.Notice; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.Notice; +using Domain.UseCases.Ports.Notice; namespace Adapters.PresenterController { @@ -33,37 +32,37 @@ public NoticePresenterController( _getNoticeById = getNoticeById; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Create(IRequest request) { - var input = _mapper.Map(request as CreateNoticeRequest); - var result = await _createNotice.Execute(input); + CreateNoticeInput input = _mapper.Map(request as CreateNoticeRequest); + DetailedReadNoticeOutput result = await _createNotice.Execute(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - var result = await _deleteNotice.Execute(id); + DetailedReadNoticeOutput result = await _deleteNotice.Execute(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - var result = await _getNotices.Execute(skip, take); + IEnumerable result = await _getNotices.Execute(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - var result = await _getNoticeById.Execute(id); + DetailedReadNoticeOutput result = await _getNoticeById.Execute(id); return _mapper.Map(result); } public async Task Update(Guid? id, IRequest request) { - var input = _mapper.Map(request as UpdateNoticeRequest); - var result = await _updateNotice.Execute(id, input); + UpdateNoticeInput input = _mapper.Map(request as UpdateNoticeRequest); + DetailedReadNoticeOutput result = await _updateNotice.Execute(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/ProfessorPresenterController.cs b/src/Adapters/PresenterController/ProfessorPresenterController.cs index 5d614f7c..8a6823fc 100755 --- a/src/Adapters/PresenterController/ProfessorPresenterController.cs +++ b/src/Adapters/PresenterController/ProfessorPresenterController.cs @@ -2,8 +2,8 @@ using Adapters.Gateways.Professor; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.Professor; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.Professor; +using Domain.UseCases.Ports.Professor; namespace Adapters.PresenterController { @@ -31,39 +31,39 @@ public ProfessorPresenterController(ICreateProfessor createProfessor, _getProfessorById = getProfessorById; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Create(IRequest request) { - var dto = request as CreateProfessorRequest; - var input = _mapper.Map(dto); - var result = await _createProfessor.Execute(input); + CreateProfessorRequest? dto = request as CreateProfessorRequest; + CreateProfessorInput input = _mapper.Map(dto); + DetailedReadProfessorOutput result = await _createProfessor.Execute(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - var result = await _deleteProfessor.Execute(id); + DetailedReadProfessorOutput result = await _deleteProfessor.Execute(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - var result = await _getProfessors.Execute(skip, take); + IQueryable result = await _getProfessors.Execute(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - var result = await _getProfessorById.Execute(id); + DetailedReadProfessorOutput result = await _getProfessorById.Execute(id); return _mapper.Map(result); } public async Task Update(Guid? id, IRequest request) { - var dto = request as UpdateProfessorRequest; - var input = _mapper.Map(dto); - var result = await _updateProfessor.Execute(id, input); + UpdateProfessorRequest? dto = request as UpdateProfessorRequest; + UpdateProfessorInput input = _mapper.Map(dto); + DetailedReadProfessorOutput result = await _updateProfessor.Execute(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/ProgramTypePresenterController.cs b/src/Adapters/PresenterController/ProgramTypePresenterController.cs index 7499dbf7..031ed6a7 100755 --- a/src/Adapters/PresenterController/ProgramTypePresenterController.cs +++ b/src/Adapters/PresenterController/ProgramTypePresenterController.cs @@ -2,8 +2,8 @@ using Adapters.Gateways.ProgramType; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.ProgramType; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.ProgramType; +using Domain.UseCases.Ports.ProgramType; namespace Adapters.PresenterController { @@ -26,39 +26,39 @@ public ProgramTypePresenterController(ICreateProgramType createProgramType, IUpd _getProgramTypeById = getProgramTypeById; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Create(IRequest request) { - var dto = request as CreateProgramTypeRequest; - var input = _mapper.Map(dto); - var result = await _createProgramType.Execute(input); + CreateProgramTypeRequest? dto = request as CreateProgramTypeRequest; + CreateProgramTypeInput input = _mapper.Map(dto); + DetailedReadProgramTypeOutput result = await _createProgramType.Execute(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - var result = await _deleteProgramType.Execute(id); + DetailedReadProgramTypeOutput result = await _deleteProgramType.Execute(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - var result = await _getProgramTypes.Execute(skip, take); + IQueryable result = await _getProgramTypes.Execute(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - var result = await _getProgramTypeById.Execute(id); + DetailedReadProgramTypeOutput result = await _getProgramTypeById.Execute(id); return _mapper.Map(result); } public async Task Update(Guid? id, IRequest request) { - var dto = request as UpdateProgramTypeRequest; - var input = _mapper.Map(dto); - var result = await _updateProgramType.Execute(id, input); + UpdateProgramTypeRequest? dto = request as UpdateProgramTypeRequest; + UpdateProgramTypeInput input = _mapper.Map(dto); + DetailedReadProgramTypeOutput result = await _updateProgramType.Execute(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/ProjectEvaluationPresenterController.cs b/src/Adapters/PresenterController/ProjectEvaluationPresenterController.cs index 1fabff06..72844afc 100644 --- a/src/Adapters/PresenterController/ProjectEvaluationPresenterController.cs +++ b/src/Adapters/PresenterController/ProjectEvaluationPresenterController.cs @@ -2,8 +2,8 @@ using Adapters.Gateways.ProjectEvaluation; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.ProjectEvaluation; -using Domain.Interfaces.UseCases.ProjectEvaluation; +using Domain.UseCases.Interfaces.ProjectEvaluation; +using Domain.UseCases.Ports.ProjectEvaluation; namespace Adapters.PresenterController { @@ -26,25 +26,25 @@ public ProjectEvaluationPresenterController( _getEvaluationByProjectId = getEvaluationByProjectId; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task EvaluateAppealProject(EvaluateAppealProjectRequest request) { - var input = _mapper.Map(request); - var output = await _evaluateAppealProject.Execute(input); + EvaluateAppealProjectInput input = _mapper.Map(request); + Domain.UseCases.Ports.Project.DetailedReadProjectOutput output = await _evaluateAppealProject.Execute(input); return _mapper.Map(output); } public async Task EvaluateSubmissionProject(EvaluateSubmissionProjectRequest request) { - var input = _mapper.Map(request); - var output = await _evaluateSubmissionProject.Execute(input); + EvaluateSubmissionProjectInput input = _mapper.Map(request); + Domain.UseCases.Ports.Project.DetailedReadProjectOutput output = await _evaluateSubmissionProject.Execute(input); return _mapper.Map(output); } public async Task GetEvaluationByProjectId(Guid? projectId) { - var output = await _getEvaluationByProjectId.Execute(projectId); + DetailedReadProjectEvaluationOutput output = await _getEvaluationByProjectId.Execute(projectId); return _mapper.Map(output); } } diff --git a/src/Adapters/PresenterController/ProjectPresenterController.cs b/src/Adapters/PresenterController/ProjectPresenterController.cs index 4bba9aff..94654add 100644 --- a/src/Adapters/PresenterController/ProjectPresenterController.cs +++ b/src/Adapters/PresenterController/ProjectPresenterController.cs @@ -1,8 +1,8 @@ using Adapters.Gateways.Project; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.Project; -using Domain.Interfaces.UseCases.Project; +using Domain.UseCases.Interfaces.Project; +using Domain.UseCases.Ports.Project; namespace Adapters.PresenterController { @@ -40,55 +40,55 @@ public ProjectPresenterController( _submitProject = submitProject; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task AppealProject(Guid? projectId, string? appealDescription) { - var output = await _appealProject.Execute(projectId, appealDescription); + ResumedReadProjectOutput output = await _appealProject.Execute(projectId, appealDescription); return _mapper.Map(output); } public async Task CancelProject(Guid? id, string? observation) { - var output = await _cancelProject.Execute(id, observation); + ResumedReadProjectOutput output = await _cancelProject.Execute(id, observation); return _mapper.Map(output); } public async Task> GetClosedProjects(int skip, int take, bool onlyMyProjects = true) { - var output = await _getClosedProjects.Execute(skip, take, onlyMyProjects); + IList output = await _getClosedProjects.Execute(skip, take, onlyMyProjects); return _mapper.Map>(output); } public async Task> GetOpenProjects(int skip, int take, bool onlyMyProjects = true) { - var output = await _getOpenProjects.Execute(skip, take, onlyMyProjects); + IList output = await _getOpenProjects.Execute(skip, take, onlyMyProjects); return _mapper.Map>(output); } public async Task GetProjectById(Guid? id) { - var output = await _getProjectById.Execute(id); + DetailedReadProjectOutput output = await _getProjectById.Execute(id); return _mapper.Map(output); } public async Task OpenProject(OpenProjectRequest request) { - var input = _mapper.Map(request); - var output = await _openProject.Execute(input); + OpenProjectInput input = _mapper.Map(request); + ResumedReadProjectOutput output = await _openProject.Execute(input); return _mapper.Map(output); } public async Task SubmitProject(Guid? projectId) { - var output = await _submitProject.Execute(projectId); + ResumedReadProjectOutput output = await _submitProject.Execute(projectId); return _mapper.Map(output); } public async Task UpdateProject(Guid? id, UpdateProjectRequest request) { - var input = _mapper.Map(request); - var output = await _updateProject.Execute(id, input); + UpdateProjectInput input = _mapper.Map(request); + ResumedReadProjectOutput output = await _updateProject.Execute(id, input); return _mapper.Map(output); } } diff --git a/src/Adapters/PresenterController/StudentDocumentsPresenterController.cs b/src/Adapters/PresenterController/StudentDocumentsPresenterController.cs index 8c2631b7..ab1939ea 100644 --- a/src/Adapters/PresenterController/StudentDocumentsPresenterController.cs +++ b/src/Adapters/PresenterController/StudentDocumentsPresenterController.cs @@ -1,8 +1,8 @@ using Adapters.Gateways.StudentDocuments; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.StudentDocuments; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; namespace Adapters.PresenterController { @@ -30,37 +30,37 @@ public StudentDocumentsPresenterController( _getStudentDocumentsByStudent = getStudentDocumentsByStudent; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Create(CreateStudentDocumentsRequest model) { - var input = _mapper.Map(model); - var result = await _createStudentDocuments.Execute(input); + CreateStudentDocumentsInput input = _mapper.Map(model); + DetailedReadStudentDocumentsOutput result = await _createStudentDocuments.Execute(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - var result = await _deleteStudentDocuments.Execute(id); + DetailedReadStudentDocumentsOutput result = await _deleteStudentDocuments.Execute(id); return _mapper.Map(result); } public async Task GetByProjectId(Guid? projectId) { - var result = await _getStudentDocumentsByProject.Execute(projectId); + ResumedReadStudentDocumentsOutput result = await _getStudentDocumentsByProject.Execute(projectId); return _mapper.Map(result); } public async Task GetByStudentId(Guid? studentId) { - var result = await _getStudentDocumentsByStudent.Execute(studentId); + ResumedReadStudentDocumentsOutput result = await _getStudentDocumentsByStudent.Execute(studentId); return _mapper.Map(result); } public async Task Update(Guid? id, UpdateStudentDocumentsRequest model) { - var input = _mapper.Map(model); - var result = await _updateStudentDocuments.Execute(id, input); + UpdateStudentDocumentsInput input = _mapper.Map(model); + DetailedReadStudentDocumentsOutput result = await _updateStudentDocuments.Execute(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/StudentPresenterController.cs b/src/Adapters/PresenterController/StudentPresenterController.cs index e2ce0885..1e60d17f 100755 --- a/src/Adapters/PresenterController/StudentPresenterController.cs +++ b/src/Adapters/PresenterController/StudentPresenterController.cs @@ -2,8 +2,8 @@ using Adapters.Gateways.Student; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.Student; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.Student; +using Domain.UseCases.Ports.Student; namespace Adapters.PresenterController { @@ -26,39 +26,39 @@ public StudentPresenterController(ICreateStudent createStudent, IUpdateStudent u _getStudentById = getStudentById; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Create(IRequest request) { - var dto = request as CreateStudentRequest; - var input = _mapper.Map(dto); - var result = await _createStudent.Execute(input); + CreateStudentRequest? dto = request as CreateStudentRequest; + CreateStudentInput input = _mapper.Map(dto); + DetailedReadStudentOutput result = await _createStudent.Execute(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - var result = await _deleteStudent.Execute(id); + DetailedReadStudentOutput result = await _deleteStudent.Execute(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - var result = await _getStudents.Execute(skip, take); + IQueryable result = await _getStudents.Execute(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - var result = await _getStudentById.Execute(id); + DetailedReadStudentOutput result = await _getStudentById.Execute(id); return _mapper.Map(result); } public async Task Update(Guid? id, IRequest request) { - var dto = request as UpdateStudentRequest; - var input = _mapper.Map(dto); - var result = await _updateStudent.Execute(id, input); + UpdateStudentRequest? dto = request as UpdateStudentRequest; + UpdateStudentInput input = _mapper.Map(dto); + DetailedReadStudentOutput result = await _updateStudent.Execute(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/SubAreaPresenterController.cs b/src/Adapters/PresenterController/SubAreaPresenterController.cs index 6d9e56c3..411b6521 100755 --- a/src/Adapters/PresenterController/SubAreaPresenterController.cs +++ b/src/Adapters/PresenterController/SubAreaPresenterController.cs @@ -2,8 +2,8 @@ using Adapters.Gateways.SubArea; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.SubArea; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.SubArea; +using Domain.UseCases.Ports.SubArea; namespace Adapters.PresenterController { @@ -27,19 +27,19 @@ public SubAreaPresenterController(ICreateSubArea createSubArea, IUpdateSubArea u _getSubAreaById = getSubAreaById; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Create(IRequest request) { - var dto = request as CreateSubAreaRequest; - var input = _mapper.Map(dto); - var result = await _createSubArea.Execute(input); + CreateSubAreaRequest? dto = request as CreateSubAreaRequest; + CreateSubAreaInput input = _mapper.Map(dto); + DetailedReadSubAreaOutput result = await _createSubArea.Execute(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - var result = await _deleteSubArea.Execute(id); + DetailedReadSubAreaOutput result = await _deleteSubArea.Execute(id); return _mapper.Map(result); } @@ -50,21 +50,21 @@ public Task> GetAll(int skip, int take) public async Task GetById(Guid? id) { - var result = await _getSubAreaById.Execute(id); + DetailedReadSubAreaOutput result = await _getSubAreaById.Execute(id); return _mapper.Map(result); } public async Task> GetSubAreasByArea(Guid? areaId, int skip, int take) { - var result = await _getSubAreasByArea.Execute(areaId, skip, take); + IQueryable result = await _getSubAreasByArea.Execute(areaId, skip, take); return _mapper.Map>(result); } public async Task Update(Guid? id, IRequest request) { - var dto = request as UpdateSubAreaRequest; - var input = _mapper.Map(dto); - var result = await _updateSubArea.Execute(id, input); + UpdateSubAreaRequest? dto = request as UpdateSubAreaRequest; + UpdateSubAreaInput input = _mapper.Map(dto); + DetailedReadSubAreaOutput result = await _updateSubArea.Execute(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/TypeAssistancePresenterController.cs b/src/Adapters/PresenterController/TypeAssistancePresenterController.cs index 7939d9ff..63310174 100755 --- a/src/Adapters/PresenterController/TypeAssistancePresenterController.cs +++ b/src/Adapters/PresenterController/TypeAssistancePresenterController.cs @@ -1,9 +1,9 @@ -using Adapters.Gateways.Base; using Adapters.Gateways.AssistanceType; +using Adapters.Gateways.Base; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.AssistanceType; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; namespace Adapters.PresenterController { @@ -31,39 +31,39 @@ public AssistanceTypePresenterController(ICreateAssistanceType createAssistanceT _getAssistanceTypeById = getAssistanceTypeById; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Create(IRequest request) { - var dto = request as CreateAssistanceTypeRequest; - var input = _mapper.Map(dto); - var result = await _createAssistanceType.Execute(input); + CreateAssistanceTypeRequest? dto = request as CreateAssistanceTypeRequest; + CreateAssistanceTypeInput input = _mapper.Map(dto); + DetailedReadAssistanceTypeOutput result = await _createAssistanceType.Execute(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - var result = await _deleteAssistanceType.Execute(id); + DetailedReadAssistanceTypeOutput result = await _deleteAssistanceType.Execute(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - var result = await _getAssistanceTypes.Execute(skip, take); + IQueryable result = await _getAssistanceTypes.Execute(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - var result = await _getAssistanceTypeById.Execute(id); + DetailedReadAssistanceTypeOutput result = await _getAssistanceTypeById.Execute(id); return _mapper.Map(result); } public async Task Update(Guid? id, IRequest request) { - var dto = request as UpdateAssistanceTypeRequest; - var input = _mapper.Map(dto); - var result = await _updateAssistanceType.Execute(id, input); + UpdateAssistanceTypeRequest? dto = request as UpdateAssistanceTypeRequest; + UpdateAssistanceTypeInput input = _mapper.Map(dto); + DetailedReadAssistanceTypeOutput result = await _updateAssistanceType.Execute(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/UserPresenterController.cs b/src/Adapters/PresenterController/UserPresenterController.cs index 52fd0321..2c55fb2a 100755 --- a/src/Adapters/PresenterController/UserPresenterController.cs +++ b/src/Adapters/PresenterController/UserPresenterController.cs @@ -1,8 +1,8 @@ using Adapters.Gateways.User; using Adapters.Interfaces; using AutoMapper; -using Domain.Contracts.User; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.User; +using Domain.UseCases.Ports.User; namespace Adapters.PresenterController { @@ -32,42 +32,42 @@ public UserPresenterController(IActivateUser activateUser, _updateUser = updateUser; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task ActivateUser(Guid? id) { - var result = await _activateUser.Execute(id); + UserReadOutput result = await _activateUser.Execute(id); return _mapper.Map(result); } public async Task DeactivateUser(Guid? id) { - var result = await _deactivateUser.Execute(id); + UserReadOutput result = await _deactivateUser.Execute(id); return _mapper.Map(result); } public async Task> GetActiveUsers(int skip, int take) { - var result = await _getActiveUsers.Execute(skip, take); + IEnumerable result = await _getActiveUsers.Execute(skip, take); return _mapper.Map>(result); } public async Task> GetInactiveUsers(int skip, int take) { - var result = await _getInactiveUsers.Execute(skip, take); + IEnumerable result = await _getInactiveUsers.Execute(skip, take); return _mapper.Map>(result); } public async Task GetUserById(Guid? id) { - var result = await _getUserById.Execute(id); + UserReadOutput result = await _getUserById.Execute(id); return _mapper.Map(result); } public async Task UpdateUser(UserUpdateRequest request) { - var input = _mapper.Map(request); - var result = await _updateUser.Execute(input); + UserUpdateInput input = _mapper.Map(request); + UserReadOutput result = await _updateUser.Execute(input); return _mapper.Map(result); } } diff --git a/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs b/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs index 5f7fcdb0..94a7d7bb 100644 --- a/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs +++ b/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs @@ -1,13 +1,13 @@ +using System; +using System.Threading.Tasks; using AutoMapper; -using Domain.Contracts.Area; -using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases; +using Domain.Ports.Area; using Domain.UseCases; +using Domain.UseCases.Interfaces.Repositories; +using Domain.UseCases.Interfaces.UseCases; using Domain.Validation; using Moq; using NUnit.Framework; -using System; -using System.Threading.Tasks; namespace Domain.Tests.UseCases.Area { diff --git a/src/Domain.Tests/UseCases/Area/DeleteAreaTests.cs b/src/Domain.Tests/UseCases/Area/DeleteAreaTests.cs index 934940d0..757c581c 100644 --- a/src/Domain.Tests/UseCases/Area/DeleteAreaTests.cs +++ b/src/Domain.Tests/UseCases/Area/DeleteAreaTests.cs @@ -1,13 +1,13 @@ +using System; +using System.Threading.Tasks; using AutoMapper; -using Domain.Contracts.Area; -using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases; +using Domain.Ports.Area; using Domain.UseCases; +using Domain.UseCases.Interfaces.Repositories; +using Domain.UseCases.Interfaces.UseCases; using Domain.Validation; using Moq; using NUnit.Framework; -using System; -using System.Threading.Tasks; namespace Domain.Tests.UseCases.Area { diff --git a/src/Domain.Tests/UseCases/Area/GetAreaByIdTests.cs b/src/Domain.Tests/UseCases/Area/GetAreaByIdTests.cs index 9860293e..ee9ab2cf 100644 --- a/src/Domain.Tests/UseCases/Area/GetAreaByIdTests.cs +++ b/src/Domain.Tests/UseCases/Area/GetAreaByIdTests.cs @@ -1,13 +1,13 @@ +using System; +using System.Threading.Tasks; using AutoMapper; -using Domain.Contracts.Area; -using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases; +using Domain.Ports.Area; using Domain.UseCases; +using Domain.UseCases.Interfaces.Repositories; +using Domain.UseCases.Interfaces.UseCases; using Domain.Validation; using Moq; using NUnit.Framework; -using System; -using System.Threading.Tasks; namespace Domain.Tests.UseCases.Area { diff --git a/src/Domain.Tests/UseCases/Area/UpdateAreaTests.cs b/src/Domain.Tests/UseCases/Area/UpdateAreaTests.cs index 68f1623d..d2488390 100644 --- a/src/Domain.Tests/UseCases/Area/UpdateAreaTests.cs +++ b/src/Domain.Tests/UseCases/Area/UpdateAreaTests.cs @@ -1,13 +1,13 @@ +using System; +using System.Threading.Tasks; using AutoMapper; -using Domain.Contracts.Area; -using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases; +using Domain.Ports.Area; using Domain.UseCases; +using Domain.UseCases.Interfaces.Repositories; +using Domain.UseCases.Interfaces.UseCases; using Domain.Validation; using Moq; using NUnit.Framework; -using System; -using System.Threading.Tasks; namespace Domain.Tests.UseCases.Area { diff --git a/src/Domain/Contracts/Activity/ActivityTypeOutput.cs b/src/Domain/Contracts/Activity/ActivityTypeOutput.cs deleted file mode 100644 index bc070298..00000000 --- a/src/Domain/Contracts/Activity/ActivityTypeOutput.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Domain.Contracts.Activity; -public class ActivityTypeOutput : BaseActivityType -{ - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } - new public IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/BaseActivity.cs b/src/Domain/Contracts/Activity/BaseActivity.cs deleted file mode 100644 index 3c50f5e0..00000000 --- a/src/Domain/Contracts/Activity/BaseActivity.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Domain.Contracts.Activity; -public class BaseActivity -{ - [Required] - public string? Name { get; set; } - [Required] - public double? Points { get; set; } - public double? Limits { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/BaseActivityType.cs b/src/Domain/Contracts/Activity/BaseActivityType.cs deleted file mode 100644 index 441b6998..00000000 --- a/src/Domain/Contracts/Activity/BaseActivityType.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Domain.Contracts.Activity; -public class BaseActivityType -{ - [Required] - public string? Name { get; set; } - [Required] - public string? Unity { get; set; } - [Required] - public virtual IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/CreateActivityInput.cs b/src/Domain/Contracts/Activity/CreateActivityInput.cs deleted file mode 100644 index f18f710d..00000000 --- a/src/Domain/Contracts/Activity/CreateActivityInput.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace Domain.Contracts.Activity; -public class CreateActivityInput : BaseActivity { } \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/CreateActivityTypeInput.cs b/src/Domain/Contracts/Activity/CreateActivityTypeInput.cs deleted file mode 100644 index c06c537b..00000000 --- a/src/Domain/Contracts/Activity/CreateActivityTypeInput.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Domain.Contracts.Activity; -public class CreateActivityTypeInput -{ - [Required] - public string? Name { get; set; } - [Required] - public string? Unity { get; set; } - [Required] - public virtual IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs b/src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs deleted file mode 100644 index d6207bcf..00000000 --- a/src/Domain/Contracts/Activity/UpdateActivityTypeInput.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Domain.Contracts.Activity; -public class UpdateActivityTypeInput -{ - [Required] - public string? Name { get; set; } - [Required] - public string? Unity { get; set; } - [Required] - public IList? Activities { get; set; } - - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/MainArea/CreateMainAreaInput.cs b/src/Domain/Contracts/MainArea/CreateMainAreaInput.cs deleted file mode 100644 index 2eb21af9..00000000 --- a/src/Domain/Contracts/MainArea/CreateMainAreaInput.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; - -namespace Domain.Contracts.MainArea -{ - public class CreateMainAreaInput : BaseMainAreaContract { } -} \ No newline at end of file diff --git a/src/Domain/Contracts/Notice/CreateNoticeInput.cs b/src/Domain/Contracts/Notice/CreateNoticeInput.cs deleted file mode 100644 index 4ec51856..00000000 --- a/src/Domain/Contracts/Notice/CreateNoticeInput.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Domain.Contracts.Activity; -using Microsoft.AspNetCore.Http; - -namespace Domain.Contracts.Notice; -public class CreateNoticeInput : BaseNoticeContract -{ - public IFormFile? File { get; set; } - public IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/Project/ResumedReadProjectOutput.cs b/src/Domain/Contracts/Project/ResumedReadProjectOutput.cs deleted file mode 100644 index 21e050bc..00000000 --- a/src/Domain/Contracts/Project/ResumedReadProjectOutput.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Domain.Contracts.Project; -public class ResumedReadProjectOutput : BaseProjectContract -{ - public Guid? Id { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/BaseProjectActivityContract.cs b/src/Domain/Contracts/ProjectActivity/BaseProjectActivityContract.cs deleted file mode 100644 index 101dbdc6..00000000 --- a/src/Domain/Contracts/ProjectActivity/BaseProjectActivityContract.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Domain.Contracts.ProjectActivity; -public abstract class BaseProjectActivityContract -{ - [Required] - public Guid? ActivityId { get; set; } - [Required] - public int? InformedActivities { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/CreateProjectActivityInput.cs b/src/Domain/Contracts/ProjectActivity/CreateProjectActivityInput.cs deleted file mode 100644 index 876cd90a..00000000 --- a/src/Domain/Contracts/ProjectActivity/CreateProjectActivityInput.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace Domain.Contracts.ProjectActivity; -public class CreateProjectActivityInput : BaseProjectActivityContract { } \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/DetailedReadProjectActivityOutput.cs b/src/Domain/Contracts/ProjectActivity/DetailedReadProjectActivityOutput.cs deleted file mode 100644 index 73e51036..00000000 --- a/src/Domain/Contracts/ProjectActivity/DetailedReadProjectActivityOutput.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Domain.Contracts.ProjectActivity; -public class DetailedReadProjectActivityOutput : BaseProjectActivityContract -{ - public Guid? Id { get; set; } - public Guid? ProjectId { get; set; } - public int? FoundActivities { get; set; } - public DateTime? DeletedAt { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/EvaluateProjectActivityInput.cs b/src/Domain/Contracts/ProjectActivity/EvaluateProjectActivityInput.cs deleted file mode 100644 index 6e55f38d..00000000 --- a/src/Domain/Contracts/ProjectActivity/EvaluateProjectActivityInput.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Domain.Contracts.ProjectActivity; -public class EvaluateProjectActivityInput : BaseProjectActivityContract -{ - [Required] - public Guid? ProjectId { get; set; } - [Required] - public int? FoundActivities { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/ResumedReadProjectActivityOutput.cs b/src/Domain/Contracts/ProjectActivity/ResumedReadProjectActivityOutput.cs deleted file mode 100644 index 71d6558a..00000000 --- a/src/Domain/Contracts/ProjectActivity/ResumedReadProjectActivityOutput.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Domain.Contracts.ProjectActivity; -public class ResumedReadProjectActivityOutput : BaseProjectActivityContract -{ - public Guid? Id { get; set; } - public Guid? ProjectId { get; set; } - public int? FoundActivities { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectActivity/UpdateProjectActivityInput.cs b/src/Domain/Contracts/ProjectActivity/UpdateProjectActivityInput.cs deleted file mode 100644 index 6deeb347..00000000 --- a/src/Domain/Contracts/ProjectActivity/UpdateProjectActivityInput.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Domain.Contracts.ProjectActivity; -public class UpdateProjectActivityInput : BaseProjectActivityContract -{ - [Required] - public Guid? ProjectId { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs b/src/Domain/Contracts/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs deleted file mode 100644 index d4a83029..00000000 --- a/src/Domain/Contracts/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace Domain.Contracts.ProjectEvaluation; -public class DetailedReadProjectEvaluationOutput -{ - #region Informações Gerais da Avaliação - public Guid? ProjectId { get; set; } - public bool IsProductivityFellow { get; set; } - public Guid? SubmissionEvaluatorId { get; set; } - public int? SubmissionEvaluationStatus { get; set; } - public DateTime? SubmissionEvaluationDate { get; set; } - public string? SubmissionEvaluationDescription { get; set; } - public Guid? AppealEvaluatorId { get; set; } - public int? AppealEvaluationStatus { get; set; } - public DateTime? AppealEvaluationDate { get; set; } - public string? AppealEvaluationDescription { get; set; } - #endregion - - #region Critérios de Avaliação - public int? APIndex { get; set; } - public int? Qualification { get; set; } - public int? ProjectProposalObjectives { get; set; } - public int? AcademicScientificProductionCoherence { get; set; } - public int? ProposalMethodologyAdaptation { get; set; } - public int? EffectiveContributionToResearch { get; set; } - #endregion -} \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectEvaluation/EvaluateAppealProjectInput.cs b/src/Domain/Contracts/ProjectEvaluation/EvaluateAppealProjectInput.cs deleted file mode 100644 index 74270d63..00000000 --- a/src/Domain/Contracts/ProjectEvaluation/EvaluateAppealProjectInput.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Domain.Contracts.ProjectEvaluation; -public class EvaluateAppealProjectInput -{ - [Required] - public Guid? ProjectId { get; set; } - [Required] - public int? AppealEvaluationStatus { get; set; } - [Required] - public string? AppealEvaluationDescription { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs b/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs deleted file mode 100644 index aa730625..00000000 --- a/src/Domain/Contracts/ProjectEvaluation/EvaluateSubmissionProjectInput.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using Domain.Contracts.ProjectActivity; - -namespace Domain.Contracts.ProjectEvaluation; -public class EvaluateSubmissionProjectInput -{ - #region Informações Gerais da Avaliação - [Required] - public Guid? ProjectId { get; set; } - [Required] - public bool IsProductivityFellow { get; set; } - [Required] - public int? SubmissionEvaluationStatus { get; set; } - [Required] - public string? SubmissionEvaluationDescription { get; set; } - [Required] - public IList? Activities { get; set; } - #endregion - - #region Critérios de Avaliação - [Required] - public int? Qualification { get; set; } - [Required] - public int? ProjectProposalObjectives { get; set; } - [Required] - public int? AcademicScientificProductionCoherence { get; set; } - [Required] - public int? ProposalMethodologyAdaptation { get; set; } - [Required] - public int? EffectiveContributionToResearch { get; set; } - #endregion -} \ No newline at end of file diff --git a/src/Domain/Contracts/StudentDocuments/CreateStudentDocumentsInput.cs b/src/Domain/Contracts/StudentDocuments/CreateStudentDocumentsInput.cs deleted file mode 100644 index b47402aa..00000000 --- a/src/Domain/Contracts/StudentDocuments/CreateStudentDocumentsInput.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using Microsoft.AspNetCore.Http; - -namespace Domain.Contracts.StudentDocuments; -public class CreateStudentDocumentsInput -{ - [Required] - public Guid? ProjectId { get; set; } - - #region Documents - /// - /// Cópia do documento de identidade com foto. - /// - [Required] - public IFormFile? IdentityDocument { get; set; } - - /// - /// Cópia do CPF - /// - [Required] - public IFormFile? CPF { get; set; } - - /// - /// Foto 3x4 - /// - [Required] - public IFormFile? Photo3x4 { get; set; } - - /// - /// Cópia atualizada do Histórico Escolar - /// - [Required] - public IFormFile? SchoolHistory { get; set; } - - /// - /// Termo de Compromisso do Bolsista assinado (Anexo II ou disponível na página do PIBIC) no caso de bolsista do CEFET/RJ - /// - [Required] - public IFormFile? ScholarCommitmentAgreement { get; set; } - - /// - /// Autorização dos pais ou responsáveis legais, em caso de aluno menor de 18 anos (Anexo 3 do Edital PIBIC ou modelo disponível na página da COPET) - /// - public IFormFile? ParentalAuthorization { get; set; } - #endregion - - #region BankData - /// - /// Número da Agência - /// - public string? AgencyNumber { get; set; } - /// - /// Número da Conta Corrente - /// - public string? AccountNumber { get; set; } - - /// - /// Comprovante de Abertura de Conta - /// - [Required] - public IFormFile? AccountOpeningProof { get; set; } - #endregion -} \ No newline at end of file diff --git a/src/Domain/Contracts/StudentDocuments/DetailedReadStudentDocumentsOutput.cs b/src/Domain/Contracts/StudentDocuments/DetailedReadStudentDocumentsOutput.cs deleted file mode 100644 index ce47fa2c..00000000 --- a/src/Domain/Contracts/StudentDocuments/DetailedReadStudentDocumentsOutput.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Domain.Contracts.StudentDocuments; -public class DetailedReadStudentDocumentsOutput : BaseStudentDocumentsOutput -{ - public DateTime? DeletedAt { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Contracts/StudentDocuments/ResumedReadStudentDocumentsOutput.cs b/src/Domain/Contracts/StudentDocuments/ResumedReadStudentDocumentsOutput.cs deleted file mode 100644 index 132f0af2..00000000 --- a/src/Domain/Contracts/StudentDocuments/ResumedReadStudentDocumentsOutput.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace Domain.Contracts.StudentDocuments; -public class ResumedReadStudentDocumentsOutput : BaseStudentDocumentsOutput { } diff --git a/src/Domain/Contracts/StudentDocuments/UpdateStudentDocumentsInput.cs b/src/Domain/Contracts/StudentDocuments/UpdateStudentDocumentsInput.cs deleted file mode 100644 index 6c40bc1e..00000000 --- a/src/Domain/Contracts/StudentDocuments/UpdateStudentDocumentsInput.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Microsoft.AspNetCore.Http; - -namespace Domain.Contracts.StudentDocuments; -public class UpdateStudentDocumentsInput -{ - /// - /// Cópia do documento de identidade com foto. - /// - public IFormFile? IdentityDocument { get; set; } - - /// - /// Cópia do CPF - /// - public IFormFile? CPF { get; set; } - - /// - /// Foto 3x4 - /// - public IFormFile? Photo3x4 { get; set; } - - /// - /// Cópia atualizada do Histórico Escolar - /// - public IFormFile? SchoolHistory { get; set; } - - /// - /// Termo de Compromisso do Bolsista assinado (Anexo II ou disponível na página do PIBIC) no caso de bolsista do CEFET/RJ - /// - public IFormFile? ScholarCommitmentAgreement { get; set; } - - /// - /// Autorização dos pais ou responsáveis legais, em caso de aluno menor de 18 anos (Anexo 3 do Edital PIBIC ou modelo disponível na página da COPET) - /// - public IFormFile? ParentalAuthorization { get; set; } - - /// - /// Número da Agência - /// - public string? AgencyNumber { get; set; } - /// - /// Número da Conta Corrente - /// - public string? AccountNumber { get; set; } - - /// - /// Comprovante de Abertura de Conta - /// - public IFormFile? AccountOpeningProof { get; set; } -} \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/Bases/IGenericCRUDRepository.cs b/src/Domain/Interfaces/Repositories/Bases/IGenericCRUDRepository.cs index 5fc9fc3e..1b3c00ec 100644 --- a/src/Domain/Interfaces/Repositories/Bases/IGenericCRUDRepository.cs +++ b/src/Domain/Interfaces/Repositories/Bases/IGenericCRUDRepository.cs @@ -13,6 +13,8 @@ public interface IGenericCRUDRepository /// /// Busca todas as entidades ativas. /// + /// + /// /// Lista de entidades ativas. Task> GetAll(int skip, int take); diff --git a/src/Domain/Interfaces/Repositories/IActivityRepository.cs b/src/Domain/Interfaces/Repositories/IActivityRepository.cs index 65cf6aba..c384860e 100644 --- a/src/Domain/Interfaces/Repositories/IActivityRepository.cs +++ b/src/Domain/Interfaces/Repositories/IActivityRepository.cs @@ -1,5 +1,7 @@ using Domain.Entities; using Domain.Interfaces.Repositories.Bases; -namespace Domain.Interfaces.Repositories; -public interface IActivityRepository : IGenericCRUDRepository { } \ No newline at end of file +namespace Domain.Interfaces.Repositories +{ + public interface IActivityRepository : IGenericCRUDRepository { } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs b/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs index 5a1b87f5..cfc7cb1a 100644 --- a/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs @@ -1,8 +1,10 @@ using Domain.Entities; using Domain.Interfaces.Repositories.Bases; -namespace Domain.Interfaces.Repositories; -public interface IProjectActivityRepository : IGenericCRUDRepository +namespace Domain.Interfaces.Repositories { - Task> GetByProjectId(Guid? projectId); + public interface IProjectActivityRepository : IGenericCRUDRepository + { + Task> GetByProjectId(Guid? projectId); + } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProjectRepository.cs b/src/Domain/Interfaces/Repositories/IProjectRepository.cs index e816da69..4987c4ee 100644 --- a/src/Domain/Interfaces/Repositories/IProjectRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProjectRepository.cs @@ -14,6 +14,8 @@ public interface IProjectRepository /// /// Permite a busca de todos os projetos abertos. /// + /// + /// /// Filtra por projetos encerrados. /// Retorna todos os projetos. Task> GetProjects(int skip, int take, bool isClosed = false); @@ -21,6 +23,8 @@ public interface IProjectRepository /// /// Permite a busca dos projetos associados ao aluno. /// + /// + /// /// Id do aluno. /// Filtra por projetos encerrados. /// Retorna os projetos do aluno. @@ -29,6 +33,8 @@ public interface IProjectRepository /// /// Permite a busca dos projetos associados ao professor. /// + /// + /// /// Id do professor. /// Filtra por projetos encerrados. /// Retorna os projetos do professor. diff --git a/src/Domain/Interfaces/Repositories/IStudentDocumentsRepository.cs b/src/Domain/Interfaces/Repositories/IStudentDocumentsRepository.cs index 0639bdaf..fe98a4ef 100644 --- a/src/Domain/Interfaces/Repositories/IStudentDocumentsRepository.cs +++ b/src/Domain/Interfaces/Repositories/IStudentDocumentsRepository.cs @@ -1,9 +1,11 @@ using Domain.Entities; using Domain.Interfaces.Repositories.Bases; -namespace Domain.Interfaces.Repositories; -public interface IStudentDocumentsRepository : IGenericCRUDRepository +namespace Domain.Interfaces.Repositories { - Task GetByProjectId(Guid? projectId); - Task GetByStudentId(Guid? studentId); + public interface IStudentDocumentsRepository : IGenericCRUDRepository + { + Task GetByProjectId(Guid? projectId); + Task GetByStudentId(Guid? studentId); + } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IStudentRepository.cs b/src/Domain/Interfaces/Repositories/IStudentRepository.cs index 14528c22..23a5d4d6 100644 --- a/src/Domain/Interfaces/Repositories/IStudentRepository.cs +++ b/src/Domain/Interfaces/Repositories/IStudentRepository.cs @@ -3,7 +3,5 @@ namespace Domain.Interfaces.Repositories { - public interface IStudentRepository : IGenericCRUDRepository - { - } + public interface IStudentRepository : IGenericCRUDRepository { } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IUserRepository.cs b/src/Domain/Interfaces/Repositories/IUserRepository.cs index 57c8c408..01bf94f9 100644 --- a/src/Domain/Interfaces/Repositories/IUserRepository.cs +++ b/src/Domain/Interfaces/Repositories/IUserRepository.cs @@ -7,12 +7,16 @@ public interface IUserRepository /// /// Retorna usuários ativos no sistema. /// + /// + /// /// Usuários encontrados. Task> GetActiveUsers(int skip, int take); /// /// Retorna usuários inativos no sistema. /// + /// + /// /// Usuários encontrados. Task> GetInactiveUsers(int skip, int take); diff --git a/src/Domain/Interfaces/Services/IEmailService.cs b/src/Domain/Interfaces/Services/IEmailService.cs index 7bed2729..76aee112 100644 --- a/src/Domain/Interfaces/Services/IEmailService.cs +++ b/src/Domain/Interfaces/Services/IEmailService.cs @@ -1,8 +1,10 @@ -namespace Domain.Interfaces.Services; -public interface IEmailService +namespace Domain.Interfaces.Services { - Task SendConfirmationEmail(string? email, string? name, string? token); - Task SendResetPasswordEmail(string? email, string? name, string? token); - Task SendNoticeEmail(string? email, string? name, DateTime? registrationStartDate, DateTime? registrationEndDate, string? noticeUrl); - Task SendProjectNotificationEmail(string? email, string? name, string? projectTitle, string? status, string? description); + public interface IEmailService + { + Task SendConfirmationEmail(string? email, string? name, string? token); + Task SendResetPasswordEmail(string? email, string? name, string? token); + Task SendNoticeEmail(string? email, string? name, DateTime? registrationStartDate, DateTime? registrationEndDate, string? noticeUrl); + Task SendProjectNotificationEmail(string? email, string? name, string? projectTitle, string? status, string? description); + } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Services/IHashService.cs b/src/Domain/Interfaces/Services/IHashService.cs index ff09bf22..e60474bc 100644 --- a/src/Domain/Interfaces/Services/IHashService.cs +++ b/src/Domain/Interfaces/Services/IHashService.cs @@ -1,6 +1,8 @@ -namespace Domain.Interfaces.Services; -public interface IHashService +namespace Domain.Interfaces.Services { - string HashPassword(string password); - bool VerifyPassword(string password, string? hashedPassword); + public interface IHashService + { + string HashPassword(string password); + bool VerifyPassword(string password, string? hashedPassword); + } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Services/IStorageFileService.cs b/src/Domain/Interfaces/Services/IStorageFileService.cs index f54d720f..e893e22c 100644 --- a/src/Domain/Interfaces/Services/IStorageFileService.cs +++ b/src/Domain/Interfaces/Services/IStorageFileService.cs @@ -1,19 +1,21 @@ using Microsoft.AspNetCore.Http; -namespace Domain.Interfaces.Services; -public interface IStorageFileService +namespace Domain.Interfaces.Services { - /// - /// Realiza o upload de um arquivo de edital - /// - /// Edital em pdf - /// Caminho completo até o arquivo - /// Caminho final do arquivo - Task UploadFileAsync(IFormFile file, string? filePath = null); + public interface IStorageFileService + { + /// + /// Realiza o upload de um arquivo de edital + /// + /// Edital em pdf + /// Caminho completo até o arquivo + /// Caminho final do arquivo + Task UploadFileAsync(IFormFile file, string? filePath = null); - /// - /// Deleta um arquivo - /// - /// Caminho completo até o arquivo - Task DeleteFile(string filePath); + /// + /// Deleta um arquivo + /// + /// Caminho completo até o arquivo + Task DeleteFile(string filePath); + } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Services/ITokenAuthenticationService.cs b/src/Domain/Interfaces/Services/ITokenAuthenticationService.cs index 5956c0e5..8cc38f4c 100644 --- a/src/Domain/Interfaces/Services/ITokenAuthenticationService.cs +++ b/src/Domain/Interfaces/Services/ITokenAuthenticationService.cs @@ -1,19 +1,21 @@ -using Domain.Contracts.Auth; +using Domain.UseCases.Ports.Auth; -namespace Domain.Interfaces.Services; -public interface ITokenAuthenticationService +namespace Domain.Interfaces.Services { - /// - /// Gera um token de autenticação com base no id e role do usuário. - /// - /// Id do usuário - /// Nome do usuário - /// Perfil do usuário - /// Token de autenticação. - UserLoginOutput GenerateToken(Guid? id, string? userName, string? role); + public interface ITokenAuthenticationService + { + /// + /// Gera um token de autenticação com base no id e role do usuário. + /// + /// Id do usuário + /// Nome do usuário + /// Perfil do usuário + /// Token de autenticação. + UserLoginOutput GenerateToken(Guid? id, string? userName, string? role); - /// - /// Retorna as claims do usuário autenticado. - /// - UserClaimsOutput GetUserAuthenticatedClaims(); + /// + /// Retorna as claims do usuário autenticado. + /// + UserClaimsOutput GetUserAuthenticatedClaims(); + } } \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs b/src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs deleted file mode 100644 index 3d978e15..00000000 --- a/src/Domain/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Domain.Contracts.Activity; - -namespace Domain.Interfaces.UseCases.ActivityType; -public interface IGetActivitiesByNoticeId -{ - Task> GetActivitiesByNoticeId(Guid? id); -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Area/IGetAreaById.cs b/src/Domain/Interfaces/UseCases/Area/IGetAreaById.cs deleted file mode 100644 index 3a9f265b..00000000 --- a/src/Domain/Interfaces/UseCases/Area/IGetAreaById.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Threading.Tasks; -using Domain.Contracts.Area; - -namespace Domain.Interfaces.UseCases -{ - public interface IGetAreaById - { - Task Execute(Guid? id); - } -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Area/IUpdateArea.cs b/src/Domain/Interfaces/UseCases/Area/IUpdateArea.cs deleted file mode 100644 index ddde90ff..00000000 --- a/src/Domain/Interfaces/UseCases/Area/IUpdateArea.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Threading.Tasks; -using Domain.Contracts.Area; - -namespace Domain.Interfaces.UseCases -{ - public interface IUpdateArea - { - Task Execute(Guid? id, UpdateAreaInput model); - } -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/AssistanceType/IUpdateAssistanceType.cs b/src/Domain/Interfaces/UseCases/AssistanceType/IUpdateAssistanceType.cs deleted file mode 100644 index cb158535..00000000 --- a/src/Domain/Interfaces/UseCases/AssistanceType/IUpdateAssistanceType.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Domain.Contracts.AssistanceType; - -namespace Domain.Interfaces.UseCases -{ - public interface IUpdateAssistanceType - { - Task Execute(Guid? id, UpdateAssistanceTypeInput model); - } -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Auth/IConfirmEmail.cs b/src/Domain/Interfaces/UseCases/Auth/IConfirmEmail.cs deleted file mode 100644 index 8d0abc18..00000000 --- a/src/Domain/Interfaces/UseCases/Auth/IConfirmEmail.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Domain.Interfaces.UseCases; -public interface IConfirmEmail -{ - Task Execute(string? email, string? token); -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Auth/IForgotPassword.cs b/src/Domain/Interfaces/UseCases/Auth/IForgotPassword.cs deleted file mode 100644 index a89af5f5..00000000 --- a/src/Domain/Interfaces/UseCases/Auth/IForgotPassword.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace Domain.Interfaces.UseCases; -public interface IForgotPassword -{ - Task Execute(string? email); -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Auth/ILogin.cs b/src/Domain/Interfaces/UseCases/Auth/ILogin.cs deleted file mode 100644 index aacdc265..00000000 --- a/src/Domain/Interfaces/UseCases/Auth/ILogin.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Domain.Contracts.Auth; - -namespace Domain.Interfaces.UseCases; -public interface ILogin -{ - Task Execute(UserLoginInput input); -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Auth/IResetPassword.cs b/src/Domain/Interfaces/UseCases/Auth/IResetPassword.cs deleted file mode 100644 index d647ed41..00000000 --- a/src/Domain/Interfaces/UseCases/Auth/IResetPassword.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Domain.Contracts.Auth; - -namespace Domain.Interfaces.UseCases; -public interface IResetPassword -{ - Task Execute(UserResetPasswordInput input); -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/MainArea/IUpdateMainArea.cs b/src/Domain/Interfaces/UseCases/MainArea/IUpdateMainArea.cs deleted file mode 100644 index adc66dc4..00000000 --- a/src/Domain/Interfaces/UseCases/MainArea/IUpdateMainArea.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Threading.Tasks; -using Domain.Contracts.MainArea; - -namespace Domain.Interfaces.UseCases -{ - public interface IUpdateMainArea - { - Task Execute(Guid? id, UpdateMainAreaInput model); - } -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Professor/ICreateProfessor.cs b/src/Domain/Interfaces/UseCases/Professor/ICreateProfessor.cs deleted file mode 100644 index bc609811..00000000 --- a/src/Domain/Interfaces/UseCases/Professor/ICreateProfessor.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Domain.Contracts.Professor; - -namespace Domain.Interfaces.UseCases; -public interface ICreateProfessor -{ - Task Execute(CreateProfessorInput model); -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Professor/IDeleteProfessor.cs b/src/Domain/Interfaces/UseCases/Professor/IDeleteProfessor.cs deleted file mode 100644 index ef63b92e..00000000 --- a/src/Domain/Interfaces/UseCases/Professor/IDeleteProfessor.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Domain.Contracts.Professor; - -namespace Domain.Interfaces.UseCases; -public interface IDeleteProfessor -{ - Task Execute(Guid? id); -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Professor/IGetProfessorById.cs b/src/Domain/Interfaces/UseCases/Professor/IGetProfessorById.cs deleted file mode 100644 index fdd45c96..00000000 --- a/src/Domain/Interfaces/UseCases/Professor/IGetProfessorById.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Domain.Contracts.Professor; - -namespace Domain.Interfaces.UseCases; -public interface IGetProfessorById -{ - Task Execute(Guid? id); -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Professor/IGetProfessors.cs b/src/Domain/Interfaces/UseCases/Professor/IGetProfessors.cs deleted file mode 100644 index ef9c5eda..00000000 --- a/src/Domain/Interfaces/UseCases/Professor/IGetProfessors.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Domain.Contracts.Professor; - -namespace Domain.Interfaces.UseCases; -public interface IGetProfessors -{ - Task> Execute(int skip, int take); -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Professor/IUpdateProfessor.cs b/src/Domain/Interfaces/UseCases/Professor/IUpdateProfessor.cs deleted file mode 100644 index 34e79f43..00000000 --- a/src/Domain/Interfaces/UseCases/Professor/IUpdateProfessor.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Domain.Contracts.Professor; - -namespace Domain.Interfaces.UseCases; -public interface IUpdateProfessor -{ - Task Execute(Guid? id, UpdateProfessorInput model); -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/SubArea/IGetSubAreaById.cs b/src/Domain/Interfaces/UseCases/SubArea/IGetSubAreaById.cs deleted file mode 100644 index 684fb9cf..00000000 --- a/src/Domain/Interfaces/UseCases/SubArea/IGetSubAreaById.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Threading.Tasks; -using Domain.Contracts.SubArea; - -namespace Domain.Interfaces.UseCases -{ - public interface IGetSubAreaById - { - Task Execute(Guid? id); - } -} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/SubArea/IUpdateSubArea.cs b/src/Domain/Interfaces/UseCases/SubArea/IUpdateSubArea.cs deleted file mode 100644 index e75da25f..00000000 --- a/src/Domain/Interfaces/UseCases/SubArea/IUpdateSubArea.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Threading.Tasks; -using Domain.Contracts.SubArea; - -namespace Domain.Interfaces.UseCases -{ - public interface IUpdateSubArea - { - Task Execute(Guid? id, UpdateSubAreaInput model); - } -} \ No newline at end of file diff --git a/src/Domain/Mappings/ActivityMappings.cs b/src/Domain/Mappings/ActivityMappings.cs index 8b955641..e3323646 100644 --- a/src/Domain/Mappings/ActivityMappings.cs +++ b/src/Domain/Mappings/ActivityMappings.cs @@ -1,6 +1,7 @@ using AutoMapper; -using Domain.Contracts.Activity; using Domain.Entities; +using Domain.Ports.Activity; +using Domain.UseCases.Ports.Activity; namespace Domain.Mappings { @@ -8,13 +9,13 @@ public class ActivityMappings : Profile { public ActivityMappings() { - CreateMap(); - CreateMap() + _ = CreateMap(); + _ = CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) .ForMember(dest => dest.DeletedAt, opt => opt.MapFrom(src => src.DeletedAt)); - CreateMap(); - CreateMap() + _ = CreateMap(); + _ = CreateMap() .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) .ForMember(dest => dest.DeletedAt, opt => opt.MapFrom(src => src.DeletedAt)) .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)); diff --git a/src/Domain/Mappings/AreaMappings.cs b/src/Domain/Mappings/AreaMappings.cs index fc5b62c5..9a9f3bb7 100644 --- a/src/Domain/Mappings/AreaMappings.cs +++ b/src/Domain/Mappings/AreaMappings.cs @@ -1,6 +1,7 @@ using AutoMapper; -using Domain.Contracts.Area; using Domain.Entities; +using Domain.Ports.Area; +using Domain.UseCases.Ports.Area; namespace Domain.Mappings { @@ -8,10 +9,10 @@ public class AreaMappings : Profile { public AreaMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap() + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap() .ForMember(dest => dest.MainArea, opt => opt.MapFrom(src => src.MainArea)) .ReverseMap(); } diff --git a/src/Domain/Mappings/AssistanceTypeMappings.cs b/src/Domain/Mappings/AssistanceTypeMappings.cs index 49cb3dbc..800059fd 100644 --- a/src/Domain/Mappings/AssistanceTypeMappings.cs +++ b/src/Domain/Mappings/AssistanceTypeMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; -using Domain.Contracts.AssistanceType; using Domain.Entities; +using Domain.UseCases.Ports.AssistanceType; namespace Domain.Mappings { @@ -8,10 +8,10 @@ public class AssistanceTypeMappings : Profile { public AssistanceTypeMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Domain/Mappings/CampusMappings.cs b/src/Domain/Mappings/CampusMappings.cs index 6cebf710..611e4ef2 100644 --- a/src/Domain/Mappings/CampusMappings.cs +++ b/src/Domain/Mappings/CampusMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; -using Domain.Contracts.Campus; using Domain.Entities; +using Domain.UseCases.Ports.Campus; namespace Domain.Mappings { @@ -8,10 +8,10 @@ public class CampusMappings : Profile { public CampusMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Domain/Mappings/CourseMappings.cs b/src/Domain/Mappings/CourseMappings.cs index ea30d504..9a6e9b82 100644 --- a/src/Domain/Mappings/CourseMappings.cs +++ b/src/Domain/Mappings/CourseMappings.cs @@ -1,6 +1,7 @@ using AutoMapper; -using Domain.Contracts.Course; using Domain.Entities; +using Domain.Ports.Course; +using Domain.UseCases.Ports.Course; namespace Domain.Mappings { @@ -8,10 +9,10 @@ public class CourseMappings : Profile { public CourseMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Domain/Mappings/MainAreaMappings.cs b/src/Domain/Mappings/MainAreaMappings.cs index 9d85523c..09ca82c5 100644 --- a/src/Domain/Mappings/MainAreaMappings.cs +++ b/src/Domain/Mappings/MainAreaMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; -using Domain.Contracts.MainArea; using Domain.Entities; +using Domain.UseCases.Ports.MainArea; namespace Domain.Mappings { @@ -8,10 +8,10 @@ public class MainAreaMappings : Profile { public MainAreaMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Domain/Mappings/NoticeMappings.cs b/src/Domain/Mappings/NoticeMappings.cs index b073f06b..8400a57d 100644 --- a/src/Domain/Mappings/NoticeMappings.cs +++ b/src/Domain/Mappings/NoticeMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; -using Domain.Contracts.Notice; using Domain.Entities; +using Domain.UseCases.Ports.Notice; namespace Domain.Mappings { @@ -8,10 +8,10 @@ public class NoticeMappings : Profile { public NoticeMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Domain/Mappings/ProfessorMappings.cs b/src/Domain/Mappings/ProfessorMappings.cs index b64bfaa0..104be91d 100644 --- a/src/Domain/Mappings/ProfessorMappings.cs +++ b/src/Domain/Mappings/ProfessorMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; -using Domain.Contracts.Professor; using Domain.Entities; +using Domain.UseCases.Ports.Professor; namespace Domain.Mappings { @@ -8,17 +8,17 @@ public class ProfessorMappings : Profile { public ProfessorMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); - CreateMap() + _ = CreateMap() .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.User != null ? src.User.Name : null)) .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.User != null ? src.User.Email : null)) .ReverseMap(); - CreateMap() + _ = CreateMap() .ForMember(dest => dest.User, opt => opt.MapFrom(src => src.User)) .ReverseMap(); diff --git a/src/Domain/Mappings/ProgramTypeMappings.cs b/src/Domain/Mappings/ProgramTypeMappings.cs index 2c051331..a03ca51f 100644 --- a/src/Domain/Mappings/ProgramTypeMappings.cs +++ b/src/Domain/Mappings/ProgramTypeMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; -using Domain.Contracts.ProgramType; using Domain.Entities; +using Domain.UseCases.Ports.ProgramType; namespace Domain.Mappings { @@ -8,10 +8,10 @@ public class ProgramTypeMappings : Profile { public ProgramTypeMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Domain/Mappings/ProjectEvaluationMappings.cs b/src/Domain/Mappings/ProjectEvaluationMappings.cs index ce9db0c3..fc0ce472 100644 --- a/src/Domain/Mappings/ProjectEvaluationMappings.cs +++ b/src/Domain/Mappings/ProjectEvaluationMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; -using Domain.Contracts.ProjectEvaluation; using Domain.Entities; +using Domain.UseCases.Ports.ProjectEvaluation; namespace Domain.Mappings { @@ -8,8 +8,8 @@ public class ProjectEvaluationMappings : Profile { public ProjectEvaluationMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Domain/Mappings/ProjectMappings.cs b/src/Domain/Mappings/ProjectMappings.cs index 80f307a5..9c3d6855 100644 --- a/src/Domain/Mappings/ProjectMappings.cs +++ b/src/Domain/Mappings/ProjectMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; -using Domain.Contracts.Project; using Domain.Entities; +using Domain.UseCases.Ports.Project; namespace Domain.Mappings { @@ -8,10 +8,10 @@ public class ProjectMappings : Profile { public ProjectMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Domain/Mappings/StudentDocumentsMappings.cs b/src/Domain/Mappings/StudentDocumentsMappings.cs index 54a00c08..6d256d46 100644 --- a/src/Domain/Mappings/StudentDocumentsMappings.cs +++ b/src/Domain/Mappings/StudentDocumentsMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; -using Domain.Contracts.StudentDocuments; using Domain.Entities; +using Domain.UseCases.Ports.StudentDocuments; namespace Domain.Mappings { @@ -8,8 +8,8 @@ public class StudentDocumentsMappings : Profile { public StudentDocumentsMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Domain/Mappings/StudentMappings.cs b/src/Domain/Mappings/StudentMappings.cs index da6c736c..d3183657 100644 --- a/src/Domain/Mappings/StudentMappings.cs +++ b/src/Domain/Mappings/StudentMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; -using Domain.Contracts.Student; using Domain.Entities; +using Domain.UseCases.Ports.Student; namespace Domain.Mappings { @@ -8,17 +8,17 @@ public class StudentMappings : Profile { public StudentMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); - CreateMap() + _ = CreateMap() .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.User != null ? src.User.Name : null)) .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.User != null ? src.User.Email : null)) .ReverseMap(); - CreateMap() + _ = CreateMap() .ForMember(dest => dest.User, opt => opt.MapFrom(src => src.User)) .ForMember(dest => dest.Campus, diff --git a/src/Domain/Mappings/SubAreaMappings.cs b/src/Domain/Mappings/SubAreaMappings.cs index ecb0124e..f974bd65 100644 --- a/src/Domain/Mappings/SubAreaMappings.cs +++ b/src/Domain/Mappings/SubAreaMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; -using Domain.Contracts.SubArea; using Domain.Entities; +using Domain.UseCases.Ports.SubArea; namespace Domain.Mappings { @@ -8,10 +8,10 @@ public class SubAreaMappings : Profile { public SubAreaMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); - CreateMap() + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap() .ForMember(dest => dest.Area, opt => opt.MapFrom(src => src.Area)) .ForPath(dest => dest.Area!.MainArea, opt => opt.MapFrom(src => src.Area!.MainArea)) .ReverseMap(); diff --git a/src/Domain/Mappings/UserMappings.cs b/src/Domain/Mappings/UserMappings.cs index 48f3df53..d2db5d4a 100644 --- a/src/Domain/Mappings/UserMappings.cs +++ b/src/Domain/Mappings/UserMappings.cs @@ -1,7 +1,6 @@ -using System; -using AutoMapper; -using Domain.Contracts.User; +using AutoMapper; using Domain.Entities; +using Domain.UseCases.Ports.User; namespace Domain.Mappings { @@ -9,8 +8,8 @@ public class UserMappings : Profile { public UserMappings() { - CreateMap().ReverseMap(); - CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); + _ = CreateMap().ReverseMap(); } } } \ No newline at end of file diff --git a/src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs b/src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs similarity index 72% rename from src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs rename to src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs index b9128a08..d359aedd 100644 --- a/src/Domain/UseCases/ActivityType/GetActivitiesByNoticeId.cs +++ b/src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs @@ -1,9 +1,10 @@ using AutoMapper; -using Domain.Contracts.Activity; using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases.ActivityType; +using Domain.Ports.Activity; +using Domain.UseCases.Interfaces.ActivityType; +using Domain.UseCases.Ports.Activity; -namespace Domain.UseCases.ActivityType +namespace Domain.UseCases.Interactors.ActivityType { public class GetActivitiesByNoticeId : IGetActivitiesByNoticeId { @@ -18,20 +19,20 @@ public GetActivitiesByNoticeId(IActivityTypeRepository activityTypeRepository, I async Task> IGetActivitiesByNoticeId.GetActivitiesByNoticeId(Guid? id) { // Obtém os tipos de atividades do edital - var activityTypes = await _activityTypeRepository.GetByNoticeId(id); + IList activityTypes = (IList)await _activityTypeRepository.GetByNoticeId(id); // Mapeia os tipos de atividades para o output - var output = _mapper.Map>(activityTypes); + _ = _mapper.Map>(activityTypes); // return output; // Mapeia os tipos de atividades para o output - var activityTypesOutput = new List(); - foreach (var activityType in activityTypes) + List activityTypesOutput = new(); + foreach (Entities.ActivityType activityType in activityTypes) { // Mapeia as atividades para o output - var activitiesOutput = new List(); - foreach (var activity in activityType.Activities!) + List activitiesOutput = new(); + foreach (Entities.Activity activity in activityType.Activities!) { activitiesOutput.Add(new ActivityOutput { diff --git a/src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs b/src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs similarity index 72% rename from src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs rename to src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs index 10db5f6e..b2750510 100644 --- a/src/Domain/UseCases/ActivityType/GetLastNoticeActivities.cs +++ b/src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs @@ -1,9 +1,10 @@ using AutoMapper; -using Domain.Contracts.Activity; using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases.ActivityType; +using Domain.Ports.Activity; +using Domain.UseCases.Interfaces.ActivityType; +using Domain.UseCases.Ports.Activity; -namespace Domain.UseCases.ActivityType +namespace Domain.UseCases.Interactors.ActivityType { public class GetLastNoticeActivities : IGetLastNoticeActivities { @@ -17,20 +18,20 @@ public GetLastNoticeActivities(IActivityTypeRepository activityTypeRepository, I async Task> IGetLastNoticeActivities.GetLastNoticeActivities() { // Obtém os tipos de atividades do último edital - var activityTypes = await _activityTypeRepository.GetLastNoticeActivities(); + IList activityTypes = (IList)await _activityTypeRepository.GetLastNoticeActivities(); // Mapeia os tipos de atividades para o output - var output = _mapper.Map>(activityTypes); + _ = _mapper.Map>(activityTypes); // return output; // Mapeia os tipos de atividades para o output - var activityTypesOutput = new List(); - foreach (var type in activityTypes) + List activityTypesOutput = new(); + foreach (Entities.ActivityType type in activityTypes) { // Mapeia as atividades para o output - var activitiesOutput = new List(); - foreach (var activity in type.Activities!) + List activitiesOutput = new(); + foreach (Entities.Activity activity in type.Activities!) { activitiesOutput.Add(new ActivityOutput { diff --git a/src/Domain/UseCases/Area/CreateArea.cs b/src/Domain/UseCases/Interactors/Area/CreateArea.cs similarity index 95% rename from src/Domain/UseCases/Area/CreateArea.cs rename to src/Domain/UseCases/Interactors/Area/CreateArea.cs index c79762a4..00f1cce2 100644 --- a/src/Domain/UseCases/Area/CreateArea.cs +++ b/src/Domain/UseCases/Interactors/Area/CreateArea.cs @@ -1,7 +1,7 @@ -using Domain.Contracts.Area; using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.Area; +using Domain.UseCases.Ports.Area; using Domain.Validation; namespace Domain.UseCases diff --git a/src/Domain/UseCases/Area/DeleteArea.cs b/src/Domain/UseCases/Interactors/Area/DeleteArea.cs similarity index 78% rename from src/Domain/UseCases/Area/DeleteArea.cs rename to src/Domain/UseCases/Interactors/Area/DeleteArea.cs index 6d6bef4b..ab7f149a 100644 --- a/src/Domain/UseCases/Area/DeleteArea.cs +++ b/src/Domain/UseCases/Interactors/Area/DeleteArea.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Area; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Area; +using Domain.UseCases.Ports.Area; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Area { public class DeleteArea : IDeleteArea { @@ -16,7 +16,7 @@ public DeleteArea(IAreaRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { @@ -24,7 +24,7 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id == null, nameof(id)); // Remove a entidade - var model = await _repository.Delete(id); + Entities.Area model = await _repository.Delete(id); // Retorna a área removida return _mapper.Map(model); diff --git a/src/Domain/UseCases/Area/GetAreaById.cs b/src/Domain/UseCases/Interactors/Area/GetAreaById.cs similarity index 76% rename from src/Domain/UseCases/Area/GetAreaById.cs rename to src/Domain/UseCases/Interactors/Area/GetAreaById.cs index 5f884d74..e1d37098 100644 --- a/src/Domain/UseCases/Area/GetAreaById.cs +++ b/src/Domain/UseCases/Interactors/Area/GetAreaById.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Area; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Area; +using Domain.UseCases.Ports.Area; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Area { public class GetAreaById : IGetAreaById { @@ -16,14 +16,14 @@ public GetAreaById(IAreaRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { // Verifica se Id foi informado. UseCaseException.NotInformedParam(id is null, nameof(id)); - var entity = await _repository.GetById(id); + Entities.Area? entity = await _repository.GetById(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Area/GetAreasByMainArea.cs b/src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs similarity index 72% rename from src/Domain/UseCases/Area/GetAreasByMainArea.cs rename to src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs index a5855f8e..71bf8fd5 100644 --- a/src/Domain/UseCases/Area/GetAreasByMainArea.cs +++ b/src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Area; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Area; +using Domain.UseCases.Ports.Area; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Area { public class GetAreasByMainArea : IGetAreasByMainArea { @@ -16,12 +16,12 @@ public GetAreasByMainArea(IAreaRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(Guid? mainAreaId, int skip, int take) { UseCaseException.NotInformedParam(mainAreaId is null, nameof(mainAreaId)); - var entities = await _repository.GetAreasByMainArea(mainAreaId, skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAreasByMainArea(mainAreaId, skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Area/UpdateArea.cs b/src/Domain/UseCases/Interactors/Area/UpdateArea.cs similarity index 77% rename from src/Domain/UseCases/Area/UpdateArea.cs rename to src/Domain/UseCases/Interactors/Area/UpdateArea.cs index 15ecc449..30ad7d23 100644 --- a/src/Domain/UseCases/Area/UpdateArea.cs +++ b/src/Domain/UseCases/Interactors/Area/UpdateArea.cs @@ -1,10 +1,11 @@ -using Domain.Contracts.Area; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Ports.Area; +using Domain.UseCases.Interfaces.Area; +using Domain.UseCases.Ports.Area; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Area { public class UpdateArea : IUpdateArea { @@ -16,7 +17,7 @@ public UpdateArea(IAreaRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id, UpdateAreaInput input) { @@ -24,7 +25,7 @@ public async Task Execute(Guid? id, UpdateAreaInput inpu UseCaseException.NotInformedParam(id is null, nameof(id)); // Recupera entidade que será atualizada - var entity = await _repository.GetById(id) + Entities.Area entity = await _repository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.MainArea)); // Atualiza atributos permitidos @@ -33,7 +34,7 @@ public async Task Execute(Guid? id, UpdateAreaInput inpu entity.MainAreaId = input.MainAreaId; // Salva entidade atualizada no banco - var model = await _repository.Update(entity); + Entities.Area model = await _repository.Update(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/AssistanceType/CreateAssistanceType.cs b/src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs similarity index 74% rename from src/Domain/UseCases/AssistanceType/CreateAssistanceType.cs rename to src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs index f6c3875f..f831c289 100644 --- a/src/Domain/UseCases/AssistanceType/CreateAssistanceType.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.AssistanceType; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.AssistanceType { public class CreateAssistanceType : ICreateAssistanceType { @@ -16,20 +16,20 @@ public CreateAssistanceType(IAssistanceTypeRepository repository, IMapper mapper _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope - public async Task Execute(CreateAssistanceTypeInput input) + public async Task Execute(CreateAssistanceTypeInput model) { // Verifica se nome foi informado - UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); + UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Name), nameof(model.Name)); // Verifica se já existe um tipo de programa com o nome indicado - var entity = await _repository.GetAssistanceTypeByName(input.Name!); + Entities.AssistanceType? entity = await _repository.GetAssistanceTypeByName(model.Name!); UseCaseException.BusinessRuleViolation(entity != null, "Já existe um Tipo de Programa para o nome informado."); // Cria entidade - entity = await _repository.Create(_mapper.Map(input)); + entity = await _repository.Create(_mapper.Map(model)); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/AssistanceType/DeleteAssistanceType.cs b/src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs similarity index 77% rename from src/Domain/UseCases/AssistanceType/DeleteAssistanceType.cs rename to src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs index f8047562..736d39a0 100644 --- a/src/Domain/UseCases/AssistanceType/DeleteAssistanceType.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.AssistanceType; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.AssistanceType { public class DeleteAssistanceType : IDeleteAssistanceType { @@ -16,7 +16,7 @@ public DeleteAssistanceType(IAssistanceTypeRepository repository, IMapper mapper _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { @@ -24,7 +24,7 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - var model = await _repository.Delete(id); + Entities.AssistanceType model = await _repository.Delete(id); // Retorna o tipo de programa removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/AssistanceType/GetAssistanceTypeById.cs b/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs similarity index 73% rename from src/Domain/UseCases/AssistanceType/GetAssistanceTypeById.cs rename to src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs index 1fb2cbf8..08a6bdc1 100644 --- a/src/Domain/UseCases/AssistanceType/GetAssistanceTypeById.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.AssistanceType; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.AssistanceType { public class GetAssistanceTypeById : IGetAssistanceTypeById { @@ -16,12 +16,12 @@ public GetAssistanceTypeById(IAssistanceTypeRepository repository, IMapper mappe _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - var entity = await _repository.GetById(id); + Entities.AssistanceType? entity = await _repository.GetById(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/AssistanceType/GetAssistanceTypes.cs b/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs similarity index 67% rename from src/Domain/UseCases/AssistanceType/GetAssistanceTypes.cs rename to src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs index 13ef147b..9b3af536 100644 --- a/src/Domain/UseCases/AssistanceType/GetAssistanceTypes.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.AssistanceType; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.AssistanceType { public class GetAssistanceTypes : IGetAssistanceTypes { @@ -15,11 +15,11 @@ public GetAssistanceTypes(IAssistanceTypeRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(int skip, int take) { - var entities = await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/AssistanceType/UpdateAssistanceType.cs b/src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs similarity index 84% rename from src/Domain/UseCases/AssistanceType/UpdateAssistanceType.cs rename to src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs index d6f530d7..c8ee0695 100644 --- a/src/Domain/UseCases/AssistanceType/UpdateAssistanceType.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.AssistanceType; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.AssistanceType { public class UpdateAssistanceType : IUpdateAssistanceType { @@ -16,7 +16,7 @@ public UpdateAssistanceType(IAssistanceTypeRepository repository, IMapper mapper _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id, UpdateAssistanceTypeInput input) { @@ -27,7 +27,7 @@ public async Task Execute(Guid? id, UpdateAssi UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - var entity = await _repository.GetById(id) + Entities.AssistanceType entity = await _repository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.AssistanceType)); // Verifica se a entidade foi excluída @@ -45,7 +45,7 @@ public async Task Execute(Guid? id, UpdateAssi entity.Description = input.Description; // Salva entidade atualizada no banco - var model = await _repository.Update(entity); + Entities.AssistanceType model = await _repository.Update(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Auth/ConfirmEmail.cs b/src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs similarity index 81% rename from src/Domain/UseCases/Auth/ConfirmEmail.cs rename to src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs index be4bed93..8a5a5fd5 100644 --- a/src/Domain/UseCases/Auth/ConfirmEmail.cs +++ b/src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs @@ -1,15 +1,18 @@ using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.Auth; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Auth { public class ConfirmEmail : IConfirmEmail { #region Global Scope private readonly IUserRepository _userRepository; - public ConfirmEmail(IUserRepository userRepository) => _userRepository = userRepository; - #endregion + public ConfirmEmail(IUserRepository userRepository) + { + _userRepository = userRepository; + } + #endregion Global Scope public async Task Execute(string? email, string? token) { diff --git a/src/Domain/UseCases/Auth/ForgotPassword.cs b/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs similarity index 91% rename from src/Domain/UseCases/Auth/ForgotPassword.cs rename to src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs index ef819e64..3a4a94f8 100644 --- a/src/Domain/UseCases/Auth/ForgotPassword.cs +++ b/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs @@ -1,9 +1,9 @@ using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.Auth; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Auth { public class ForgotPassword : IForgotPassword { @@ -15,7 +15,7 @@ public ForgotPassword(IUserRepository userRepository, IEmailService emailService _emailService = emailService; _userRepository = userRepository; } - #endregion + #endregion Global Scope public async Task Execute(string? email) { @@ -37,7 +37,9 @@ public async Task Execute(string? email) // Verifica se o token foi gerado if (string.IsNullOrEmpty(user.ResetPasswordToken)) + { throw UseCaseException.BusinessRuleViolation("Token não gerado."); + } // Retorna token return "Token de recuperação gerado e enviado por e-mail com sucesso."; diff --git a/src/Domain/UseCases/Auth/Login.cs b/src/Domain/UseCases/Interactors/Auth/Login.cs similarity index 87% rename from src/Domain/UseCases/Auth/Login.cs rename to src/Domain/UseCases/Interactors/Auth/Login.cs index 143f26c9..f3f4c586 100644 --- a/src/Domain/UseCases/Auth/Login.cs +++ b/src/Domain/UseCases/Interactors/Auth/Login.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Auth; -using Domain.Interfaces.UseCases; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; +using Domain.UseCases.Interfaces.Auth; +using Domain.UseCases.Ports.Auth; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Auth { public class Login : ILogin { @@ -18,7 +18,7 @@ public Login(ITokenAuthenticationService tokenService, IUserRepository userRepos _userRepository = userRepository; _hashService = hashService; } - #endregion + #endregion Global Scope public async Task Execute(UserLoginInput input) { @@ -29,7 +29,7 @@ public async Task Execute(UserLoginInput input) UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Password), nameof(input.Password)); // Busca usuário pelo email - var entity = await _userRepository.GetUserByEmail(input.Email) + Entities.User entity = await _userRepository.GetUserByEmail(input.Email) ?? throw UseCaseException.NotFoundEntityByParams(nameof(Entities.User)); // Verifica se o usuário está confirmado diff --git a/src/Domain/UseCases/Auth/ResetPassword.cs b/src/Domain/UseCases/Interactors/Auth/ResetPassword.cs similarity index 84% rename from src/Domain/UseCases/Auth/ResetPassword.cs rename to src/Domain/UseCases/Interactors/Auth/ResetPassword.cs index c616c038..7819944f 100644 --- a/src/Domain/UseCases/Auth/ResetPassword.cs +++ b/src/Domain/UseCases/Interactors/Auth/ResetPassword.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Auth; -using Domain.Interfaces.UseCases; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; +using Domain.UseCases.Interfaces.Auth; +using Domain.UseCases.Ports.Auth; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Auth { public class ResetPassword : IResetPassword { @@ -16,7 +16,7 @@ public ResetPassword(IUserRepository userRepository, IHashService hashService) _userRepository = userRepository; _hashService = hashService; } - #endregion + #endregion Global Scope public async Task Execute(UserResetPasswordInput input) { @@ -30,22 +30,26 @@ public async Task Execute(UserResetPasswordInput input) UseCaseException.NotInformedParam(input.Token == null, nameof(input.Token)); // Busca o usuário pelo id - var entity = await _userRepository.GetById(input.Id) + Entities.User entity = await _userRepository.GetById(input.Id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); // Verifica se o token de validação é nulo if (string.IsNullOrEmpty(entity.ResetPasswordToken)) + { throw UseCaseException.BusinessRuleViolation("Solicitação de atualização de senha não permitido."); + } // Verifica se o token de validação é igual ao token informado input.Password = _hashService.HashPassword(input.Password!); // Atualiza a senha do usuário if (!entity.UpdatePassword(input.Password, input.Token!)) + { throw UseCaseException.BusinessRuleViolation("Token de validação inválido."); + } // Salva as alterações - await _userRepository.Update(entity); + _ = await _userRepository.Update(entity); // Retorna o resultado return "Senha atualizada com sucesso."; diff --git a/src/Domain/UseCases/Campus/CreateCampus.cs b/src/Domain/UseCases/Interactors/Campus/CreateCampus.cs similarity index 94% rename from src/Domain/UseCases/Campus/CreateCampus.cs rename to src/Domain/UseCases/Interactors/Campus/CreateCampus.cs index 4d38545d..88bf4bc0 100644 --- a/src/Domain/UseCases/Campus/CreateCampus.cs +++ b/src/Domain/UseCases/Interactors/Campus/CreateCampus.cs @@ -1,7 +1,7 @@ -using Domain.Contracts.Campus; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Campus; +using Domain.UseCases.Ports.Campus; using Domain.Validation; namespace Domain.UseCases diff --git a/src/Domain/UseCases/Campus/DeleteCampus.cs b/src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs similarity index 78% rename from src/Domain/UseCases/Campus/DeleteCampus.cs rename to src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs index 94cb8c3e..f1e9f4e6 100644 --- a/src/Domain/UseCases/Campus/DeleteCampus.cs +++ b/src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Campus; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Campus; +using Domain.UseCases.Ports.Campus; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Campus { public class DeleteCampus : IDeleteCampus { @@ -16,7 +16,7 @@ public DeleteCampus(ICampusRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { @@ -24,7 +24,7 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - var model = await _repository.Delete(id); + Entities.Campus model = await _repository.Delete(id); // Retorna o curso removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Campus/GetCampusById.cs b/src/Domain/UseCases/Interactors/Campus/GetCampusById.cs similarity index 74% rename from src/Domain/UseCases/Campus/GetCampusById.cs rename to src/Domain/UseCases/Interactors/Campus/GetCampusById.cs index deec7aeb..3bec3309 100644 --- a/src/Domain/UseCases/Campus/GetCampusById.cs +++ b/src/Domain/UseCases/Interactors/Campus/GetCampusById.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Campus; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Campus; +using Domain.UseCases.Ports.Campus; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Campus { public class GetCampusById : IGetCampusById { @@ -16,13 +16,13 @@ public GetCampusById(ICampusRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - var entity = await _repository.GetById(id); + Entities.Campus? entity = await _repository.GetById(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Campus/GetCampuses.cs b/src/Domain/UseCases/Interactors/Campus/GetCampuses.cs similarity index 69% rename from src/Domain/UseCases/Campus/GetCampuses.cs rename to src/Domain/UseCases/Interactors/Campus/GetCampuses.cs index 735e3019..52cd2547 100644 --- a/src/Domain/UseCases/Campus/GetCampuses.cs +++ b/src/Domain/UseCases/Interactors/Campus/GetCampuses.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.Campus; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Campus; +using Domain.UseCases.Ports.Campus; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Campus { public class GetCampuses : IGetCampuses { @@ -15,11 +15,11 @@ public GetCampuses(ICampusRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(int skip, int take) { - var entities = await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Campus/UpdateCampus.cs b/src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs similarity index 79% rename from src/Domain/UseCases/Campus/UpdateCampus.cs rename to src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs index f939df47..7aec9228 100644 --- a/src/Domain/UseCases/Campus/UpdateCampus.cs +++ b/src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Campus; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Campus; +using Domain.UseCases.Ports.Campus; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Campus { public class UpdateCampus : IUpdateCampus { @@ -16,7 +16,7 @@ public UpdateCampus(ICampusRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id, UpdateCampusInput input) { @@ -27,21 +27,25 @@ public async Task Execute(Guid? id, UpdateCampusInput UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - var entity = await _repository.GetById(id) ?? throw new Exception("Campus não encontrado."); + Entities.Campus entity = await _repository.GetById(id) ?? throw new Exception("Campus não encontrado."); // Verifica se a entidade foi excluída if (entity.DeletedAt != null) + { throw UseCaseException.BusinessRuleViolation("O Campus informado já foi excluído."); + } // Verifica se o nome já está sendo usado if (!string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) && await _repository.GetCampusByName(input.Name!) != null) + { throw UseCaseException.BusinessRuleViolation("Já existe um Campus para o nome informado."); + } // Atualiza atributos permitidos entity.Name = input.Name; // Salva entidade atualizada no banco - var model = await _repository.Update(entity); + Entities.Campus model = await _repository.Update(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Course/CreateCourse.cs b/src/Domain/UseCases/Interactors/Course/CreateCourse.cs similarity index 71% rename from src/Domain/UseCases/Course/CreateCourse.cs rename to src/Domain/UseCases/Interactors/Course/CreateCourse.cs index a264d3ec..80d37c59 100644 --- a/src/Domain/UseCases/Course/CreateCourse.cs +++ b/src/Domain/UseCases/Interactors/Course/CreateCourse.cs @@ -1,10 +1,11 @@ -using Domain.Contracts.Course; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.Ports.Course; +using Domain.UseCases.Interfaces.Course; +using Domain.UseCases.Ports.Course; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Course { public class CreateCourse : ICreateCourse { @@ -16,20 +17,22 @@ public CreateCourse(ICourseRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope - public async Task Execute(CreateCourseInput input) + public async Task Execute(CreateCourseInput model) { // Verifica se nome foi informado - UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); + UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Name), nameof(model.Name)); // Verifica se já existe um edital para o período indicado - var entity = await _repository.GetCourseByName(input.Name!); + Entities.Course? entity = await _repository.GetCourseByName(model.Name!); if (entity != null) + { throw UseCaseException.BusinessRuleViolation("Já existe um Curso para o nome informado."); + } // Cria entidade - var newEntity = new Entities.Course(input.Name); + Entities.Course newEntity = new(model.Name); entity = await _repository.Create(newEntity); // Salva entidade no banco diff --git a/src/Domain/UseCases/Course/DeleteCourse.cs b/src/Domain/UseCases/Interactors/Course/DeleteCourse.cs similarity index 78% rename from src/Domain/UseCases/Course/DeleteCourse.cs rename to src/Domain/UseCases/Interactors/Course/DeleteCourse.cs index 0729bd2f..d3ecf727 100644 --- a/src/Domain/UseCases/Course/DeleteCourse.cs +++ b/src/Domain/UseCases/Interactors/Course/DeleteCourse.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Course; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Course; +using Domain.UseCases.Ports.Course; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Course { public class DeleteCourse : IDeleteCourse { @@ -16,7 +16,7 @@ public DeleteCourse(ICourseRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { @@ -24,7 +24,7 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - var model = await _repository.Delete(id); + Entities.Course model = await _repository.Delete(id); // Retorna o curso removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Course/GetCourseById.cs b/src/Domain/UseCases/Interactors/Course/GetCourseById.cs similarity index 74% rename from src/Domain/UseCases/Course/GetCourseById.cs rename to src/Domain/UseCases/Interactors/Course/GetCourseById.cs index af82ad43..6b8660f6 100644 --- a/src/Domain/UseCases/Course/GetCourseById.cs +++ b/src/Domain/UseCases/Interactors/Course/GetCourseById.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Course; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Course; +using Domain.UseCases.Ports.Course; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Course { public class GetCourseById : IGetCourseById { @@ -16,13 +16,13 @@ public GetCourseById(ICourseRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - var entity = await _repository.GetById(id); + Entities.Course? entity = await _repository.GetById(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Course/GetCourses.cs b/src/Domain/UseCases/Interactors/Course/GetCourses.cs similarity index 71% rename from src/Domain/UseCases/Course/GetCourses.cs rename to src/Domain/UseCases/Interactors/Course/GetCourses.cs index f3c430d6..ba0486cb 100644 --- a/src/Domain/UseCases/Course/GetCourses.cs +++ b/src/Domain/UseCases/Interactors/Course/GetCourses.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.Course; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Course; +using Domain.UseCases.Ports.Course; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Course { public class GetCourses : IGetCourses { @@ -15,11 +15,11 @@ public GetCourses(ICourseRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(int skip, int take) { - var entities = await _repository.GetAll(skip, take); + IEnumerable entities = await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Course/UpdateCourse.cs b/src/Domain/UseCases/Interactors/Course/UpdateCourse.cs similarity index 82% rename from src/Domain/UseCases/Course/UpdateCourse.cs rename to src/Domain/UseCases/Interactors/Course/UpdateCourse.cs index 78c66f2f..dcce210c 100644 --- a/src/Domain/UseCases/Course/UpdateCourse.cs +++ b/src/Domain/UseCases/Interactors/Course/UpdateCourse.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Course; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Course; +using Domain.UseCases.Ports.Course; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Course { public class UpdateCourse : IUpdateCourse { @@ -16,7 +16,7 @@ public UpdateCourse(ICourseRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id, UpdateCourseInput input) { @@ -27,22 +27,26 @@ public async Task Execute(Guid? id, UpdateCourseInput UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - var entity = await _repository.GetById(id) ?? + Entities.Course entity = await _repository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Course)); // Verifica se a entidade foi excluída if (entity.DeletedAt != null) + { throw UseCaseException.BusinessRuleViolation("O Curso informado já foi excluído."); + } // Verifica se o nome já está sendo usado if (!string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) && await _repository.GetCourseByName(input.Name!) != null) + { throw UseCaseException.BusinessRuleViolation("Já existe um Curso para o nome informado."); + } // Atualiza atributos permitidos entity.Name = input.Name; // Salva entidade atualizada no banco - var model = await _repository.Update(entity); + Entities.Course model = await _repository.Update(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/MainArea/CreateMainArea.cs b/src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs similarity index 68% rename from src/Domain/UseCases/MainArea/CreateMainArea.cs rename to src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs index d55218b9..43054dd7 100644 --- a/src/Domain/UseCases/MainArea/CreateMainArea.cs +++ b/src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs @@ -1,12 +1,10 @@ -using Domain.Contracts.MainArea; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; -using System.Threading.Tasks; -using System; +using Domain.UseCases.Interfaces.MainArea; +using Domain.UseCases.Ports.MainArea; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.MainArea { public class CreateMainArea : ICreateMainArea { @@ -18,16 +16,18 @@ public CreateMainArea(IMainAreaRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope - public async Task Execute(CreateMainAreaInput input) + public async Task Execute(CreateMainAreaInput model) { // Validação de código da Área - var entity = await _repository.GetByCode(input.Code); + Entities.MainArea? entity = await _repository.GetByCode(model.Code); if (entity != null) - throw UseCaseException.BusinessRuleViolation($"Já existe uma Área Principal para o código {input.Code}"); + { + throw UseCaseException.BusinessRuleViolation($"Já existe uma Área Principal para o código {model.Code}"); + } - entity = await _repository.Create(_mapper.Map(input)); + entity = await _repository.Create(_mapper.Map(model)); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/MainArea/DeleteMainArea.cs b/src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs similarity index 77% rename from src/Domain/UseCases/MainArea/DeleteMainArea.cs rename to src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs index 17a0598b..f6c77c2b 100644 --- a/src/Domain/UseCases/MainArea/DeleteMainArea.cs +++ b/src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.MainArea; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.MainArea; +using Domain.UseCases.Ports.MainArea; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.MainArea { public class DeleteMainArea : IDeleteMainArea { @@ -16,7 +16,7 @@ public DeleteMainArea(IMainAreaRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { @@ -24,7 +24,7 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - var model = await _repository.Delete(id); + Entities.MainArea model = await _repository.Delete(id); // Retorna o edital removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/MainArea/GetMainAreaById.cs b/src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs similarity index 74% rename from src/Domain/UseCases/MainArea/GetMainAreaById.cs rename to src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs index eb153864..01aff4de 100644 --- a/src/Domain/UseCases/MainArea/GetMainAreaById.cs +++ b/src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.MainArea; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.MainArea; +using Domain.UseCases.Ports.MainArea; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.MainArea { public class GetMainAreaById : IGetMainAreaById { @@ -16,13 +16,13 @@ public GetMainAreaById(IMainAreaRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - var entity = await _repository.GetById(id); + Entities.MainArea? entity = await _repository.GetById(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/MainArea/GetMainAreas.cs b/src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs similarity index 68% rename from src/Domain/UseCases/MainArea/GetMainAreas.cs rename to src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs index 85726aa0..4dac0ae6 100644 --- a/src/Domain/UseCases/MainArea/GetMainAreas.cs +++ b/src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.MainArea; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.MainArea; +using Domain.UseCases.Ports.MainArea; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.MainArea { public class GetMainAreas : IGetMainAreas { @@ -15,11 +15,11 @@ public GetMainAreas(IMainAreaRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(int skip, int take) { - var entities = await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/MainArea/UpdateMainArea.cs b/src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs similarity index 75% rename from src/Domain/UseCases/MainArea/UpdateMainArea.cs rename to src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs index 7cc6552c..b618126e 100644 --- a/src/Domain/UseCases/MainArea/UpdateMainArea.cs +++ b/src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.MainArea; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.MainArea; +using Domain.UseCases.Ports.MainArea; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.MainArea { public class UpdateMainArea : IUpdateMainArea { @@ -15,12 +15,12 @@ public UpdateMainArea(IMainAreaRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id, UpdateMainAreaInput input) { // Recupera entidade que será atualizada - var entity = await _repository.GetById(id) + Entities.MainArea entity = await _repository.GetById(id) ?? throw Validation.UseCaseException.BusinessRuleViolation("Área Principal não encontrada."); // Atualiza atributos permitidos @@ -28,7 +28,7 @@ public async Task Execute(Guid? id, UpdateMainAreaInput entity.Code = input.Code; // Salva entidade atualizada no banco - var model = await _repository.Update(entity); + Entities.MainArea model = await _repository.Update(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Notice/CreateNotice.cs b/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs similarity index 98% rename from src/Domain/UseCases/Notice/CreateNotice.cs rename to src/Domain/UseCases/Interactors/Notice/CreateNotice.cs index 22fd763a..55600e16 100644 --- a/src/Domain/UseCases/Notice/CreateNotice.cs +++ b/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs @@ -1,8 +1,8 @@ -using Domain.Contracts.Notice; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; +using Domain.UseCases.Interfaces.Notice; +using Domain.UseCases.Ports.Notice; using Domain.Validation; namespace Domain.UseCases diff --git a/src/Domain/UseCases/Notice/DeleteNotice.cs b/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs similarity index 82% rename from src/Domain/UseCases/Notice/DeleteNotice.cs rename to src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs index ab4751d4..c7ed637d 100644 --- a/src/Domain/UseCases/Notice/DeleteNotice.cs +++ b/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs @@ -1,11 +1,11 @@ -using Domain.Contracts.Notice; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; +using Domain.UseCases.Interfaces.Notice; +using Domain.UseCases.Ports.Notice; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Notice { public class DeleteNotice : IDeleteNotice { @@ -19,7 +19,7 @@ public DeleteNotice(INoticeRepository repository, IStorageFileService storageFil _storageFileService = storageFileService; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { @@ -27,11 +27,13 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id == null, nameof(id)); // Remove a entidade - var entity = await _repository.Delete(id); + Entities.Notice entity = await _repository.Delete(id); // Deleta o arquivo do edital if (!string.IsNullOrEmpty(entity.DocUrl)) + { await _storageFileService.DeleteFile(entity.DocUrl); + } // Retorna o edital removido return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Notice/GetNoticeById.cs b/src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs similarity index 74% rename from src/Domain/UseCases/Notice/GetNoticeById.cs rename to src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs index 68c146fd..9b6ec3fc 100644 --- a/src/Domain/UseCases/Notice/GetNoticeById.cs +++ b/src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Notice; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Notice; +using Domain.UseCases.Ports.Notice; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Notice { public class GetNoticeById : IGetNoticeById { @@ -16,13 +16,13 @@ public GetNoticeById(INoticeRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - var entity = await _repository.GetById(id); + Entities.Notice? entity = await _repository.GetById(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Notice/GetNotices.cs b/src/Domain/UseCases/Interactors/Notice/GetNotices.cs similarity index 68% rename from src/Domain/UseCases/Notice/GetNotices.cs rename to src/Domain/UseCases/Interactors/Notice/GetNotices.cs index 0d4fa8ec..53c081fe 100644 --- a/src/Domain/UseCases/Notice/GetNotices.cs +++ b/src/Domain/UseCases/Interactors/Notice/GetNotices.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.Notice; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Notice; +using Domain.UseCases.Ports.Notice; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Notice { public class GetNotices : IGetNotices { @@ -15,11 +15,11 @@ public GetNotices(INoticeRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(int skip, int take) { - var entities = await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities); } } diff --git a/src/Domain/UseCases/Notice/UpdateNotice.cs b/src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs similarity index 67% rename from src/Domain/UseCases/Notice/UpdateNotice.cs rename to src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs index e3dc3f88..b5d101aa 100644 --- a/src/Domain/UseCases/Notice/UpdateNotice.cs +++ b/src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs @@ -1,12 +1,13 @@ -using Domain.Contracts.Notice; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; +using Domain.Ports.Activity; +using Domain.UseCases.Interfaces.Notice; +using Domain.UseCases.Ports.Activity; +using Domain.UseCases.Ports.Notice; using Domain.Validation; -using Domain.Contracts.Activity; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Notice { public class UpdateNotice : IUpdateNotice { @@ -29,61 +30,65 @@ public UpdateNotice( _activityRepository = activityRepository; _mapper = mapper; } - #endregion + #endregion Global Scope - public async Task Execute(Guid? id, UpdateNoticeInput input) + public async Task Execute(Guid? id, UpdateNoticeInput model) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id == null, nameof(id)); // Verifica se atividades foram informadas - UseCaseException.BusinessRuleViolation(input.Activities == null || input.Activities.Count == 0, + UseCaseException.BusinessRuleViolation(model.Activities == null || model.Activities.Count == 0, "As atividades devem ser informadas."); // Recupera entidade que será atualizada - var notice = await _repository.GetById(id) + Entities.Notice notice = await _repository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Notice)); // Verifica se a entidade foi excluída UseCaseException.BusinessRuleViolation(notice.DeletedAt != null, "O Edital inserido já foi excluído."); // Salva arquivo no repositório e atualiza atributo DocUrl - if (input.File != null) - notice.DocUrl = await _storageFileService.UploadFileAsync(input.File, notice.DocUrl); + if (model.File != null) + { + notice.DocUrl = await _storageFileService.UploadFileAsync(model.File, notice.DocUrl); + } // Atualiza atributos permitidos - notice.RegistrationStartDate = input.RegistrationStartDate ?? notice.RegistrationStartDate; - notice.RegistrationEndDate = input.RegistrationEndDate ?? notice.RegistrationEndDate; - notice.EvaluationStartDate = input.EvaluationStartDate ?? notice.EvaluationStartDate; - notice.EvaluationEndDate = input.EvaluationEndDate ?? notice.EvaluationEndDate; - notice.AppealStartDate = input.AppealStartDate ?? notice.AppealStartDate; - notice.AppealEndDate = input.AppealEndDate ?? notice.AppealEndDate; - notice.SendingDocsStartDate = input.SendingDocsStartDate ?? notice.SendingDocsStartDate; - notice.SendingDocsEndDate = input.SendingDocsEndDate ?? notice.SendingDocsEndDate; - notice.PartialReportDeadline = input.PartialReportDeadline ?? notice.PartialReportDeadline; - notice.FinalReportDeadline = input.FinalReportDeadline ?? notice.FinalReportDeadline; - notice.SuspensionYears = input.SuspensionYears ?? notice.SuspensionYears; + notice.RegistrationStartDate = model.RegistrationStartDate ?? notice.RegistrationStartDate; + notice.RegistrationEndDate = model.RegistrationEndDate ?? notice.RegistrationEndDate; + notice.EvaluationStartDate = model.EvaluationStartDate ?? notice.EvaluationStartDate; + notice.EvaluationEndDate = model.EvaluationEndDate ?? notice.EvaluationEndDate; + notice.AppealStartDate = model.AppealStartDate ?? notice.AppealStartDate; + notice.AppealEndDate = model.AppealEndDate ?? notice.AppealEndDate; + notice.SendingDocsStartDate = model.SendingDocsStartDate ?? notice.SendingDocsStartDate; + notice.SendingDocsEndDate = model.SendingDocsEndDate ?? notice.SendingDocsEndDate; + notice.PartialReportDeadline = model.PartialReportDeadline ?? notice.PartialReportDeadline; + notice.FinalReportDeadline = model.FinalReportDeadline ?? notice.FinalReportDeadline; + notice.SuspensionYears = model.SuspensionYears ?? notice.SuspensionYears; // Converte as atividades para entidades antes de prosseguir // com a atualização no banco, apenas para fins de validação. - foreach (var activityType in input.Activities!) + foreach (UpdateActivityTypeInput activityType in model.Activities!) { // Converte atividades para entidades - foreach (var activity in activityType.Activities!) + foreach (UpdateActivityInput activity in activityType.Activities!) + { _ = new Entities.Activity(activity.Name, activity.Points, activity.Limits, Guid.Empty); + } // Converte tipo de atividade para entidade _ = new Entities.ActivityType(activityType.Name, activityType.Unity, Guid.Empty); } // Salva entidade atualizada no banco - await _repository.Update(notice); + _ = await _repository.Update(notice); // Recupera atividades do edital - var noticeActivities = await _activityTypeRepository.GetByNoticeId(notice.Id); + IList noticeActivities = await _activityTypeRepository.GetByNoticeId(notice.Id); // Atualiza atividades - await HandleActivityType(input.Activities!, noticeActivities, notice.Id); + await HandleActivityType(model.Activities!, noticeActivities, notice.Id); // Retorna entidade atualizada return _mapper.Map(notice); @@ -95,12 +100,12 @@ public async Task Execute(Guid? id, UpdateNoticeInput /// Lista de tipos de atividades que serão atualizados. /// Lista de tipos de atividades que serão excluídos. /// Id do edital. - async Task HandleActivityType(IList newActivityTypes, IList oldActivityTypes, Guid? noticeId) + private async Task HandleActivityType(IList newActivityTypes, IList oldActivityTypes, Guid? noticeId) { - foreach (var newActivityType in newActivityTypes) + foreach (UpdateActivityTypeInput newActivityType in newActivityTypes) { // Verifica se o tipo de atividade já existe - var activityType = oldActivityTypes.FirstOrDefault(x => x.Id == newActivityType.Id); + Entities.ActivityType? activityType = oldActivityTypes.FirstOrDefault(x => x.Id == newActivityType.Id); // Se o tipo de atividade não existir, cria um novo if (activityType is null) @@ -109,7 +114,7 @@ async Task HandleActivityType(IList newActivityTypes, I activityType = new Entities.ActivityType(newActivityType.Name, newActivityType.Unity, noticeId); // Salva tipo de atividade no banco - await _activityTypeRepository.Create(activityType); + _ = await _activityTypeRepository.Create(activityType); // Cria atividades await HandleActivity(newActivityType.Activities!, new List(), activityType.Id); @@ -123,22 +128,22 @@ async Task HandleActivityType(IList newActivityTypes, I activityType.Unity = newActivityType.Unity; // Salva tipo de atividade atualizado no banco - await _activityTypeRepository.Update(activityType); + _ = await _activityTypeRepository.Update(activityType); // Atualiza atividades await HandleActivity(newActivityType.Activities!, activityType.Activities!, activityType.Id); // Remove tipo de atividade da lista de tipos de atividades do edital - oldActivityTypes.Remove(activityType); + _ = oldActivityTypes.Remove(activityType); } } // TODO: Validar remoção de tipos de atividade. // Verifica se existem tipos de atividades que foram excluídos - foreach (var activityTypeToRemove in oldActivityTypes) + foreach (Entities.ActivityType activityTypeToRemove in oldActivityTypes) { // Remove tipo de atividade do banco - await _activityTypeRepository.Delete(activityTypeToRemove.Id); + _ = await _activityTypeRepository.Delete(activityTypeToRemove.Id); } } @@ -148,13 +153,13 @@ async Task HandleActivityType(IList newActivityTypes, I /// Lista de atividades que serão atualizadas. /// Lista de atividades que serão excluídas. /// Id do tipo de atividade. - async Task HandleActivity(IList newActivities, IList oldActivities, Guid? activityTypeId) + private async Task HandleActivity(IList newActivities, IList oldActivities, Guid? activityTypeId) { // Verifica se existem atividades que foram criadas ou atualizadas - foreach (var newActivity in newActivities) + foreach (UpdateActivityInput newActivity in newActivities) { // Verifica se o tipo de atividade já existe - var activity = oldActivities.FirstOrDefault(x => x.Id == newActivity.Id); + Entities.Activity? activity = oldActivities.FirstOrDefault(x => x.Id == newActivity.Id); // Se o tipo de atividade não existir, cria um novo if (activity is null) @@ -163,7 +168,7 @@ async Task HandleActivity(IList newActivities, IList newActivities, IList Execute(Guid? id) { @@ -26,7 +26,7 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se o professor existe - var professor = await _professorRepository.GetById(id) + Entities.Professor? professor = await _professorRepository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Professor)); // Verifica se o usuário existe diff --git a/src/Domain/UseCases/Professor/GetProfessorById.cs b/src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs similarity index 74% rename from src/Domain/UseCases/Professor/GetProfessorById.cs rename to src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs index 0eaa8d6d..db55766a 100644 --- a/src/Domain/UseCases/Professor/GetProfessorById.cs +++ b/src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Professor; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Professor; +using Domain.UseCases.Ports.Professor; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Professor { public class GetProfessorById : IGetProfessorById { @@ -16,12 +16,12 @@ public GetProfessorById(IProfessorRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - var entity = await _repository.GetById(id); + Entities.Professor? entity = await _repository.GetById(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Professor/GetProfessors.cs b/src/Domain/UseCases/Interactors/Professor/GetProfessors.cs similarity index 68% rename from src/Domain/UseCases/Professor/GetProfessors.cs rename to src/Domain/UseCases/Interactors/Professor/GetProfessors.cs index 05f0d4df..8fe38fb6 100644 --- a/src/Domain/UseCases/Professor/GetProfessors.cs +++ b/src/Domain/UseCases/Interactors/Professor/GetProfessors.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.Professor; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Professor; +using Domain.UseCases.Ports.Professor; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Professor { public class GetProfessors : IGetProfessors { @@ -15,11 +15,11 @@ public GetProfessors(IProfessorRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(int skip, int take) { - var entities = await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Professor/UpdateProfessor.cs b/src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs similarity index 75% rename from src/Domain/UseCases/Professor/UpdateProfessor.cs rename to src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs index 46d292ec..c47688fe 100644 --- a/src/Domain/UseCases/Professor/UpdateProfessor.cs +++ b/src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Professor; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Professor; +using Domain.UseCases.Ports.Professor; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Professor { public class UpdateProfessor : IUpdateProfessor { @@ -16,24 +16,26 @@ public UpdateProfessor(IProfessorRepository professorRepository, IMapper mapper) _professorRepository = professorRepository; _mapper = mapper; } - #endregion + #endregion Global Scope - public async Task Execute(Guid? id, UpdateProfessorInput input) + public async Task Execute(Guid? id, UpdateProfessorInput model) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); // Recupera entidade que será atualizada - var professor = await _professorRepository.GetById(id) + Entities.Professor professor = await _professorRepository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Professor)); // Verifica se a entidade foi excluída if (professor.DeletedAt != null) + { throw UseCaseException.BusinessRuleViolation("O professor informado já foi excluído."); + } // Atualiza atributos permitidos - professor.IdentifyLattes = input.IdentifyLattes; - professor.SIAPEEnrollment = input.SIAPEEnrollment; + professor.IdentifyLattes = model.IdentifyLattes; + professor.SIAPEEnrollment = model.SIAPEEnrollment; // Atualiza professor com as informações fornecidas professor = await _professorRepository.Update(professor); diff --git a/src/Domain/UseCases/ProgramType/CreateProgramType.cs b/src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs similarity index 73% rename from src/Domain/UseCases/ProgramType/CreateProgramType.cs rename to src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs index fa163062..a2ec2942 100644 --- a/src/Domain/UseCases/ProgramType/CreateProgramType.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.ProgramType; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.ProgramType; +using Domain.UseCases.Ports.ProgramType; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.ProgramType { public class CreateProgramType : ICreateProgramType { @@ -16,20 +16,22 @@ public CreateProgramType(IProgramTypeRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope - public async Task Execute(CreateProgramTypeInput input) + public async Task Execute(CreateProgramTypeInput model) { // Verifica se nome foi informado - UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); + UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Name), nameof(model.Name)); // Verifica se já existe um tipo de programa com o nome indicado - var entity = await _repository.GetProgramTypeByName(input.Name!); + Entities.ProgramType? entity = await _repository.GetProgramTypeByName(model.Name!); if (entity != null) + { throw UseCaseException.BusinessRuleViolation("Já existe um Tipo de Programa para o nome informado."); + } // Cria entidade - entity = await _repository.Create(_mapper.Map(input)); + entity = await _repository.Create(_mapper.Map(model)); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/ProgramType/DeleteProgramType.cs b/src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs similarity index 77% rename from src/Domain/UseCases/ProgramType/DeleteProgramType.cs rename to src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs index 7fb85cbe..1af8c50b 100644 --- a/src/Domain/UseCases/ProgramType/DeleteProgramType.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.ProgramType; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.ProgramType; +using Domain.UseCases.Ports.ProgramType; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.ProgramType { public class DeleteProgramType : IDeleteProgramType { @@ -16,7 +16,7 @@ public DeleteProgramType(IProgramTypeRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { @@ -24,7 +24,7 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - var model = await _repository.Delete(id); + Entities.ProgramType model = await _repository.Delete(id); // Retorna o tipo de programa removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/ProgramType/GetProgramTypeById.cs b/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs similarity index 74% rename from src/Domain/UseCases/ProgramType/GetProgramTypeById.cs rename to src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs index f7a04ac9..3380254e 100644 --- a/src/Domain/UseCases/ProgramType/GetProgramTypeById.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.ProgramType; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.ProgramType; +using Domain.UseCases.Ports.ProgramType; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.ProgramType { public class GetProgramTypeById : IGetProgramTypeById { @@ -16,12 +16,12 @@ public GetProgramTypeById(IProgramTypeRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - var entity = await _repository.GetById(id); + Entities.ProgramType? entity = await _repository.GetById(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/ProgramType/GetProgramTypes.cs b/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs similarity index 68% rename from src/Domain/UseCases/ProgramType/GetProgramTypes.cs rename to src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs index a63dbb8a..4a863b78 100644 --- a/src/Domain/UseCases/ProgramType/GetProgramTypes.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.ProgramType; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.ProgramType; +using Domain.UseCases.Ports.ProgramType; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.ProgramType { public class GetProgramTypes : IGetProgramTypes { @@ -15,11 +15,11 @@ public GetProgramTypes(IProgramTypeRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(int skip, int take) { - var entities = await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/ProgramType/UpdateProgramType.cs b/src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs similarity index 85% rename from src/Domain/UseCases/ProgramType/UpdateProgramType.cs rename to src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs index bcb1e692..95e26c0b 100644 --- a/src/Domain/UseCases/ProgramType/UpdateProgramType.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.ProgramType; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.ProgramType; +using Domain.UseCases.Ports.ProgramType; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.ProgramType { public class UpdateProgramType : IUpdateProgramType { @@ -16,7 +16,7 @@ public UpdateProgramType(IProgramTypeRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id, UpdateProgramTypeInput input) { @@ -27,7 +27,7 @@ public async Task Execute(Guid? id, UpdateProgram UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - var entity = await _repository.GetById(id) + Entities.ProgramType entity = await _repository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); // Verifica se a entidade foi excluída @@ -44,7 +44,7 @@ public async Task Execute(Guid? id, UpdateProgram entity.Description = input.Description; // Salva entidade atualizada no banco - var model = await _repository.Update(entity); + Entities.ProgramType model = await _repository.Update(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Project/AppealProject.cs b/src/Domain/UseCases/Interactors/Project/AppealProject.cs similarity index 82% rename from src/Domain/UseCases/Project/AppealProject.cs rename to src/Domain/UseCases/Interactors/Project/AppealProject.cs index 16314eff..b9d8ca8d 100644 --- a/src/Domain/UseCases/Project/AppealProject.cs +++ b/src/Domain/UseCases/Interactors/Project/AppealProject.cs @@ -1,11 +1,11 @@ using AutoMapper; -using Domain.Contracts.Project; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases.Project; +using Domain.UseCases.Interfaces.Project; +using Domain.UseCases.Ports.Project; using Domain.Validation; -namespace Domain.UseCases.Project +namespace Domain.UseCases.Interactors.Project { public class AppealProject : IAppealProject { @@ -18,7 +18,7 @@ public AppealProject(IProjectRepository projectRepository, _projectRepository = projectRepository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? projectId, string? appealDescription) { @@ -30,7 +30,7 @@ public async Task Execute(Guid? projectId, string? app nameof(appealDescription)); // Verifica se o projeto existe - var project = await _projectRepository.GetById(projectId!.Value) + Entities.Project project = await _projectRepository.GetById(projectId!.Value) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Verifica se o projeto está em recurso @@ -48,15 +48,13 @@ public async Task Execute(Guid? projectId, string? app project.AppealDate = DateTime.UtcNow; // Salva alterações no banco de dados - await _projectRepository.Update(project); + _ = await _projectRepository.Update(project); // Retorna o projeto return _mapper.Map(project); } - else - { - throw UseCaseException.BusinessRuleViolation("O projeto não está em uma fase que permita recurso."); - } + + throw UseCaseException.BusinessRuleViolation("O projeto não está em uma fase que permita recurso."); } } } \ No newline at end of file diff --git a/src/Domain/UseCases/Project/CancelProject.cs b/src/Domain/UseCases/Interactors/Project/CancelProject.cs similarity index 82% rename from src/Domain/UseCases/Project/CancelProject.cs rename to src/Domain/UseCases/Interactors/Project/CancelProject.cs index 7fcb3e40..3c77b2f9 100644 --- a/src/Domain/UseCases/Project/CancelProject.cs +++ b/src/Domain/UseCases/Interactors/Project/CancelProject.cs @@ -1,11 +1,11 @@ using AutoMapper; -using Domain.Contracts.Project; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases.Project; +using Domain.UseCases.Interfaces.Project; +using Domain.UseCases.Ports.Project; using Domain.Validation; -namespace Domain.UseCases.Project +namespace Domain.UseCases.Interactors.Project { public class CancelProject : ICancelProject { @@ -18,17 +18,17 @@ public CancelProject(IProjectRepository projectRepository, _projectRepository = projectRepository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id, string? observation) { // Verifica se o projeto existe - var project = await _projectRepository.GetById(id) + Entities.Project project = await _projectRepository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Verifica se o projeto já não foi cancelado ou está encerrado UseCaseException.BusinessRuleViolation( - project.Status == EProjectStatus.Canceled || project.Status == EProjectStatus.Closed, + project.Status is EProjectStatus.Canceled or EProjectStatus.Closed, "Projeto já cancelado ou encerrado."); // Atualiza informações de cancelamento do projeto diff --git a/src/Domain/UseCases/Project/GetClosedProjects.cs b/src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs similarity index 61% rename from src/Domain/UseCases/Project/GetClosedProjects.cs rename to src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs index 4b30208f..c73c4248 100644 --- a/src/Domain/UseCases/Project/GetClosedProjects.cs +++ b/src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs @@ -1,12 +1,12 @@ using AutoMapper; -using Domain.Contracts.Project; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; -using Domain.Interfaces.UseCases.Project; +using Domain.UseCases.Interfaces.Project; +using Domain.UseCases.Ports.Project; using Domain.Validation; -namespace Domain.UseCases.Project +namespace Domain.UseCases.Interactors.Project { public class GetClosedProjects : IGetClosedProjects { @@ -22,42 +22,44 @@ public GetClosedProjects(IProjectRepository projectRepository, _tokenAuthenticationService = tokenAuthenticationService; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(int skip, int take, bool onlyMyProjects = true) { // Obtém as claims do usuário autenticado. - var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + Ports.Auth.UserClaimsOutput? userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Se o usuário não estiver autenticado, lança uma exceção. UseCaseException.BusinessRuleViolation(userClaims == null || userClaims.Role == null, "Usuário não autorizado."); // Obtém o tipo de usuário. - var userRole = Enum.Parse(userClaims?.Role!); + ERole userRole = Enum.Parse(userClaims?.Role!); // Obtém a lista de projetos de acordo com o tipo de usuário. IEnumerable projects; // Se o usuário for um professor, retorna apenas os seus projetos. if (userRole == ERole.PROFESSOR) - projects = await _projectRepository.GetProfessorProjects(skip, take, userClaims?.Id, true); + { + projects = (IEnumerable)await _projectRepository.GetProfessorProjects(skip, take, userClaims?.Id, true); + } // Se o usuário for um aluno, retorna apenas os seus projetos. else if (userRole == ERole.STUDENT) - projects = await _projectRepository.GetStudentProjects(skip, take, userClaims?.Id, true); + { + projects = (IEnumerable)await _projectRepository.GetStudentProjects(skip, take, userClaims?.Id, true); + } // Se o usuário for um administrador, permite a busca apenas pelo seu ID. - else if (userRole == ERole.ADMIN && onlyMyProjects) - projects = await _projectRepository.GetProfessorProjects(skip, take, userClaims?.Id, true); - - // Se o usuário for um administrador, permite a busca por todos os projetos. - else if (userRole == ERole.ADMIN && !onlyMyProjects) - projects = await _projectRepository.GetProjects(skip, take, true); - - // Se o usuário não for nenhum dos tipos acima, lança uma exceção. else - throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); + { + projects = userRole == ERole.ADMIN && onlyMyProjects + ? (IEnumerable)await _projectRepository.GetProfessorProjects(skip, take, userClaims?.Id, true) + : userRole == ERole.ADMIN && !onlyMyProjects + ? (IEnumerable)await _projectRepository.GetProjects(skip, take, true) + : throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); + } // Mapeia a lista de projetos para uma lista de projetos resumidos e retorna. return _mapper.Map>(projects); diff --git a/src/Domain/UseCases/Project/GetOpenProjects.cs b/src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs similarity index 61% rename from src/Domain/UseCases/Project/GetOpenProjects.cs rename to src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs index d76e2e24..6ca07790 100644 --- a/src/Domain/UseCases/Project/GetOpenProjects.cs +++ b/src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs @@ -1,12 +1,12 @@ using AutoMapper; -using Domain.Contracts.Project; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; -using Domain.Interfaces.UseCases.Project; +using Domain.UseCases.Interfaces.Project; +using Domain.UseCases.Ports.Project; using Domain.Validation; -namespace Domain.UseCases.Project +namespace Domain.UseCases.Interactors.Project { public class GetOpenProjects : IGetOpenProjects { @@ -22,42 +22,44 @@ public GetOpenProjects(IProjectRepository projectRepository, _tokenAuthenticationService = tokenAuthenticationService; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(int skip, int take, bool onlyMyProjects = true) { // Obtém as claims do usuário autenticado. - var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + Ports.Auth.UserClaimsOutput? userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Se o usuário não estiver autenticado, lança uma exceção. UseCaseException.BusinessRuleViolation(userClaims == null || userClaims.Role == null, "Usuário não autorizado."); // Obtém o tipo de usuário. - var userRole = Enum.Parse(userClaims?.Role!); + ERole userRole = Enum.Parse(userClaims?.Role!); // Obtém a lista de projetos de acordo com o tipo de usuário. IEnumerable projects; // Se o usuário for um professor, retorna apenas os seus projetos. if (userRole == ERole.PROFESSOR) - projects = await _projectRepository.GetProfessorProjects(skip, take, userClaims?.Id); + { + projects = (IEnumerable)await _projectRepository.GetProfessorProjects(skip, take, userClaims?.Id); + } // Se o usuário for um aluno, retorna apenas os seus projetos. else if (userRole == ERole.STUDENT) - projects = await _projectRepository.GetStudentProjects(skip, take, userClaims?.Id); + { + projects = (IEnumerable)await _projectRepository.GetStudentProjects(skip, take, userClaims?.Id); + } // Se o usuário for um administrador, permite a busca apenas pelo seu ID. - else if (userRole == ERole.ADMIN && onlyMyProjects) - projects = await _projectRepository.GetProfessorProjects(skip, take, userClaims?.Id); - - // Se o usuário for um administrador, permite a busca por todos os projetos. - else if (userRole == ERole.ADMIN && !onlyMyProjects) - projects = await _projectRepository.GetProjects(skip, take); - - // Se o usuário não for nenhum dos tipos acima, lança uma exceção. else - throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); + { + projects = userRole == ERole.ADMIN && onlyMyProjects + ? (IEnumerable)await _projectRepository.GetProfessorProjects(skip, take, userClaims?.Id) + : userRole == ERole.ADMIN && !onlyMyProjects + ? (IEnumerable)await _projectRepository.GetProjects(skip, take) + : throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); + } // Mapeia a lista de projetos para uma lista de projetos resumidos e retorna. return _mapper.Map>(projects); diff --git a/src/Domain/UseCases/Project/GetProjectById.cs b/src/Domain/UseCases/Interactors/Project/GetProjectById.cs similarity index 78% rename from src/Domain/UseCases/Project/GetProjectById.cs rename to src/Domain/UseCases/Interactors/Project/GetProjectById.cs index 86ffda2c..1f4d146a 100644 --- a/src/Domain/UseCases/Project/GetProjectById.cs +++ b/src/Domain/UseCases/Interactors/Project/GetProjectById.cs @@ -1,10 +1,10 @@ using AutoMapper; -using Domain.Contracts.Project; using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases.Project; +using Domain.UseCases.Interfaces.Project; +using Domain.UseCases.Ports.Project; using Domain.Validation; -namespace Domain.UseCases.Project +namespace Domain.UseCases.Interactors.Project { public class GetProjectById : IGetProjectById { @@ -17,12 +17,12 @@ public GetProjectById(IProjectRepository projectRepository, _projectRepository = projectRepository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { // Busca projeto pelo Id informado - var project = await _projectRepository.GetById(id) + Entities.Project project = await _projectRepository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Mapeia entidade para output e retorna diff --git a/src/Domain/UseCases/Interactors/Project/OpenProject.cs b/src/Domain/UseCases/Interactors/Project/OpenProject.cs new file mode 100644 index 00000000..a971c0dd --- /dev/null +++ b/src/Domain/UseCases/Interactors/Project/OpenProject.cs @@ -0,0 +1,151 @@ +using AutoMapper; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Project; +using Domain.UseCases.Ports.Project; +using Domain.Validation; + +namespace Domain.UseCases.Interactors.Project +{ + public class OpenProject : IOpenProject + { + #region Global Scope + private readonly IProjectRepository _projectRepository; + private readonly IStudentRepository _studentRepository; + private readonly IProfessorRepository _professorRepository; + private readonly INoticeRepository _noticeRepository; + private readonly ISubAreaRepository _subAreaRepository; + private readonly IProgramTypeRepository _programTypeRepository; + private readonly IActivityTypeRepository _activityTypeRepository; + private readonly IProjectActivityRepository _projectActivityRepository; + private readonly IMapper _mapper; + public OpenProject(IProjectRepository projectRepository, + IStudentRepository studentRepository, + IProfessorRepository professorRepository, + INoticeRepository noticeRepository, + ISubAreaRepository subAreaRepository, + IProgramTypeRepository programTypeRepository, + IActivityTypeRepository activityTypeRepository, + IProjectActivityRepository projectActivityRepository, + IMapper mapper) + { + _projectRepository = projectRepository; + _studentRepository = studentRepository; + _professorRepository = professorRepository; + _noticeRepository = noticeRepository; + _subAreaRepository = subAreaRepository; + _programTypeRepository = programTypeRepository; + _activityTypeRepository = activityTypeRepository; + _projectActivityRepository = projectActivityRepository; + _mapper = mapper; + } + #endregion Global Scope + + public async Task Execute(OpenProjectInput input) + { + // Mapeia input para entidade e realiza validação dos campos informados + Entities.Project project = new( + input.Title, + input.KeyWord1, + input.KeyWord2, + input.KeyWord3, + input.IsScholarshipCandidate, + input.Objective, + input.Methodology, + input.ExpectedResults, + input.ActivitiesExecutionSchedule, + input.StudentId, + input.ProgramTypeId, + input.ProfessorId, + input.SubAreaId, + input.NoticeId, + EProjectStatus.Opened, + EProjectStatus.Opened.GetDescription(), + null, + DateTime.UtcNow, + null, + null, + null); + + // Verifica se Edital existe + Entities.Notice notice = await _noticeRepository.GetById(project.NoticeId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Notice)); + + // Verifica se o período do edital é válido + if (notice.RegistrationStartDate > DateTime.UtcNow || notice.RegistrationEndDate < DateTime.UtcNow) + { + throw UseCaseException.BusinessRuleViolation("Fora do período de inscrição no edital."); + } + + // Verifica se a Subárea existe + _ = await _subAreaRepository.GetById(project.SubAreaId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); + + // Verifica se o Tipo de Programa existe + _ = await _programTypeRepository.GetById(project.ProgramTypeId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); + + // Verifica se o Professor existe + _ = await _professorRepository.GetById(project.ProfessorId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Professor)); + + // Caso tenha sido informado algum aluno no processo de abertura do projeto + if (project.StudentId.HasValue) + { + // Verifica se o aluno existe + Entities.Student student = await _studentRepository.GetById(project.StudentId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); + + // Verifica se o aluno já está em um projeto + IEnumerable studentProjects = await _projectRepository.GetStudentProjects(0, 1, student.Id); + if (studentProjects.Any()) + { + throw UseCaseException.BusinessRuleViolation("Aluno já está em um projeto."); + } + } + + // Verifica se foram informadas atividades + if (input.Activities?.Any() != true) + { + throw UseCaseException.BusinessRuleViolation("Atividades não informadas."); + } + + // Obtém atividades do Edital + IList noticeActivities = await _activityTypeRepository.GetByNoticeId(notice.Id); + + // Valida se todas as atividades do projeto foram informadas corretamente + List newProjectActivities = new(); + foreach (Entities.ActivityType activityType in noticeActivities) + { + // Verifica se as atividades que o professor informou existem no edital + // e se todas as atividades do edital foram informadas. + foreach (Entities.Activity activity in activityType.Activities!) + { + // Verifica se professor informou valor para essa atividade do edital + Ports.ProjectActivity.CreateProjectActivityInput inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) + ?? throw UseCaseException.BusinessRuleViolation($"Não foi informado valor para a atividade {activity.Name}."); + + // Adiciona atividade do projeto na lista para ser criada posteriormente + newProjectActivities.Add(new Entities.ProjectActivity( + Guid.Empty, // Id do projeto será gerado na etapa seguinte + inputActivity.ActivityId, + inputActivity.InformedActivities, + 0)); + } + } + + // Cria o projeto + project = await _projectRepository.Create(project); + + // Cria as atividades do projeto + foreach (Entities.ProjectActivity projectActivity in newProjectActivities) + { + projectActivity.ProjectId = project.Id; + _ = await _projectActivityRepository.Create(projectActivity); + } + + // Mapeia o projeto para o retorno e retorna + return _mapper.Map(project); + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Project/SubmitProject.cs b/src/Domain/UseCases/Interactors/Project/SubmitProject.cs similarity index 82% rename from src/Domain/UseCases/Project/SubmitProject.cs rename to src/Domain/UseCases/Interactors/Project/SubmitProject.cs index 1209973c..a7326561 100644 --- a/src/Domain/UseCases/Project/SubmitProject.cs +++ b/src/Domain/UseCases/Interactors/Project/SubmitProject.cs @@ -1,11 +1,11 @@ using AutoMapper; -using Domain.Contracts.Project; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases.Project; +using Domain.UseCases.Interfaces.Project; +using Domain.UseCases.Ports.Project; using Domain.Validation; -namespace Domain.UseCases.Project +namespace Domain.UseCases.Interactors.Project { public class SubmitProject : ISubmitProject { @@ -18,7 +18,7 @@ public SubmitProject(IProjectRepository projectRepository, _projectRepository = projectRepository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? projectId) { @@ -26,7 +26,7 @@ public async Task Execute(Guid? projectId) UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); // Verifica se o projeto existe - var project = await _projectRepository.GetById(projectId!.Value) + Entities.Project project = await _projectRepository.GetById(projectId!.Value) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Verifica se edital está em fase de inscrição @@ -46,15 +46,13 @@ public async Task Execute(Guid? projectId) project.SubmissionDate = DateTime.UtcNow; // Salva alterações no banco de dados - await _projectRepository.Update(project); + _ = await _projectRepository.Update(project); // Mapeia entidade para output e retorna return _mapper.Map(project); } - else - { - throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); - } + + throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); } } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interactors/Project/UpdateProject.cs b/src/Domain/UseCases/Interactors/Project/UpdateProject.cs new file mode 100644 index 00000000..f556607d --- /dev/null +++ b/src/Domain/UseCases/Interactors/Project/UpdateProject.cs @@ -0,0 +1,153 @@ +using AutoMapper; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Project; +using Domain.UseCases.Ports.Project; +using Domain.Validation; + +namespace Domain.UseCases.Interactors.Project +{ + public class UpdateProject : IUpdateProject + { + #region Global Scope + private readonly IProjectRepository _projectRepository; + private readonly IStudentRepository _studentRepository; + private readonly IProfessorRepository _professorRepository; + private readonly INoticeRepository _noticeRepository; + private readonly ISubAreaRepository _subAreaRepository; + private readonly IProgramTypeRepository _programTypeRepository; + private readonly IActivityTypeRepository _activityTypeRepository; + private readonly IProjectActivityRepository _projectActivityRepository; + private readonly IMapper _mapper; + public UpdateProject(IProjectRepository projectRepository, + IStudentRepository studentRepository, + IProfessorRepository professorRepository, + INoticeRepository noticeRepository, + ISubAreaRepository subAreaRepository, + IProgramTypeRepository programTypeRepository, + IActivityTypeRepository activityTypeRepository, + IProjectActivityRepository projectActivityRepository, + IMapper mapper) + { + _projectRepository = projectRepository; + _studentRepository = studentRepository; + _professorRepository = professorRepository; + _noticeRepository = noticeRepository; + _subAreaRepository = subAreaRepository; + _programTypeRepository = programTypeRepository; + _activityTypeRepository = activityTypeRepository; + _projectActivityRepository = projectActivityRepository; + _mapper = mapper; + } + #endregion Global Scope + + public async Task Execute(Guid? id, UpdateProjectInput input) + { + // Verifica se o id foi informado + UseCaseException.NotInformedParam(id is null, nameof(id)); + + // Verifica se o projeto existe + Entities.Project project = await _projectRepository.GetById(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + + // Verifica se o edital está no período de inscrições + if (project.Notice!.RegistrationStartDate > DateTime.UtcNow || project.Notice?.RegistrationEndDate < DateTime.UtcNow) + { + throw UseCaseException.BusinessRuleViolation("Fora do período de inscrição no edital."); + } + + // Verifica se o projeto está aberto + if (project!.Status == EProjectStatus.Opened) + { + // Verifica se a nova Subárea existe + if (input.SubAreaId != project.SubAreaId) + { + _ = await _subAreaRepository.GetById(input.SubAreaId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); + } + + // Verifica se o novo Tipo de Programa existe + if (input.ProgramTypeId != project.ProgramTypeId) + { + _ = await _programTypeRepository.GetById(input.ProgramTypeId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); + } + + // Caso tenha sido informado algum aluno no processo de abertura do projeto + if (input.StudentId.HasValue && input.StudentId != project.StudentId) + { + // Verifica se o aluno existe + Entities.Student student = await _studentRepository.GetById(input.StudentId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); + + // Verifica se o aluno já está em um projeto + IEnumerable studentProjects = await _projectRepository.GetStudentProjects(0, 1, student.Id); + UseCaseException.BusinessRuleViolation(studentProjects.Any(), "Student is already on a project."); + } + + // Atualiza campos permitidos + project.Title = input.Title; + project.KeyWord1 = input.KeyWord1; + project.KeyWord2 = input.KeyWord2; + project.KeyWord3 = input.KeyWord3; + project.IsScholarshipCandidate = input.IsScholarshipCandidate; + project.Objective = input.Objective; + project.Methodology = input.Methodology; + project.ExpectedResults = input.ExpectedResults; + project.ActivitiesExecutionSchedule = input.ActivitiesExecutionSchedule; + project.ProgramTypeId = input.ProgramTypeId; + project.StudentId = input.StudentId; + project.SubAreaId = input.SubAreaId; + + // Verifica se foram informadas atividades + if (input.Activities?.Any() != true) + { + throw UseCaseException.BusinessRuleViolation("Atividades não informadas."); + } + + // Obtém atividades do Edital + IList noticeActivities = await _activityTypeRepository.GetByNoticeId(project.Notice!.Id); + + // Obtém atividades do projeto + IList projectActivities = await _projectActivityRepository.GetByProjectId(project.Id); + + // Valida se todas as atividades do projeto foram informadas corretamente + List updateProjectActivities = new(); + foreach (Entities.ActivityType activityType in noticeActivities) + { + // Verifica se as atividades que o professor informou existem no edital + // e se todas as atividades do edital foram informadas. + foreach (Entities.Activity activity in activityType.Activities!) + { + // Verifica se professor informou valor para essa atividade do edital + Ports.ProjectActivity.UpdateProjectActivityInput inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) + ?? throw UseCaseException.BusinessRuleViolation($"Não foi informado valor para a atividade {activity.Name}."); + + // Obtém atividade do projeto + Entities.ProjectActivity? updateProjectActivity = projectActivities.FirstOrDefault(x => x.ActivityId == activity.Id); + + // Atualiza valores da entidade + updateProjectActivity!.InformedActivities = inputActivity.InformedActivities; + + // Atualiza atividade do projeto no banco de dados + _ = await _projectActivityRepository.Update(updateProjectActivity); + } + } + + // Atualiza o projeto + _ = await _projectRepository.Update(project); + + // Atualiza atividades do projeto no banco + foreach (Entities.ProjectActivity projectActivity in updateProjectActivities) + { + _ = await _projectActivityRepository.Update(projectActivity); + } + + // Mapeia o projeto para o retorno e retorna + return _mapper.Map(project); + } + + throw UseCaseException.BusinessRuleViolation("O projeto não está em um estágio que permita mudanças."); + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs similarity index 86% rename from src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs rename to src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs index 5642042b..0692a4c7 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs @@ -1,13 +1,13 @@ using AutoMapper; -using Domain.Contracts.Project; -using Domain.Contracts.ProjectEvaluation; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; -using Domain.Interfaces.UseCases.ProjectEvaluation; +using Domain.UseCases.Interfaces.ProjectEvaluation; +using Domain.UseCases.Ports.Project; +using Domain.UseCases.Ports.ProjectEvaluation; using Domain.Validation; -namespace Domain.UseCases.ProjectEvaluation +namespace Domain.UseCases.Interactors.ProjectEvaluation { public class EvaluateAppealProject : IEvaluateAppealProject { @@ -29,23 +29,23 @@ public EvaluateAppealProject(IMapper mapper, _tokenAuthenticationService = tokenAuthenticationService; _projectEvaluationRepository = projectEvaluationRepository; } - #endregion + #endregion Global Scope public async Task Execute(EvaluateAppealProjectInput input) { // Obtém informações do usuário logado. - var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + Ports.Auth.UserClaimsOutput user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Verifica se o usuário logado é um avaliador. UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN.GetDescription() || user.Role != ERole.PROFESSOR.GetDescription(), "O usuário não é um avaliador."); // Busca avaliação do projeto pelo Id. - var projectEvaluation = await _projectEvaluationRepository.GetByProjectId(input.ProjectId) + Entities.ProjectEvaluation? projectEvaluation = await _projectEvaluationRepository.GetByProjectId(input.ProjectId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProjectEvaluation)); // Recupera projeto pelo Id. - var project = await _projectRepository.GetById(input.ProjectId) + Entities.Project project = await _projectRepository.GetById(input.ProjectId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Verifica se o avaliador é o professor orientador do projeto. @@ -77,7 +77,7 @@ public async Task Execute(EvaluateAppealProjectInput projectEvaluation.AppealEvaluationStatus = (EProjectStatus)input.AppealEvaluationStatus!; // Atualiza avaliação do projeto. - await _projectEvaluationRepository.Update(projectEvaluation); + _ = await _projectEvaluationRepository.Update(projectEvaluation); // Se projeto foi aceito, adiciona prazo para envio da documentação. if ((EProjectStatus)input.AppealEvaluationStatus == EProjectStatus.Accepted) @@ -100,7 +100,7 @@ await _emailService.SendProjectNotificationEmail( projectEvaluation.SubmissionEvaluationDescription); // Atualiza projeto. - var output = await _projectRepository.Update(project); + Entities.Project output = await _projectRepository.Update(project); // Mapeia dados de saída e retorna. return _mapper.Map(output); diff --git a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs similarity index 81% rename from src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs rename to src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs index 3ec883fa..7725aef1 100644 --- a/src/Domain/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -1,13 +1,13 @@ using AutoMapper; -using Domain.Contracts.Project; -using Domain.Contracts.ProjectEvaluation; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; -using Domain.Interfaces.UseCases.ProjectEvaluation; +using Domain.UseCases.Interfaces.ProjectEvaluation; +using Domain.UseCases.Ports.Project; +using Domain.UseCases.Ports.ProjectEvaluation; using Domain.Validation; -namespace Domain.UseCases.ProjectEvaluation +namespace Domain.UseCases.Interactors.ProjectEvaluation { public class EvaluateSubmissionProject : IEvaluateSubmissionProject { @@ -35,12 +35,12 @@ public EvaluateSubmissionProject(IMapper mapper, _emailService = emailService; _projectEvaluationRepository = projectEvaluationRepository; } - #endregion + #endregion Global Scope public async Task Execute(EvaluateSubmissionProjectInput input) { // Obtém informações do usuário logado. - var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + Ports.Auth.UserClaimsOutput user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Verifica se o usuário logado é um avaliador. UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN.GetDescription() @@ -48,12 +48,12 @@ public async Task Execute(EvaluateSubmissionProjectIn "O usuário não é um avaliador."); // Verifica se já existe alguma avaliação para o projeto. - var projectEvaluation = await _projectEvaluationRepository.GetByProjectId(input.ProjectId); + Entities.ProjectEvaluation? projectEvaluation = await _projectEvaluationRepository.GetByProjectId(input.ProjectId); UseCaseException.BusinessRuleViolation(projectEvaluation != null, "Projeto já avaliado."); // Busca projeto pelo Id. - var project = await _projectRepository.GetById(input.ProjectId) + Entities.Project project = await _projectRepository.GetById(input.ProjectId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Verifica se o avaliador é o professor orientador do projeto. @@ -87,25 +87,25 @@ public async Task Execute(EvaluateSubmissionProjectIn 0); // Obtém atividades do Edital - var noticeActivities = await _activityTypeRepository.GetByNoticeId(project.Notice!.Id); + IList noticeActivities = (IList)await _activityTypeRepository.GetByNoticeId(project.Notice!.Id); // Obtém atividades do projeto - var projectActivities = await _projectActivityRepository.GetByProjectId(project.Id); + IList projectActivities = await _projectActivityRepository.GetByProjectId(project.Id); // Valida se todas as atividades do projeto foram informadas corretamente - var updateProjectActivities = new List(); - foreach (var activityType in noticeActivities) + List updateProjectActivities = new(); + foreach (Entities.ActivityType activityType in noticeActivities) { // Verifica se as atividades que o professor informou existem no edital // e se todas as atividades do edital foram informadas. - foreach (var activity in activityType.Activities!) + foreach (Entities.Activity activity in activityType.Activities!) { // Verifica se professor informou valor para essa atividade do edital - var inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) + Ports.ProjectActivity.EvaluateProjectActivityInput inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) ?? throw UseCaseException.BusinessRuleViolation($"Não foi informado valor para a atividade {activity.Name}."); // Obtém atividade do projeto - var updateProjectActivity = projectActivities.FirstOrDefault(x => x.ActivityId == activity.Id); + Entities.ProjectActivity? updateProjectActivity = projectActivities.FirstOrDefault(x => x.ActivityId == activity.Id); // Atualiza valores da entidade updateProjectActivity!.FoundActivities = inputActivity.FoundActivities; @@ -114,7 +114,7 @@ public async Task Execute(EvaluateSubmissionProjectIn projectEvaluation.APIndex += updateProjectActivity.CalculatePoints(); // Atualiza atividade do projeto no banco de dados - await _projectActivityRepository.Update(updateProjectActivity); + _ = await _projectActivityRepository.Update(updateProjectActivity); } } @@ -122,7 +122,7 @@ public async Task Execute(EvaluateSubmissionProjectIn projectEvaluation.CalculateFinalScore(); // Adiciona avaliação do projeto. - await _projectEvaluationRepository.Create(projectEvaluation); + _ = await _projectEvaluationRepository.Create(projectEvaluation); // Se projeto foi aceito, adiciona prazo para envio da documentação. if (projectEvaluation.SubmissionEvaluationStatus == EProjectStatus.Accepted) @@ -145,7 +145,7 @@ await _emailService.SendProjectNotificationEmail( projectEvaluation.SubmissionEvaluationDescription); // Atualiza projeto. - var output = await _projectRepository.Update(project); + Entities.Project output = await _projectRepository.Update(project); // Mapeia dados de saída e retorna. return _mapper.Map(output); diff --git a/src/Domain/UseCases/ProjectEvaluation/GetEvaluationByProjectId.cs b/src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs similarity index 76% rename from src/Domain/UseCases/ProjectEvaluation/GetEvaluationByProjectId.cs rename to src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs index d2108a30..bcfcc9a8 100644 --- a/src/Domain/UseCases/ProjectEvaluation/GetEvaluationByProjectId.cs +++ b/src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs @@ -1,10 +1,10 @@ using AutoMapper; -using Domain.Contracts.ProjectEvaluation; using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases.ProjectEvaluation; +using Domain.UseCases.Interfaces.ProjectEvaluation; +using Domain.UseCases.Ports.ProjectEvaluation; using Domain.Validation; -namespace Domain.UseCases.ProjectEvaluation +namespace Domain.UseCases.Interactors.ProjectEvaluation { public class GetEvaluationByProjectId : IGetEvaluationByProjectId { @@ -17,7 +17,7 @@ public GetEvaluationByProjectId(IMapper mapper, _mapper = mapper; _repository = repository; } - #endregion + #endregion Global Scope public async Task Execute(Guid? projectId) { @@ -25,7 +25,7 @@ public async Task Execute(Guid? projectId) UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); // Obtém a avaliação do projeto pelo Id do projeto. - var entity = await _repository.GetByProjectId(projectId); + Entities.ProjectEvaluation? entity = await _repository.GetByProjectId(projectId); // Converte e retorna o resultado. return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Student/CreateStudent.cs b/src/Domain/UseCases/Interactors/Student/CreateStudent.cs similarity index 68% rename from src/Domain/UseCases/Student/CreateStudent.cs rename to src/Domain/UseCases/Interactors/Student/CreateStudent.cs index 93205c42..9485d25d 100644 --- a/src/Domain/UseCases/Student/CreateStudent.cs +++ b/src/Domain/UseCases/Interactors/Student/CreateStudent.cs @@ -1,12 +1,12 @@ -using Domain.Contracts.Student; -using Domain.Interfaces.UseCases; using AutoMapper; +using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; +using Domain.UseCases.Interfaces.Student; +using Domain.UseCases.Ports.Student; using Domain.Validation; -using Domain.Entities.Enums; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Student { public class CreateStudent : ICreateStudent { @@ -34,59 +34,59 @@ public CreateStudent(IStudentRepository studentRepository, _hashService = hashService; _mapper = mapper; } - #endregion + #endregion Global Scope - public async Task Execute(CreateStudentInput input) + public async Task Execute(CreateStudentInput model) { // Realiza o map da entidade e a validação dos campos informados // var entity = _mapper.Map(input); - var entity = new Entities.Student(input.BirthDate, - input.RG, - input.IssuingAgency, - input.DispatchDate, - (EGender)input.Gender, - (ERace)input.Race, - input.HomeAddress, - input.City, - input.UF, - input.CEP, - input.PhoneDDD, - input.Phone, - input.CellPhoneDDD, - input.CellPhone, - input.CampusId, - input.CourseId, - input.StartYear, - input.AssistanceTypeId); + Entities.Student? entity = new(model.BirthDate, + model.RG, + model.IssuingAgency, + model.DispatchDate, + (EGender)model.Gender, + (ERace)model.Race, + model.HomeAddress, + model.City, + model.UF, + model.CEP, + model.PhoneDDD, + model.Phone, + model.CellPhoneDDD, + model.CellPhone, + model.CampusId, + model.CourseId, + model.StartYear, + model.AssistanceTypeId); // Verifica se já existe um usuário com o e-mail informado - var user = await _userRepository.GetUserByEmail(input.Email); + Entities.User? user = await _userRepository.GetUserByEmail(model.Email); UseCaseException.BusinessRuleViolation(user != null, "Já existe um usuário com o e-mail informado."); // Verifica se já existe um usuário com o CPF informado - user = await _userRepository.GetUserByCPF(input.CPF); + user = await _userRepository.GetUserByCPF(model.CPF); UseCaseException.BusinessRuleViolation(user != null, "Já existe um usuário com o CPF informado."); // Verifica se curso informado existe - var course = await _courseRepository.GetById(input.CourseId); + Entities.Course? course = await _courseRepository.GetById(model.CourseId); UseCaseException.BusinessRuleViolation(course == null || course.DeletedAt != null, "Curso informado não existe."); // Verifica se campus informado existe - var campus = await _campusRepository.GetById(input.CampusId); + Entities.Campus? campus = await _campusRepository.GetById(model.CampusId); UseCaseException.BusinessRuleViolation(campus == null || campus.DeletedAt != null, "Campus informado não existe."); // Verifica se a senha é nula - UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Password), nameof(input.Password)); + UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Password), nameof(model.Password)); // Gera hash da senha - input.Password = _hashService.HashPassword(input.Password!); + model.Password = _hashService.HashPassword(model.Password!); // Cria usuário - user = new Entities.User(input.Name, input.Email, input.Password, input.CPF, Entities.Enums.ERole.STUDENT); + user = new Entities.User(model.Name, model.Email, model.Password, model.CPF, ERole.STUDENT); // Adiciona usuário no banco user = await _userRepository.Create(user); @@ -100,7 +100,7 @@ public async Task Execute(CreateStudentInput input) "Não foi possível criar o estudante."); // Envia e-mail de confirmação - await _emailService.SendConfirmationEmail(user?.Email, user?.Name, user?.ValidationCode); + _ = await _emailService.SendConfirmationEmail(user?.Email, user?.Name, user?.ValidationCode); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Student/DeleteStudent.cs b/src/Domain/UseCases/Interactors/Student/DeleteStudent.cs similarity index 87% rename from src/Domain/UseCases/Student/DeleteStudent.cs rename to src/Domain/UseCases/Interactors/Student/DeleteStudent.cs index 0ae94d32..035bc239 100644 --- a/src/Domain/UseCases/Student/DeleteStudent.cs +++ b/src/Domain/UseCases/Interactors/Student/DeleteStudent.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Student; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Student; +using Domain.UseCases.Ports.Student; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Student { public class DeleteStudent : IDeleteStudent { @@ -18,7 +18,7 @@ public DeleteStudent(IStudentRepository studentRepository, IUserRepository userR _userRepository = userRepository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { @@ -26,7 +26,7 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se o estudante existe - var student = await _studentRepository.GetById(id) + Entities.Student? student = await _studentRepository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); // Verifica se o usuário existe diff --git a/src/Domain/UseCases/Student/GetStudentById.cs b/src/Domain/UseCases/Interactors/Student/GetStudentById.cs similarity index 74% rename from src/Domain/UseCases/Student/GetStudentById.cs rename to src/Domain/UseCases/Interactors/Student/GetStudentById.cs index 1f70b0e2..ebd55704 100644 --- a/src/Domain/UseCases/Student/GetStudentById.cs +++ b/src/Domain/UseCases/Interactors/Student/GetStudentById.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.Student; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Student; +using Domain.UseCases.Ports.Student; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Student { public class GetStudentById : IGetStudentById { @@ -16,12 +16,12 @@ public GetStudentById(IStudentRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - var entity = await _repository.GetById(id); + Entities.Student? entity = await _repository.GetById(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Student/GetStudents.cs b/src/Domain/UseCases/Interactors/Student/GetStudents.cs similarity index 68% rename from src/Domain/UseCases/Student/GetStudents.cs rename to src/Domain/UseCases/Interactors/Student/GetStudents.cs index c32c5a29..ab33d91d 100644 --- a/src/Domain/UseCases/Student/GetStudents.cs +++ b/src/Domain/UseCases/Interactors/Student/GetStudents.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.Student; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Student; +using Domain.UseCases.Ports.Student; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Student { public class GetStudents : IGetStudents { @@ -15,11 +15,11 @@ public GetStudents(IStudentRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(int skip, int take) { - var entities = await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Student/UpdateStudent.cs b/src/Domain/UseCases/Interactors/Student/UpdateStudent.cs similarity index 54% rename from src/Domain/UseCases/Student/UpdateStudent.cs rename to src/Domain/UseCases/Interactors/Student/UpdateStudent.cs index ca3fdc73..23f20ca5 100644 --- a/src/Domain/UseCases/Student/UpdateStudent.cs +++ b/src/Domain/UseCases/Interactors/Student/UpdateStudent.cs @@ -1,11 +1,11 @@ -using Domain.Contracts.Student; -using Domain.Interfaces.UseCases; using AutoMapper; -using Domain.Interfaces.Repositories; using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Student; +using Domain.UseCases.Ports.Student; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.Student { public class UpdateStudent : IUpdateStudent { @@ -17,15 +17,15 @@ public UpdateStudent(IStudentRepository studentRepository, IMapper mapper) _studentRepository = studentRepository; _mapper = mapper; } - #endregion + #endregion Global Scope - public async Task Execute(Guid? id, UpdateStudentInput input) + public async Task Execute(Guid? id, UpdateStudentInput model) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); // Recupera entidade que será atualizada - var student = await _studentRepository.GetById(id) + Entities.Student student = await _studentRepository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); // Verifica se a entidade foi excluída @@ -33,26 +33,26 @@ public async Task Execute(Guid? id, UpdateStudentInpu "O estudante informado já foi excluído."); // Atualiza atributos permitidos - student.BirthDate = input.BirthDate; - student.CampusId = input.CampusId; - student.CellPhone = input.CellPhone; - student.CellPhoneDDD = input.CellPhoneDDD; - student.CEP = input.CEP; - student.City = input.City; - student.CourseId = input.CourseId; - student.DispatchDate = input.DispatchDate; - student.HomeAddress = input.HomeAddress; - student.IssuingAgency = input.IssuingAgency; - student.Phone = input.Phone; - student.PhoneDDD = input.PhoneDDD; - student.RG = input.RG; - student.StartYear = input.StartYear; - student.UF = input.UF; - student.AssistanceTypeId = input.AssistanceTypeId; + student.BirthDate = model.BirthDate; + student.CampusId = model.CampusId; + student.CellPhone = model.CellPhone; + student.CellPhoneDDD = model.CellPhoneDDD; + student.CEP = model.CEP; + student.City = model.City; + student.CourseId = model.CourseId; + student.DispatchDate = model.DispatchDate; + student.HomeAddress = model.HomeAddress; + student.IssuingAgency = model.IssuingAgency; + student.Phone = model.Phone; + student.PhoneDDD = model.PhoneDDD; + student.RG = model.RG; + student.StartYear = model.StartYear; + student.UF = model.UF; + student.AssistanceTypeId = model.AssistanceTypeId; // Enums - student.Race = (ERace)input.Race; - student.Gender = (EGender)input.Gender; + student.Race = (ERace)model.Race; + student.Gender = (EGender)model.Gender; // Atualiza estudante com as informações fornecidas student = await _studentRepository.Update(student); diff --git a/src/Domain/UseCases/StudentDocuments/CreateStudentDocuments.cs b/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs similarity index 97% rename from src/Domain/UseCases/StudentDocuments/CreateStudentDocuments.cs rename to src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs index 63e345c6..c8c662be 100644 --- a/src/Domain/UseCases/StudentDocuments/CreateStudentDocuments.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.StudentDocuments; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Validation; using Domain.Interfaces.Services; +using Domain.UseCases.Interfaces.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; +using Domain.Validation; using Microsoft.AspNetCore.Http; namespace Domain.UseCases diff --git a/src/Domain/UseCases/StudentDocuments/DeleteStudentDocuments.cs b/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs similarity index 76% rename from src/Domain/UseCases/StudentDocuments/DeleteStudentDocuments.cs rename to src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs index bb18573a..d56decac 100644 --- a/src/Domain/UseCases/StudentDocuments/DeleteStudentDocuments.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.StudentDocuments; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.StudentDocuments { public class DeleteStudentDocuments : IDeleteStudentDocuments { @@ -16,7 +16,7 @@ public DeleteStudentDocuments(IStudentDocumentsRepository repository, IMapper ma _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { @@ -24,7 +24,7 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - var model = await _repository.Delete(id); + Entities.StudentDocuments model = await _repository.Delete(id); // Retorna o tipo de programa removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/StudentDocuments/GetStudentDocumentsByProjectId.cs b/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs similarity index 77% rename from src/Domain/UseCases/StudentDocuments/GetStudentDocumentsByProjectId.cs rename to src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs index 1fdbc99d..b7f83c77 100644 --- a/src/Domain/UseCases/StudentDocuments/GetStudentDocumentsByProjectId.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.StudentDocuments; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.StudentDocuments { public class GetStudentDocumentsByProjectId : IGetStudentDocumentsByProjectId { @@ -18,7 +18,7 @@ public GetStudentDocumentsByProjectId( _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? projectId) { @@ -26,7 +26,7 @@ public async Task Execute(Guid? projectId) UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); // Busca documentos do estudante pelo id do projeto - var entity = await _repository.GetByProjectId(projectId); + Entities.StudentDocuments? entity = await _repository.GetByProjectId(projectId); // Retorna entidade mapeada return _mapper.Map(entity); diff --git a/src/Domain/UseCases/StudentDocuments/GetStudentDocumentsByStudentId.cs b/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs similarity index 77% rename from src/Domain/UseCases/StudentDocuments/GetStudentDocumentsByStudentId.cs rename to src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs index 3f0d0d11..b2c0d1d5 100644 --- a/src/Domain/UseCases/StudentDocuments/GetStudentDocumentsByStudentId.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.StudentDocuments; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.StudentDocuments { public class GetStudentDocumentsByStudentId : IGetStudentDocumentsByStudentId { @@ -18,7 +18,7 @@ public GetStudentDocumentsByStudentId( _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? studentId) { @@ -26,7 +26,7 @@ public async Task Execute(Guid? studentId) UseCaseException.NotInformedParam(studentId is null, nameof(studentId)); // Busca documentos do estudante pelo id do projeto - var entity = await _repository.GetByStudentId(studentId); + Entities.StudentDocuments? entity = await _repository.GetByStudentId(studentId); // Retorna entidade mapeada return _mapper.Map(entity); diff --git a/src/Domain/UseCases/StudentDocuments/UpdateStudentDocuments.cs b/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs similarity index 66% rename from src/Domain/UseCases/StudentDocuments/UpdateStudentDocuments.cs rename to src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs index 4705dbcc..d40fb5df 100644 --- a/src/Domain/UseCases/StudentDocuments/UpdateStudentDocuments.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs @@ -1,12 +1,12 @@ -using Domain.Contracts.StudentDocuments; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Validation; using Domain.Interfaces.Services; +using Domain.UseCases.Interfaces.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; +using Domain.Validation; using Microsoft.AspNetCore.Http; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.StudentDocuments { public class UpdateStudentDocuments : IUpdateStudentDocuments { @@ -27,35 +27,35 @@ public UpdateStudentDocuments( _storageFileService = storageFileService; _mapper = mapper; } - #endregion + #endregion Global Scope - public async Task Execute(Guid? id, UpdateStudentDocumentsInput input) + public async Task Execute(Guid? id, UpdateStudentDocumentsInput model) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se já foram enviados documentos para o projeto informado - var studentDocuments = await _studentDocumentRepository.GetById(id!); + Entities.StudentDocuments? studentDocuments = await _studentDocumentRepository.GetById(id!); UseCaseException.NotFoundEntityById(studentDocuments is not null, nameof(studentDocuments)); // Verifica se o projeto se encontra em situação de submissão de documentos UseCaseException.BusinessRuleViolation( - studentDocuments!.Project?.Status != Entities.Enums.EProjectStatus.DocumentAnalysis - || studentDocuments!.Project?.Status != Entities.Enums.EProjectStatus.Pending, + studentDocuments!.Project?.Status is not Entities.Enums.EProjectStatus.DocumentAnalysis + and not Entities.Enums.EProjectStatus.Pending, "O projeto não está na fase de apresentação de documentos."); // Atualiza entidade a partir do input informado - studentDocuments!.AgencyNumber = input.AgencyNumber; - studentDocuments!.AccountNumber = input.AccountNumber; + studentDocuments!.AgencyNumber = model.AgencyNumber; + studentDocuments!.AccountNumber = model.AccountNumber; // Atualiza arquivos na nuvem - await TryToSaveFileInCloud(input.IdentityDocument!, studentDocuments.IdentityDocument); - await TryToSaveFileInCloud(input.CPF!, studentDocuments.CPF); - await TryToSaveFileInCloud(input.Photo3x4!, studentDocuments.Photo3x4); - await TryToSaveFileInCloud(input.SchoolHistory!, studentDocuments.SchoolHistory); - await TryToSaveFileInCloud(input.ScholarCommitmentAgreement!, studentDocuments.ScholarCommitmentAgreement); - await TryToSaveFileInCloud(input.ParentalAuthorization!, studentDocuments.ParentalAuthorization); - await TryToSaveFileInCloud(input.AccountOpeningProof!, studentDocuments.AccountOpeningProof); + await TryToSaveFileInCloud(model.IdentityDocument!, studentDocuments.IdentityDocument); + await TryToSaveFileInCloud(model.CPF!, studentDocuments.CPF); + await TryToSaveFileInCloud(model.Photo3x4!, studentDocuments.Photo3x4); + await TryToSaveFileInCloud(model.SchoolHistory!, studentDocuments.SchoolHistory); + await TryToSaveFileInCloud(model.ScholarCommitmentAgreement!, studentDocuments.ScholarCommitmentAgreement); + await TryToSaveFileInCloud(model.ParentalAuthorization!, studentDocuments.ParentalAuthorization); + await TryToSaveFileInCloud(model.AccountOpeningProof!, studentDocuments.AccountOpeningProof); // Atualiza entidade studentDocuments = await _studentDocumentRepository.Update(studentDocuments); @@ -63,9 +63,9 @@ public async Task Execute(Guid? id, UpdateSt // Se o projeto está no status de pendente, atualiza para o status de análise de documentos if (studentDocuments.Project?.Status == Entities.Enums.EProjectStatus.Pending) { - var project = await _projectRepository.GetById(studentDocuments.ProjectId); + Entities.Project? project = await _projectRepository.GetById(studentDocuments.ProjectId); project!.Status = Entities.Enums.EProjectStatus.DocumentAnalysis; - await _projectRepository.Update(project); + _ = await _projectRepository.Update(project); } // Retorna entidade atualizada @@ -76,8 +76,12 @@ private async Task TryToSaveFileInCloud(IFormFile file, string? url) { try { - if (file is null) return; - await _storageFileService.UploadFileAsync(file, url); + if (file is null) + { + return; + } + + _ = await _storageFileService.UploadFileAsync(file, url); } catch (Exception ex) { diff --git a/src/Domain/UseCases/SubArea/CreateSubArea.cs b/src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs similarity index 95% rename from src/Domain/UseCases/SubArea/CreateSubArea.cs rename to src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs index 74ed154a..a698d2ae 100644 --- a/src/Domain/UseCases/SubArea/CreateSubArea.cs +++ b/src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs @@ -1,7 +1,7 @@ -using Domain.Contracts.SubArea; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.SubArea; +using Domain.UseCases.Ports.SubArea; using Domain.Validation; namespace Domain.UseCases diff --git a/src/Domain/UseCases/SubArea/DeleteSubArea.cs b/src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs similarity index 78% rename from src/Domain/UseCases/SubArea/DeleteSubArea.cs rename to src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs index eb59ca28..d0b8b54c 100644 --- a/src/Domain/UseCases/SubArea/DeleteSubArea.cs +++ b/src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.SubArea; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.SubArea; +using Domain.UseCases.Ports.SubArea; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.SubArea { public class DeleteSubArea : IDeleteSubArea { @@ -16,7 +16,7 @@ public DeleteSubArea(ISubAreaRepository subAreaRepository, IMapper mapper) _repository = subAreaRepository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { @@ -24,7 +24,7 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - var model = await _repository.Delete(id); + Entities.SubArea model = await _repository.Delete(id); // Retorna o entidade removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/SubArea/GetSubAreaById.cs b/src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs similarity index 72% rename from src/Domain/UseCases/SubArea/GetSubAreaById.cs rename to src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs index 9d7d6a4f..79175713 100644 --- a/src/Domain/UseCases/SubArea/GetSubAreaById.cs +++ b/src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.SubArea; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.SubArea; +using Domain.UseCases.Ports.SubArea; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.SubArea { public class GetSubAreaById : IGetSubAreaById { @@ -15,11 +15,11 @@ public GetSubAreaById(ISubAreaRepository subAreaRepository, IMapper mapper) _subAreaRepository = subAreaRepository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { - var entity = await _subAreaRepository.GetById(id); + Entities.SubArea? entity = await _subAreaRepository.GetById(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/SubArea/GetSubAreasByArea.cs b/src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs similarity index 71% rename from src/Domain/UseCases/SubArea/GetSubAreasByArea.cs rename to src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs index 33a849c6..780b389e 100644 --- a/src/Domain/UseCases/SubArea/GetSubAreasByArea.cs +++ b/src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs @@ -1,10 +1,10 @@ -using Domain.Contracts.SubArea; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.SubArea; +using Domain.UseCases.Ports.SubArea; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.SubArea { public class GetSubAreasByArea : IGetSubAreasByArea { @@ -16,12 +16,12 @@ public GetSubAreasByArea(ISubAreaRepository subAreaRepository, IMapper mapper) _subAreaRepository = subAreaRepository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(Guid? areaId, int skip, int take) { UseCaseException.NotInformedParam(areaId is null, nameof(areaId)); - var entities = await _subAreaRepository.GetSubAreasByArea(areaId, skip, take); + IEnumerable entities = (IEnumerable)await _subAreaRepository.GetSubAreasByArea(areaId, skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/SubArea/UpdateSubArea.cs b/src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs similarity index 76% rename from src/Domain/UseCases/SubArea/UpdateSubArea.cs rename to src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs index f199668f..a5bc2492 100644 --- a/src/Domain/UseCases/SubArea/UpdateSubArea.cs +++ b/src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.SubArea; -using Domain.Interfaces.UseCases; using AutoMapper; using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.SubArea; +using Domain.UseCases.Ports.SubArea; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.SubArea { public class UpdateSubArea : IUpdateSubArea { @@ -15,12 +15,12 @@ public UpdateSubArea(ISubAreaRepository subAreaRepository, IMapper mapper) _subAreaRepository = subAreaRepository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id, UpdateSubAreaInput input) { // Recupera entidade que será atualizada - var entity = await _subAreaRepository.GetById(id) + Entities.SubArea entity = await _subAreaRepository.GetById(id) ?? throw Validation.UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); // Atualiza atributos permitidos @@ -29,7 +29,7 @@ public async Task Execute(Guid? id, UpdateSubAreaInpu entity.AreaId = input.AreaId; // Salva entidade atualizada no banco - var model = await _subAreaRepository.Update(entity); + Entities.SubArea model = await _subAreaRepository.Update(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/User/ActivateUser.cs b/src/Domain/UseCases/Interactors/User/ActivateUser.cs similarity index 75% rename from src/Domain/UseCases/User/ActivateUser.cs rename to src/Domain/UseCases/Interactors/User/ActivateUser.cs index 06fe6d7c..94d297ea 100644 --- a/src/Domain/UseCases/User/ActivateUser.cs +++ b/src/Domain/UseCases/Interactors/User/ActivateUser.cs @@ -1,10 +1,10 @@ using AutoMapper; -using Domain.Contracts.User; using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.User; +using Domain.UseCases.Ports.User; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.User { public class ActivateUser : IActivateUser { @@ -16,7 +16,7 @@ public ActivateUser(IUserRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { @@ -24,12 +24,12 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Encontra usuário pelo Id e o ativa - var user = await _repository.GetById(id) + Entities.User user = await _repository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); user.ActivateEntity(); // Atualiza usuário - var entity = await _repository.Update(user); + Entities.User entity = await _repository.Update(user); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/User/DeactivateUser.cs b/src/Domain/UseCases/Interactors/User/DeactivateUser.cs similarity index 76% rename from src/Domain/UseCases/User/DeactivateUser.cs rename to src/Domain/UseCases/Interactors/User/DeactivateUser.cs index a661b49b..0c14ba96 100644 --- a/src/Domain/UseCases/User/DeactivateUser.cs +++ b/src/Domain/UseCases/Interactors/User/DeactivateUser.cs @@ -1,10 +1,10 @@ using AutoMapper; -using Domain.Contracts.User; using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.User; +using Domain.UseCases.Ports.User; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.User { public class DeactivateUser : IDeactivateUser { @@ -16,7 +16,7 @@ public DeactivateUser(IUserRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { @@ -24,12 +24,12 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Encontra usuário pelo Id e o desativa - var user = await _repository.GetById(id) + Entities.User user = await _repository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); user.DeactivateEntity(); // Atualiza usuário - var entity = await _repository.Update(user); + Entities.User entity = await _repository.Update(user); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/User/GetActiveUsers.cs b/src/Domain/UseCases/Interactors/User/GetActiveUsers.cs similarity index 68% rename from src/Domain/UseCases/User/GetActiveUsers.cs rename to src/Domain/UseCases/Interactors/User/GetActiveUsers.cs index 240b7738..12309417 100644 --- a/src/Domain/UseCases/User/GetActiveUsers.cs +++ b/src/Domain/UseCases/Interactors/User/GetActiveUsers.cs @@ -1,9 +1,9 @@ using AutoMapper; -using Domain.Contracts.User; using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.User; +using Domain.UseCases.Ports.User; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.User { public class GetActiveUsers : IGetActiveUsers { @@ -15,11 +15,11 @@ public GetActiveUsers(IUserRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(int skip, int take) { - var entities = await _repository.GetActiveUsers(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetActiveUsers(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/User/GetInactiveUsers.cs b/src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs similarity index 68% rename from src/Domain/UseCases/User/GetInactiveUsers.cs rename to src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs index 6cc2046e..0e0a3efd 100644 --- a/src/Domain/UseCases/User/GetInactiveUsers.cs +++ b/src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs @@ -1,9 +1,9 @@ using AutoMapper; -using Domain.Contracts.User; using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.User; +using Domain.UseCases.Ports.User; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.User { public class GetInactiveUsers : IGetInactiveUsers { @@ -15,11 +15,11 @@ public GetInactiveUsers(IUserRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task> Execute(int skip, int take) { - var entities = await _repository.GetInactiveUsers(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetInactiveUsers(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/User/GetUserById.cs b/src/Domain/UseCases/Interactors/User/GetUserById.cs similarity index 80% rename from src/Domain/UseCases/User/GetUserById.cs rename to src/Domain/UseCases/Interactors/User/GetUserById.cs index b4940668..7eb65089 100644 --- a/src/Domain/UseCases/User/GetUserById.cs +++ b/src/Domain/UseCases/Interactors/User/GetUserById.cs @@ -1,10 +1,10 @@ using AutoMapper; -using Domain.Contracts.User; using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.User; +using Domain.UseCases.Ports.User; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.User { public class GetUserById : IGetUserById { @@ -16,7 +16,7 @@ public GetUserById(IUserRepository repository, IMapper mapper) _repository = repository; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(Guid? id) { @@ -24,7 +24,7 @@ public async Task Execute(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Busca usuário pelo id informado - var entity = await _repository.GetById(id) + Entities.User entity = await _repository.GetById(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); // Retorna usuário encontrado diff --git a/src/Domain/UseCases/User/UpdateUser.cs b/src/Domain/UseCases/Interactors/User/UpdateUser.cs similarity index 76% rename from src/Domain/UseCases/User/UpdateUser.cs rename to src/Domain/UseCases/Interactors/User/UpdateUser.cs index 45885a47..700c6a4c 100644 --- a/src/Domain/UseCases/User/UpdateUser.cs +++ b/src/Domain/UseCases/Interactors/User/UpdateUser.cs @@ -1,11 +1,11 @@ using AutoMapper; -using Domain.Contracts.User; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; -using Domain.Interfaces.UseCases; +using Domain.UseCases.Interfaces.User; +using Domain.UseCases.Ports.User; using Domain.Validation; -namespace Domain.UseCases +namespace Domain.UseCases.Interactors.User { public class UpdateUser : IUpdateUser { @@ -19,18 +19,18 @@ public UpdateUser(IUserRepository repository, ITokenAuthenticationService tokenA _tokenAuthenticationService = tokenAuthenticationService; _mapper = mapper; } - #endregion + #endregion Global Scope public async Task Execute(UserUpdateInput input) { // Busca as claims do usuário autenticado - var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + Ports.Auth.UserClaimsOutput userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Verifica se o id informado é nulo UseCaseException.NotInformedParam(userClaims.Id is null, nameof(userClaims.Id)); // Busca usuário pelo id informado - var user = await _repository.GetById(userClaims.Id) + Entities.User user = await _repository.GetById(userClaims.Id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); // Atualiza atributos permitidos @@ -38,7 +38,7 @@ public async Task Execute(UserUpdateInput input) user.CPF = input.CPF; // Salva usuário atualizado no banco - var entity = await _repository.Update(user); + Entities.User entity = await _repository.Update(user); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interfaces/ActivityType/IGetActivitiesByNoticeId.cs b/src/Domain/UseCases/Interfaces/ActivityType/IGetActivitiesByNoticeId.cs new file mode 100644 index 00000000..cdd9c374 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/ActivityType/IGetActivitiesByNoticeId.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.Activity; + +namespace Domain.UseCases.Interfaces.ActivityType +{ + public interface IGetActivitiesByNoticeId + { + Task> GetActivitiesByNoticeId(Guid? id); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs b/src/Domain/UseCases/Interfaces/ActivityType/IGetLastNoticeActivities.cs similarity index 60% rename from src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs rename to src/Domain/UseCases/Interfaces/ActivityType/IGetLastNoticeActivities.cs index b79452ae..58fd711f 100644 --- a/src/Domain/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs +++ b/src/Domain/UseCases/Interfaces/ActivityType/IGetLastNoticeActivities.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Activity; +using Domain.UseCases.Ports.Activity; -namespace Domain.Interfaces.UseCases.ActivityType +namespace Domain.UseCases.Interfaces.ActivityType { public interface IGetLastNoticeActivities { diff --git a/src/Domain/Interfaces/UseCases/Area/ICreateArea.cs b/src/Domain/UseCases/Interfaces/Area/ICreateArea.cs similarity index 60% rename from src/Domain/Interfaces/UseCases/Area/ICreateArea.cs rename to src/Domain/UseCases/Interfaces/Area/ICreateArea.cs index 8f5bdb0a..0e8088fc 100644 --- a/src/Domain/Interfaces/UseCases/Area/ICreateArea.cs +++ b/src/Domain/UseCases/Interfaces/Area/ICreateArea.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Area; +using Domain.UseCases.Ports.Area; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Area { public interface ICreateArea { diff --git a/src/Domain/Interfaces/UseCases/Area/IDeleteArea.cs b/src/Domain/UseCases/Interfaces/Area/IDeleteArea.cs similarity index 58% rename from src/Domain/Interfaces/UseCases/Area/IDeleteArea.cs rename to src/Domain/UseCases/Interfaces/Area/IDeleteArea.cs index 4103b384..eaf35f46 100644 --- a/src/Domain/Interfaces/UseCases/Area/IDeleteArea.cs +++ b/src/Domain/UseCases/Interfaces/Area/IDeleteArea.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Area; +using Domain.UseCases.Ports.Area; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Area { public interface IDeleteArea { diff --git a/src/Domain/UseCases/Interfaces/Area/IGetAreaById.cs b/src/Domain/UseCases/Interfaces/Area/IGetAreaById.cs new file mode 100644 index 00000000..25d97a90 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/Area/IGetAreaById.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.Area; + +namespace Domain.UseCases.Interfaces.Area +{ + public interface IGetAreaById + { + Task Execute(Guid? id); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Area/IGetAreasByMainArea.cs b/src/Domain/UseCases/Interfaces/Area/IGetAreasByMainArea.cs similarity index 54% rename from src/Domain/Interfaces/UseCases/Area/IGetAreasByMainArea.cs rename to src/Domain/UseCases/Interfaces/Area/IGetAreasByMainArea.cs index 95f16399..2955604a 100644 --- a/src/Domain/Interfaces/UseCases/Area/IGetAreasByMainArea.cs +++ b/src/Domain/UseCases/Interfaces/Area/IGetAreasByMainArea.cs @@ -1,9 +1,6 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Domain.Contracts.Area; +using Domain.UseCases.Ports.Area; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Area { public interface IGetAreasByMainArea { diff --git a/src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs b/src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs new file mode 100644 index 00000000..29f37caf --- /dev/null +++ b/src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs @@ -0,0 +1,10 @@ +using Domain.Ports.Area; +using Domain.UseCases.Ports.Area; + +namespace Domain.UseCases.Interfaces.Area +{ + public interface IUpdateArea + { + Task Execute(Guid? id, UpdateAreaInput input); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/AssistanceType/ICreateAssistanceType.cs b/src/Domain/UseCases/Interfaces/AssistanceType/ICreateAssistanceType.cs similarity index 60% rename from src/Domain/Interfaces/UseCases/AssistanceType/ICreateAssistanceType.cs rename to src/Domain/UseCases/Interfaces/AssistanceType/ICreateAssistanceType.cs index dd709fd5..2bd34c40 100644 --- a/src/Domain/Interfaces/UseCases/AssistanceType/ICreateAssistanceType.cs +++ b/src/Domain/UseCases/Interfaces/AssistanceType/ICreateAssistanceType.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.AssistanceType { public interface ICreateAssistanceType { diff --git a/src/Domain/Interfaces/UseCases/AssistanceType/IDeleteAssistanceType.cs b/src/Domain/UseCases/Interfaces/AssistanceType/IDeleteAssistanceType.cs similarity index 56% rename from src/Domain/Interfaces/UseCases/AssistanceType/IDeleteAssistanceType.cs rename to src/Domain/UseCases/Interfaces/AssistanceType/IDeleteAssistanceType.cs index d031e29e..d2bc8012 100644 --- a/src/Domain/Interfaces/UseCases/AssistanceType/IDeleteAssistanceType.cs +++ b/src/Domain/UseCases/Interfaces/AssistanceType/IDeleteAssistanceType.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.AssistanceType { public interface IDeleteAssistanceType { diff --git a/src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypeById.cs b/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypeById.cs similarity index 56% rename from src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypeById.cs rename to src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypeById.cs index 92ddd8b5..0b888442 100644 --- a/src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypeById.cs +++ b/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypeById.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.AssistanceType { public interface IGetAssistanceTypeById { diff --git a/src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypes.cs b/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypes.cs similarity index 60% rename from src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypes.cs rename to src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypes.cs index b9e0193c..0012ce34 100644 --- a/src/Domain/Interfaces/UseCases/AssistanceType/IGetAssistanceTypes.cs +++ b/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypes.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.AssistanceType; +using Domain.UseCases.Ports.AssistanceType; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.AssistanceType { public interface IGetAssistanceTypes { diff --git a/src/Domain/UseCases/Interfaces/AssistanceType/IUpdateAssistanceType.cs b/src/Domain/UseCases/Interfaces/AssistanceType/IUpdateAssistanceType.cs new file mode 100644 index 00000000..aa6489f7 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/AssistanceType/IUpdateAssistanceType.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.AssistanceType; + +namespace Domain.UseCases.Interfaces.AssistanceType +{ + public interface IUpdateAssistanceType + { + Task Execute(Guid? id, UpdateAssistanceTypeInput input); + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Auth/IConfirmEmail.cs b/src/Domain/UseCases/Interfaces/Auth/IConfirmEmail.cs new file mode 100644 index 00000000..ba06c013 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/Auth/IConfirmEmail.cs @@ -0,0 +1,7 @@ +namespace Domain.UseCases.Interfaces.Auth +{ + public interface IConfirmEmail + { + Task Execute(string? email, string? token); + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Auth/IForgotPassword.cs b/src/Domain/UseCases/Interfaces/Auth/IForgotPassword.cs new file mode 100644 index 00000000..29518a9d --- /dev/null +++ b/src/Domain/UseCases/Interfaces/Auth/IForgotPassword.cs @@ -0,0 +1,7 @@ +namespace Domain.UseCases.Interfaces.Auth +{ + public interface IForgotPassword + { + Task Execute(string? email); + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Auth/ILogin.cs b/src/Domain/UseCases/Interfaces/Auth/ILogin.cs new file mode 100644 index 00000000..949c69f3 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/Auth/ILogin.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.Auth; + +namespace Domain.UseCases.Interfaces.Auth +{ + public interface ILogin + { + Task Execute(UserLoginInput input); + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Auth/IResetPassword.cs b/src/Domain/UseCases/Interfaces/Auth/IResetPassword.cs new file mode 100644 index 00000000..b26283ab --- /dev/null +++ b/src/Domain/UseCases/Interfaces/Auth/IResetPassword.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.Auth; + +namespace Domain.UseCases.Interfaces.Auth +{ + public interface IResetPassword + { + Task Execute(UserResetPasswordInput input); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Campus/ICreateCampus.cs b/src/Domain/UseCases/Interfaces/Campus/ICreateCampus.cs similarity index 60% rename from src/Domain/Interfaces/UseCases/Campus/ICreateCampus.cs rename to src/Domain/UseCases/Interfaces/Campus/ICreateCampus.cs index 532b8649..5e32a66d 100644 --- a/src/Domain/Interfaces/UseCases/Campus/ICreateCampus.cs +++ b/src/Domain/UseCases/Interfaces/Campus/ICreateCampus.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Campus; +using Domain.UseCases.Ports.Campus; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Campus { public interface ICreateCampus { diff --git a/src/Domain/Interfaces/UseCases/Campus/IDeleteCampus.cs b/src/Domain/UseCases/Interfaces/Campus/IDeleteCampus.cs similarity index 57% rename from src/Domain/Interfaces/UseCases/Campus/IDeleteCampus.cs rename to src/Domain/UseCases/Interfaces/Campus/IDeleteCampus.cs index 133533f2..c48161b0 100644 --- a/src/Domain/Interfaces/UseCases/Campus/IDeleteCampus.cs +++ b/src/Domain/UseCases/Interfaces/Campus/IDeleteCampus.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Campus; +using Domain.UseCases.Ports.Campus; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Campus { public interface IDeleteCampus { diff --git a/src/Domain/Interfaces/UseCases/Campus/IGetCampusById.cs b/src/Domain/UseCases/Interfaces/Campus/IGetCampusById.cs similarity index 57% rename from src/Domain/Interfaces/UseCases/Campus/IGetCampusById.cs rename to src/Domain/UseCases/Interfaces/Campus/IGetCampusById.cs index 482d1046..de31e7e8 100644 --- a/src/Domain/Interfaces/UseCases/Campus/IGetCampusById.cs +++ b/src/Domain/UseCases/Interfaces/Campus/IGetCampusById.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Campus; +using Domain.UseCases.Ports.Campus; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Campus { public interface IGetCampusById { diff --git a/src/Domain/Interfaces/UseCases/Campus/IGetCampuses.cs b/src/Domain/UseCases/Interfaces/Campus/IGetCampuses.cs similarity index 61% rename from src/Domain/Interfaces/UseCases/Campus/IGetCampuses.cs rename to src/Domain/UseCases/Interfaces/Campus/IGetCampuses.cs index a7732797..7bcded9b 100644 --- a/src/Domain/Interfaces/UseCases/Campus/IGetCampuses.cs +++ b/src/Domain/UseCases/Interfaces/Campus/IGetCampuses.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Campus; +using Domain.UseCases.Ports.Campus; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Campus { public interface IGetCampuses { diff --git a/src/Domain/Interfaces/UseCases/Campus/IUpdateCampus.cs b/src/Domain/UseCases/Interfaces/Campus/IUpdateCampus.cs similarity index 53% rename from src/Domain/Interfaces/UseCases/Campus/IUpdateCampus.cs rename to src/Domain/UseCases/Interfaces/Campus/IUpdateCampus.cs index b00d0abb..32c5e18f 100644 --- a/src/Domain/Interfaces/UseCases/Campus/IUpdateCampus.cs +++ b/src/Domain/UseCases/Interfaces/Campus/IUpdateCampus.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.Campus; +using Domain.UseCases.Ports.Campus; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Campus { public interface IUpdateCampus { - Task Execute(Guid? id, UpdateCampusInput model); + Task Execute(Guid? id, UpdateCampusInput input); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Course/ICreateCourse.cs b/src/Domain/UseCases/Interfaces/Course/ICreateCourse.cs similarity index 53% rename from src/Domain/Interfaces/UseCases/Course/ICreateCourse.cs rename to src/Domain/UseCases/Interfaces/Course/ICreateCourse.cs index 5849479d..7a830c03 100644 --- a/src/Domain/Interfaces/UseCases/Course/ICreateCourse.cs +++ b/src/Domain/UseCases/Interfaces/Course/ICreateCourse.cs @@ -1,6 +1,7 @@ -using Domain.Contracts.Course; +using Domain.Ports.Course; +using Domain.UseCases.Ports.Course; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Course { public interface ICreateCourse { diff --git a/src/Domain/Interfaces/UseCases/Course/IDeleteCourse.cs b/src/Domain/UseCases/Interfaces/Course/IDeleteCourse.cs similarity index 57% rename from src/Domain/Interfaces/UseCases/Course/IDeleteCourse.cs rename to src/Domain/UseCases/Interfaces/Course/IDeleteCourse.cs index 56542fa0..b778ea9e 100644 --- a/src/Domain/Interfaces/UseCases/Course/IDeleteCourse.cs +++ b/src/Domain/UseCases/Interfaces/Course/IDeleteCourse.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Course; +using Domain.UseCases.Ports.Course; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Course { public interface IDeleteCourse { diff --git a/src/Domain/Interfaces/UseCases/Course/IGetCourseById.cs b/src/Domain/UseCases/Interfaces/Course/IGetCourseById.cs similarity index 57% rename from src/Domain/Interfaces/UseCases/Course/IGetCourseById.cs rename to src/Domain/UseCases/Interfaces/Course/IGetCourseById.cs index acd12eec..118e9b72 100644 --- a/src/Domain/Interfaces/UseCases/Course/IGetCourseById.cs +++ b/src/Domain/UseCases/Interfaces/Course/IGetCourseById.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Course; +using Domain.UseCases.Ports.Course; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Course { public interface IGetCourseById { diff --git a/src/Domain/Interfaces/UseCases/Course/IGetCourses.cs b/src/Domain/UseCases/Interfaces/Course/IGetCourses.cs similarity index 61% rename from src/Domain/Interfaces/UseCases/Course/IGetCourses.cs rename to src/Domain/UseCases/Interfaces/Course/IGetCourses.cs index 25803aeb..bd69105d 100644 --- a/src/Domain/Interfaces/UseCases/Course/IGetCourses.cs +++ b/src/Domain/UseCases/Interfaces/Course/IGetCourses.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Course; +using Domain.UseCases.Ports.Course; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Course { public interface IGetCourses { diff --git a/src/Domain/Interfaces/UseCases/Course/IUpdateCourse.cs b/src/Domain/UseCases/Interfaces/Course/IUpdateCourse.cs similarity index 53% rename from src/Domain/Interfaces/UseCases/Course/IUpdateCourse.cs rename to src/Domain/UseCases/Interfaces/Course/IUpdateCourse.cs index dd8f4a93..058ffcd4 100644 --- a/src/Domain/Interfaces/UseCases/Course/IUpdateCourse.cs +++ b/src/Domain/UseCases/Interfaces/Course/IUpdateCourse.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.Course; +using Domain.UseCases.Ports.Course; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Course { public interface IUpdateCourse { - Task Execute(Guid? id, UpdateCourseInput model); + Task Execute(Guid? id, UpdateCourseInput input); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/MainArea/ICreateMainArea.cs b/src/Domain/UseCases/Interfaces/MainArea/ICreateMainArea.cs similarity index 55% rename from src/Domain/Interfaces/UseCases/MainArea/ICreateMainArea.cs rename to src/Domain/UseCases/Interfaces/MainArea/ICreateMainArea.cs index f980f976..8e6860a8 100644 --- a/src/Domain/Interfaces/UseCases/MainArea/ICreateMainArea.cs +++ b/src/Domain/UseCases/Interfaces/MainArea/ICreateMainArea.cs @@ -1,7 +1,6 @@ -using System.Threading.Tasks; -using Domain.Contracts.MainArea; +using Domain.UseCases.Ports.MainArea; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.MainArea { public interface ICreateMainArea { diff --git a/src/Domain/Interfaces/UseCases/MainArea/IDeleteMainArea.cs b/src/Domain/UseCases/Interfaces/MainArea/IDeleteMainArea.cs similarity index 56% rename from src/Domain/Interfaces/UseCases/MainArea/IDeleteMainArea.cs rename to src/Domain/UseCases/Interfaces/MainArea/IDeleteMainArea.cs index 9b9fe50e..df91c51a 100644 --- a/src/Domain/Interfaces/UseCases/MainArea/IDeleteMainArea.cs +++ b/src/Domain/UseCases/Interfaces/MainArea/IDeleteMainArea.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.MainArea; +using Domain.UseCases.Ports.MainArea; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.MainArea { public interface IDeleteMainArea { diff --git a/src/Domain/Interfaces/UseCases/MainArea/IGetMainAreaById.cs b/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreaById.cs similarity index 56% rename from src/Domain/Interfaces/UseCases/MainArea/IGetMainAreaById.cs rename to src/Domain/UseCases/Interfaces/MainArea/IGetMainAreaById.cs index 91d4b6ef..641c20dd 100644 --- a/src/Domain/Interfaces/UseCases/MainArea/IGetMainAreaById.cs +++ b/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreaById.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.MainArea; +using Domain.UseCases.Ports.MainArea; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.MainArea { public interface IGetMainAreaById { diff --git a/src/Domain/Interfaces/UseCases/MainArea/IGetMainAreas.cs b/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreas.cs similarity index 52% rename from src/Domain/Interfaces/UseCases/MainArea/IGetMainAreas.cs rename to src/Domain/UseCases/Interfaces/MainArea/IGetMainAreas.cs index 2d0ef4a9..bb6f321a 100644 --- a/src/Domain/Interfaces/UseCases/MainArea/IGetMainAreas.cs +++ b/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreas.cs @@ -1,8 +1,6 @@ -using System.Linq; -using System.Threading.Tasks; -using Domain.Contracts.MainArea; +using Domain.UseCases.Ports.MainArea; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.MainArea { public interface IGetMainAreas { diff --git a/src/Domain/UseCases/Interfaces/MainArea/IUpdateMainArea.cs b/src/Domain/UseCases/Interfaces/MainArea/IUpdateMainArea.cs new file mode 100644 index 00000000..042653ad --- /dev/null +++ b/src/Domain/UseCases/Interfaces/MainArea/IUpdateMainArea.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.MainArea; + +namespace Domain.UseCases.Interfaces.MainArea +{ + public interface IUpdateMainArea + { + Task Execute(Guid? id, UpdateMainAreaInput input); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Notice/ICreateNotice.cs b/src/Domain/UseCases/Interfaces/Notice/ICreateNotice.cs similarity index 60% rename from src/Domain/Interfaces/UseCases/Notice/ICreateNotice.cs rename to src/Domain/UseCases/Interfaces/Notice/ICreateNotice.cs index 27b8e05d..e4a88581 100644 --- a/src/Domain/Interfaces/UseCases/Notice/ICreateNotice.cs +++ b/src/Domain/UseCases/Interfaces/Notice/ICreateNotice.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Notice; +using Domain.UseCases.Ports.Notice; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Notice { public interface ICreateNotice { diff --git a/src/Domain/Interfaces/UseCases/Notice/IDeleteNotice.cs b/src/Domain/UseCases/Interfaces/Notice/IDeleteNotice.cs similarity index 57% rename from src/Domain/Interfaces/UseCases/Notice/IDeleteNotice.cs rename to src/Domain/UseCases/Interfaces/Notice/IDeleteNotice.cs index 9e96fa22..c8b60d5e 100644 --- a/src/Domain/Interfaces/UseCases/Notice/IDeleteNotice.cs +++ b/src/Domain/UseCases/Interfaces/Notice/IDeleteNotice.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Notice; +using Domain.UseCases.Ports.Notice; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Notice { public interface IDeleteNotice { diff --git a/src/Domain/Interfaces/UseCases/Notice/IGetNoticeById.cs b/src/Domain/UseCases/Interfaces/Notice/IGetNoticeById.cs similarity index 57% rename from src/Domain/Interfaces/UseCases/Notice/IGetNoticeById.cs rename to src/Domain/UseCases/Interfaces/Notice/IGetNoticeById.cs index 5e643152..9191b876 100644 --- a/src/Domain/Interfaces/UseCases/Notice/IGetNoticeById.cs +++ b/src/Domain/UseCases/Interfaces/Notice/IGetNoticeById.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Notice; +using Domain.UseCases.Ports.Notice; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Notice { public interface IGetNoticeById { diff --git a/src/Domain/Interfaces/UseCases/Notice/IGetNotices.cs b/src/Domain/UseCases/Interfaces/Notice/IGetNotices.cs similarity index 61% rename from src/Domain/Interfaces/UseCases/Notice/IGetNotices.cs rename to src/Domain/UseCases/Interfaces/Notice/IGetNotices.cs index 07cca698..54f932cf 100644 --- a/src/Domain/Interfaces/UseCases/Notice/IGetNotices.cs +++ b/src/Domain/UseCases/Interfaces/Notice/IGetNotices.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Notice; +using Domain.UseCases.Ports.Notice; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Notice { public interface IGetNotices { diff --git a/src/Domain/Interfaces/UseCases/Notice/IUpdateNotice.cs b/src/Domain/UseCases/Interfaces/Notice/IUpdateNotice.cs similarity index 62% rename from src/Domain/Interfaces/UseCases/Notice/IUpdateNotice.cs rename to src/Domain/UseCases/Interfaces/Notice/IUpdateNotice.cs index 2f4c364b..49fe0fb6 100644 --- a/src/Domain/Interfaces/UseCases/Notice/IUpdateNotice.cs +++ b/src/Domain/UseCases/Interfaces/Notice/IUpdateNotice.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Notice; +using Domain.UseCases.Ports.Notice; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Notice { public interface IUpdateNotice { diff --git a/src/Domain/UseCases/Interfaces/Professor/ICreateProfessor.cs b/src/Domain/UseCases/Interfaces/Professor/ICreateProfessor.cs new file mode 100644 index 00000000..c0af468d --- /dev/null +++ b/src/Domain/UseCases/Interfaces/Professor/ICreateProfessor.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.Professor; + +namespace Domain.UseCases.Interfaces.Professor +{ + public interface ICreateProfessor + { + Task Execute(CreateProfessorInput model); + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Professor/IDeleteProfessor.cs b/src/Domain/UseCases/Interfaces/Professor/IDeleteProfessor.cs new file mode 100644 index 00000000..50081b68 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/Professor/IDeleteProfessor.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.Professor; + +namespace Domain.UseCases.Interfaces.Professor +{ + public interface IDeleteProfessor + { + Task Execute(Guid? id); + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Professor/IGetProfessorById.cs b/src/Domain/UseCases/Interfaces/Professor/IGetProfessorById.cs new file mode 100644 index 00000000..a98b75d5 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/Professor/IGetProfessorById.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.Professor; + +namespace Domain.UseCases.Interfaces.Professor +{ + public interface IGetProfessorById + { + Task Execute(Guid? id); + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Professor/IGetProfessors.cs b/src/Domain/UseCases/Interfaces/Professor/IGetProfessors.cs new file mode 100644 index 00000000..0915bd00 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/Professor/IGetProfessors.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.Professor; + +namespace Domain.UseCases.Interfaces.Professor +{ + public interface IGetProfessors + { + Task> Execute(int skip, int take); + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Professor/IUpdateProfessor.cs b/src/Domain/UseCases/Interfaces/Professor/IUpdateProfessor.cs new file mode 100644 index 00000000..c7247b8d --- /dev/null +++ b/src/Domain/UseCases/Interfaces/Professor/IUpdateProfessor.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.Professor; + +namespace Domain.UseCases.Interfaces.Professor +{ + public interface IUpdateProfessor + { + Task Execute(Guid? id, UpdateProfessorInput model); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/ProgramType/ICreateProgramType.cs b/src/Domain/UseCases/Interfaces/ProgramType/ICreateProgramType.cs similarity index 60% rename from src/Domain/Interfaces/UseCases/ProgramType/ICreateProgramType.cs rename to src/Domain/UseCases/Interfaces/ProgramType/ICreateProgramType.cs index 48af3261..436609da 100644 --- a/src/Domain/Interfaces/UseCases/ProgramType/ICreateProgramType.cs +++ b/src/Domain/UseCases/Interfaces/ProgramType/ICreateProgramType.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.ProgramType; +using Domain.UseCases.Ports.ProgramType; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.ProgramType { public interface ICreateProgramType { diff --git a/src/Domain/Interfaces/UseCases/ProgramType/IDeleteProgramType.cs b/src/Domain/UseCases/Interfaces/ProgramType/IDeleteProgramType.cs similarity index 56% rename from src/Domain/Interfaces/UseCases/ProgramType/IDeleteProgramType.cs rename to src/Domain/UseCases/Interfaces/ProgramType/IDeleteProgramType.cs index d8725db7..b3dfe3df 100644 --- a/src/Domain/Interfaces/UseCases/ProgramType/IDeleteProgramType.cs +++ b/src/Domain/UseCases/Interfaces/ProgramType/IDeleteProgramType.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.ProgramType; +using Domain.UseCases.Ports.ProgramType; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.ProgramType { public interface IDeleteProgramType { diff --git a/src/Domain/Interfaces/UseCases/ProgramType/IGetProgramTypeById.cs b/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypeById.cs similarity index 57% rename from src/Domain/Interfaces/UseCases/ProgramType/IGetProgramTypeById.cs rename to src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypeById.cs index 0ae6ec55..3c11c1d7 100644 --- a/src/Domain/Interfaces/UseCases/ProgramType/IGetProgramTypeById.cs +++ b/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypeById.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.ProgramType; +using Domain.UseCases.Ports.ProgramType; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.ProgramType { public interface IGetProgramTypeById { diff --git a/src/Domain/Interfaces/UseCases/ProgramType/IGetProgramTypes.cs b/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypes.cs similarity index 60% rename from src/Domain/Interfaces/UseCases/ProgramType/IGetProgramTypes.cs rename to src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypes.cs index 55ad4788..c0ec71c0 100644 --- a/src/Domain/Interfaces/UseCases/ProgramType/IGetProgramTypes.cs +++ b/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypes.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.ProgramType; +using Domain.UseCases.Ports.ProgramType; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.ProgramType { public interface IGetProgramTypes { diff --git a/src/Domain/Interfaces/UseCases/ProgramType/IUpdateProgramType.cs b/src/Domain/UseCases/Interfaces/ProgramType/IUpdateProgramType.cs similarity index 50% rename from src/Domain/Interfaces/UseCases/ProgramType/IUpdateProgramType.cs rename to src/Domain/UseCases/Interfaces/ProgramType/IUpdateProgramType.cs index 0064f948..ddbcced2 100644 --- a/src/Domain/Interfaces/UseCases/ProgramType/IUpdateProgramType.cs +++ b/src/Domain/UseCases/Interfaces/ProgramType/IUpdateProgramType.cs @@ -1,9 +1,9 @@ -using Domain.Contracts.ProgramType; +using Domain.UseCases.Ports.ProgramType; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.ProgramType { public interface IUpdateProgramType { - Task Execute(Guid? id, UpdateProgramTypeInput model); + Task Execute(Guid? id, UpdateProgramTypeInput input); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/Project/IAppealProject.cs b/src/Domain/UseCases/Interfaces/Project/IAppealProject.cs similarity index 63% rename from src/Domain/Interfaces/UseCases/Project/IAppealProject.cs rename to src/Domain/UseCases/Interfaces/Project/IAppealProject.cs index db7ee991..52c2e53d 100644 --- a/src/Domain/Interfaces/UseCases/Project/IAppealProject.cs +++ b/src/Domain/UseCases/Interfaces/Project/IAppealProject.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Project; +using Domain.UseCases.Ports.Project; -namespace Domain.Interfaces.UseCases.Project +namespace Domain.UseCases.Interfaces.Project { public interface IAppealProject { diff --git a/src/Domain/Interfaces/UseCases/Project/ICancelProject.cs b/src/Domain/UseCases/Interfaces/Project/ICancelProject.cs similarity index 61% rename from src/Domain/Interfaces/UseCases/Project/ICancelProject.cs rename to src/Domain/UseCases/Interfaces/Project/ICancelProject.cs index a8a565eb..9e5c004f 100644 --- a/src/Domain/Interfaces/UseCases/Project/ICancelProject.cs +++ b/src/Domain/UseCases/Interfaces/Project/ICancelProject.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Project; +using Domain.UseCases.Ports.Project; -namespace Domain.Interfaces.UseCases.Project +namespace Domain.UseCases.Interfaces.Project { public interface ICancelProject { diff --git a/src/Domain/Interfaces/UseCases/Project/IGetClosedProjects.cs b/src/Domain/UseCases/Interfaces/Project/IGetClosedProjects.cs similarity index 65% rename from src/Domain/Interfaces/UseCases/Project/IGetClosedProjects.cs rename to src/Domain/UseCases/Interfaces/Project/IGetClosedProjects.cs index b483ff78..16d63062 100644 --- a/src/Domain/Interfaces/UseCases/Project/IGetClosedProjects.cs +++ b/src/Domain/UseCases/Interfaces/Project/IGetClosedProjects.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Project; +using Domain.UseCases.Ports.Project; -namespace Domain.Interfaces.UseCases.Project +namespace Domain.UseCases.Interfaces.Project { public interface IGetClosedProjects { diff --git a/src/Domain/Interfaces/UseCases/Project/IGetOpenProjects.cs b/src/Domain/UseCases/Interfaces/Project/IGetOpenProjects.cs similarity index 65% rename from src/Domain/Interfaces/UseCases/Project/IGetOpenProjects.cs rename to src/Domain/UseCases/Interfaces/Project/IGetOpenProjects.cs index f284291b..b2a803fa 100644 --- a/src/Domain/Interfaces/UseCases/Project/IGetOpenProjects.cs +++ b/src/Domain/UseCases/Interfaces/Project/IGetOpenProjects.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Project; +using Domain.UseCases.Ports.Project; -namespace Domain.Interfaces.UseCases.Project +namespace Domain.UseCases.Interfaces.Project { public interface IGetOpenProjects { diff --git a/src/Domain/Interfaces/UseCases/Project/IGetProjectById.cs b/src/Domain/UseCases/Interfaces/Project/IGetProjectById.cs similarity index 57% rename from src/Domain/Interfaces/UseCases/Project/IGetProjectById.cs rename to src/Domain/UseCases/Interfaces/Project/IGetProjectById.cs index 0b5e8dd2..b0e902a4 100644 --- a/src/Domain/Interfaces/UseCases/Project/IGetProjectById.cs +++ b/src/Domain/UseCases/Interfaces/Project/IGetProjectById.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Project; +using Domain.UseCases.Ports.Project; -namespace Domain.Interfaces.UseCases.Project +namespace Domain.UseCases.Interfaces.Project { public interface IGetProjectById { diff --git a/src/Domain/Interfaces/UseCases/Project/IOpenProject.cs b/src/Domain/UseCases/Interfaces/Project/IOpenProject.cs similarity index 59% rename from src/Domain/Interfaces/UseCases/Project/IOpenProject.cs rename to src/Domain/UseCases/Interfaces/Project/IOpenProject.cs index f02a872f..75ee0229 100644 --- a/src/Domain/Interfaces/UseCases/Project/IOpenProject.cs +++ b/src/Domain/UseCases/Interfaces/Project/IOpenProject.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Project; +using Domain.UseCases.Ports.Project; -namespace Domain.Interfaces.UseCases.Project +namespace Domain.UseCases.Interfaces.Project { public interface IOpenProject { diff --git a/src/Domain/Interfaces/UseCases/Project/ISubmitProject.cs b/src/Domain/UseCases/Interfaces/Project/ISubmitProject.cs similarity index 58% rename from src/Domain/Interfaces/UseCases/Project/ISubmitProject.cs rename to src/Domain/UseCases/Interfaces/Project/ISubmitProject.cs index 7807dbc2..d77289a9 100644 --- a/src/Domain/Interfaces/UseCases/Project/ISubmitProject.cs +++ b/src/Domain/UseCases/Interfaces/Project/ISubmitProject.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Project; +using Domain.UseCases.Ports.Project; -namespace Domain.Interfaces.UseCases.Project +namespace Domain.UseCases.Interfaces.Project { public interface ISubmitProject { diff --git a/src/Domain/Interfaces/UseCases/Project/IUpdateProject.cs b/src/Domain/UseCases/Interfaces/Project/IUpdateProject.cs similarity index 62% rename from src/Domain/Interfaces/UseCases/Project/IUpdateProject.cs rename to src/Domain/UseCases/Interfaces/Project/IUpdateProject.cs index c2cf1387..8d458ae5 100644 --- a/src/Domain/Interfaces/UseCases/Project/IUpdateProject.cs +++ b/src/Domain/UseCases/Interfaces/Project/IUpdateProject.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Project; +using Domain.UseCases.Ports.Project; -namespace Domain.Interfaces.UseCases.Project +namespace Domain.UseCases.Interfaces.Project { public interface IUpdateProject { diff --git a/src/Domain/Interfaces/UseCases/ProjectEvaluation/IEvaluateAppealProject.cs b/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateAppealProject.cs similarity index 50% rename from src/Domain/Interfaces/UseCases/ProjectEvaluation/IEvaluateAppealProject.cs rename to src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateAppealProject.cs index 41c39573..2a7fda5e 100644 --- a/src/Domain/Interfaces/UseCases/ProjectEvaluation/IEvaluateAppealProject.cs +++ b/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateAppealProject.cs @@ -1,7 +1,7 @@ -using Domain.Contracts.Project; -using Domain.Contracts.ProjectEvaluation; +using Domain.UseCases.Ports.Project; +using Domain.UseCases.Ports.ProjectEvaluation; -namespace Domain.Interfaces.UseCases.ProjectEvaluation +namespace Domain.UseCases.Interfaces.ProjectEvaluation { public interface IEvaluateAppealProject { diff --git a/src/Domain/Interfaces/UseCases/ProjectEvaluation/IEvaluateSubmissionProject.cs b/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateSubmissionProject.cs similarity index 52% rename from src/Domain/Interfaces/UseCases/ProjectEvaluation/IEvaluateSubmissionProject.cs rename to src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateSubmissionProject.cs index e71f5e6c..f18ce9e8 100644 --- a/src/Domain/Interfaces/UseCases/ProjectEvaluation/IEvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateSubmissionProject.cs @@ -1,7 +1,7 @@ -using Domain.Contracts.Project; -using Domain.Contracts.ProjectEvaluation; +using Domain.UseCases.Ports.Project; +using Domain.UseCases.Ports.ProjectEvaluation; -namespace Domain.Interfaces.UseCases.ProjectEvaluation +namespace Domain.UseCases.Interfaces.ProjectEvaluation { public interface IEvaluateSubmissionProject { diff --git a/src/Domain/Interfaces/UseCases/ProjectEvaluation/IGetEvaluationByProjectId.cs b/src/Domain/UseCases/Interfaces/ProjectEvaluation/IGetEvaluationByProjectId.cs similarity index 57% rename from src/Domain/Interfaces/UseCases/ProjectEvaluation/IGetEvaluationByProjectId.cs rename to src/Domain/UseCases/Interfaces/ProjectEvaluation/IGetEvaluationByProjectId.cs index 76a0b41f..2154a8ff 100644 --- a/src/Domain/Interfaces/UseCases/ProjectEvaluation/IGetEvaluationByProjectId.cs +++ b/src/Domain/UseCases/Interfaces/ProjectEvaluation/IGetEvaluationByProjectId.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.ProjectEvaluation; +using Domain.UseCases.Ports.ProjectEvaluation; -namespace Domain.Interfaces.UseCases.ProjectEvaluation +namespace Domain.UseCases.Interfaces.ProjectEvaluation { public interface IGetEvaluationByProjectId { diff --git a/src/Domain/Interfaces/UseCases/Student/ICreateStudent.cs b/src/Domain/UseCases/Interfaces/Student/ICreateStudent.cs similarity index 60% rename from src/Domain/Interfaces/UseCases/Student/ICreateStudent.cs rename to src/Domain/UseCases/Interfaces/Student/ICreateStudent.cs index be6f1e94..a4194787 100644 --- a/src/Domain/Interfaces/UseCases/Student/ICreateStudent.cs +++ b/src/Domain/UseCases/Interfaces/Student/ICreateStudent.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Student; +using Domain.UseCases.Ports.Student; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Student { public interface ICreateStudent { diff --git a/src/Domain/Interfaces/UseCases/Student/IDeleteStudent.cs b/src/Domain/UseCases/Interfaces/Student/IDeleteStudent.cs similarity index 57% rename from src/Domain/Interfaces/UseCases/Student/IDeleteStudent.cs rename to src/Domain/UseCases/Interfaces/Student/IDeleteStudent.cs index 406291cb..d922036b 100644 --- a/src/Domain/Interfaces/UseCases/Student/IDeleteStudent.cs +++ b/src/Domain/UseCases/Interfaces/Student/IDeleteStudent.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Student; +using Domain.UseCases.Ports.Student; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Student { public interface IDeleteStudent { diff --git a/src/Domain/Interfaces/UseCases/Student/IGetStudentById.cs b/src/Domain/UseCases/Interfaces/Student/IGetStudentById.cs similarity index 57% rename from src/Domain/Interfaces/UseCases/Student/IGetStudentById.cs rename to src/Domain/UseCases/Interfaces/Student/IGetStudentById.cs index c4fb8d9f..62084c50 100644 --- a/src/Domain/Interfaces/UseCases/Student/IGetStudentById.cs +++ b/src/Domain/UseCases/Interfaces/Student/IGetStudentById.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Student; +using Domain.UseCases.Ports.Student; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Student { public interface IGetStudentById { diff --git a/src/Domain/Interfaces/UseCases/Student/IGetStudents.cs b/src/Domain/UseCases/Interfaces/Student/IGetStudents.cs similarity index 61% rename from src/Domain/Interfaces/UseCases/Student/IGetStudents.cs rename to src/Domain/UseCases/Interfaces/Student/IGetStudents.cs index 1c176fa6..6a4f9bcd 100644 --- a/src/Domain/Interfaces/UseCases/Student/IGetStudents.cs +++ b/src/Domain/UseCases/Interfaces/Student/IGetStudents.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Student; +using Domain.UseCases.Ports.Student; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Student { public interface IGetStudents { diff --git a/src/Domain/Interfaces/UseCases/Student/IUpdateStudent.cs b/src/Domain/UseCases/Interfaces/Student/IUpdateStudent.cs similarity index 62% rename from src/Domain/Interfaces/UseCases/Student/IUpdateStudent.cs rename to src/Domain/UseCases/Interfaces/Student/IUpdateStudent.cs index a4044c0d..053dc505 100644 --- a/src/Domain/Interfaces/UseCases/Student/IUpdateStudent.cs +++ b/src/Domain/UseCases/Interfaces/Student/IUpdateStudent.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Student; +using Domain.UseCases.Ports.Student; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.Student { public interface IUpdateStudent { diff --git a/src/Domain/Interfaces/UseCases/StudentDocuments/ICreateStudentDocuments.cs b/src/Domain/UseCases/Interfaces/StudentDocuments/ICreateStudentDocuments.cs similarity index 60% rename from src/Domain/Interfaces/UseCases/StudentDocuments/ICreateStudentDocuments.cs rename to src/Domain/UseCases/Interfaces/StudentDocuments/ICreateStudentDocuments.cs index 4f71ff15..63fec887 100644 --- a/src/Domain/Interfaces/UseCases/StudentDocuments/ICreateStudentDocuments.cs +++ b/src/Domain/UseCases/Interfaces/StudentDocuments/ICreateStudentDocuments.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.StudentDocuments { public interface ICreateStudentDocuments { diff --git a/src/Domain/Interfaces/UseCases/StudentDocuments/IDeleteStudentDocuments.cs b/src/Domain/UseCases/Interfaces/StudentDocuments/IDeleteStudentDocuments.cs similarity index 56% rename from src/Domain/Interfaces/UseCases/StudentDocuments/IDeleteStudentDocuments.cs rename to src/Domain/UseCases/Interfaces/StudentDocuments/IDeleteStudentDocuments.cs index 671a29a2..8d85206a 100644 --- a/src/Domain/Interfaces/UseCases/StudentDocuments/IDeleteStudentDocuments.cs +++ b/src/Domain/UseCases/Interfaces/StudentDocuments/IDeleteStudentDocuments.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.StudentDocuments { public interface IDeleteStudentDocuments { diff --git a/src/Domain/Interfaces/UseCases/StudentDocuments/IGetStudentDocumentsByProjectId.cs b/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByProjectId.cs similarity index 58% rename from src/Domain/Interfaces/UseCases/StudentDocuments/IGetStudentDocumentsByProjectId.cs rename to src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByProjectId.cs index efef4e91..46bf7eb3 100644 --- a/src/Domain/Interfaces/UseCases/StudentDocuments/IGetStudentDocumentsByProjectId.cs +++ b/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByProjectId.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.StudentDocuments { public interface IGetStudentDocumentsByProjectId { diff --git a/src/Domain/Interfaces/UseCases/StudentDocuments/IGetStudentDocumentsByStudentId.cs b/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByStudentId.cs similarity index 58% rename from src/Domain/Interfaces/UseCases/StudentDocuments/IGetStudentDocumentsByStudentId.cs rename to src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByStudentId.cs index 43111ffb..f130152c 100644 --- a/src/Domain/Interfaces/UseCases/StudentDocuments/IGetStudentDocumentsByStudentId.cs +++ b/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByStudentId.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.StudentDocuments { public interface IGetStudentDocumentsByStudentId { diff --git a/src/Domain/Interfaces/UseCases/StudentDocuments/IUpdateStudentDocuments.cs b/src/Domain/UseCases/Interfaces/StudentDocuments/IUpdateStudentDocuments.cs similarity index 62% rename from src/Domain/Interfaces/UseCases/StudentDocuments/IUpdateStudentDocuments.cs rename to src/Domain/UseCases/Interfaces/StudentDocuments/IUpdateStudentDocuments.cs index e7096c9e..24806fbb 100644 --- a/src/Domain/Interfaces/UseCases/StudentDocuments/IUpdateStudentDocuments.cs +++ b/src/Domain/UseCases/Interfaces/StudentDocuments/IUpdateStudentDocuments.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.StudentDocuments; +using Domain.UseCases.Ports.StudentDocuments; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.StudentDocuments { public interface IUpdateStudentDocuments { diff --git a/src/Domain/Interfaces/UseCases/SubArea/ICreateSubArea.cs b/src/Domain/UseCases/Interfaces/SubArea/ICreateSubArea.cs similarity index 60% rename from src/Domain/Interfaces/UseCases/SubArea/ICreateSubArea.cs rename to src/Domain/UseCases/Interfaces/SubArea/ICreateSubArea.cs index 8d40ab12..fcc99852 100644 --- a/src/Domain/Interfaces/UseCases/SubArea/ICreateSubArea.cs +++ b/src/Domain/UseCases/Interfaces/SubArea/ICreateSubArea.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.SubArea; +using Domain.UseCases.Ports.SubArea; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.SubArea { public interface ICreateSubArea { diff --git a/src/Domain/Interfaces/UseCases/SubArea/IDeleteSubArea.cs b/src/Domain/UseCases/Interfaces/SubArea/IDeleteSubArea.cs similarity index 57% rename from src/Domain/Interfaces/UseCases/SubArea/IDeleteSubArea.cs rename to src/Domain/UseCases/Interfaces/SubArea/IDeleteSubArea.cs index de399bbf..77d10ee2 100644 --- a/src/Domain/Interfaces/UseCases/SubArea/IDeleteSubArea.cs +++ b/src/Domain/UseCases/Interfaces/SubArea/IDeleteSubArea.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.SubArea; +using Domain.UseCases.Ports.SubArea; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.SubArea { public interface IDeleteSubArea { diff --git a/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreaById.cs b/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreaById.cs new file mode 100644 index 00000000..4cb4ab52 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreaById.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.SubArea; + +namespace Domain.UseCases.Interfaces.SubArea +{ + public interface IGetSubAreaById + { + Task Execute(Guid? id); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/SubArea/IGetSubAreasByArea.cs b/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreasByArea.cs similarity index 53% rename from src/Domain/Interfaces/UseCases/SubArea/IGetSubAreasByArea.cs rename to src/Domain/UseCases/Interfaces/SubArea/IGetSubAreasByArea.cs index d69f567d..9c7f0c61 100644 --- a/src/Domain/Interfaces/UseCases/SubArea/IGetSubAreasByArea.cs +++ b/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreasByArea.cs @@ -1,9 +1,6 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Domain.Contracts.SubArea; +using Domain.UseCases.Ports.SubArea; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.SubArea { public interface IGetSubAreasByArea { diff --git a/src/Domain/UseCases/Interfaces/SubArea/IUpdateSubArea.cs b/src/Domain/UseCases/Interfaces/SubArea/IUpdateSubArea.cs new file mode 100644 index 00000000..44512337 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/SubArea/IUpdateSubArea.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.SubArea; + +namespace Domain.UseCases.Interfaces.SubArea +{ + public interface IUpdateSubArea + { + Task Execute(Guid? id, UpdateSubAreaInput input); + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/UseCases/User/IActivateUser.cs b/src/Domain/UseCases/Interfaces/User/IActivateUser.cs similarity index 56% rename from src/Domain/Interfaces/UseCases/User/IActivateUser.cs rename to src/Domain/UseCases/Interfaces/User/IActivateUser.cs index 27ad1625..c6a7583e 100644 --- a/src/Domain/Interfaces/UseCases/User/IActivateUser.cs +++ b/src/Domain/UseCases/Interfaces/User/IActivateUser.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.User; +using Domain.UseCases.Ports.User; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.User { public interface IActivateUser { diff --git a/src/Domain/Interfaces/UseCases/User/IDeactivateUser.cs b/src/Domain/UseCases/Interfaces/User/IDeactivateUser.cs similarity index 57% rename from src/Domain/Interfaces/UseCases/User/IDeactivateUser.cs rename to src/Domain/UseCases/Interfaces/User/IDeactivateUser.cs index 19fb0a14..2dbf0724 100644 --- a/src/Domain/Interfaces/UseCases/User/IDeactivateUser.cs +++ b/src/Domain/UseCases/Interfaces/User/IDeactivateUser.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.User; +using Domain.UseCases.Ports.User; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.User { public interface IDeactivateUser { diff --git a/src/Domain/Interfaces/UseCases/User/IGetActiveUsers.cs b/src/Domain/UseCases/Interfaces/User/IGetActiveUsers.cs similarity index 62% rename from src/Domain/Interfaces/UseCases/User/IGetActiveUsers.cs rename to src/Domain/UseCases/Interfaces/User/IGetActiveUsers.cs index 006b7bec..77f18d55 100644 --- a/src/Domain/Interfaces/UseCases/User/IGetActiveUsers.cs +++ b/src/Domain/UseCases/Interfaces/User/IGetActiveUsers.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.User; +using Domain.UseCases.Ports.User; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.User { public interface IGetActiveUsers { diff --git a/src/Domain/Interfaces/UseCases/User/IGetInactiveUsers.cs b/src/Domain/UseCases/Interfaces/User/IGetInactiveUsers.cs similarity index 62% rename from src/Domain/Interfaces/UseCases/User/IGetInactiveUsers.cs rename to src/Domain/UseCases/Interfaces/User/IGetInactiveUsers.cs index c3385c7a..e22fce0f 100644 --- a/src/Domain/Interfaces/UseCases/User/IGetInactiveUsers.cs +++ b/src/Domain/UseCases/Interfaces/User/IGetInactiveUsers.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.User; +using Domain.UseCases.Ports.User; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.User { public interface IGetInactiveUsers { diff --git a/src/Domain/Interfaces/UseCases/User/IGetUserById.cs b/src/Domain/UseCases/Interfaces/User/IGetUserById.cs similarity index 56% rename from src/Domain/Interfaces/UseCases/User/IGetUserById.cs rename to src/Domain/UseCases/Interfaces/User/IGetUserById.cs index 8a4b5fad..cf7c0f30 100644 --- a/src/Domain/Interfaces/UseCases/User/IGetUserById.cs +++ b/src/Domain/UseCases/Interfaces/User/IGetUserById.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.User; +using Domain.UseCases.Ports.User; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.User { public interface IGetUserById { diff --git a/src/Domain/Interfaces/UseCases/User/IUpdateUser.cs b/src/Domain/UseCases/Interfaces/User/IUpdateUser.cs similarity index 59% rename from src/Domain/Interfaces/UseCases/User/IUpdateUser.cs rename to src/Domain/UseCases/Interfaces/User/IUpdateUser.cs index 67130aa8..fda97b6c 100644 --- a/src/Domain/Interfaces/UseCases/User/IUpdateUser.cs +++ b/src/Domain/UseCases/Interfaces/User/IUpdateUser.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.User; +using Domain.UseCases.Ports.User; -namespace Domain.Interfaces.UseCases +namespace Domain.UseCases.Interfaces.User { public interface IUpdateUser { diff --git a/src/Domain/Contracts/Activity/ActivityOutput.cs b/src/Domain/UseCases/Ports/Activity/ActivityOutput.cs similarity index 63% rename from src/Domain/Contracts/Activity/ActivityOutput.cs rename to src/Domain/UseCases/Ports/Activity/ActivityOutput.cs index 5b3364f0..afd7b3c6 100644 --- a/src/Domain/Contracts/Activity/ActivityOutput.cs +++ b/src/Domain/UseCases/Ports/Activity/ActivityOutput.cs @@ -1,4 +1,6 @@ -namespace Domain.Contracts.Activity; +using Domain.UseCases.Ports.Activity; + +namespace Domain.Ports.Activity; public class ActivityOutput : BaseActivity { public Guid? Id { get; set; } diff --git a/src/Domain/UseCases/Ports/Activity/ActivityTypeOutput.cs b/src/Domain/UseCases/Ports/Activity/ActivityTypeOutput.cs new file mode 100644 index 00000000..8aba2e18 --- /dev/null +++ b/src/Domain/UseCases/Ports/Activity/ActivityTypeOutput.cs @@ -0,0 +1,11 @@ +using Domain.Ports.Activity; + +namespace Domain.UseCases.Ports.Activity +{ + public class ActivityTypeOutput : BaseActivityType + { + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } + public new IList? Activities { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/Activity/BaseActivity.cs b/src/Domain/UseCases/Ports/Activity/BaseActivity.cs new file mode 100644 index 00000000..fd771b42 --- /dev/null +++ b/src/Domain/UseCases/Ports/Activity/BaseActivity.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.UseCases.Ports.Activity +{ + public class BaseActivity + { + [Required] + public string? Name { get; set; } + [Required] + public double? Points { get; set; } + public double? Limits { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/Activity/BaseActivityType.cs b/src/Domain/UseCases/Ports/Activity/BaseActivityType.cs new file mode 100644 index 00000000..177602be --- /dev/null +++ b/src/Domain/UseCases/Ports/Activity/BaseActivityType.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.UseCases.Ports.Activity +{ + public class BaseActivityType + { + [Required] + public string? Name { get; set; } + [Required] + public string? Unity { get; set; } + [Required] + public virtual IList? Activities { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/Activity/CreateActivityInput.cs b/src/Domain/UseCases/Ports/Activity/CreateActivityInput.cs new file mode 100644 index 00000000..eecc3c41 --- /dev/null +++ b/src/Domain/UseCases/Ports/Activity/CreateActivityInput.cs @@ -0,0 +1,4 @@ +namespace Domain.UseCases.Ports.Activity +{ + public class CreateActivityInput : BaseActivity { } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/Activity/CreateActivityTypeInput.cs b/src/Domain/UseCases/Ports/Activity/CreateActivityTypeInput.cs new file mode 100644 index 00000000..178d8595 --- /dev/null +++ b/src/Domain/UseCases/Ports/Activity/CreateActivityTypeInput.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.UseCases.Ports.Activity +{ + public class CreateActivityTypeInput + { + [Required] + public string? Name { get; set; } + [Required] + public string? Unity { get; set; } + [Required] + public virtual IList? Activities { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Activity/UpdateActivityInput.cs b/src/Domain/UseCases/Ports/Activity/UpdateActivityInput.cs similarity index 64% rename from src/Domain/Contracts/Activity/UpdateActivityInput.cs rename to src/Domain/UseCases/Ports/Activity/UpdateActivityInput.cs index 6590d4a6..cefb2187 100644 --- a/src/Domain/Contracts/Activity/UpdateActivityInput.cs +++ b/src/Domain/UseCases/Ports/Activity/UpdateActivityInput.cs @@ -1,4 +1,6 @@ -namespace Domain.Contracts.Activity; +using Domain.UseCases.Ports.Activity; + +namespace Domain.Ports.Activity; public class UpdateActivityInput : BaseActivity { public Guid? Id { get; set; } diff --git a/src/Domain/UseCases/Ports/Activity/UpdateActivityTypeInput.cs b/src/Domain/UseCases/Ports/Activity/UpdateActivityTypeInput.cs new file mode 100644 index 00000000..bb4003a4 --- /dev/null +++ b/src/Domain/UseCases/Ports/Activity/UpdateActivityTypeInput.cs @@ -0,0 +1,18 @@ +using System.ComponentModel.DataAnnotations; +using Domain.Ports.Activity; + +namespace Domain.UseCases.Ports.Activity +{ + public class UpdateActivityTypeInput + { + [Required] + public string? Name { get; set; } + [Required] + public string? Unity { get; set; } + [Required] + public IList? Activities { get; set; } + + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Area/BaseAreaContract.cs b/src/Domain/UseCases/Ports/Area/BaseAreaContract.cs similarity index 86% rename from src/Domain/Contracts/Area/BaseAreaContract.cs rename to src/Domain/UseCases/Ports/Area/BaseAreaContract.cs index 9399d760..368b0f75 100644 --- a/src/Domain/Contracts/Area/BaseAreaContract.cs +++ b/src/Domain/UseCases/Ports/Area/BaseAreaContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.Area +namespace Domain.UseCases.Ports.Area { public abstract class BaseAreaContract { diff --git a/src/Domain/Contracts/Area/CreateAreaInput.cs b/src/Domain/UseCases/Ports/Area/CreateAreaInput.cs similarity index 83% rename from src/Domain/Contracts/Area/CreateAreaInput.cs rename to src/Domain/UseCases/Ports/Area/CreateAreaInput.cs index d4e28aed..b49bafb3 100644 --- a/src/Domain/Contracts/Area/CreateAreaInput.cs +++ b/src/Domain/UseCases/Ports/Area/CreateAreaInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.Area +namespace Domain.UseCases.Ports.Area { public class CreateAreaInput : BaseAreaContract { diff --git a/src/Domain/Contracts/Area/DetailedReadAreaOutput.cs b/src/Domain/UseCases/Ports/Area/DetailedReadAreaOutput.cs similarity index 74% rename from src/Domain/Contracts/Area/DetailedReadAreaOutput.cs rename to src/Domain/UseCases/Ports/Area/DetailedReadAreaOutput.cs index 47f450db..459156c3 100644 --- a/src/Domain/Contracts/Area/DetailedReadAreaOutput.cs +++ b/src/Domain/UseCases/Ports/Area/DetailedReadAreaOutput.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.MainArea; +using Domain.UseCases.Ports.MainArea; -namespace Domain.Contracts.Area +namespace Domain.UseCases.Ports.Area { public class DetailedReadAreaOutput : BaseAreaContract { diff --git a/src/Domain/Contracts/Area/ResumedReadAreaOutput.cs b/src/Domain/UseCases/Ports/Area/ResumedReadAreaOutput.cs similarity index 73% rename from src/Domain/Contracts/Area/ResumedReadAreaOutput.cs rename to src/Domain/UseCases/Ports/Area/ResumedReadAreaOutput.cs index 4de34b28..3715ab84 100644 --- a/src/Domain/Contracts/Area/ResumedReadAreaOutput.cs +++ b/src/Domain/UseCases/Ports/Area/ResumedReadAreaOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Area +namespace Domain.UseCases.Ports.Area { public class ResumedReadAreaOutput : BaseAreaContract { diff --git a/src/Domain/Contracts/Area/UpdateAreaInput.cs b/src/Domain/UseCases/Ports/Area/UpdateAreaInput.cs similarity index 77% rename from src/Domain/Contracts/Area/UpdateAreaInput.cs rename to src/Domain/UseCases/Ports/Area/UpdateAreaInput.cs index 2b16414f..2042426f 100644 --- a/src/Domain/Contracts/Area/UpdateAreaInput.cs +++ b/src/Domain/UseCases/Ports/Area/UpdateAreaInput.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; +using Domain.UseCases.Ports.Area; -namespace Domain.Contracts.Area +namespace Domain.Ports.Area { public class UpdateAreaInput : BaseAreaContract { diff --git a/src/Domain/Contracts/AssistanceType/BaseAssistanceTypeContract.cs b/src/Domain/UseCases/Ports/AssistanceType/BaseAssistanceTypeContract.cs similarity index 82% rename from src/Domain/Contracts/AssistanceType/BaseAssistanceTypeContract.cs rename to src/Domain/UseCases/Ports/AssistanceType/BaseAssistanceTypeContract.cs index d317bb34..8556d516 100644 --- a/src/Domain/Contracts/AssistanceType/BaseAssistanceTypeContract.cs +++ b/src/Domain/UseCases/Ports/AssistanceType/BaseAssistanceTypeContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.AssistanceType +namespace Domain.UseCases.Ports.AssistanceType { public abstract class BaseAssistanceTypeContract { diff --git a/src/Domain/Contracts/AssistanceType/CreateAssistanceTypeInput.cs b/src/Domain/UseCases/Ports/AssistanceType/CreateAssistanceTypeInput.cs similarity index 63% rename from src/Domain/Contracts/AssistanceType/CreateAssistanceTypeInput.cs rename to src/Domain/UseCases/Ports/AssistanceType/CreateAssistanceTypeInput.cs index b461f3c0..df4a28d1 100644 --- a/src/Domain/Contracts/AssistanceType/CreateAssistanceTypeInput.cs +++ b/src/Domain/UseCases/Ports/AssistanceType/CreateAssistanceTypeInput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.AssistanceType +namespace Domain.UseCases.Ports.AssistanceType { public class CreateAssistanceTypeInput : BaseAssistanceTypeContract { diff --git a/src/Domain/Contracts/AssistanceType/DetailedReadAssistanceTypeOutput.cs b/src/Domain/UseCases/Ports/AssistanceType/DetailedReadAssistanceTypeOutput.cs similarity index 78% rename from src/Domain/Contracts/AssistanceType/DetailedReadAssistanceTypeOutput.cs rename to src/Domain/UseCases/Ports/AssistanceType/DetailedReadAssistanceTypeOutput.cs index 045735ab..528c8281 100644 --- a/src/Domain/Contracts/AssistanceType/DetailedReadAssistanceTypeOutput.cs +++ b/src/Domain/UseCases/Ports/AssistanceType/DetailedReadAssistanceTypeOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.AssistanceType +namespace Domain.UseCases.Ports.AssistanceType { public class DetailedReadAssistanceTypeOutput : BaseAssistanceTypeContract { diff --git a/src/Domain/Contracts/AssistanceType/ResumedReadAssistanceTypeOutput.cs b/src/Domain/UseCases/Ports/AssistanceType/ResumedReadAssistanceTypeOutput.cs similarity index 72% rename from src/Domain/Contracts/AssistanceType/ResumedReadAssistanceTypeOutput.cs rename to src/Domain/UseCases/Ports/AssistanceType/ResumedReadAssistanceTypeOutput.cs index 5b77df67..8e7d98e1 100644 --- a/src/Domain/Contracts/AssistanceType/ResumedReadAssistanceTypeOutput.cs +++ b/src/Domain/UseCases/Ports/AssistanceType/ResumedReadAssistanceTypeOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.AssistanceType +namespace Domain.UseCases.Ports.AssistanceType { public class ResumedReadAssistanceTypeOutput : BaseAssistanceTypeContract { diff --git a/src/Domain/Contracts/AssistanceType/UpdateAssistanceTypeInput.cs b/src/Domain/UseCases/Ports/AssistanceType/UpdateAssistanceTypeInput.cs similarity index 71% rename from src/Domain/Contracts/AssistanceType/UpdateAssistanceTypeInput.cs rename to src/Domain/UseCases/Ports/AssistanceType/UpdateAssistanceTypeInput.cs index f2e7dc21..de4dcaac 100644 --- a/src/Domain/Contracts/AssistanceType/UpdateAssistanceTypeInput.cs +++ b/src/Domain/UseCases/Ports/AssistanceType/UpdateAssistanceTypeInput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.AssistanceType +namespace Domain.UseCases.Ports.AssistanceType { public class UpdateAssistanceTypeInput : BaseAssistanceTypeContract { diff --git a/src/Domain/Contracts/Auth/UserClaimsOutput.cs b/src/Domain/UseCases/Ports/Auth/UserClaimsOutput.cs similarity index 82% rename from src/Domain/Contracts/Auth/UserClaimsOutput.cs rename to src/Domain/UseCases/Ports/Auth/UserClaimsOutput.cs index 6cdf13e4..5e8717df 100644 --- a/src/Domain/Contracts/Auth/UserClaimsOutput.cs +++ b/src/Domain/UseCases/Ports/Auth/UserClaimsOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Auth +namespace Domain.UseCases.Ports.Auth { public class UserClaimsOutput { diff --git a/src/Domain/Contracts/Auth/UserLoginInput.cs b/src/Domain/UseCases/Ports/Auth/UserLoginInput.cs similarity index 65% rename from src/Domain/Contracts/Auth/UserLoginInput.cs rename to src/Domain/UseCases/Ports/Auth/UserLoginInput.cs index a64a2ff4..44cd1c76 100644 --- a/src/Domain/Contracts/Auth/UserLoginInput.cs +++ b/src/Domain/UseCases/Ports/Auth/UserLoginInput.cs @@ -1,7 +1,6 @@ -using System; -using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.Auth +namespace Domain.UseCases.Ports.Auth { public class UserLoginInput { diff --git a/src/Domain/Contracts/Auth/UserLoginOutput.cs b/src/Domain/UseCases/Ports/Auth/UserLoginOutput.cs similarity index 77% rename from src/Domain/Contracts/Auth/UserLoginOutput.cs rename to src/Domain/UseCases/Ports/Auth/UserLoginOutput.cs index 4199540a..baab46a4 100644 --- a/src/Domain/Contracts/Auth/UserLoginOutput.cs +++ b/src/Domain/UseCases/Ports/Auth/UserLoginOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Auth +namespace Domain.UseCases.Ports.Auth { public class UserLoginOutput { diff --git a/src/Domain/Contracts/Auth/UserResetPasswordInput.cs b/src/Domain/UseCases/Ports/Auth/UserResetPasswordInput.cs similarity index 88% rename from src/Domain/Contracts/Auth/UserResetPasswordInput.cs rename to src/Domain/UseCases/Ports/Auth/UserResetPasswordInput.cs index 7cd4b556..3891d3b4 100644 --- a/src/Domain/Contracts/Auth/UserResetPasswordInput.cs +++ b/src/Domain/UseCases/Ports/Auth/UserResetPasswordInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.Auth +namespace Domain.UseCases.Ports.Auth { public class UserResetPasswordInput { diff --git a/src/Domain/Contracts/Campus/BaseCampusContract.cs b/src/Domain/UseCases/Ports/Campus/BaseCampusContract.cs similarity index 81% rename from src/Domain/Contracts/Campus/BaseCampusContract.cs rename to src/Domain/UseCases/Ports/Campus/BaseCampusContract.cs index c401aa85..5e2ba666 100644 --- a/src/Domain/Contracts/Campus/BaseCampusContract.cs +++ b/src/Domain/UseCases/Ports/Campus/BaseCampusContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.Campus +namespace Domain.UseCases.Ports.Campus { public abstract class BaseCampusContract { diff --git a/src/Domain/Contracts/Campus/CreateCampusInput.cs b/src/Domain/UseCases/Ports/Campus/CreateCampusInput.cs similarity index 62% rename from src/Domain/Contracts/Campus/CreateCampusInput.cs rename to src/Domain/UseCases/Ports/Campus/CreateCampusInput.cs index 5fa878bd..b111eec0 100644 --- a/src/Domain/Contracts/Campus/CreateCampusInput.cs +++ b/src/Domain/UseCases/Ports/Campus/CreateCampusInput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Campus +namespace Domain.UseCases.Ports.Campus { public class CreateCampusInput : BaseCampusContract { diff --git a/src/Domain/Contracts/Campus/DetailedReadCampusOutput.cs b/src/Domain/UseCases/Ports/Campus/DetailedReadCampusOutput.cs similarity index 79% rename from src/Domain/Contracts/Campus/DetailedReadCampusOutput.cs rename to src/Domain/UseCases/Ports/Campus/DetailedReadCampusOutput.cs index 569e3842..ccdba065 100644 --- a/src/Domain/Contracts/Campus/DetailedReadCampusOutput.cs +++ b/src/Domain/UseCases/Ports/Campus/DetailedReadCampusOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Campus +namespace Domain.UseCases.Ports.Campus { public class DetailedReadCampusOutput : BaseCampusContract { diff --git a/src/Domain/Contracts/Campus/ResumedReadCampusOutput.cs b/src/Domain/UseCases/Ports/Campus/ResumedReadCampusOutput.cs similarity index 73% rename from src/Domain/Contracts/Campus/ResumedReadCampusOutput.cs rename to src/Domain/UseCases/Ports/Campus/ResumedReadCampusOutput.cs index b150132f..289d5fd0 100644 --- a/src/Domain/Contracts/Campus/ResumedReadCampusOutput.cs +++ b/src/Domain/UseCases/Ports/Campus/ResumedReadCampusOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Campus +namespace Domain.UseCases.Ports.Campus { public class ResumedReadCampusOutput : BaseCampusContract { diff --git a/src/Domain/Contracts/Campus/UpdateCampusInput.cs b/src/Domain/UseCases/Ports/Campus/UpdateCampusInput.cs similarity index 72% rename from src/Domain/Contracts/Campus/UpdateCampusInput.cs rename to src/Domain/UseCases/Ports/Campus/UpdateCampusInput.cs index d89a83e1..a2b7219f 100644 --- a/src/Domain/Contracts/Campus/UpdateCampusInput.cs +++ b/src/Domain/UseCases/Ports/Campus/UpdateCampusInput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Campus +namespace Domain.UseCases.Ports.Campus { public class UpdateCampusInput : BaseCampusContract { diff --git a/src/Domain/Contracts/Course/BaseCourseContract.cs b/src/Domain/UseCases/Ports/Course/BaseCourseContract.cs similarity index 81% rename from src/Domain/Contracts/Course/BaseCourseContract.cs rename to src/Domain/UseCases/Ports/Course/BaseCourseContract.cs index 9ff6ee36..f9507f4b 100644 --- a/src/Domain/Contracts/Course/BaseCourseContract.cs +++ b/src/Domain/UseCases/Ports/Course/BaseCourseContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.Course +namespace Domain.UseCases.Ports.Course { public abstract class BaseCourseContract { diff --git a/src/Domain/Contracts/Course/CreateCourseInput.cs b/src/Domain/UseCases/Ports/Course/CreateCourseInput.cs similarity index 50% rename from src/Domain/Contracts/Course/CreateCourseInput.cs rename to src/Domain/UseCases/Ports/Course/CreateCourseInput.cs index 479cae2b..e8109ab7 100644 --- a/src/Domain/Contracts/Course/CreateCourseInput.cs +++ b/src/Domain/UseCases/Ports/Course/CreateCourseInput.cs @@ -1,4 +1,6 @@ -namespace Domain.Contracts.Course +using Domain.UseCases.Ports.Course; + +namespace Domain.Ports.Course { public class CreateCourseInput : BaseCourseContract { diff --git a/src/Domain/Contracts/Course/DetailedReadCourseOutput.cs b/src/Domain/UseCases/Ports/Course/DetailedReadCourseOutput.cs similarity index 79% rename from src/Domain/Contracts/Course/DetailedReadCourseOutput.cs rename to src/Domain/UseCases/Ports/Course/DetailedReadCourseOutput.cs index 0e988114..81a41a3f 100644 --- a/src/Domain/Contracts/Course/DetailedReadCourseOutput.cs +++ b/src/Domain/UseCases/Ports/Course/DetailedReadCourseOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Course +namespace Domain.UseCases.Ports.Course { public class DetailedReadCourseOutput : BaseCourseContract { diff --git a/src/Domain/Contracts/Course/ResumedReadCourseOutput.cs b/src/Domain/UseCases/Ports/Course/ResumedReadCourseOutput.cs similarity index 73% rename from src/Domain/Contracts/Course/ResumedReadCourseOutput.cs rename to src/Domain/UseCases/Ports/Course/ResumedReadCourseOutput.cs index 8689d973..88b65db5 100644 --- a/src/Domain/Contracts/Course/ResumedReadCourseOutput.cs +++ b/src/Domain/UseCases/Ports/Course/ResumedReadCourseOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Course +namespace Domain.UseCases.Ports.Course { public class ResumedReadCourseOutput : BaseCourseContract { diff --git a/src/Domain/Contracts/Course/UpdateCourseInput.cs b/src/Domain/UseCases/Ports/Course/UpdateCourseInput.cs similarity index 72% rename from src/Domain/Contracts/Course/UpdateCourseInput.cs rename to src/Domain/UseCases/Ports/Course/UpdateCourseInput.cs index 51cb6cf9..a9957f41 100644 --- a/src/Domain/Contracts/Course/UpdateCourseInput.cs +++ b/src/Domain/UseCases/Ports/Course/UpdateCourseInput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Course +namespace Domain.UseCases.Ports.Course { public class UpdateCourseInput : BaseCourseContract { diff --git a/src/Domain/Contracts/MainArea/BaseMainAreaContract.cs b/src/Domain/UseCases/Ports/MainArea/BaseMainAreaContract.cs similarity index 85% rename from src/Domain/Contracts/MainArea/BaseMainAreaContract.cs rename to src/Domain/UseCases/Ports/MainArea/BaseMainAreaContract.cs index 5bd0c471..f17e6dbb 100644 --- a/src/Domain/Contracts/MainArea/BaseMainAreaContract.cs +++ b/src/Domain/UseCases/Ports/MainArea/BaseMainAreaContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.MainArea +namespace Domain.UseCases.Ports.MainArea { public abstract class BaseMainAreaContract { diff --git a/src/Domain/UseCases/Ports/MainArea/CreateMainAreaInput.cs b/src/Domain/UseCases/Ports/MainArea/CreateMainAreaInput.cs new file mode 100644 index 00000000..55de730a --- /dev/null +++ b/src/Domain/UseCases/Ports/MainArea/CreateMainAreaInput.cs @@ -0,0 +1,4 @@ +namespace Domain.UseCases.Ports.MainArea +{ + public class CreateMainAreaInput : BaseMainAreaContract { } +} \ No newline at end of file diff --git a/src/Domain/Contracts/MainArea/DetailedMainAreaOutput.cs b/src/Domain/UseCases/Ports/MainArea/DetailedMainAreaOutput.cs similarity index 78% rename from src/Domain/Contracts/MainArea/DetailedMainAreaOutput.cs rename to src/Domain/UseCases/Ports/MainArea/DetailedMainAreaOutput.cs index ceec2c9d..08ceee78 100644 --- a/src/Domain/Contracts/MainArea/DetailedMainAreaOutput.cs +++ b/src/Domain/UseCases/Ports/MainArea/DetailedMainAreaOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.MainArea +namespace Domain.UseCases.Ports.MainArea { public class DetailedMainAreaOutput : BaseMainAreaContract { diff --git a/src/Domain/Contracts/MainArea/ResumedReadMainAreaOutput.cs b/src/Domain/UseCases/Ports/MainArea/ResumedReadMainAreaOutput.cs similarity index 74% rename from src/Domain/Contracts/MainArea/ResumedReadMainAreaOutput.cs rename to src/Domain/UseCases/Ports/MainArea/ResumedReadMainAreaOutput.cs index 55003112..631e8c4d 100644 --- a/src/Domain/Contracts/MainArea/ResumedReadMainAreaOutput.cs +++ b/src/Domain/UseCases/Ports/MainArea/ResumedReadMainAreaOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.MainArea +namespace Domain.UseCases.Ports.MainArea { public class ResumedReadMainAreaOutput : BaseMainAreaContract { diff --git a/src/Domain/Contracts/MainArea/UpdateMainAreaInput.cs b/src/Domain/UseCases/Ports/MainArea/UpdateMainAreaInput.cs similarity index 53% rename from src/Domain/Contracts/MainArea/UpdateMainAreaInput.cs rename to src/Domain/UseCases/Ports/MainArea/UpdateMainAreaInput.cs index df846f06..193d9d56 100644 --- a/src/Domain/Contracts/MainArea/UpdateMainAreaInput.cs +++ b/src/Domain/UseCases/Ports/MainArea/UpdateMainAreaInput.cs @@ -1,7 +1,4 @@ -using System; -using System.ComponentModel.DataAnnotations; - -namespace Domain.Contracts.MainArea +namespace Domain.UseCases.Ports.MainArea { public class UpdateMainAreaInput : BaseMainAreaContract { diff --git a/src/Domain/Contracts/Notice/BaseNoticeContract.cs b/src/Domain/UseCases/Ports/Notice/BaseNoticeContract.cs similarity index 96% rename from src/Domain/Contracts/Notice/BaseNoticeContract.cs rename to src/Domain/UseCases/Ports/Notice/BaseNoticeContract.cs index 5dd51b32..9f2a3b34 100644 --- a/src/Domain/Contracts/Notice/BaseNoticeContract.cs +++ b/src/Domain/UseCases/Ports/Notice/BaseNoticeContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.Notice +namespace Domain.UseCases.Ports.Notice { public abstract class BaseNoticeContract { diff --git a/src/Domain/UseCases/Ports/Notice/CreateNoticeInput.cs b/src/Domain/UseCases/Ports/Notice/CreateNoticeInput.cs new file mode 100644 index 00000000..3a0314c8 --- /dev/null +++ b/src/Domain/UseCases/Ports/Notice/CreateNoticeInput.cs @@ -0,0 +1,11 @@ +using Domain.UseCases.Ports.Activity; +using Microsoft.AspNetCore.Http; + +namespace Domain.UseCases.Ports.Notice +{ + public class CreateNoticeInput : BaseNoticeContract + { + public IFormFile? File { get; set; } + public IList? Activities { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Notice/DetailedReadNoticeOutput.cs b/src/Domain/UseCases/Ports/Notice/DetailedReadNoticeOutput.cs similarity index 83% rename from src/Domain/Contracts/Notice/DetailedReadNoticeOutput.cs rename to src/Domain/UseCases/Ports/Notice/DetailedReadNoticeOutput.cs index 207733bb..7171f2c7 100644 --- a/src/Domain/Contracts/Notice/DetailedReadNoticeOutput.cs +++ b/src/Domain/UseCases/Ports/Notice/DetailedReadNoticeOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Notice +namespace Domain.UseCases.Ports.Notice { public class DetailedReadNoticeOutput : BaseNoticeContract { diff --git a/src/Domain/Contracts/Notice/ResumedReadNoticeOutput.cs b/src/Domain/UseCases/Ports/Notice/ResumedReadNoticeOutput.cs similarity index 79% rename from src/Domain/Contracts/Notice/ResumedReadNoticeOutput.cs rename to src/Domain/UseCases/Ports/Notice/ResumedReadNoticeOutput.cs index 628f013c..6bbebf26 100644 --- a/src/Domain/Contracts/Notice/ResumedReadNoticeOutput.cs +++ b/src/Domain/UseCases/Ports/Notice/ResumedReadNoticeOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Notice +namespace Domain.UseCases.Ports.Notice { public class ResumedReadNoticeOutput : BaseNoticeContract { diff --git a/src/Domain/Contracts/Notice/UpdateNoticeInput.cs b/src/Domain/UseCases/Ports/Notice/UpdateNoticeInput.cs similarity index 76% rename from src/Domain/Contracts/Notice/UpdateNoticeInput.cs rename to src/Domain/UseCases/Ports/Notice/UpdateNoticeInput.cs index 897c5e92..23204c8a 100644 --- a/src/Domain/Contracts/Notice/UpdateNoticeInput.cs +++ b/src/Domain/UseCases/Ports/Notice/UpdateNoticeInput.cs @@ -1,7 +1,7 @@ -using Domain.Contracts.Activity; +using Domain.UseCases.Ports.Activity; using Microsoft.AspNetCore.Http; -namespace Domain.Contracts.Notice +namespace Domain.UseCases.Ports.Notice { public class UpdateNoticeInput : BaseNoticeContract { diff --git a/src/Domain/Contracts/Professor/BaseProfessorContract.cs b/src/Domain/UseCases/Ports/Professor/BaseProfessorContract.cs similarity index 85% rename from src/Domain/Contracts/Professor/BaseProfessorContract.cs rename to src/Domain/UseCases/Ports/Professor/BaseProfessorContract.cs index c51be82c..9bced2f7 100644 --- a/src/Domain/Contracts/Professor/BaseProfessorContract.cs +++ b/src/Domain/UseCases/Ports/Professor/BaseProfessorContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.Professor +namespace Domain.UseCases.Ports.Professor { public abstract class BaseProfessorContract { diff --git a/src/Domain/Contracts/Professor/CreateProfessorInput.cs b/src/Domain/UseCases/Ports/Professor/CreateProfessorInput.cs similarity index 83% rename from src/Domain/Contracts/Professor/CreateProfessorInput.cs rename to src/Domain/UseCases/Ports/Professor/CreateProfessorInput.cs index 2b2b87bd..8cb5043b 100644 --- a/src/Domain/Contracts/Professor/CreateProfessorInput.cs +++ b/src/Domain/UseCases/Ports/Professor/CreateProfessorInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.Professor +namespace Domain.UseCases.Ports.Professor { public class CreateProfessorInput : BaseProfessorContract { @@ -13,6 +13,6 @@ public class CreateProfessorInput : BaseProfessorContract public string? Email { get; set; } [Required] public string? Password { get; set; } - #endregion + #endregion User Properties } } \ No newline at end of file diff --git a/src/Domain/Contracts/Professor/DetailedReadStudentOutput.cs b/src/Domain/UseCases/Ports/Professor/DetailedReadStudentOutput.cs similarity index 74% rename from src/Domain/Contracts/Professor/DetailedReadStudentOutput.cs rename to src/Domain/UseCases/Ports/Professor/DetailedReadStudentOutput.cs index 9d3c02ca..90aecb09 100644 --- a/src/Domain/Contracts/Professor/DetailedReadStudentOutput.cs +++ b/src/Domain/UseCases/Ports/Professor/DetailedReadStudentOutput.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.User; +using Domain.UseCases.Ports.User; -namespace Domain.Contracts.Professor +namespace Domain.UseCases.Ports.Professor { public class DetailedReadProfessorOutput : BaseProfessorContract { diff --git a/src/Domain/Contracts/Professor/ResumedReadStudentOutput.cs b/src/Domain/UseCases/Ports/Professor/ResumedReadStudentOutput.cs similarity index 82% rename from src/Domain/Contracts/Professor/ResumedReadStudentOutput.cs rename to src/Domain/UseCases/Ports/Professor/ResumedReadStudentOutput.cs index 536d57f1..53508870 100644 --- a/src/Domain/Contracts/Professor/ResumedReadStudentOutput.cs +++ b/src/Domain/UseCases/Ports/Professor/ResumedReadStudentOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Professor +namespace Domain.UseCases.Ports.Professor { public class ResumedReadProfessorOutput : BaseProfessorContract { diff --git a/src/Domain/Contracts/Professor/UpdateStudentInput.cs b/src/Domain/UseCases/Ports/Professor/UpdateStudentInput.cs similarity index 73% rename from src/Domain/Contracts/Professor/UpdateStudentInput.cs rename to src/Domain/UseCases/Ports/Professor/UpdateStudentInput.cs index cd989d06..8f185c03 100644 --- a/src/Domain/Contracts/Professor/UpdateStudentInput.cs +++ b/src/Domain/UseCases/Ports/Professor/UpdateStudentInput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Professor +namespace Domain.UseCases.Ports.Professor { public class UpdateProfessorInput : BaseProfessorContract { diff --git a/src/Domain/Contracts/ProgramType/BaseProgramTypeContract.cs b/src/Domain/UseCases/Ports/ProgramType/BaseProgramTypeContract.cs similarity index 83% rename from src/Domain/Contracts/ProgramType/BaseProgramTypeContract.cs rename to src/Domain/UseCases/Ports/ProgramType/BaseProgramTypeContract.cs index a5687fa4..8e9d3ad4 100644 --- a/src/Domain/Contracts/ProgramType/BaseProgramTypeContract.cs +++ b/src/Domain/UseCases/Ports/ProgramType/BaseProgramTypeContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.ProgramType +namespace Domain.UseCases.Ports.ProgramType { public abstract class BaseProgramTypeContract { diff --git a/src/Domain/Contracts/ProgramType/CreateProgramTypeInput.cs b/src/Domain/UseCases/Ports/ProgramType/CreateProgramTypeInput.cs similarity index 63% rename from src/Domain/Contracts/ProgramType/CreateProgramTypeInput.cs rename to src/Domain/UseCases/Ports/ProgramType/CreateProgramTypeInput.cs index fe9ddcd2..5311d40e 100644 --- a/src/Domain/Contracts/ProgramType/CreateProgramTypeInput.cs +++ b/src/Domain/UseCases/Ports/ProgramType/CreateProgramTypeInput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.ProgramType +namespace Domain.UseCases.Ports.ProgramType { public class CreateProgramTypeInput : BaseProgramTypeContract { diff --git a/src/Domain/Contracts/ProgramType/DetailedReadProgramTypeOutput.cs b/src/Domain/UseCases/Ports/ProgramType/DetailedReadProgramTypeOutput.cs similarity index 78% rename from src/Domain/Contracts/ProgramType/DetailedReadProgramTypeOutput.cs rename to src/Domain/UseCases/Ports/ProgramType/DetailedReadProgramTypeOutput.cs index 0c504c24..82c2f546 100644 --- a/src/Domain/Contracts/ProgramType/DetailedReadProgramTypeOutput.cs +++ b/src/Domain/UseCases/Ports/ProgramType/DetailedReadProgramTypeOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.ProgramType +namespace Domain.UseCases.Ports.ProgramType { public class DetailedReadProgramTypeOutput : BaseProgramTypeContract { diff --git a/src/Domain/Contracts/ProgramType/ResumedReadProgramTypeOutput.cs b/src/Domain/UseCases/Ports/ProgramType/ResumedReadProgramTypeOutput.cs similarity index 72% rename from src/Domain/Contracts/ProgramType/ResumedReadProgramTypeOutput.cs rename to src/Domain/UseCases/Ports/ProgramType/ResumedReadProgramTypeOutput.cs index 2a47c4e7..83915d7f 100644 --- a/src/Domain/Contracts/ProgramType/ResumedReadProgramTypeOutput.cs +++ b/src/Domain/UseCases/Ports/ProgramType/ResumedReadProgramTypeOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.ProgramType +namespace Domain.UseCases.Ports.ProgramType { public class ResumedReadProgramTypeOutput : BaseProgramTypeContract { diff --git a/src/Domain/Contracts/ProgramType/UpdateProgramTypeInput.cs b/src/Domain/UseCases/Ports/ProgramType/UpdateProgramTypeInput.cs similarity index 71% rename from src/Domain/Contracts/ProgramType/UpdateProgramTypeInput.cs rename to src/Domain/UseCases/Ports/ProgramType/UpdateProgramTypeInput.cs index 96844666..0f9d81ba 100644 --- a/src/Domain/Contracts/ProgramType/UpdateProgramTypeInput.cs +++ b/src/Domain/UseCases/Ports/ProgramType/UpdateProgramTypeInput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.ProgramType +namespace Domain.UseCases.Ports.ProgramType { public class UpdateProgramTypeInput : BaseProgramTypeContract { diff --git a/src/Domain/Contracts/Project/BaseProjectContract.cs b/src/Domain/UseCases/Ports/Project/BaseProjectContract.cs similarity index 87% rename from src/Domain/Contracts/Project/BaseProjectContract.cs rename to src/Domain/UseCases/Ports/Project/BaseProjectContract.cs index 4de0daf0..9789550c 100644 --- a/src/Domain/Contracts/Project/BaseProjectContract.cs +++ b/src/Domain/UseCases/Ports/Project/BaseProjectContract.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Project +namespace Domain.UseCases.Ports.Project { public abstract class BaseProjectContract { @@ -12,7 +12,7 @@ public abstract class BaseProjectContract public string? Methodology { get; set; } public string? ExpectedResults { get; set; } public string? ActivitiesExecutionSchedule { get; set; } - #endregion + #endregion Informações do Projeto #region Resultados da Avaliação public int? Status { get; set; } @@ -20,7 +20,7 @@ public abstract class BaseProjectContract public string? EvaluatorObservation { get; set; } public string? AppealDescription { get; set; } public string? AppealEvaluatorObservation { get; set; } - #endregion + #endregion Resultados da Avaliação #region Relacionamentos public Guid? ProgramTypeId { get; set; } @@ -28,7 +28,7 @@ public abstract class BaseProjectContract public Guid? StudentId { get; set; } public Guid? SubAreaId { get; set; } public Guid? NoticeId { get; set; } - #endregion + #endregion Relacionamentos #region Informações de Controle public DateTime? SubmitionDate { get; set; } @@ -36,6 +36,6 @@ public abstract class BaseProjectContract public DateTime? CancellationDate { get; set; } public string? CancellationReason { get; set; } public DateTime SendingDocumentationDeadline { get; set; } - #endregion + #endregion Informações de Controle } } \ No newline at end of file diff --git a/src/Domain/Contracts/Project/DetailedReadProjectOutput.cs b/src/Domain/UseCases/Ports/Project/DetailedReadProjectOutput.cs similarity index 80% rename from src/Domain/Contracts/Project/DetailedReadProjectOutput.cs rename to src/Domain/UseCases/Ports/Project/DetailedReadProjectOutput.cs index bb43e51f..a35626ba 100644 --- a/src/Domain/Contracts/Project/DetailedReadProjectOutput.cs +++ b/src/Domain/UseCases/Ports/Project/DetailedReadProjectOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Project +namespace Domain.UseCases.Ports.Project { public class DetailedReadProjectOutput : BaseProjectContract { diff --git a/src/Domain/Contracts/Project/OpenProjectInput.cs b/src/Domain/UseCases/Ports/Project/OpenProjectInput.cs similarity index 87% rename from src/Domain/Contracts/Project/OpenProjectInput.cs rename to src/Domain/UseCases/Ports/Project/OpenProjectInput.cs index 453c3933..05a1ef27 100644 --- a/src/Domain/Contracts/Project/OpenProjectInput.cs +++ b/src/Domain/UseCases/Ports/Project/OpenProjectInput.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; -using Domain.Contracts.ProjectActivity; +using Domain.UseCases.Ports.ProjectActivity; -namespace Domain.Contracts.Project +namespace Domain.UseCases.Ports.Project { public class OpenProjectInput { @@ -26,7 +26,7 @@ public class OpenProjectInput public string? ActivitiesExecutionSchedule { get; set; } [Required] public virtual IList? Activities { get; set; } - #endregion + #endregion Informações do Projeto #region Relacionamentos [Required] @@ -38,6 +38,6 @@ public class OpenProjectInput [Required] public Guid? NoticeId { get; set; } public Guid? StudentId { get; set; } - #endregion + #endregion Relacionamentos } } \ No newline at end of file diff --git a/src/Domain/Contracts/Project/ProjectReportInput.cs b/src/Domain/UseCases/Ports/Project/ProjectReportInput.cs similarity index 56% rename from src/Domain/Contracts/Project/ProjectReportInput.cs rename to src/Domain/UseCases/Ports/Project/ProjectReportInput.cs index cf822296..00f7be4d 100644 --- a/src/Domain/Contracts/Project/ProjectReportInput.cs +++ b/src/Domain/UseCases/Ports/Project/ProjectReportInput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Project +namespace Domain.UseCases.Ports.Project { public class ProjectReportInput { diff --git a/src/Domain/Contracts/Project/ProjectReportOutput.cs b/src/Domain/UseCases/Ports/Project/ProjectReportOutput.cs similarity index 56% rename from src/Domain/Contracts/Project/ProjectReportOutput.cs rename to src/Domain/UseCases/Ports/Project/ProjectReportOutput.cs index 496c85f0..c218b3e2 100644 --- a/src/Domain/Contracts/Project/ProjectReportOutput.cs +++ b/src/Domain/UseCases/Ports/Project/ProjectReportOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Project +namespace Domain.UseCases.Ports.Project { public class ProjectReportOutput { diff --git a/src/Domain/UseCases/Ports/Project/ResumedReadProjectOutput.cs b/src/Domain/UseCases/Ports/Project/ResumedReadProjectOutput.cs new file mode 100644 index 00000000..368b59eb --- /dev/null +++ b/src/Domain/UseCases/Ports/Project/ResumedReadProjectOutput.cs @@ -0,0 +1,7 @@ +namespace Domain.UseCases.Ports.Project +{ + public class ResumedReadProjectOutput : BaseProjectContract + { + public Guid? Id { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Project/UpdateProjectInput.cs b/src/Domain/UseCases/Ports/Project/UpdateProjectInput.cs similarity index 86% rename from src/Domain/Contracts/Project/UpdateProjectInput.cs rename to src/Domain/UseCases/Ports/Project/UpdateProjectInput.cs index 47922686..964741a6 100644 --- a/src/Domain/Contracts/Project/UpdateProjectInput.cs +++ b/src/Domain/UseCases/Ports/Project/UpdateProjectInput.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; -using Domain.Contracts.ProjectActivity; +using Domain.UseCases.Ports.ProjectActivity; -namespace Domain.Contracts.Project +namespace Domain.UseCases.Ports.Project { public class UpdateProjectInput { @@ -26,7 +26,7 @@ public class UpdateProjectInput public string? ActivitiesExecutionSchedule { get; set; } [Required] public IList? Activities { get; set; } - #endregion + #endregion Informações do Projeto #region Relacionamentos [Required] @@ -34,6 +34,6 @@ public class UpdateProjectInput [Required] public Guid? SubAreaId { get; set; } public Guid? StudentId { get; set; } - #endregion + #endregion Relacionamentos } } \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectActivity/BaseProjectActivityContract.cs b/src/Domain/UseCases/Ports/ProjectActivity/BaseProjectActivityContract.cs new file mode 100644 index 00000000..754d1023 --- /dev/null +++ b/src/Domain/UseCases/Ports/ProjectActivity/BaseProjectActivityContract.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.UseCases.Ports.ProjectActivity +{ + public abstract class BaseProjectActivityContract + { + [Required] + public Guid? ActivityId { get; set; } + [Required] + public int? InformedActivities { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectActivity/CreateProjectActivityInput.cs b/src/Domain/UseCases/Ports/ProjectActivity/CreateProjectActivityInput.cs new file mode 100644 index 00000000..29709c24 --- /dev/null +++ b/src/Domain/UseCases/Ports/ProjectActivity/CreateProjectActivityInput.cs @@ -0,0 +1,4 @@ +namespace Domain.UseCases.Ports.ProjectActivity +{ + public class CreateProjectActivityInput : BaseProjectActivityContract { } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectActivity/DetailedReadProjectActivityOutput.cs b/src/Domain/UseCases/Ports/ProjectActivity/DetailedReadProjectActivityOutput.cs new file mode 100644 index 00000000..33b99667 --- /dev/null +++ b/src/Domain/UseCases/Ports/ProjectActivity/DetailedReadProjectActivityOutput.cs @@ -0,0 +1,10 @@ +namespace Domain.UseCases.Ports.ProjectActivity +{ + public class DetailedReadProjectActivityOutput : BaseProjectActivityContract + { + public Guid? Id { get; set; } + public Guid? ProjectId { get; set; } + public int? FoundActivities { get; set; } + public DateTime? DeletedAt { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectActivity/EvaluateProjectActivityInput.cs b/src/Domain/UseCases/Ports/ProjectActivity/EvaluateProjectActivityInput.cs new file mode 100644 index 00000000..ed49bab9 --- /dev/null +++ b/src/Domain/UseCases/Ports/ProjectActivity/EvaluateProjectActivityInput.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.UseCases.Ports.ProjectActivity +{ + public class EvaluateProjectActivityInput : BaseProjectActivityContract + { + [Required] + public Guid? ProjectId { get; set; } + [Required] + public int? FoundActivities { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectActivity/ResumedReadProjectActivityOutput.cs b/src/Domain/UseCases/Ports/ProjectActivity/ResumedReadProjectActivityOutput.cs new file mode 100644 index 00000000..8cab9afa --- /dev/null +++ b/src/Domain/UseCases/Ports/ProjectActivity/ResumedReadProjectActivityOutput.cs @@ -0,0 +1,9 @@ +namespace Domain.UseCases.Ports.ProjectActivity +{ + public class ResumedReadProjectActivityOutput : BaseProjectActivityContract + { + public Guid? Id { get; set; } + public Guid? ProjectId { get; set; } + public int? FoundActivities { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectActivity/UpdateProjectActivityInput.cs b/src/Domain/UseCases/Ports/ProjectActivity/UpdateProjectActivityInput.cs new file mode 100644 index 00000000..26b1922c --- /dev/null +++ b/src/Domain/UseCases/Ports/ProjectActivity/UpdateProjectActivityInput.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.UseCases.Ports.ProjectActivity +{ + public class UpdateProjectActivityInput : BaseProjectActivityContract + { + [Required] + public Guid? ProjectId { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs b/src/Domain/UseCases/Ports/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs new file mode 100644 index 00000000..d670a179 --- /dev/null +++ b/src/Domain/UseCases/Ports/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs @@ -0,0 +1,27 @@ +namespace Domain.UseCases.Ports.ProjectEvaluation +{ + public class DetailedReadProjectEvaluationOutput + { + #region Informações Gerais da Avaliação + public Guid? ProjectId { get; set; } + public bool IsProductivityFellow { get; set; } + public Guid? SubmissionEvaluatorId { get; set; } + public int? SubmissionEvaluationStatus { get; set; } + public DateTime? SubmissionEvaluationDate { get; set; } + public string? SubmissionEvaluationDescription { get; set; } + public Guid? AppealEvaluatorId { get; set; } + public int? AppealEvaluationStatus { get; set; } + public DateTime? AppealEvaluationDate { get; set; } + public string? AppealEvaluationDescription { get; set; } + #endregion Informações Gerais da Avaliação + + #region Critérios de Avaliação + public int? APIndex { get; set; } + public int? Qualification { get; set; } + public int? ProjectProposalObjectives { get; set; } + public int? AcademicScientificProductionCoherence { get; set; } + public int? ProposalMethodologyAdaptation { get; set; } + public int? EffectiveContributionToResearch { get; set; } + #endregion Critérios de Avaliação + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateAppealProjectInput.cs b/src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateAppealProjectInput.cs new file mode 100644 index 00000000..64d0692d --- /dev/null +++ b/src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateAppealProjectInput.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.UseCases.Ports.ProjectEvaluation +{ + public class EvaluateAppealProjectInput + { + [Required] + public Guid? ProjectId { get; set; } + [Required] + public int? AppealEvaluationStatus { get; set; } + [Required] + public string? AppealEvaluationDescription { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateSubmissionProjectInput.cs b/src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateSubmissionProjectInput.cs new file mode 100644 index 00000000..afe2eda7 --- /dev/null +++ b/src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateSubmissionProjectInput.cs @@ -0,0 +1,34 @@ +using System.ComponentModel.DataAnnotations; +using Domain.UseCases.Ports.ProjectActivity; + +namespace Domain.UseCases.Ports.ProjectEvaluation +{ + public class EvaluateSubmissionProjectInput + { + #region Informações Gerais da Avaliação + [Required] + public Guid? ProjectId { get; set; } + [Required] + public bool IsProductivityFellow { get; set; } + [Required] + public int? SubmissionEvaluationStatus { get; set; } + [Required] + public string? SubmissionEvaluationDescription { get; set; } + [Required] + public IList? Activities { get; set; } + #endregion Informações Gerais da Avaliação + + #region Critérios de Avaliação + [Required] + public int? Qualification { get; set; } + [Required] + public int? ProjectProposalObjectives { get; set; } + [Required] + public int? AcademicScientificProductionCoherence { get; set; } + [Required] + public int? ProposalMethodologyAdaptation { get; set; } + [Required] + public int? EffectiveContributionToResearch { get; set; } + #endregion Critérios de Avaliação + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/Student/BaseStudentContract.cs b/src/Domain/UseCases/Ports/Student/BaseStudentContract.cs similarity index 91% rename from src/Domain/Contracts/Student/BaseStudentContract.cs rename to src/Domain/UseCases/Ports/Student/BaseStudentContract.cs index 2d2af17b..b48a70bf 100644 --- a/src/Domain/Contracts/Student/BaseStudentContract.cs +++ b/src/Domain/UseCases/Ports/Student/BaseStudentContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.Student +namespace Domain.UseCases.Ports.Student { public abstract class BaseStudentContract { @@ -33,13 +33,13 @@ public abstract class BaseStudentContract public string? StartYear { get; set; } [Required] public Guid? AssistanceTypeId { get; set; } - #endregion + #endregion Required Properties #region Optional Properties public int? PhoneDDD { get; set; } public long? Phone { get; set; } public int? CellPhoneDDD { get; set; } public long? CellPhone { get; set; } - #endregion + #endregion Optional Properties } } \ No newline at end of file diff --git a/src/Domain/Contracts/Student/CreateStudentInput.cs b/src/Domain/UseCases/Ports/Student/CreateStudentInput.cs similarity index 84% rename from src/Domain/Contracts/Student/CreateStudentInput.cs rename to src/Domain/UseCases/Ports/Student/CreateStudentInput.cs index 2db24f04..9d8067f3 100644 --- a/src/Domain/Contracts/Student/CreateStudentInput.cs +++ b/src/Domain/UseCases/Ports/Student/CreateStudentInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.Student +namespace Domain.UseCases.Ports.Student { public class CreateStudentInput : BaseStudentContract { @@ -13,6 +13,6 @@ public class CreateStudentInput : BaseStudentContract public string? Email { get; set; } [Required] public string? Password { get; set; } - #endregion + #endregion User Properties } } \ No newline at end of file diff --git a/src/Domain/Contracts/Student/DetailedReadStudentOutput.cs b/src/Domain/UseCases/Ports/Student/DetailedReadStudentOutput.cs similarity index 70% rename from src/Domain/Contracts/Student/DetailedReadStudentOutput.cs rename to src/Domain/UseCases/Ports/Student/DetailedReadStudentOutput.cs index b1e8b63b..12fb83f0 100644 --- a/src/Domain/Contracts/Student/DetailedReadStudentOutput.cs +++ b/src/Domain/UseCases/Ports/Student/DetailedReadStudentOutput.cs @@ -1,8 +1,8 @@ -using Domain.Contracts.Campus; -using Domain.Contracts.Course; -using Domain.Contracts.User; +using Domain.UseCases.Ports.Campus; +using Domain.UseCases.Ports.Course; +using Domain.UseCases.Ports.User; -namespace Domain.Contracts.Student +namespace Domain.UseCases.Ports.Student { public class DetailedReadStudentOutput : BaseStudentContract { diff --git a/src/Domain/Contracts/Student/ResumedReadStudentOutput.cs b/src/Domain/UseCases/Ports/Student/ResumedReadStudentOutput.cs similarity index 83% rename from src/Domain/Contracts/Student/ResumedReadStudentOutput.cs rename to src/Domain/UseCases/Ports/Student/ResumedReadStudentOutput.cs index b2552b86..d460d3f4 100644 --- a/src/Domain/Contracts/Student/ResumedReadStudentOutput.cs +++ b/src/Domain/UseCases/Ports/Student/ResumedReadStudentOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Student +namespace Domain.UseCases.Ports.Student { public class ResumedReadStudentOutput : BaseStudentContract { diff --git a/src/Domain/Contracts/Student/UpdateStudentInput.cs b/src/Domain/UseCases/Ports/Student/UpdateStudentInput.cs similarity index 73% rename from src/Domain/Contracts/Student/UpdateStudentInput.cs rename to src/Domain/UseCases/Ports/Student/UpdateStudentInput.cs index 28a06c25..bec8b6ca 100644 --- a/src/Domain/Contracts/Student/UpdateStudentInput.cs +++ b/src/Domain/UseCases/Ports/Student/UpdateStudentInput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.Student +namespace Domain.UseCases.Ports.Student { public class UpdateStudentInput : BaseStudentContract { diff --git a/src/Domain/Contracts/StudentDocuments/BaseStudentDocumentsOutput.cs b/src/Domain/UseCases/Ports/StudentDocuments/BaseStudentDocumentsOutput.cs similarity index 93% rename from src/Domain/Contracts/StudentDocuments/BaseStudentDocumentsOutput.cs rename to src/Domain/UseCases/Ports/StudentDocuments/BaseStudentDocumentsOutput.cs index 4e23d7b6..6eab71b6 100644 --- a/src/Domain/Contracts/StudentDocuments/BaseStudentDocumentsOutput.cs +++ b/src/Domain/UseCases/Ports/StudentDocuments/BaseStudentDocumentsOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.StudentDocuments +namespace Domain.UseCases.Ports.StudentDocuments { public abstract class BaseStudentDocumentsOutput { @@ -35,7 +35,7 @@ public abstract class BaseStudentDocumentsOutput /// Autorização dos pais ou responsáveis legais, em caso de aluno menor de 18 anos (Anexo 3 do Edital PIBIC ou modelo disponível na página da COPET) ///
public string? ParentalAuthorization { get; set; } - #endregion + #endregion Documents #region BankData /// @@ -51,6 +51,6 @@ public abstract class BaseStudentDocumentsOutput /// Comprovante de Abertura de Conta /// public string? AccountOpeningProof { get; set; } - #endregion + #endregion BankData } } \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/StudentDocuments/CreateStudentDocumentsInput.cs b/src/Domain/UseCases/Ports/StudentDocuments/CreateStudentDocumentsInput.cs new file mode 100644 index 00000000..5792ab57 --- /dev/null +++ b/src/Domain/UseCases/Ports/StudentDocuments/CreateStudentDocumentsInput.cs @@ -0,0 +1,65 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Http; + +namespace Domain.UseCases.Ports.StudentDocuments +{ + public class CreateStudentDocumentsInput + { + [Required] + public Guid? ProjectId { get; set; } + + #region Documents + /// + /// Cópia do documento de identidade com foto. + /// + [Required] + public IFormFile? IdentityDocument { get; set; } + + /// + /// Cópia do CPF + /// + [Required] + public IFormFile? CPF { get; set; } + + /// + /// Foto 3x4 + /// + [Required] + public IFormFile? Photo3x4 { get; set; } + + /// + /// Cópia atualizada do Histórico Escolar + /// + [Required] + public IFormFile? SchoolHistory { get; set; } + + /// + /// Termo de Compromisso do Bolsista assinado (Anexo II ou disponível na página do PIBIC) no caso de bolsista do CEFET/RJ + /// + [Required] + public IFormFile? ScholarCommitmentAgreement { get; set; } + + /// + /// Autorização dos pais ou responsáveis legais, em caso de aluno menor de 18 anos (Anexo 3 do Edital PIBIC ou modelo disponível na página da COPET) + /// + public IFormFile? ParentalAuthorization { get; set; } + #endregion Documents + + #region BankData + /// + /// Número da Agência + /// + public string? AgencyNumber { get; set; } + /// + /// Número da Conta Corrente + /// + public string? AccountNumber { get; set; } + + /// + /// Comprovante de Abertura de Conta + /// + [Required] + public IFormFile? AccountOpeningProof { get; set; } + #endregion BankData + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/StudentDocuments/DetailedReadStudentDocumentsOutput.cs b/src/Domain/UseCases/Ports/StudentDocuments/DetailedReadStudentDocumentsOutput.cs new file mode 100644 index 00000000..96f18d3f --- /dev/null +++ b/src/Domain/UseCases/Ports/StudentDocuments/DetailedReadStudentDocumentsOutput.cs @@ -0,0 +1,7 @@ +namespace Domain.UseCases.Ports.StudentDocuments +{ + public class DetailedReadStudentDocumentsOutput : BaseStudentDocumentsOutput + { + public DateTime? DeletedAt { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/StudentDocuments/ResumedReadStudentDocumentsOutput.cs b/src/Domain/UseCases/Ports/StudentDocuments/ResumedReadStudentDocumentsOutput.cs new file mode 100644 index 00000000..4637205a --- /dev/null +++ b/src/Domain/UseCases/Ports/StudentDocuments/ResumedReadStudentDocumentsOutput.cs @@ -0,0 +1,4 @@ +namespace Domain.UseCases.Ports.StudentDocuments +{ + public class ResumedReadStudentDocumentsOutput : BaseStudentDocumentsOutput { } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/StudentDocuments/UpdateStudentDocumentsInput.cs b/src/Domain/UseCases/Ports/StudentDocuments/UpdateStudentDocumentsInput.cs new file mode 100644 index 00000000..dc32e4e2 --- /dev/null +++ b/src/Domain/UseCases/Ports/StudentDocuments/UpdateStudentDocumentsInput.cs @@ -0,0 +1,51 @@ +using Microsoft.AspNetCore.Http; + +namespace Domain.UseCases.Ports.StudentDocuments +{ + public class UpdateStudentDocumentsInput + { + /// + /// Cópia do documento de identidade com foto. + /// + public IFormFile? IdentityDocument { get; set; } + + /// + /// Cópia do CPF + /// + public IFormFile? CPF { get; set; } + + /// + /// Foto 3x4 + /// + public IFormFile? Photo3x4 { get; set; } + + /// + /// Cópia atualizada do Histórico Escolar + /// + public IFormFile? SchoolHistory { get; set; } + + /// + /// Termo de Compromisso do Bolsista assinado (Anexo II ou disponível na página do PIBIC) no caso de bolsista do CEFET/RJ + /// + public IFormFile? ScholarCommitmentAgreement { get; set; } + + /// + /// Autorização dos pais ou responsáveis legais, em caso de aluno menor de 18 anos (Anexo 3 do Edital PIBIC ou modelo disponível na página da COPET) + /// + public IFormFile? ParentalAuthorization { get; set; } + + /// + /// Número da Agência + /// + public string? AgencyNumber { get; set; } + /// + /// Número da Conta Corrente + /// + public string? AccountNumber { get; set; } + + /// + /// Comprovante de Abertura de Conta + /// + public IFormFile? AccountOpeningProof { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/Contracts/SubArea/BaseSubAreaContract.cs b/src/Domain/UseCases/Ports/SubArea/BaseSubAreaContract.cs similarity index 85% rename from src/Domain/Contracts/SubArea/BaseSubAreaContract.cs rename to src/Domain/UseCases/Ports/SubArea/BaseSubAreaContract.cs index 31413c68..52e7c7d9 100644 --- a/src/Domain/Contracts/SubArea/BaseSubAreaContract.cs +++ b/src/Domain/UseCases/Ports/SubArea/BaseSubAreaContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.SubArea +namespace Domain.UseCases.Ports.SubArea { public abstract class BaseSubAreaContract { diff --git a/src/Domain/Contracts/SubArea/CreateSubAreaInput.cs b/src/Domain/UseCases/Ports/SubArea/CreateSubAreaInput.cs similarity index 58% rename from src/Domain/Contracts/SubArea/CreateSubAreaInput.cs rename to src/Domain/UseCases/Ports/SubArea/CreateSubAreaInput.cs index a920e4ca..bec2e3a6 100644 --- a/src/Domain/Contracts/SubArea/CreateSubAreaInput.cs +++ b/src/Domain/UseCases/Ports/SubArea/CreateSubAreaInput.cs @@ -1,7 +1,6 @@ -using System; -using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.SubArea +namespace Domain.UseCases.Ports.SubArea { public class CreateSubAreaInput : BaseSubAreaContract { diff --git a/src/Domain/Contracts/SubArea/DetailedReadSubAreaOutput.cs b/src/Domain/UseCases/Ports/SubArea/DetailedReadSubAreaOutput.cs similarity index 75% rename from src/Domain/Contracts/SubArea/DetailedReadSubAreaOutput.cs rename to src/Domain/UseCases/Ports/SubArea/DetailedReadSubAreaOutput.cs index 1c707be9..9e98ade0 100644 --- a/src/Domain/Contracts/SubArea/DetailedReadSubAreaOutput.cs +++ b/src/Domain/UseCases/Ports/SubArea/DetailedReadSubAreaOutput.cs @@ -1,6 +1,6 @@ -using Domain.Contracts.Area; +using Domain.UseCases.Ports.Area; -namespace Domain.Contracts.SubArea +namespace Domain.UseCases.Ports.SubArea { public class DetailedReadSubAreaOutput : BaseSubAreaContract { diff --git a/src/Domain/Contracts/SubArea/ResumedReadSubAreaOutput.cs b/src/Domain/UseCases/Ports/SubArea/ResumedReadSubAreaOutput.cs similarity index 73% rename from src/Domain/Contracts/SubArea/ResumedReadSubAreaOutput.cs rename to src/Domain/UseCases/Ports/SubArea/ResumedReadSubAreaOutput.cs index 91e45161..ad7a4a52 100644 --- a/src/Domain/Contracts/SubArea/ResumedReadSubAreaOutput.cs +++ b/src/Domain/UseCases/Ports/SubArea/ResumedReadSubAreaOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.SubArea +namespace Domain.UseCases.Ports.SubArea { public class ResumedReadSubAreaOutput : BaseSubAreaContract { diff --git a/src/Domain/Contracts/SubArea/UpdateSubAreaInput.cs b/src/Domain/UseCases/Ports/SubArea/UpdateSubAreaInput.cs similarity index 84% rename from src/Domain/Contracts/SubArea/UpdateSubAreaInput.cs rename to src/Domain/UseCases/Ports/SubArea/UpdateSubAreaInput.cs index c8b445fc..28c0d15c 100644 --- a/src/Domain/Contracts/SubArea/UpdateSubAreaInput.cs +++ b/src/Domain/UseCases/Ports/SubArea/UpdateSubAreaInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.SubArea +namespace Domain.UseCases.Ports.SubArea { public class UpdateSubAreaInput : BaseSubAreaContract { diff --git a/src/Domain/Contracts/User/UserReadOutput.cs b/src/Domain/UseCases/Ports/User/UserReadOutput.cs similarity index 88% rename from src/Domain/Contracts/User/UserReadOutput.cs rename to src/Domain/UseCases/Ports/User/UserReadOutput.cs index 00d8ca19..1ff55913 100644 --- a/src/Domain/Contracts/User/UserReadOutput.cs +++ b/src/Domain/UseCases/Ports/User/UserReadOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.Contracts.User +namespace Domain.UseCases.Ports.User { public class UserReadOutput { diff --git a/src/Domain/Contracts/User/UserUpdateInput.cs b/src/Domain/UseCases/Ports/User/UserUpdateInput.cs similarity index 85% rename from src/Domain/Contracts/User/UserUpdateInput.cs rename to src/Domain/UseCases/Ports/User/UserUpdateInput.cs index 01d00cdf..c0675543 100644 --- a/src/Domain/Contracts/User/UserUpdateInput.cs +++ b/src/Domain/UseCases/Ports/User/UserUpdateInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.Contracts.User +namespace Domain.UseCases.Ports.User { public class UserUpdateInput { diff --git a/src/Domain/UseCases/Project/OpenProject.cs b/src/Domain/UseCases/Project/OpenProject.cs deleted file mode 100644 index 782313a2..00000000 --- a/src/Domain/UseCases/Project/OpenProject.cs +++ /dev/null @@ -1,143 +0,0 @@ -using AutoMapper; -using Domain.Contracts.Project; -using Domain.Entities.Enums; -using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases.Project; -using Domain.Validation; - -namespace Domain.UseCases.Project; -public class OpenProject : IOpenProject -{ - #region Global Scope - private readonly IProjectRepository _projectRepository; - private readonly IStudentRepository _studentRepository; - private readonly IProfessorRepository _professorRepository; - private readonly INoticeRepository _noticeRepository; - private readonly ISubAreaRepository _subAreaRepository; - private readonly IProgramTypeRepository _programTypeRepository; - private readonly IActivityTypeRepository _activityTypeRepository; - private readonly IProjectActivityRepository _projectActivityRepository; - private readonly IMapper _mapper; - public OpenProject(IProjectRepository projectRepository, - IStudentRepository studentRepository, - IProfessorRepository professorRepository, - INoticeRepository noticeRepository, - ISubAreaRepository subAreaRepository, - IProgramTypeRepository programTypeRepository, - IActivityTypeRepository activityTypeRepository, - IProjectActivityRepository projectActivityRepository, - IMapper mapper) - { - _projectRepository = projectRepository; - _studentRepository = studentRepository; - _professorRepository = professorRepository; - _noticeRepository = noticeRepository; - _subAreaRepository = subAreaRepository; - _programTypeRepository = programTypeRepository; - _activityTypeRepository = activityTypeRepository; - _projectActivityRepository = projectActivityRepository; - _mapper = mapper; - } - #endregion - - public async Task Execute(OpenProjectInput input) - { - // Mapeia input para entidade e realiza validação dos campos informados - var project = new Entities.Project( - input.Title, - input.KeyWord1, - input.KeyWord2, - input.KeyWord3, - input.IsScholarshipCandidate, - input.Objective, - input.Methodology, - input.ExpectedResults, - input.ActivitiesExecutionSchedule, - input.StudentId, - input.ProgramTypeId, - input.ProfessorId, - input.SubAreaId, - input.NoticeId, - EProjectStatus.Opened, - EProjectStatus.Opened.GetDescription(), - null, - DateTime.UtcNow, - null, - null, - null); - - // Verifica se Edital existe - var notice = await _noticeRepository.GetById(project.NoticeId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Notice)); - - // Verifica se o período do edital é válido - if (notice.RegistrationStartDate > DateTime.UtcNow || notice.RegistrationEndDate < DateTime.UtcNow) - throw UseCaseException.BusinessRuleViolation("Fora do período de inscrição no edital."); - - // Verifica se a Subárea existe - _ = await _subAreaRepository.GetById(project.SubAreaId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); - - // Verifica se o Tipo de Programa existe - _ = await _programTypeRepository.GetById(project.ProgramTypeId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); - - // Verifica se o Professor existe - _ = await _professorRepository.GetById(project.ProfessorId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Professor)); - - // Caso tenha sido informado algum aluno no processo de abertura do projeto - if (project.StudentId.HasValue) - { - // Verifica se o aluno existe - var student = await _studentRepository.GetById(project.StudentId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); - - // Verifica se o aluno já está em um projeto - var studentProjects = await _projectRepository.GetStudentProjects(0, 1, student.Id); - if (studentProjects.Any()) - throw UseCaseException.BusinessRuleViolation("Aluno já está em um projeto."); - } - - // Verifica se foram informadas atividades - if (input.Activities?.Any() != true) - throw UseCaseException.BusinessRuleViolation("Atividades não informadas."); - - // Obtém atividades do Edital - var noticeActivities = await _activityTypeRepository.GetByNoticeId(notice.Id); - - // Valida se todas as atividades do projeto foram informadas corretamente - var newProjectActivities = new List(); - foreach (var activityType in noticeActivities) - { - // Verifica se as atividades que o professor informou existem no edital - // e se todas as atividades do edital foram informadas. - foreach (var activity in activityType.Activities!) - { - // Verifica se professor informou valor para essa atividade do edital - var inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) - ?? throw UseCaseException.BusinessRuleViolation($"Não foi informado valor para a atividade {activity.Name}."); - - // Adiciona atividade do projeto na lista para ser criada posteriormente - newProjectActivities.Add(new Entities.ProjectActivity( - Guid.Empty, // Id do projeto será gerado na etapa seguinte - inputActivity.ActivityId, - inputActivity.InformedActivities, - 0)); - } - } - - // Cria o projeto - project = await _projectRepository.Create(project); - - // Cria as atividades do projeto - foreach (var projectActivity in newProjectActivities) - { - projectActivity.ProjectId = project.Id; - await _projectActivityRepository.Create(projectActivity); - } - - // Mapeia o projeto para o retorno e retorna - return _mapper.Map(project); - } -} \ No newline at end of file diff --git a/src/Domain/UseCases/Project/UpdateProject.cs b/src/Domain/UseCases/Project/UpdateProject.cs deleted file mode 100644 index 9c1f2955..00000000 --- a/src/Domain/UseCases/Project/UpdateProject.cs +++ /dev/null @@ -1,149 +0,0 @@ -using AutoMapper; -using Domain.Contracts.Project; -using Domain.Entities.Enums; -using Domain.Interfaces.Repositories; -using Domain.Interfaces.UseCases.Project; -using Domain.Validation; - -namespace Domain.UseCases.Project; -public class UpdateProject : IUpdateProject -{ - #region Global Scope - private readonly IProjectRepository _projectRepository; - private readonly IStudentRepository _studentRepository; - private readonly IProfessorRepository _professorRepository; - private readonly INoticeRepository _noticeRepository; - private readonly ISubAreaRepository _subAreaRepository; - private readonly IProgramTypeRepository _programTypeRepository; - private readonly IActivityTypeRepository _activityTypeRepository; - private readonly IProjectActivityRepository _projectActivityRepository; - private readonly IMapper _mapper; - public UpdateProject(IProjectRepository projectRepository, - IStudentRepository studentRepository, - IProfessorRepository professorRepository, - INoticeRepository noticeRepository, - ISubAreaRepository subAreaRepository, - IProgramTypeRepository programTypeRepository, - IActivityTypeRepository activityTypeRepository, - IProjectActivityRepository projectActivityRepository, - IMapper mapper) - { - _projectRepository = projectRepository; - _studentRepository = studentRepository; - _professorRepository = professorRepository; - _noticeRepository = noticeRepository; - _subAreaRepository = subAreaRepository; - _programTypeRepository = programTypeRepository; - _activityTypeRepository = activityTypeRepository; - _projectActivityRepository = projectActivityRepository; - _mapper = mapper; - } - #endregion - - public async Task Execute(Guid? id, UpdateProjectInput input) - { - // Verifica se o id foi informado - UseCaseException.NotInformedParam(id is null, nameof(id)); - - // Verifica se o projeto existe - var project = await _projectRepository.GetById(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); - - // Verifica se o edital está no período de inscrições - if (project.Notice!.RegistrationStartDate > DateTime.UtcNow || project.Notice?.RegistrationEndDate < DateTime.UtcNow) - throw UseCaseException.BusinessRuleViolation("Fora do período de inscrição no edital."); - - // Verifica se o projeto está aberto - if (project!.Status == EProjectStatus.Opened) - { - // Verifica se a nova Subárea existe - if (input.SubAreaId != project.SubAreaId) - { - _ = await _subAreaRepository.GetById(input.SubAreaId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); - } - - // Verifica se o novo Tipo de Programa existe - if (input.ProgramTypeId != project.ProgramTypeId) - { - _ = await _programTypeRepository.GetById(input.ProgramTypeId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); - } - - // Caso tenha sido informado algum aluno no processo de abertura do projeto - if (input.StudentId.HasValue && input.StudentId != project.StudentId) - { - // Verifica se o aluno existe - var student = await _studentRepository.GetById(input.StudentId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); - - // Verifica se o aluno já está em um projeto - var studentProjects = await _projectRepository.GetStudentProjects(0, 1, student.Id); - UseCaseException.BusinessRuleViolation(studentProjects.Any(), "Student is already on a project."); - } - - // Atualiza campos permitidos - project.Title = input.Title; - project.KeyWord1 = input.KeyWord1; - project.KeyWord2 = input.KeyWord2; - project.KeyWord3 = input.KeyWord3; - project.IsScholarshipCandidate = input.IsScholarshipCandidate; - project.Objective = input.Objective; - project.Methodology = input.Methodology; - project.ExpectedResults = input.ExpectedResults; - project.ActivitiesExecutionSchedule = input.ActivitiesExecutionSchedule; - project.ProgramTypeId = input.ProgramTypeId; - project.StudentId = input.StudentId; - project.SubAreaId = input.SubAreaId; - - // Verifica se foram informadas atividades - if (input.Activities?.Any() != true) - throw UseCaseException.BusinessRuleViolation("Atividades não informadas."); - - // Obtém atividades do Edital - var noticeActivities = await _activityTypeRepository.GetByNoticeId(project.Notice!.Id); - - // Obtém atividades do projeto - var projectActivities = await _projectActivityRepository.GetByProjectId(project.Id); - - // Valida se todas as atividades do projeto foram informadas corretamente - var updateProjectActivities = new List(); - foreach (var activityType in noticeActivities) - { - // Verifica se as atividades que o professor informou existem no edital - // e se todas as atividades do edital foram informadas. - foreach (var activity in activityType.Activities!) - { - // Verifica se professor informou valor para essa atividade do edital - var inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) - ?? throw UseCaseException.BusinessRuleViolation($"Não foi informado valor para a atividade {activity.Name}."); - - // Obtém atividade do projeto - var updateProjectActivity = projectActivities.FirstOrDefault(x => x.ActivityId == activity.Id); - - // Atualiza valores da entidade - updateProjectActivity!.InformedActivities = inputActivity.InformedActivities; - - // Atualiza atividade do projeto no banco de dados - await _projectActivityRepository.Update(updateProjectActivity); - } - } - - // Atualiza o projeto - await _projectRepository.Update(project); - - // Atualiza atividades do projeto no banco - foreach (var projectActivity in updateProjectActivities) - { - await _projectActivityRepository.Update(projectActivity); - } - - // Mapeia o projeto para o retorno e retorna - return _mapper.Map(project); - } - else - { - throw UseCaseException.BusinessRuleViolation("O projeto não está em um estágio que permita mudanças."); - } - } -} \ No newline at end of file diff --git a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs index 3242a07b..9e24b7a6 100644 --- a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs +++ b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs @@ -1,52 +1,54 @@ -using Adapters.Mappings; -using Adapters.Interfaces; +using Adapters.Interfaces; +using Adapters.Mappings; using Adapters.PresenterController; using Microsoft.Extensions.DependencyInjection; -namespace Infrastructure.IoC; -public static class DependencyAdaptersInjection +namespace IoC { - public static IServiceCollection AddAdapters(this IServiceCollection services) + public static class DependencyAdaptersInjection { - #region PresenterControllers - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - // services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion + public static IServiceCollection AddAdapters(this IServiceCollection services) + { + #region PresenterControllers + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + // services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion PresenterControllers - #region Gateways Mappers - services.AddAutoMapper(typeof(AreaMappings)); - services.AddAutoMapper(typeof(ActivityMappings)); - services.AddAutoMapper(typeof(AssistanceTypeMappings)); - services.AddAutoMapper(typeof(AuthMappings)); - services.AddAutoMapper(typeof(CampusMappings)); - services.AddAutoMapper(typeof(CourseMappings)); - services.AddAutoMapper(typeof(MainAreaMappings)); - services.AddAutoMapper(typeof(NoticeMappings)); - services.AddAutoMapper(typeof(ProfessorMappings)); - services.AddAutoMapper(typeof(ProgramTypeMappings)); - services.AddAutoMapper(typeof(ProjectEvaluationMapping)); - services.AddAutoMapper(typeof(ProjectMappings)); - services.AddAutoMapper(typeof(ProjectActivityMappings)); - services.AddAutoMapper(typeof(StudentDocumentsMappings)); - services.AddAutoMapper(typeof(StudentMappings)); - services.AddAutoMapper(typeof(SubAreaMappings)); - services.AddAutoMapper(typeof(UserMappings)); - #endregion + #region Gateways Mappers + _ = services.AddAutoMapper(typeof(AreaMappings)); + _ = services.AddAutoMapper(typeof(ActivityMappings)); + _ = services.AddAutoMapper(typeof(AssistanceTypeMappings)); + _ = services.AddAutoMapper(typeof(AuthMappings)); + _ = services.AddAutoMapper(typeof(CampusMappings)); + _ = services.AddAutoMapper(typeof(CourseMappings)); + _ = services.AddAutoMapper(typeof(MainAreaMappings)); + _ = services.AddAutoMapper(typeof(NoticeMappings)); + _ = services.AddAutoMapper(typeof(ProfessorMappings)); + _ = services.AddAutoMapper(typeof(ProgramTypeMappings)); + _ = services.AddAutoMapper(typeof(ProjectEvaluationMapping)); + _ = services.AddAutoMapper(typeof(ProjectMappings)); + _ = services.AddAutoMapper(typeof(ProjectActivityMappings)); + _ = services.AddAutoMapper(typeof(StudentDocumentsMappings)); + _ = services.AddAutoMapper(typeof(StudentMappings)); + _ = services.AddAutoMapper(typeof(SubAreaMappings)); + _ = services.AddAutoMapper(typeof(UserMappings)); + #endregion Gateways Mappers - return services; + return services; + } } } \ No newline at end of file diff --git a/src/Infrastructure/IoC/DependencyDomainInjection.cs b/src/Infrastructure/IoC/DependencyDomainInjection.cs index f8805b62..6772ede1 100644 --- a/src/Infrastructure/IoC/DependencyDomainInjection.cs +++ b/src/Infrastructure/IoC/DependencyDomainInjection.cs @@ -1,177 +1,202 @@ using Domain.Interfaces.Services; -using Domain.Interfaces.UseCases; -using Domain.Interfaces.UseCases.ActivityType; -using Domain.Interfaces.UseCases.Project; -using Domain.Interfaces.UseCases.ProjectEvaluation; using Domain.Mappings; using Domain.UseCases; -using Domain.UseCases.ActivityType; -using Domain.UseCases.Project; -using Domain.UseCases.ProjectEvaluation; -using Infrastructure.Services; +using Domain.UseCases.Interactors.ActivityType; +using Domain.UseCases.Interactors.Area; +using Domain.UseCases.Interactors.AssistanceType; +using Domain.UseCases.Interactors.Auth; +using Domain.UseCases.Interactors.Campus; +using Domain.UseCases.Interactors.Course; +using Domain.UseCases.Interactors.MainArea; +using Domain.UseCases.Interactors.Notice; +using Domain.UseCases.Interactors.Professor; +using Domain.UseCases.Interactors.ProgramType; +using Domain.UseCases.Interactors.Project; +using Domain.UseCases.Interactors.ProjectEvaluation; +using Domain.UseCases.Interactors.Student; +using Domain.UseCases.Interactors.SubArea; +using Domain.UseCases.Interactors.User; +using Domain.UseCases.Interfaces.ActivityType; +using Domain.UseCases.Interfaces.Area; +using Domain.UseCases.Interfaces.AssistanceType; +using Domain.UseCases.Interfaces.Auth; +using Domain.UseCases.Interfaces.Campus; +using Domain.UseCases.Interfaces.Course; +using Domain.UseCases.Interfaces.MainArea; +using Domain.UseCases.Interfaces.Notice; +using Domain.UseCases.Interfaces.Professor; +using Domain.UseCases.Interfaces.ProgramType; +using Domain.UseCases.Interfaces.Project; +using Domain.UseCases.Interfaces.ProjectEvaluation; +using Domain.UseCases.Interfaces.Student; +using Domain.UseCases.Interfaces.SubArea; +using Domain.UseCases.Interfaces.User; using Microsoft.Extensions.DependencyInjection; +using Services; -namespace Infrastructure.IoC; -public static class DependencyDomainInjection +namespace IoC { - public static IServiceCollection AddDomain(this IServiceCollection services) + public static class DependencyDomainInjection { - #region External Services - services.AddHttpContextAccessor(); - services.AddScoped(); - services.AddScoped(); - // services.AddScoped(); - services.AddScoped(); - #endregion - - #region UseCases - #region Area - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #region ActivityType - services.AddScoped(); - services.AddScoped(); - #endregion - - #region AssistanceType - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #region Auth - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #region Campus - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #region Course - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #region MainArea - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #region Notice - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #region Professor - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #region ProgramType - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #region Project - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #region ProjectEvaluation - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #region Student - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #region StudentDocuments - // services.AddScoped(); - // services.AddScoped(); - // services.AddScoped(); - // services.AddScoped(); - // services.AddScoped(); - // services.AddScoped(); - #endregion - - #region SubArea - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #region User - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion - - #endregion - - #region Contract Mappers - services.AddAutoMapper(typeof(AreaMappings)); - services.AddAutoMapper(typeof(ActivityMappings)); - services.AddAutoMapper(typeof(AssistanceTypeMappings)); - services.AddAutoMapper(typeof(CampusMappings)); - services.AddAutoMapper(typeof(CourseMappings)); - services.AddAutoMapper(typeof(MainAreaMappings)); - services.AddAutoMapper(typeof(NoticeMappings)); - services.AddAutoMapper(typeof(ProfessorMappings)); - services.AddAutoMapper(typeof(ProgramTypeMappings)); - services.AddAutoMapper(typeof(ProjectEvaluationMappings)); - services.AddAutoMapper(typeof(ProjectMappings)); - services.AddAutoMapper(typeof(StudentDocumentsMappings)); - services.AddAutoMapper(typeof(StudentMappings)); - services.AddAutoMapper(typeof(SubAreaMappings)); - services.AddAutoMapper(typeof(UserMappings)); - #endregion - - return services; + public static IServiceCollection AddDomain(this IServiceCollection services) + { + #region External Services + _ = services.AddHttpContextAccessor(); + _ = services.AddScoped(); + _ = services.AddScoped(); + // services.AddScoped(); + _ = services.AddScoped(); + #endregion External Services + + #region UseCases + #region Area + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion Area + + #region ActivityType + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion ActivityType + + #region AssistanceType + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion AssistanceType + + #region Auth + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion Auth + + #region Campus + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion Campus + + #region Course + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion Course + + #region MainArea + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion MainArea + + #region Notice + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion Notice + + #region Professor + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion Professor + + #region ProgramType + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion ProgramType + + #region Project + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion Project + + #region ProjectEvaluation + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion ProjectEvaluation + + #region Student + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion Student + + #region StudentDocuments + // services.AddScoped(); + // services.AddScoped(); + // services.AddScoped(); + // services.AddScoped(); + // services.AddScoped(); + // services.AddScoped(); + #endregion StudentDocuments + + #region SubArea + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion SubArea + + #region User + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion User + + #endregion UseCases + + #region Contract Mappers + _ = services.AddAutoMapper(typeof(AreaMappings)); + _ = services.AddAutoMapper(typeof(ActivityMappings)); + _ = services.AddAutoMapper(typeof(AssistanceTypeMappings)); + _ = services.AddAutoMapper(typeof(CampusMappings)); + _ = services.AddAutoMapper(typeof(CourseMappings)); + _ = services.AddAutoMapper(typeof(MainAreaMappings)); + _ = services.AddAutoMapper(typeof(NoticeMappings)); + _ = services.AddAutoMapper(typeof(ProfessorMappings)); + _ = services.AddAutoMapper(typeof(ProgramTypeMappings)); + _ = services.AddAutoMapper(typeof(ProjectEvaluationMappings)); + _ = services.AddAutoMapper(typeof(ProjectMappings)); + _ = services.AddAutoMapper(typeof(StudentDocumentsMappings)); + _ = services.AddAutoMapper(typeof(StudentMappings)); + _ = services.AddAutoMapper(typeof(SubAreaMappings)); + _ = services.AddAutoMapper(typeof(UserMappings)); + #endregion Contract Mappers + + return services; + } } } \ No newline at end of file diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs index 9d964d4f..13414354 100644 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ b/src/Infrastructure/IoC/DependencyInjection.cs @@ -1,90 +1,92 @@ using AspNetCoreRateLimit; using Domain.Interfaces.Repositories; -using Infrastructure.IoC.Utils; using Infrastructure.Persistence.Context; -using Infrastructure.Persistence.Repositories; -using Infrastructure.Services; -using Infrastructure.Services.Email.Configs; -using Infrastructure.Services.Email.Factories; +using IoC.Utils; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Persistence.Repositories; using Serilog; +using Services; +using Services.Email.Configs; +using Services.Email.Factories; -namespace Infrastructure.IoC; -public static class DependencyInjection +namespace IoC { - public static IServiceCollection AddInfrastructure(this IServiceCollection services) + public static class DependencyInjection { - // Define valores das propriedades de configuração - IConfiguration configuration = SettingsConfiguration.GetConfiguration(); - services.AddSingleton(configuration); + public static IServiceCollection AddInfrastructure(this IServiceCollection services) + { + // Define valores das propriedades de configuração + IConfiguration configuration = SettingsConfiguration.GetConfiguration(); + _ = services.AddSingleton(configuration); - // Carrega informações de ambiente (.env) - var dotEnvSecrets = new DotEnvSecrets(); - services.AddScoped(); + // Carrega informações de ambiente (.env) + DotEnvSecrets dotEnvSecrets = new(); + _ = services.AddScoped(); - #region Inicialização do banco de dados - services.AddDbContext( - o => o.UseNpgsql(dotEnvSecrets.GetDatabaseConnectionString(), - b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); - #endregion + #region Inicialização do banco de dados + _ = services.AddDbContext( + o => o.UseNpgsql(dotEnvSecrets.GetDatabaseConnectionString(), + b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); + #endregion Inicialização do banco de dados - #region Serviço de Log  - Log.Logger = new LoggerConfiguration() - .ReadFrom.Configuration(configuration) - .CreateLogger(); - services.AddLogging(loggingBuilder => - { - loggingBuilder.ClearProviders(); - loggingBuilder.AddSerilog(Log.Logger, dispose: true); - }); - #endregion + #region Serviço de Log  + Log.Logger = new LoggerConfiguration() + .ReadFrom.Configuration(configuration) + .CreateLogger(); + _ = services.AddLogging(loggingBuilder => + { + _ = loggingBuilder.ClearProviders(); + _ = loggingBuilder.AddSerilog(Log.Logger, dispose: true); + }); + #endregion Serviço de Log  - #region Serviço de E-mail + #region Serviço de E-mail - var smtpConfig = new SmtpConfiguration(); - configuration.GetSection("SmtpConfiguration").Bind(smtpConfig); - smtpConfig.Password = dotEnvSecrets.GetSmtpUserPassword(); - smtpConfig.Username = dotEnvSecrets.GetSmtpUserName(); - services.AddSingleton(); - services.AddSingleton(sp => - { - var factory = sp.GetRequiredService(); - return factory.Create(smtpConfig); - }); - #endregion + SmtpConfiguration smtpConfig = new(); + configuration.GetSection("SmtpConfiguration").Bind(smtpConfig); + smtpConfig.Password = dotEnvSecrets.GetSmtpUserPassword(); + smtpConfig.Username = dotEnvSecrets.GetSmtpUserName(); + _ = services.AddSingleton(); + _ = services.AddSingleton(sp => + { + IEmailServiceFactory factory = sp.GetRequiredService(); + return factory.Create(smtpConfig); + }); + #endregion Serviço de E-mail - #region Repositórios - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - #endregion + #region Repositórios + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + #endregion Repositórios - #region Rate Limit - services.AddMemoryCache(); - services.AddInMemoryRateLimiting(); - services.Configure(configuration.GetSection("IpRateLimiting")); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - #endregion + #region Rate Limit + _ = services.AddMemoryCache(); + _ = services.AddInMemoryRateLimiting(); + _ = services.Configure(configuration.GetSection("IpRateLimiting")); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + _ = services.AddSingleton(); + #endregion Rate Limit - return services; + return services; + } } } \ No newline at end of file diff --git a/src/Infrastructure/IoC/DependencyInjectionJWT.cs b/src/Infrastructure/IoC/DependencyInjectionJWT.cs index 59707ca3..c7548f6c 100644 --- a/src/Infrastructure/IoC/DependencyInjectionJWT.cs +++ b/src/Infrastructure/IoC/DependencyInjectionJWT.cs @@ -1,53 +1,55 @@ -using Infrastructure.IoC.Utils; +using System.Text; +using IoC.Utils; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; -using System.Text; -namespace Infrastructure.IoC; -public static class DependencyInjectionJWT +namespace IoC { - public static IServiceCollection AddInfrastructureJWT(this IServiceCollection services) + public static class DependencyInjectionJWT { - // Carrega informações de ambiente (.env) - var dotEnvSecrets = new DotEnvSecrets(); - services.AddSingleton(dotEnvSecrets); - - /// Informar o tipo de autenticação; - /// Definir o modelo de desafio de autenticação. - services.AddAuthentication(opt => + public static IServiceCollection AddInfrastructureJWT(this IServiceCollection services) { - opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - }) + // Carrega informações de ambiente (.env) + DotEnvSecrets dotEnvSecrets = new(); + _ = services.AddSingleton(dotEnvSecrets); - /// Habilita a autenticação JWT usando o esquema e desafio definidos; - /// Validar o token. - .AddJwtBearer(options => - { - options.TokenValidationParameters = new TokenValidationParameters + /// Informar o tipo de autenticação; + /// Definir o modelo de desafio de autenticação. + _ = services.AddAuthentication(opt => { - ValidateIssuer = true, - ValidateAudience = true, - ValidateLifetime = true, - ValidateIssuerSigningKey = true, - /// Valores válidos - ValidIssuer = dotEnvSecrets.GetJwtIssuer(), - ValidAudience = dotEnvSecrets.GetJwtAudience(), - IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(dotEnvSecrets.GetJwtSecret())), - /// Se não fizer isso ele vai inserir + 5min em cima - /// do que foi definido na geração do Token. - ClockSkew = TimeSpan.Zero - }; - }); + opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + }) - /// Define as políticas de autorização - services.AddAuthorization(options => - { - options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("ADMIN")); - options.AddPolicy("RequireProfessorRole", policy => policy.RequireRole("PROFESSOR")); - options.AddPolicy("RequireStudentRole", policy => policy.RequireRole("STUDENT")); - }); - return services; + /// Habilita a autenticação JWT usando o esquema e desafio definidos; + /// Validar o token. + .AddJwtBearer(options => + { + options.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuer = true, + ValidateAudience = true, + ValidateLifetime = true, + ValidateIssuerSigningKey = true, + /// Valores válidos + ValidIssuer = dotEnvSecrets.GetJwtIssuer(), + ValidAudience = dotEnvSecrets.GetJwtAudience(), + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(dotEnvSecrets.GetJwtSecret())), + /// Se não fizer isso ele vai inserir + 5min em cima + /// do que foi definido na geração do Token. + ClockSkew = TimeSpan.Zero + }; + }); + + /// Define as políticas de autorização + _ = services.AddAuthorization(options => + { + options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("ADMIN")); + options.AddPolicy("RequireProfessorRole", policy => policy.RequireRole("PROFESSOR")); + options.AddPolicy("RequireStudentRole", policy => policy.RequireRole("STUDENT")); + }); + return services; + } } } \ No newline at end of file diff --git a/src/Infrastructure/IoC/DependencyInjectionSwagger.cs b/src/Infrastructure/IoC/DependencyInjectionSwagger.cs index b5dde348..88a752ff 100644 --- a/src/Infrastructure/IoC/DependencyInjectionSwagger.cs +++ b/src/Infrastructure/IoC/DependencyInjectionSwagger.cs @@ -2,14 +2,14 @@ using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; -namespace Infrastructure.IoC +namespace IoC { public static class DependencyInjectionSwagger { public static IServiceCollection AddInfrastructureSwagger(this IServiceCollection services) { - services.AddEndpointsApiExplorer(); - services.AddSwaggerGen(c => + _ = services.AddEndpointsApiExplorer(); + _ = services.AddSwaggerGen(c => { // Adiciona documentação com Swagger c.SwaggerDoc("v1", new OpenApiInfo @@ -49,7 +49,7 @@ public static IServiceCollection AddInfrastructureSwagger(this IServiceCollectio } }); }); - services.AddSingleton(); + _ = services.AddSingleton(); return services; } } diff --git a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs index 11993b09..6f5e2119 100644 --- a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs +++ b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs @@ -1,31 +1,61 @@ -using Infrastructure.Services; +using Services; -namespace Infrastructure.IoC.Utils; -public class DotEnvSecrets : IDotEnvSecrets +namespace IoC.Utils { - public DotEnvSecrets() + public class DotEnvSecrets : IDotEnvSecrets { - // Caminho base para o arquivo appsettings.json - var basePath = Path.GetDirectoryName(typeof(DotEnvSecrets).Assembly.Location); - - // Carrega informações de ambiente (.env) - DotNetEnv.Env.Load(Path.Combine(basePath!, ".env")); + public DotEnvSecrets() + { + // Caminho base para o arquivo appsettings.json + string? basePath = Path.GetDirectoryName(typeof(DotEnvSecrets).Assembly.Location); + + // Carrega informações de ambiente (.env) + _ = DotNetEnv.Env.Load(Path.Combine(basePath!, ".env")); + } + + public string GetBlobStorageConnectionString() + { + return DotNetEnv.Env.GetString("AZURE_BLOB_STORAGE_CONNECTION_STRING"); + } + + public string GetBlobStorageContainerName() + { + return DotNetEnv.Env.GetString("AZURE_BLOB_STORAGE_CONTAINER_NAME"); + } + + public string GetDatabaseConnectionString() + { + return DotNetEnv.Env.GetString("AZURE_POSTGRES_CONNECTION_STRING"); + } + + public string GetSmtpUserName() + { + return DotNetEnv.Env.GetString("SMTP_EMAIL_USERNAME"); + } + + public string GetSmtpUserPassword() + { + return DotNetEnv.Env.GetString("SMTP_EMAIL_PASSWORD"); + } + + public string GetJwtSecret() + { + return DotNetEnv.Env.GetString("JWT_SECRET_KEY"); + } + + public string GetJwtIssuer() + { + return DotNetEnv.Env.GetString("JWT_ISSUER"); + } + + public string GetJwtAudience() + { + return DotNetEnv.Env.GetString("JWT_AUDIENCE"); + } + + public string GetJwtExpirationTime() + { + return DotNetEnv.Env.GetString("JWT_EXPIRE_IN"); + } } - - public string GetBlobStorageConnectionString() => DotNetEnv.Env.GetString("AZURE_BLOB_STORAGE_CONNECTION_STRING"); - public string GetBlobStorageContainerName() => DotNetEnv.Env.GetString("AZURE_BLOB_STORAGE_CONTAINER_NAME"); - - public string GetDatabaseConnectionString() => DotNetEnv.Env.GetString("AZURE_POSTGRES_CONNECTION_STRING"); - - public string GetSmtpUserName() => DotNetEnv.Env.GetString("SMTP_EMAIL_USERNAME"); - - public string GetSmtpUserPassword() => DotNetEnv.Env.GetString("SMTP_EMAIL_PASSWORD"); - - public string GetJwtSecret() => DotNetEnv.Env.GetString("JWT_SECRET_KEY"); - - public string GetJwtIssuer() => DotNetEnv.Env.GetString("JWT_ISSUER"); - - public string GetJwtAudience() => DotNetEnv.Env.GetString("JWT_AUDIENCE"); - - public string GetJwtExpirationTime() => DotNetEnv.Env.GetString("JWT_EXPIRE_IN"); } \ No newline at end of file diff --git a/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs b/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs index 281e4020..2a58010a 100644 --- a/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs +++ b/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs @@ -1,21 +1,23 @@ using Microsoft.Extensions.Configuration; -namespace Infrastructure.IoC.Utils; -public static class SettingsConfiguration +namespace IoC.Utils { - public static IConfiguration GetConfiguration() + public static class SettingsConfiguration { - // Caminho base para o arquivo appsettings.json - var basePath = Path.GetDirectoryName(typeof(SettingsConfiguration).Assembly.Location); + public static IConfiguration GetConfiguration() + { + // Caminho base para o arquivo appsettings.json + string? basePath = Path.GetDirectoryName(typeof(SettingsConfiguration).Assembly.Location); - // Carrega informações de ambiente (.env) - DotNetEnv.Env.Load(Path.Combine(basePath!, ".env")); + // Carrega informações de ambiente (.env) + _ = DotNetEnv.Env.Load(Path.Combine(basePath!, ".env")); - // Retorna configurações - return new ConfigurationBuilder() - .SetBasePath(basePath!) - .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) - .AddEnvironmentVariables() - .Build(); + // Retorna configurações + return new ConfigurationBuilder() + .SetBasePath(basePath!) + .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) + .AddEnvironmentVariables() + .Build(); + } } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs b/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs index b70b1c97..d68b9116 100644 --- a/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs @@ -3,36 +3,44 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class ActivityRepository : IActivityRepository { private readonly ApplicationDbContext _context; - public ActivityRepository(ApplicationDbContext context) => _context = context; + public ActivityRepository(ApplicationDbContext context) + { + _context = context; + } public async Task Create(Activity model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) => await _context.Activities + public async Task> GetAll(int skip, int take) + { + return await _context.Activities .Skip(skip) .Take(take) .AsAsyncEnumerable() .OrderBy(x => x.Name) .ToListAsync(); + } - public async Task GetById(Guid? id) => - await _context.Activities + public async Task GetById(Guid? id) + { + return await _context.Activities .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id); + } public async Task Delete(Guid? id) { - var model = await GetById(id) + Activity model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -40,8 +48,8 @@ public async Task Delete(Guid? id) public async Task Update(Activity model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } } diff --git a/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs b/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs index f4adc738..2fc7c8fc 100644 --- a/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs @@ -3,25 +3,28 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class ActivityTypeRepository : IActivityTypeRepository { #region Global Scope private readonly ApplicationDbContext _context; - public ActivityTypeRepository(ApplicationDbContext context) => _context = context; - #endregion + public ActivityTypeRepository(ApplicationDbContext context) + { + _context = context; + } + #endregion Global Scope public async Task Create(ActivityType model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } public async Task Delete(Guid? id) { - var model = await GetById(id) + ActivityType model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -39,14 +42,14 @@ public async Task Delete(Guid? id) public async Task> GetByNoticeId(Guid? noticeId) { - var activityTypes = await _context.ActivityTypes + List activityTypes = await _context.ActivityTypes .Include(x => x.Activities) .Where(x => x.NoticeId == noticeId) .ToListAsync() ?? throw new Exception("Nenhum tipo de atividade encontrado."); // Force loading of the Activities collection for each ActivityType - foreach (var activityType in activityTypes) + foreach (ActivityType? activityType in activityTypes) { // Explicitly load the Activities collection await _context.Entry(activityType) @@ -59,7 +62,7 @@ await _context.Entry(activityType) public async Task> GetLastNoticeActivities() { - var lastNoticeId = await _context.Notices + Guid lastNoticeId = await _context.Notices .AsAsyncEnumerable() .OrderByDescending(x => x.CreatedAt) .Select(x => x.Id) @@ -70,16 +73,19 @@ public async Task> GetLastNoticeActivities() public async Task Update(ActivityType model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) => await _context.ActivityTypes + public async Task> GetAll(int skip, int take) + { + return await _context.ActivityTypes .Skip(skip) .Take(take) .AsAsyncEnumerable() .OrderBy(x => x.Name) .ToListAsync(); + } } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/AreaRepository.cs b/src/Infrastructure/Persistence/Repositories/AreaRepository.cs index b14fa99d..12a45bfe 100644 --- a/src/Infrastructure/Persistence/Repositories/AreaRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/AreaRepository.cs @@ -3,29 +3,37 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class AreaRepository : IAreaRepository { #region Global Scope private readonly ApplicationDbContext _context; - public AreaRepository(ApplicationDbContext context) => _context = context; - #endregion + public AreaRepository(ApplicationDbContext context) + { + _context = context; + } + #endregion Global Scope #region Public Methods public async Task Create(Area model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task GetByCode(string? code) => await _context.Areas + public async Task GetByCode(string? code) + { + return await _context.Areas .Where(x => x.Code == code) .ToAsyncEnumerable() .FirstOrDefaultAsync(); + } - public async Task> GetAreasByMainArea(Guid? mainAreaId, int skip, int take) => await _context.Areas + public async Task> GetAreasByMainArea(Guid? mainAreaId, int skip, int take) + { + return await _context.Areas .Where(x => x.MainAreaId == mainAreaId) .Skip(skip) .Take(take) @@ -33,6 +41,7 @@ public async Task> GetAreasByMainArea(Guid? mainAreaId, int sk .AsAsyncEnumerable() .OrderBy(x => x.Name) .ToListAsync(); + } public async Task GetById(Guid? id) { @@ -46,7 +55,7 @@ public async Task> GetAreasByMainArea(Guid? mainAreaId, int sk public async Task Delete(Guid? id) { - var model = await GetById(id) + Area model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -54,8 +63,8 @@ public async Task Delete(Guid? id) public async Task Update(Area model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } @@ -63,6 +72,6 @@ public Task> GetAll(int skip, int take) { throw new NotImplementedException(); } - #endregion + #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs b/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs index 9ae9e69d..428c8e79 100644 --- a/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs @@ -3,39 +3,47 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class AssistanceTypeRepository : IAssistanceTypeRepository { #region Global Scope private readonly ApplicationDbContext _context; - public AssistanceTypeRepository(ApplicationDbContext context) => _context = context; - #endregion + public AssistanceTypeRepository(ApplicationDbContext context) + { + _context = context; + } + #endregion Global Scope #region Public Methods public async Task Create(AssistanceType model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) => await _context.AssistanceTypes + public async Task> GetAll(int skip, int take) + { + return await _context.AssistanceTypes .Skip(skip) .Take(take) .AsAsyncEnumerable() .OrderBy(x => x.Name) .ToListAsync(); + } - public async Task GetById(Guid? id) => - await _context.AssistanceTypes + public async Task GetById(Guid? id) + { + return await _context.AssistanceTypes .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id); + } public async Task Delete(Guid? id) { - var model = await GetById(id) + AssistanceType model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -43,20 +51,20 @@ public async Task Delete(Guid? id) public async Task Update(AssistanceType model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } public async Task GetAssistanceTypeByName(string name) { - string loweredName = name.ToLower(); - var entities = await _context.AssistanceTypes - .Where(x => x.Name!.ToLower() == loweredName) + string loweredName = name.ToLower(System.Globalization.CultureInfo.CurrentCulture); + List entities = await _context.AssistanceTypes + .Where(x => x.Name!.ToLower(System.Globalization.CultureInfo.CurrentCulture) == loweredName) .AsAsyncEnumerable() .ToListAsync(); return entities.FirstOrDefault(); } - #endregion + #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/CampusRepository.cs b/src/Infrastructure/Persistence/Repositories/CampusRepository.cs index b06ba577..6e2c5dde 100644 --- a/src/Infrastructure/Persistence/Repositories/CampusRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/CampusRepository.cs @@ -4,39 +4,47 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class CampusRepository : ICampusRepository { #region Global Scope private readonly ApplicationDbContext _context; - public CampusRepository(ApplicationDbContext context) => _context = context; - #endregion + public CampusRepository(ApplicationDbContext context) + { + _context = context; + } + #endregion Global Scope #region Public Methods public async Task Create(Campus model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) => await _context.Campuses + public async Task> GetAll(int skip, int take) + { + return await _context.Campuses .Skip(skip) .Take(take) .AsAsyncEnumerable() .OrderBy(x => x.Name) .ToListAsync(); + } - public async Task GetById(Guid? id) => - await _context.Campuses + public async Task GetById(Guid? id) + { + return await _context.Campuses .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id); + } public async Task Delete(Guid? id) { - var model = await GetById(id) + Campus model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -44,20 +52,20 @@ public async Task Delete(Guid? id) public async Task Update(Campus model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } public async Task GetCampusByName(string name) { - string loweredName = name.ToLower(); - var entities = await _context.Campuses - .Where(x => x.Name!.ToLower() == loweredName) + string loweredName = name.ToLower(System.Globalization.CultureInfo.CurrentCulture); + List entities = await _context.Campuses + .Where(x => x.Name!.ToLower(System.Globalization.CultureInfo.CurrentCulture) == loweredName) .AsAsyncEnumerable() .ToListAsync(); return entities.FirstOrDefault(); } - #endregion + #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/CourseRepository.cs b/src/Infrastructure/Persistence/Repositories/CourseRepository.cs index c37b87f4..203eac05 100644 --- a/src/Infrastructure/Persistence/Repositories/CourseRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/CourseRepository.cs @@ -1,46 +1,50 @@ -using System; -using System.Collections.Generic; -using System.Data.Entity; -using System.Linq; -using System.Threading.Tasks; +using System.Data.Entity; using Domain.Entities; using Domain.Interfaces.Repositories; using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class CourseRepository : ICourseRepository { #region Global Scope private readonly ApplicationDbContext _context; - public CourseRepository(ApplicationDbContext context) => _context = context; - #endregion + public CourseRepository(ApplicationDbContext context) + { + _context = context; + } + #endregion Global Scope #region Public Methods public async Task Create(Course model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) => await _context.Courses + public async Task> GetAll(int skip, int take) + { + return await _context.Courses .Skip(skip) .Take(take) .AsAsyncEnumerable() .OrderBy(x => x.Name) .ToListAsync(); + } - public async Task GetById(Guid? id) => - await _context.Courses + public async Task GetById(Guid? id) + { + return await _context.Courses .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id); + } public async Task Delete(Guid? id) { - var model = await GetById(id) + Course model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -48,20 +52,20 @@ public async Task Delete(Guid? id) public async Task Update(Course model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } public async Task GetCourseByName(string name) { - string loweredName = name.ToLower(); - var entities = await _context.Courses - .Where(x => x.Name!.ToLower() == loweredName) + string loweredName = name.ToLower(System.Globalization.CultureInfo.CurrentCulture); + List entities = await _context.Courses + .Where(x => x.Name!.ToLower(System.Globalization.CultureInfo.CurrentCulture) == loweredName) .AsAsyncEnumerable() .ToListAsync(); return entities.FirstOrDefault(); } - #endregion + #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/MainAreaRepository.cs b/src/Infrastructure/Persistence/Repositories/MainAreaRepository.cs index 6dadf2a3..8e56bae2 100644 --- a/src/Infrastructure/Persistence/Repositories/MainAreaRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/MainAreaRepository.cs @@ -4,44 +4,55 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class MainAreaRepository : IMainAreaRepository { #region Global Scope private readonly ApplicationDbContext _context; - public MainAreaRepository(ApplicationDbContext context) => _context = context; - #endregion + public MainAreaRepository(ApplicationDbContext context) + { + _context = context; + } + #endregion Global Scope #region Public Methods public async Task Create(MainArea model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task GetByCode(string? code) => await _context.MainAreas + public async Task GetByCode(string? code) + { + return await _context.MainAreas .Where(x => x.Code == code) .ToAsyncEnumerable() .FirstOrDefaultAsync(); + } - public async Task> GetAll(int skip, int take) => await _context.MainAreas + public async Task> GetAll(int skip, int take) + { + return await _context.MainAreas .Skip(skip) .Take(take) .AsAsyncEnumerable() .OrderBy(x => x.Name) .ToListAsync(); + } - public async Task GetById(Guid? id) => - await _context.MainAreas + public async Task GetById(Guid? id) + { + return await _context.MainAreas .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id); + } public async Task Delete(Guid? id) { - var model = await GetById(id) + MainArea model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -49,10 +60,10 @@ public async Task Delete(Guid? id) public async Task Update(MainArea model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } - #endregion + #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs b/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs index 9dcb7f15..eb41ebdc 100644 --- a/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs @@ -4,39 +4,47 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class NoticeRepository : INoticeRepository { #region Global Scope private readonly ApplicationDbContext _context; - public NoticeRepository(ApplicationDbContext context) => _context = context; - #endregion + public NoticeRepository(ApplicationDbContext context) + { + _context = context; + } + #endregion Global Scope #region Public Methods public async Task Create(Notice model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) => await _context.Notices + public async Task> GetAll(int skip, int take) + { + return await _context.Notices .Skip(skip) .Take(take) .AsAsyncEnumerable() .OrderByDescending(x => x.RegistrationStartDate) .ToListAsync(); + } - public async Task GetById(Guid? id) => - await _context.Notices + public async Task GetById(Guid? id) + { + return await _context.Notices .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id); + } public async Task Delete(Guid? id) { - var model = await GetById(id) + Notice model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -44,17 +52,17 @@ public async Task Delete(Guid? id) public async Task Update(Notice model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } public async Task GetNoticeByPeriod(DateTime start, DateTime end) { - var startDate = start.ToUniversalTime(); - var finalDate = end.ToUniversalTime(); + DateTime startDate = start.ToUniversalTime(); + DateTime finalDate = end.ToUniversalTime(); - var entities = await _context.Notices + List entities = await _context.Notices .Where(x => (x.RegistrationStartDate <= startDate && x.RegistrationEndDate >= finalDate) || (x.RegistrationStartDate <= finalDate && x.RegistrationEndDate >= finalDate) || (x.RegistrationStartDate <= startDate && x.RegistrationEndDate >= startDate)) @@ -62,6 +70,6 @@ public async Task Update(Notice model) .ToListAsync(); return entities.FirstOrDefault(); } - #endregion + #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs b/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs index 4d80ded3..ff7b566f 100644 --- a/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs @@ -3,41 +3,49 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class ProfessorRepository : IProfessorRepository { #region Global Scope private readonly ApplicationDbContext _context; - public ProfessorRepository(ApplicationDbContext context) => _context = context; - #endregion + public ProfessorRepository(ApplicationDbContext context) + { + _context = context; + } + #endregion Global Scope #region Public Methods public async Task Create(Professor model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) => await _context.Professors + public async Task> GetAll(int skip, int take) + { + return await _context.Professors .Include(x => x.User) .OrderBy(x => x.User!.Name) .AsAsyncEnumerable() .Skip(skip) .Take(take) .ToListAsync(); + } - public async Task GetById(Guid? id) => - await _context.Professors + public async Task GetById(Guid? id) + { + return await _context.Professors .Include(x => x.User) .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id); + } public async Task Delete(Guid? id) { - var model = await GetById(id) + Professor model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -45,16 +53,19 @@ public async Task Delete(Guid? id) public async Task Update(Professor model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAllActiveProfessors() => await _context.Professors + public async Task> GetAllActiveProfessors() + { + return await _context.Professors .Include(x => x.User) .AsAsyncEnumerable() .Where(x => x.SuspensionEndDate < DateTime.UtcNow || x.SuspensionEndDate == null) .ToListAsync(); - #endregion + } + #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/ProgramTypeRepository.cs b/src/Infrastructure/Persistence/Repositories/ProgramTypeRepository.cs index fee1ac86..d594cf3f 100644 --- a/src/Infrastructure/Persistence/Repositories/ProgramTypeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProgramTypeRepository.cs @@ -4,39 +4,47 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class ProgramTypeRepository : IProgramTypeRepository { #region Global Scope private readonly ApplicationDbContext _context; - public ProgramTypeRepository(ApplicationDbContext context) => _context = context; - #endregion + public ProgramTypeRepository(ApplicationDbContext context) + { + _context = context; + } + #endregion Global Scope #region Public Methods public async Task Create(ProgramType model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) => await _context.ProgramTypes + public async Task> GetAll(int skip, int take) + { + return await _context.ProgramTypes .Skip(skip) .Take(take) .AsAsyncEnumerable() .OrderBy(x => x.Name) .ToListAsync(); + } - public async Task GetById(Guid? id) => - await _context.ProgramTypes + public async Task GetById(Guid? id) + { + return await _context.ProgramTypes .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id); + } public async Task Delete(Guid? id) { - var model = await GetById(id) + ProgramType model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -44,20 +52,20 @@ public async Task Delete(Guid? id) public async Task Update(ProgramType model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } public async Task GetProgramTypeByName(string name) { - string loweredName = name.ToLower(); - var entities = await _context.ProgramTypes - .Where(x => x.Name!.ToLower() == loweredName) + string loweredName = name.ToLower(System.Globalization.CultureInfo.CurrentCulture); + List entities = await _context.ProgramTypes + .Where(x => x.Name!.ToLower(System.Globalization.CultureInfo.CurrentCulture) == loweredName) .AsAsyncEnumerable() .ToListAsync(); return entities.FirstOrDefault(); } - #endregion + #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/ProjectActivityRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectActivityRepository.cs index 0caa5fe4..2aa3c374 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectActivityRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectActivityRepository.cs @@ -3,36 +3,43 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class ProjectActivityRepository : IProjectActivityRepository { private readonly ApplicationDbContext _context; - public ProjectActivityRepository(ApplicationDbContext context) => _context = context; + public ProjectActivityRepository(ApplicationDbContext context) + { + _context = context; + } public async Task Create(ProjectActivity model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) => - await _context.ProjectActivities + public async Task> GetAll(int skip, int take) + { + return await _context.ProjectActivities .Skip(skip) .Take(take) .AsAsyncEnumerable() .ToListAsync(); + } - public async Task GetById(Guid? id) => - await _context.ProjectActivities + public async Task GetById(Guid? id) + { + return await _context.ProjectActivities .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id); + } public async Task Delete(Guid? id) { - var model = await GetById(id) + ProjectActivity model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -40,15 +47,17 @@ public async Task Delete(Guid? id) public async Task Update(ProjectActivity model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetByProjectId(Guid? projectId) => - await _context.ProjectActivities + public async Task> GetByProjectId(Guid? projectId) + { + return await _context.ProjectActivities .AsAsyncEnumerable() .Where(x => x.ProjectId == projectId) .ToListAsync(); + } } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs index a2e7341b..4441005e 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs @@ -3,17 +3,20 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class ProjectEvaluationRepository : IProjectEvaluationRepository { private readonly ApplicationDbContext _context; - public ProjectEvaluationRepository(ApplicationDbContext context) => _context = context; + public ProjectEvaluationRepository(ApplicationDbContext context) + { + _context = context; + } public async Task Create(ProjectEvaluation model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } @@ -45,8 +48,8 @@ public async Task Create(ProjectEvaluation model) public async Task Update(ProjectEvaluation model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } } diff --git a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs index ebd2fbef..81d7fb6d 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs @@ -4,30 +4,33 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class ProjectRepository : IProjectRepository { private readonly ApplicationDbContext _context; - public ProjectRepository(ApplicationDbContext context) => _context = context; + public ProjectRepository(ApplicationDbContext context) + { + _context = context; + } public async Task Create(Project model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } public async Task Update(Project model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } public async Task Delete(Guid? id) { - var model = await GetById(id) + Project model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -50,9 +53,8 @@ public async Task Delete(Guid? id) public async Task> GetProfessorProjects(int skip, int take, Guid? id, bool isClosed = false) { - if (isClosed) - { - return await _context.Projects + return isClosed + ? await _context.Projects .Include(x => x.Student) .Include(x => x.Professor) .Include(x => x.SubArea) @@ -65,10 +67,8 @@ public async Task> GetProfessorProjects(int skip, int take, || x.Status == EProjectStatus.Canceled)) .Skip(skip) .Take(take) - .ToListAsync(); - } - - return await _context.Projects + .ToListAsync() + : (IEnumerable)await _context.Projects .Include(x => x.Student) .Include(x => x.Professor) .Include(x => x.SubArea) @@ -86,9 +86,8 @@ public async Task> GetProfessorProjects(int skip, int take, public async Task> GetProjects(int skip, int take, bool isClosed = false) { - if (isClosed) - { - return await _context.Projects + return isClosed + ? await _context.Projects .Include(x => x.Student) .Include(x => x.Professor) .Include(x => x.SubArea) @@ -96,13 +95,11 @@ public async Task> GetProjects(int skip, int take, bool isC .Include(x => x.Notice) .IgnoreQueryFilters() .AsAsyncEnumerable() - .Where(x => x.Status == EProjectStatus.Closed || x.Status == EProjectStatus.Canceled) + .Where(x => x.Status is EProjectStatus.Closed or EProjectStatus.Canceled) .Skip(skip) .Take(take) - .ToListAsync(); - } - - return await _context.Projects + .ToListAsync() + : (IEnumerable)await _context.Projects .Include(x => x.Student) .Include(x => x.Professor) .Include(x => x.SubArea) @@ -110,7 +107,7 @@ public async Task> GetProjects(int skip, int take, bool isC .Include(x => x.Notice) .IgnoreQueryFilters() .AsAsyncEnumerable() - .Where(x => x.Status != EProjectStatus.Closed && x.Status != EProjectStatus.Canceled) + .Where(x => x.Status is not EProjectStatus.Closed and not EProjectStatus.Canceled) .Skip(skip) .Take(take) .ToListAsync(); @@ -118,9 +115,8 @@ public async Task> GetProjects(int skip, int take, bool isC public async Task> GetStudentProjects(int skip, int take, Guid? id, bool isClosed = false) { - if (isClosed) - { - return await _context.Projects + return isClosed + ? await _context.Projects .Include(x => x.Student) .Include(x => x.Professor) .Include(x => x.SubArea) @@ -133,10 +129,8 @@ public async Task> GetStudentProjects(int skip, int take, G || x.Status == EProjectStatus.Canceled)) .Skip(skip) .Take(take) - .ToListAsync(); - } - - return await _context.Projects + .ToListAsync() + : (IEnumerable)await _context.Projects .Include(x => x.Student) .Include(x => x.Professor) .Include(x => x.SubArea) diff --git a/src/Infrastructure/Persistence/Repositories/StudentRepository.cs b/src/Infrastructure/Persistence/Repositories/StudentRepository.cs index 450503d2..892f82f6 100644 --- a/src/Infrastructure/Persistence/Repositories/StudentRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/StudentRepository.cs @@ -1,46 +1,53 @@ -// using System.Data.Entity; -using Domain.Entities; +using Domain.Entities; using Domain.Interfaces.Repositories; using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class StudentRepository : IStudentRepository { #region Global Scope private readonly ApplicationDbContext _context; - public StudentRepository(ApplicationDbContext context) => _context = context; - #endregion + public StudentRepository(ApplicationDbContext context) + { + _context = context; + } + #endregion Global Scope #region Public Methods public async Task Create(Student model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) => await _context.Students + public async Task> GetAll(int skip, int take) + { + return await _context.Students .Include(x => x.User) .Skip(skip) .Take(take) .AsAsyncEnumerable() .OrderBy(x => x.User?.Name) .ToListAsync(); + } - public async Task GetById(Guid? id) => - await _context.Students + public async Task GetById(Guid? id) + { + return await _context.Students .Include(x => x.User) .Include(x => x.Campus) .Include(x => x.Course) .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id); + } public async Task Delete(Guid? id) { - var model = await GetById(id) + Student model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -48,10 +55,10 @@ public async Task Delete(Guid? id) public async Task Update(Student model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } - #endregion + #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/SubAreaRepository.cs b/src/Infrastructure/Persistence/Repositories/SubAreaRepository.cs index edc1b8fc..506be875 100644 --- a/src/Infrastructure/Persistence/Repositories/SubAreaRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/SubAreaRepository.cs @@ -3,31 +3,39 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class SubAreaRepository : ISubAreaRepository { #region Global Scope private readonly ApplicationDbContext _context; - public SubAreaRepository(ApplicationDbContext context) => _context = context; - #endregion + public SubAreaRepository(ApplicationDbContext context) + { + _context = context; + } + #endregion Global Scope #region Public Methods public async Task Create(SubArea model) { - _context.Add(model); - await _context.SaveChangesAsync(); + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); return model; } - public async Task GetByCode(string? code) => await _context.SubAreas + public async Task GetByCode(string? code) + { + return await _context.SubAreas .Where(x => x.Code == code) .Include(x => x.Area) .Include(x => x.Area != null ? x.Area.MainArea : null) .ToAsyncEnumerable() .FirstOrDefaultAsync(); + } - public async Task> GetSubAreasByArea(Guid? areaId, int skip, int take) => await _context.SubAreas + public async Task> GetSubAreasByArea(Guid? areaId, int skip, int take) + { + return await _context.SubAreas .Where(x => x.AreaId == areaId) .Skip(skip) .Take(take) @@ -36,18 +44,21 @@ public async Task> GetSubAreasByArea(Guid? areaId, int skip .AsAsyncEnumerable() .OrderBy(x => x.Name) .ToListAsync(); + } - public async Task GetById(Guid? id) => - await _context.SubAreas + public async Task GetById(Guid? id) + { + return await _context.SubAreas .Include(x => x.Area) .Include(x => x.Area != null ? x.Area.MainArea : null) .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id); + } public async Task Delete(Guid? id) { - var model = await GetById(id) + SubArea model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); @@ -55,8 +66,8 @@ public async Task Delete(Guid? id) public async Task Update(SubArea model) { - _context.Update(model); - await _context.SaveChangesAsync(); + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); return model; } @@ -64,6 +75,6 @@ public Task> GetAll(int skip, int take) { throw new NotImplementedException(); } - #endregion + #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/UserRepository.cs b/src/Infrastructure/Persistence/Repositories/UserRepository.cs index d0f2b46e..52794ed9 100644 --- a/src/Infrastructure/Persistence/Repositories/UserRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/UserRepository.cs @@ -3,26 +3,37 @@ using Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; -namespace Infrastructure.Persistence.Repositories +namespace Persistence.Repositories { public class UserRepository : IUserRepository { #region Global Scope private readonly ApplicationDbContext _context; - public UserRepository(ApplicationDbContext context) => _context = context; - #endregion + public UserRepository(ApplicationDbContext context) + { + _context = context; + } + #endregion Global Scope #region CRUD Methods - public async Task GetById(Guid? id) => await _context.Users + public async Task GetById(Guid? id) + { + return await _context.Users .FindAsync(id); + } - public async Task> GetActiveUsers(int skip, int take) => await _context.Users + public async Task> GetActiveUsers(int skip, int take) + { + return await _context.Users .Skip(skip) .Take(take) .OrderBy(x => x.Name) .ToListAsync(); + } - public async Task> GetInactiveUsers(int skip, int take) => await _context.Users + public async Task> GetInactiveUsers(int skip, int take) + { + return await _context.Users .IgnoreQueryFilters() .AsAsyncEnumerable() .Where(x => x.DeletedAt != null) @@ -30,34 +41,41 @@ public async Task> GetInactiveUsers(int skip, int take) => awa .Take(take) .OrderBy(x => x.Name) .ToListAsync(); + } public async Task Update(User user) { - _context.Update(user); - await _context.SaveChangesAsync(); + _ = _context.Update(user); + _ = await _context.SaveChangesAsync(); return user; } public async Task Create(User user) { - _context.Add(user); - await _context.SaveChangesAsync(); + _ = _context.Add(user); + _ = await _context.SaveChangesAsync(); return user; } public async Task Delete(Guid? id) { - var model = await GetById(id) + User model = await GetById(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); return await Update(model); } - #endregion + #endregion CRUD Methods #region Auth Methods - public async Task GetUserByEmail(string? email) => await _context.Users.FirstOrDefaultAsync(x => x.Email == email); + public async Task GetUserByEmail(string? email) + { + return await _context.Users.FirstOrDefaultAsync(x => x.Email == email); + } - public async Task GetUserByCPF(string? cpf) => await _context.Users.FirstOrDefaultAsync(x => x.CPF == cpf); - #endregion + public async Task GetUserByCPF(string? cpf) + { + return await _context.Users.FirstOrDefaultAsync(x => x.CPF == cpf); + } + #endregion Auth Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Services/AzureStorageService.cs b/src/Infrastructure/Services/AzureStorageService.cs index 2fd7e0eb..6303c5d2 100644 --- a/src/Infrastructure/Services/AzureStorageService.cs +++ b/src/Infrastructure/Services/AzureStorageService.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; -namespace Infrastructure.Services +namespace Services { public class AzureStorageService : IStorageFileService { @@ -24,61 +24,62 @@ public AzureStorageService(IConfiguration configuration, IDotEnvSecrets dotEnvSe ?? throw new Exception("A string de conexão não foi configurada."); // Verifica se as extensões de arquivos permitidas foram configuradas - var allowedExtensions = configuration.GetSection("StorageFile:AllowedExtensions") + IConfigurationSection allowedExtensions = configuration.GetSection("StorageFile:AllowedExtensions") ?? throw new Exception("As extensões de arquivos permitidas não foram configuradas."); _allowedExtensions = allowedExtensions.GetChildren().Select(x => x.Value).ToArray(); // Verifica se o tamanho máximo de arquivo foi configurado - if (long.TryParse(configuration["StorageFile:MaxFileSizeInBytes"], out long maxFileSizeInBytes)) - _maxFileSizeInBytes = maxFileSizeInBytes; - else - throw new Exception("O tamanho máximo de arquivo não foi configurado."); + _maxFileSizeInBytes = long.TryParse(configuration["StorageFile:MaxFileSizeInBytes"], out long maxFileSizeInBytes) + ? maxFileSizeInBytes + : throw new Exception("O tamanho máximo de arquivo não foi configurado."); } - #endregion + #endregion Global Scope - public async Task DeleteFile(string url) + public async Task DeleteFile(string filePath) { // Cria o cliente do blob - var fileName = url.Split("/").LastOrDefault(); + string? fileName = filePath.Split("/").LastOrDefault(); // Cria o cliente do blob - var blobClient = new BlobClient(_connectionString, _container, fileName); + BlobClient blobClient = new(_connectionString, _container, fileName); // Deleta o arquivo - await blobClient.DeleteAsync(); + _ = await blobClient.DeleteAsync(); } - public async Task UploadFileAsync(IFormFile file, string? fileName = null) + public async Task UploadFileAsync(IFormFile file, string? filePath = null) { // Remove o arquivo anterior caso já exista - if (!string.IsNullOrEmpty(fileName)) + if (!string.IsNullOrEmpty(filePath)) { // Deleta o arquivo - await DeleteFile(fileName); + await DeleteFile(filePath); // Utiliza o mesmo nome do arquivo anterior para o arquivo atual - fileName = fileName.Split("/").LastOrDefault(); + filePath = filePath.Split("/").LastOrDefault(); } // Gera um nome único para o arquivo else { - fileName = GenerateFileName(file); + filePath = GenerateFileName(file); } // Cria o cliente do blob - var blobClient = new BlobClient(_connectionString, _container, fileName); + BlobClient blobClient = new(_connectionString, _container, filePath); // Converte o arquivo para um array de bytes byte[] fileBytes; - using (var ms = new MemoryStream()) + using (MemoryStream ms = new()) { file.CopyTo(ms); fileBytes = ms.ToArray(); } // Salva o arquivo - using (var stream = new MemoryStream(fileBytes)) - await blobClient.UploadAsync(stream); + using (MemoryStream stream = new(fileBytes)) + { + _ = await blobClient.UploadAsync(stream); + } // Retorna o caminho do arquivo return blobClient.Uri.AbsoluteUri; @@ -88,17 +89,21 @@ public async Task UploadFileAsync(IFormFile file, string? fileName = nul private string GenerateFileName(IFormFile file, bool onlyPdf = false) { // Verifica se a extensão do arquivo é permitida - var extension = Path.GetExtension(file.FileName); - if ((onlyPdf && extension != ".pdf") || (!_allowedExtensions.Contains(extension))) + string extension = Path.GetExtension(file.FileName); + if ((onlyPdf && extension != ".pdf") || !_allowedExtensions.Contains(extension)) + { throw new Exception($"A extensão ({extension}) do arquivo não é permitida."); + } // Verifica o tamanho do arquivo if (file.Length > _maxFileSizeInBytes) + { throw new Exception($"O tamanho do arquivo excede o máximo de {_maxFileSizeInBytes} bytes."); + } // Gera um nome único para o arquivo return $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}"; } - #endregion + #endregion Private Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Services/Email/Configs/SmtpConfiguration.cs b/src/Infrastructure/Services/Email/Configs/SmtpConfiguration.cs index e263add4..c1875b04 100644 --- a/src/Infrastructure/Services/Email/Configs/SmtpConfiguration.cs +++ b/src/Infrastructure/Services/Email/Configs/SmtpConfiguration.cs @@ -1,8 +1,10 @@ -namespace Infrastructure.Services.Email.Configs; -public class SmtpConfiguration +namespace Services.Email.Configs { - public int Port { get; set; } - public string? Server { get; set; } - public string? Username { get; set; } - public string? Password { get; set; } + public class SmtpConfiguration + { + public int Port { get; set; } + public string? Server { get; set; } + public string? Username { get; set; } + public string? Password { get; set; } + } } \ No newline at end of file diff --git a/src/Infrastructure/Services/Email/EmailService.cs b/src/Infrastructure/Services/Email/EmailService.cs index bcba3090..ea1d113b 100644 --- a/src/Infrastructure/Services/Email/EmailService.cs +++ b/src/Infrastructure/Services/Email/EmailService.cs @@ -2,134 +2,146 @@ using System.Net.Mail; using Domain.Interfaces.Services; -namespace Infrastructure.Services.Email; -public class EmailService : IEmailService +namespace Services.Email { - #region Global Scope - private readonly string? _smtpServer; - private readonly int _smtpPort; - private readonly string? _smtpUsername; - private readonly string? _smtpPassword; - private readonly string? _currentDirectory; - - public EmailService(string? smtpServer, int smtpPort, string? smtpUsername, string? smtpPassword) + public class EmailService : IEmailService { - _smtpServer = smtpServer; - _smtpPort = smtpPort; - _smtpUsername = smtpUsername; - _smtpPassword = smtpPassword; - _currentDirectory = Path.GetDirectoryName(typeof(EmailService).Assembly.Location); - } - #endregion + #region Global Scope + private readonly string? _smtpServer; + private readonly int _smtpPort; + private readonly string? _smtpUsername; + private readonly string? _smtpPassword; + private readonly string? _currentDirectory; + + public EmailService(string? smtpServer, int smtpPort, string? smtpUsername, string? smtpPassword) + { + _smtpServer = smtpServer; + _smtpPort = smtpPort; + _smtpUsername = smtpUsername; + _smtpPassword = smtpPassword; + _currentDirectory = Path.GetDirectoryName(typeof(EmailService).Assembly.Location); + } + #endregion Global Scope - public async Task SendConfirmationEmail(string? email, string? name, string? token) - { - // Verifica se os parâmetros são nulos ou vazios - if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(token)) - throw new Exception("Parâmetros inválidos. Email, nome e token são obrigatórios."); + public async Task SendConfirmationEmail(string? email, string? name, string? token) + { + // Verifica se os parâmetros são nulos ou vazios + if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(token)) + { + throw new Exception("Parâmetros inválidos. Email, nome e token são obrigatórios."); + } - // Lê mensagem do template em html salvo localmente - string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ConfirmEmail.html")); + // Lê mensagem do template em html salvo localmente + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ConfirmEmail.html")); - // Gera mensagem de envio - const string subject = "Confirmação de Cadastro"; - string body = template.Replace("#USER_NAME#", name).Replace("#USER_TOKEN#", token); + // Gera mensagem de envio + const string subject = "Confirmação de Cadastro"; + string body = template.Replace("#USER_NAME#", name).Replace("#USER_TOKEN#", token); - // Tentativa de envio de email - await SendEmailAsync(email, subject, body); - return true; - } - - public async Task SendResetPasswordEmail(string? email, string? name, string? token) - { - // Verifica se os parâmetros são nulos ou vazios - if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(token)) - throw new Exception("Parâmetros inválidos. Email, nome e token são obrigatórios."); + // Tentativa de envio de email + await SendEmailAsync(email, subject, body); + return true; + } - // Lê mensagem do template em html salvo localmente - string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ResetPassword.html")); + public async Task SendResetPasswordEmail(string? email, string? name, string? token) + { + // Verifica se os parâmetros são nulos ou vazios + if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(token)) + { + throw new Exception("Parâmetros inválidos. Email, nome e token são obrigatórios."); + } - // Gera mensagem de envio - const string subject = "Recuperação de Senha"; - string body = template.Replace("#USER_NAME#", name).Replace("#USER_TOKEN#", token); + // Lê mensagem do template em html salvo localmente + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ResetPassword.html")); - // Tentativa de envio de email - await SendEmailAsync(email, subject, body); - return true; - } + // Gera mensagem de envio + const string subject = "Recuperação de Senha"; + string body = template.Replace("#USER_NAME#", name).Replace("#USER_TOKEN#", token); - public async Task SendNoticeEmail(string? email, string? name, DateTime? registrationStartDate, DateTime? registrationEndDate, string? noticeUrl) - { - // Verifica se os parâmetros são nulos ou vazios - if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || registrationStartDate == null || registrationEndDate == null || string.IsNullOrEmpty(noticeUrl)) - throw new Exception("Parâmetros inválidos. Email, nome, data de início e fim das inscrições e url do edital são obrigatórios."); - - // Lê mensagem do template em html salvo localmente - string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/NewEdital.html")); - - // Gera mensagem de envio - const string subject = "Novo Edital"; - string body = template - .Replace("#PROFESSOR_NAME#", name) - .Replace("#START_DATE#", registrationStartDate.Value.ToString("dd/MM/yyyy")) - .Replace("#END_DATE#", registrationEndDate.Value.ToString("dd/MM/yyyy")) - .Replace("#NOTICE_URL#", noticeUrl); - - // Tentativa de envio de email - await SendEmailAsync(email, subject, body); - } - - public async Task SendProjectNotificationEmail(string? email, string? name, string? projectTitle, string? status, string? description) - { - // Verifica se os parâmetros são nulos ou vazios - if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(projectTitle) || string.IsNullOrEmpty(status) || string.IsNullOrEmpty(description)) - throw new Exception("Parâmetros inválidos. Email, título do projeto, status e descrição são obrigatórios."); - - // Lê mensagem do template em html salvo localmente - string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ProjectStatusChange.html")); - - // Gera mensagem de envio - const string subject = "Alteração de Status de Projeto"; - string body = template - .Replace("#PROFESSOR_NAME#", name) - .Replace("#PROJECT_TITLE#", projectTitle) - .Replace("#PROJECT_STATUS#", status) - .Replace("#PROJECT_DESCRIPTION#", description); - - // Tentativa de envio de email - await SendEmailAsync(email, subject, body); - } + // Tentativa de envio de email + await SendEmailAsync(email, subject, body); + return true; + } - #region Private Methods - public async Task SendEmailAsync(string email, string subject, string message) - { - try + public async Task SendNoticeEmail(string? email, string? name, DateTime? registrationStartDate, DateTime? registrationEndDate, string? noticeUrl) { // Verifica se os parâmetros são nulos ou vazios - if (_smtpServer == null || _smtpUsername == null || _smtpPassword == null) - throw new Exception("Parâmetros de configuração de email não foram encontrados."); + if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || registrationStartDate == null || registrationEndDate == null || string.IsNullOrEmpty(noticeUrl)) + { + throw new Exception("Parâmetros inválidos. Email, nome, data de início e fim das inscrições e url do edital são obrigatórios."); + } + + // Lê mensagem do template em html salvo localmente + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/NewEdital.html")); + + // Gera mensagem de envio + const string subject = "Novo Edital"; + string body = template + .Replace("#PROFESSOR_NAME#", name) + .Replace("#START_DATE#", registrationStartDate.Value.ToString("dd/MM/yyyy")) + .Replace("#END_DATE#", registrationEndDate.Value.ToString("dd/MM/yyyy")) + .Replace("#NOTICE_URL#", noticeUrl); + + // Tentativa de envio de email + await SendEmailAsync(email, subject, body); + } - // Cria objeto de mensagem - var mc = new MailMessage(_smtpUsername, email) + public async Task SendProjectNotificationEmail(string? email, string? name, string? projectTitle, string? status, string? description) + { + // Verifica se os parâmetros são nulos ou vazios + if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(projectTitle) || string.IsNullOrEmpty(status) || string.IsNullOrEmpty(description)) { - Subject = subject, - Body = message, - IsBodyHtml = true - }; - - // Envia mensagem - using var smtpClient = new SmtpClient(_smtpServer, _smtpPort); - smtpClient.Timeout = 1000000; - smtpClient.EnableSsl = true; - smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; - smtpClient.UseDefaultCredentials = false; - smtpClient.Credentials = new NetworkCredential(_smtpUsername, _smtpPassword); - await smtpClient.SendMailAsync(mc); + throw new Exception("Parâmetros inválidos. Email, título do projeto, status e descrição são obrigatórios."); + } + + // Lê mensagem do template em html salvo localmente + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ProjectStatusChange.html")); + + // Gera mensagem de envio + const string subject = "Alteração de Status de Projeto"; + string body = template + .Replace("#PROFESSOR_NAME#", name) + .Replace("#PROJECT_TITLE#", projectTitle) + .Replace("#PROJECT_STATUS#", status) + .Replace("#PROJECT_DESCRIPTION#", description); + + // Tentativa de envio de email + await SendEmailAsync(email, subject, body); } - catch (Exception ex) + + #region Private Methods + public async Task SendEmailAsync(string email, string subject, string message) { - throw new Exception($"Não foi possível enviar o email de notificação de novo edital. {ex.Message}"); + try + { + // Verifica se os parâmetros são nulos ou vazios + if (_smtpServer == null || _smtpUsername == null || _smtpPassword == null) + { + throw new Exception("Parâmetros de configuração de email não foram encontrados."); + } + + // Cria objeto de mensagem + MailMessage mc = new(_smtpUsername, email) + { + Subject = subject, + Body = message, + IsBodyHtml = true + }; + + // Envia mensagem + using SmtpClient smtpClient = new(_smtpServer, _smtpPort); + smtpClient.Timeout = 1000000; + smtpClient.EnableSsl = true; + smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; + smtpClient.UseDefaultCredentials = false; + smtpClient.Credentials = new NetworkCredential(_smtpUsername, _smtpPassword); + await smtpClient.SendMailAsync(mc); + } + catch (Exception ex) + { + throw new Exception($"Não foi possível enviar o email de notificação de novo edital. {ex.Message}"); + } } + #endregion Private Methods } - #endregion } \ No newline at end of file diff --git a/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs b/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs index 69158979..f41647e8 100644 --- a/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs +++ b/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs @@ -1,12 +1,17 @@ using Domain.Interfaces.Services; -using Infrastructure.Services.Email.Configs; +using Services.Email.Configs; -namespace Infrastructure.Services.Email.Factories; -public class EmailServiceFactory : IEmailServiceFactory +namespace Services.Email.Factories { - public IEmailService Create(SmtpConfiguration configuration) => new EmailService( - configuration.Server, - configuration.Port, - configuration.Username, - configuration.Password); + public class EmailServiceFactory : IEmailServiceFactory + { + public IEmailService Create(SmtpConfiguration configuration) + { + return new EmailService( + configuration.Server, + configuration.Port, + configuration.Username, + configuration.Password); + } + } } \ No newline at end of file diff --git a/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs b/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs index 99649b55..3cf70abe 100644 --- a/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs +++ b/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs @@ -1,7 +1,7 @@ using Domain.Interfaces.Services; -using Infrastructure.Services.Email.Configs; +using Services.Email.Configs; -namespace Infrastructure.Services.Email.Factories +namespace Services.Email.Factories { public interface IEmailServiceFactory { diff --git a/src/Infrastructure/Services/HashService.cs b/src/Infrastructure/Services/HashService.cs index 6a881ea1..1fd9c2ac 100644 --- a/src/Infrastructure/Services/HashService.cs +++ b/src/Infrastructure/Services/HashService.cs @@ -3,52 +3,60 @@ using Domain.Interfaces.Services; using DZen.Security.Cryptography; -namespace Infrastructure.Services; -public class HashService : IHashService +namespace Services { - public string HashPassword(string password) + public class HashService : IHashService { - byte[] passwordBytes = Encoding.UTF8.GetBytes(password); - byte[] salt = new byte[16]; - using (var rng = RandomNumberGenerator.Create()) + public string HashPassword(string password) { - rng.GetBytes(salt); + byte[] passwordBytes = Encoding.UTF8.GetBytes(password); + byte[] salt = new byte[16]; + using (RandomNumberGenerator rng = RandomNumberGenerator.Create()) + { + rng.GetBytes(salt); + } + byte[] hashBytes = HashPasswordWithSHA3(passwordBytes, salt); + string saltString = Convert.ToBase64String(salt); + string hashString = Convert.ToBase64String(hashBytes); + return $"{saltString}.{hashString}"; } - byte[] hashBytes = HashPasswordWithSHA3(passwordBytes, salt); - string saltString = Convert.ToBase64String(salt); - string hashString = Convert.ToBase64String(hashBytes); - return $"{saltString}.{hashString}"; - } - private static byte[] HashPasswordWithSHA3(byte[] password, byte[] salt) - { - byte[] saltedPassword = new byte[password.Length + salt.Length]; - Buffer.BlockCopy(password, 0, saltedPassword, 0, password.Length); - Buffer.BlockCopy(salt, 0, saltedPassword, password.Length, salt.Length); - using var hasher = new SHA3256Managed(); - return hasher.ComputeHash(saltedPassword); - } + private static byte[] HashPasswordWithSHA3(byte[] password, byte[] salt) + { + byte[] saltedPassword = new byte[password.Length + salt.Length]; + Buffer.BlockCopy(password, 0, saltedPassword, 0, password.Length); + Buffer.BlockCopy(salt, 0, saltedPassword, password.Length, salt.Length); + using SHA3256Managed hasher = new(); + return hasher.ComputeHash(saltedPassword); + } - public bool VerifyPassword(string password, string? hashedPassword) - { - // Verifica se o hash da senha é vazio - if (string.IsNullOrEmpty(hashedPassword)) - return false; + public bool VerifyPassword(string password, string? hashedPassword) + { + // Verifica se o hash da senha é vazio + if (string.IsNullOrEmpty(hashedPassword)) + { + return false; + } - // Verifica se a senha é vazia - if (string.IsNullOrEmpty(password)) - return false; + // Verifica se a senha é vazia + if (string.IsNullOrEmpty(password)) + { + return false; + } - // Verifica o formato do hash da senha - string[] parts = hashedPassword.Split('.'); - if (parts.Length != 2) - return false; + // Verifica o formato do hash da senha + string[] parts = hashedPassword.Split('.'); + if (parts.Length != 2) + { + return false; + } - // Verifica se o hash da senha é válido - byte[] salt = Convert.FromBase64String(parts[0]); - byte[] hashBytes = Convert.FromBase64String(parts[1]); - byte[] passwordBytes = Encoding.UTF8.GetBytes(password); - byte[] hashedPasswordBytes = HashPasswordWithSHA3(passwordBytes, salt); - return hashedPasswordBytes.SequenceEqual(hashBytes); + // Verifica se o hash da senha é válido + byte[] salt = Convert.FromBase64String(parts[0]); + byte[] hashBytes = Convert.FromBase64String(parts[1]); + byte[] passwordBytes = Encoding.UTF8.GetBytes(password); + byte[] hashedPasswordBytes = HashPasswordWithSHA3(passwordBytes, salt); + return hashedPasswordBytes.SequenceEqual(hashBytes); + } } } \ No newline at end of file diff --git a/src/Infrastructure/Services/IDotEnvSecrets.cs b/src/Infrastructure/Services/IDotEnvSecrets.cs index 2c869c86..c5f5b3ef 100644 --- a/src/Infrastructure/Services/IDotEnvSecrets.cs +++ b/src/Infrastructure/Services/IDotEnvSecrets.cs @@ -1,4 +1,4 @@ -namespace Infrastructure.Services +namespace Services { public interface IDotEnvSecrets { diff --git a/src/Infrastructure/Services/StorageFileService.cs b/src/Infrastructure/Services/StorageFileService.cs index 8cb7afb9..7f858734 100644 --- a/src/Infrastructure/Services/StorageFileService.cs +++ b/src/Infrastructure/Services/StorageFileService.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; -namespace Infrastructure.Services +namespace Services { public class StorageFileService : IStorageFileService { @@ -21,21 +21,20 @@ public StorageFileService(IConfiguration configuration) ?? throw new Exception("O diretório de armazenamento de arquivos não foi configurado."); // Verifica se as extensões de arquivos permitidas foram configuradas - var allowedExtensions = configuration.GetSection("StorageFile:AllowedExtensions") + IConfigurationSection allowedExtensions = configuration.GetSection("StorageFile:AllowedExtensions") ?? throw new Exception("As extensões de arquivos permitidas não foram configuradas."); _allowedExtensions = allowedExtensions.GetChildren().Select(x => x.Value).ToArray(); // Verifica se o tamanho máximo de arquivo foi configurado - if (long.TryParse(configuration["StorageFile:MaxFileSizeInBytes"], out long maxFileSizeInBytes)) - _maxFileSizeInBytes = maxFileSizeInBytes; - else - throw new Exception("O tamanho máximo de arquivo não foi configurado."); + _maxFileSizeInBytes = long.TryParse(configuration["StorageFile:MaxFileSizeInBytes"], out long maxFileSizeInBytes) + ? maxFileSizeInBytes + : throw new Exception("O tamanho máximo de arquivo não foi configurado."); // Verifica se o diretório de armazenamento de arquivos dos editais foi configurado _folder = configuration["StorageFile:Folder"] ?? throw new Exception("O diretório de armazenamento de arquivos não foi configurado."); } - #endregion + #endregion Global Scope #region Public Methods public async Task UploadFileAsync(IFormFile file, string? filePath = null) @@ -44,8 +43,10 @@ public async Task UploadFileAsync(IFormFile file, string? filePath = nul filePath = await GenerateFilePath(file, _folder, filePath, true); // Salva o arquivo - using (var stream = new FileStream(filePath, FileMode.Create)) + using (FileStream stream = new(filePath, FileMode.Create)) + { await file.CopyToAsync(stream); + } // Retorna o caminho do arquivo return filePath; @@ -56,7 +57,10 @@ public async Task DeleteFile(string filePath) try { if (File.Exists(filePath)) + { File.Delete(filePath); + } + await Task.CompletedTask; } catch (Exception ex) @@ -64,19 +68,23 @@ public async Task DeleteFile(string filePath) throw new Exception($"O arquivo {filePath} não pode ser excluído.", ex); } } - #endregion + #endregion Public Methods #region Private Methods private async Task GenerateFilePath(IFormFile file, string custom_directory, string? filePath = null, bool onlyPdf = false) { // Verifica se a extensão do arquivo é permitida - var extension = Path.GetExtension(file.FileName); - if ((onlyPdf && extension != ".pdf") || (!_allowedExtensions.Contains(extension))) + string extension = Path.GetExtension(file.FileName); + if ((onlyPdf && extension != ".pdf") || !_allowedExtensions.Contains(extension)) + { throw new Exception($"A extensão {extension} do arquivo não é permitida."); + } // Verifica o tamanho do arquivo if (file.Length > _maxFileSizeInBytes) + { throw new Exception($"O tamanho do arquivo excede o máximo de {_maxFileSizeInBytes} bytes."); + } // Gera um nome único para o arquivo string fileName = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}"; @@ -87,7 +95,9 @@ private async Task GenerateFilePath(IFormFile file, string custom_direct // Cria o diretório caso não exista string dirPath = Path.Combine(_directory, custom_directory); if (!Directory.Exists(dirPath)) - Directory.CreateDirectory(dirPath); + { + _ = Directory.CreateDirectory(dirPath); + } // Gera o caminho do arquivo filePath = Path.Combine(dirPath, fileName); @@ -103,14 +113,14 @@ private async Task GenerateFilePath(IFormFile file, string custom_direct private static IConfiguration InitializeConfigs() { // Adicione o caminho base para o arquivo appsettings.json - var basePath = Path.GetDirectoryName(typeof(StorageFileService).Assembly.Location); - var configurationBuilder = new ConfigurationBuilder() + string? basePath = Path.GetDirectoryName(typeof(StorageFileService).Assembly.Location); + IConfigurationBuilder configurationBuilder = new ConfigurationBuilder() .SetBasePath(basePath!) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); // Use a configuração criada acima para ler as configurações do appsettings.json return configurationBuilder.Build(); } - #endregion + #endregion Private Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Services/TokenAuthenticationService.cs b/src/Infrastructure/Services/TokenAuthenticationService.cs index 36e92fa7..f6e01e5d 100644 --- a/src/Infrastructure/Services/TokenAuthenticationService.cs +++ b/src/Infrastructure/Services/TokenAuthenticationService.cs @@ -1,104 +1,123 @@ -using System.Security.Claims; -using System.IdentityModel.Tokens.Jwt; -using Domain.Contracts.Auth; -using Domain.Interfaces.Services; -using Microsoft.IdentityModel.Tokens; +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; using System.Text; +using Domain.Interfaces.Services; +using Domain.UseCases.Ports.Auth; using Microsoft.AspNetCore.Http; +using Microsoft.IdentityModel.Tokens; -namespace Infrastructure.Services; -public class TokenAuthenticationService : ITokenAuthenticationService +namespace Services { - #region Global Scope - private readonly IDotEnvSecrets _dotEnvSecrets; - private readonly IHttpContextAccessor _httpContextAccessor; - - public TokenAuthenticationService(IHttpContextAccessor httpContextAccessor, IDotEnvSecrets dotEnvSecrets) + public class TokenAuthenticationService : ITokenAuthenticationService { - _httpContextAccessor = httpContextAccessor; - _dotEnvSecrets = dotEnvSecrets; - } - #endregion + #region Global Scope + private readonly IDotEnvSecrets _dotEnvSecrets; + private readonly IHttpContextAccessor _httpContextAccessor; - public UserLoginOutput GenerateToken(Guid? id, string? userName, string? role) - { - // Verifica se o id é nulo - if (id == null) - throw new Exception("Id do usuário não informado."); - - // Verifica se o nome do usuário é nulo - if (string.IsNullOrEmpty(userName)) - throw new Exception("Nome do usuário não informado."); - - // Verifica se o perfil do usuário é nulo - if (string.IsNullOrEmpty(role)) - throw new Exception("Perfil do usuário não informado."); - - // Declaração do usuário - var claims = new[] + public TokenAuthenticationService(IDotEnvSecrets dotEnvSecrets, IHttpContextAccessor httpContextAccessor) { + _dotEnvSecrets = dotEnvSecrets; + _httpContextAccessor = httpContextAccessor; + } + #endregion Global Scope + + /// + /// Gera o token de autenticação. + /// + /// Id do usuário. + /// Nome do usuário. + /// Perfil do usuário. + /// Token de autenticação. + public UserLoginOutput GenerateToken(Guid? id, string? userName, string? role) + { + // Verifica se o id é nulo + if (id == null) + { + throw new Exception("Id do usuário não informado."); + } + + // Verifica se o nome do usuário é nulo + if (string.IsNullOrEmpty(userName)) + { + throw new Exception("Nome do usuário não informado."); + } + + // Verifica se o perfil do usuário é nulo + if (string.IsNullOrEmpty(role)) + { + throw new Exception("Perfil do usuário não informado."); + } + + // Declaração do usuário + Claim[] claims = new[] + { new Claim(ClaimTypes.Sid, id.Value.ToString()), new Claim(ClaimTypes.Name, userName), new Claim(ClaimTypes.Role, role), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) }; - // Gerar chave privada para assinar o token - var privateKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_dotEnvSecrets.GetJwtSecret() - ?? throw new Exception("Chave secreta não informada."))); - - // Gerar a assinatura digital - var credentials = new SigningCredentials(privateKey, SecurityAlgorithms.HmacSha256); - - // Tempo de expiração do token - var expireIn = int.Parse(_dotEnvSecrets.GetJwtExpirationTime() ?? "10"); - - // Definir o tempo de expiração - var expiration = DateTime.UtcNow.AddMinutes(expireIn); - - // Gerar o Token - var token = new JwtSecurityToken( - issuer: _dotEnvSecrets.GetJwtIssuer() ?? throw new Exception("Emissor do token não informado."), - audience: _dotEnvSecrets.GetJwtAudience() ?? throw new Exception("Público do token não informado."), - claims: claims, - expires: expiration, - signingCredentials: credentials); - - return new UserLoginOutput() - { - Token = new JwtSecurityTokenHandler().WriteToken(token), - Expiration = expiration - }; - } - - /// - /// Retorna as claims do usuário autenticado. - /// - /// Id, Name e Role. - public UserClaimsOutput GetUserAuthenticatedClaims() - { - // Get the current HttpContext to retrieve the claims principal - var httpContext = _httpContextAccessor.HttpContext; - - // Check if the user is authenticated - if (httpContext?.User.Identity == null || httpContext?.User.Identity.IsAuthenticated != true) - throw new Exception("User is not authenticated."); - - // Get the claims principal - var claimsIdentity = httpContext.User.Identity as ClaimsIdentity - ?? throw new Exception("User is not authenticated."); - - // Get the user's ID - var id = claimsIdentity.FindFirst(ClaimTypes.Sid)?.Value; - if (string.IsNullOrEmpty(id)) - throw new Exception("User ID not provided."); - - // Return the user's claims - return new UserClaimsOutput() + // Gerar chave privada para assinar o token + SymmetricSecurityKey privateKey = new(Encoding.UTF8.GetBytes(_dotEnvSecrets.GetJwtSecret() + ?? throw new Exception("Chave secreta não informada."))); + + // Gerar a assinatura digital + SigningCredentials credentials = new(privateKey, SecurityAlgorithms.HmacSha256); + + // Tempo de expiração do token + int expireIn = int.Parse(_dotEnvSecrets.GetJwtExpirationTime() ?? "10"); + + // Definir o tempo de expiração + DateTime expiration = DateTime.UtcNow.AddMinutes(expireIn); + + // Gerar o Token + JwtSecurityToken token = new( + issuer: _dotEnvSecrets.GetJwtIssuer() ?? throw new Exception("Emissor do token não informado."), + audience: _dotEnvSecrets.GetJwtAudience() ?? throw new Exception("Público do token não informado."), + claims: claims, + expires: expiration, + signingCredentials: credentials); + + return new UserLoginOutput() + { + Token = new JwtSecurityTokenHandler().WriteToken(token), + Expiration = expiration + }; + } + + /// + /// Retorna as claims do usuário autenticado. + /// + /// Id, Name e Role. + public UserClaimsOutput GetUserAuthenticatedClaims() { - Id = Guid.Parse(id), - Name = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value, - Role = claimsIdentity.FindFirst(ClaimTypes.Role)?.Value - }; + // Get the current HttpContext to retrieve the claims principal + HttpContext? httpContext = _httpContextAccessor.HttpContext; + + // Check if the user is authenticated + if (httpContext?.User.Identity == null || httpContext?.User.Identity.IsAuthenticated != true) + { + throw new Exception("User is not authenticated."); + } + + // Get the claims principal + ClaimsIdentity claimsIdentity = httpContext.User.Identity as ClaimsIdentity + ?? throw new Exception("User is not authenticated."); + + // Get the user's ID + string? id = claimsIdentity.FindFirst(ClaimTypes.Sid)?.Value; + if (string.IsNullOrEmpty(id)) + { + throw new Exception("User ID not provided."); + } + + // Return the user's claims + return new UserClaimsOutput() + { + Id = Guid.Parse(id), + Name = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value, + Role = claimsIdentity.FindFirst(ClaimTypes.Role)?.Value + }; + } } } diff --git a/src/Infrastructure/WebAPI/Controllers/ActivityController.cs b/src/Infrastructure/WebAPI/Controllers/ActivityController.cs index 2cd4414c..4581a205 100644 --- a/src/Infrastructure/WebAPI/Controllers/ActivityController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ActivityController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller responsável por gerenciar as atividades. @@ -38,7 +38,7 @@ public async Task GetLastNoticeActivities() { try { - var result = await _activityPresenterController.GetLastNoticeActivities(); + IEnumerable result = await _activityPresenterController.GetLastNoticeActivities(); _logger.LogInformation("Atividades encontradas."); return Ok(result); } @@ -64,7 +64,7 @@ public async Task GetActivitiesByNoticeId(Guid? noticeId) { try { - var result = await _activityPresenterController.GetActivitiesByNoticeId(noticeId); + IEnumerable result = await _activityPresenterController.GetActivitiesByNoticeId(noticeId); _logger.LogInformation("Atividades encontradas para o edital {noticeId}.", noticeId); return Ok(result); } diff --git a/src/Infrastructure/WebAPI/Controllers/AreaController.cs b/src/Infrastructure/WebAPI/Controllers/AreaController.cs index 186cffa6..735dc13d 100644 --- a/src/Infrastructure/WebAPI/Controllers/AreaController.cs +++ b/src/Infrastructure/WebAPI/Controllers/AreaController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de Área. @@ -26,7 +26,7 @@ public AreaController(IAreaPresenterController service, ILogger _service = service; _logger = logger; } - #endregion + #endregion Global Scope /// /// Busca área pelo id. @@ -49,7 +49,7 @@ public async Task> GetById(Guid? id) try { - var model = await _service.GetById(id); + Adapters.Gateways.Base.IResponse model = await _service.GetById(id); _logger.LogInformation("Método ({MethodName}) executado. Retorno: Id = {id}", id); return Ok(model); } @@ -81,7 +81,7 @@ public async Task>> GetAreasBy try { - var models = await _service.GetAreasByMainArea(mainAreaId, skip, take); + IEnumerable models = await _service.GetAreasByMainArea(mainAreaId, skip, take); if (models == null) { const string msg = "Nenhuma Área encontrada."; @@ -112,7 +112,7 @@ public async Task> Create([FromBody] Crea { try { - var model = await _service.Create(request) as DetailedReadAreaResponse; + DetailedReadAreaResponse? model = await _service.Create(request) as DetailedReadAreaResponse; _logger.LogInformation("Método finalizado, retorno: Id = {id}", model?.Id); return Ok(model); } @@ -135,7 +135,7 @@ public async Task> Update(Guid? id, [From { try { - var model = await _service.Update(id, request) as DetailedReadAreaResponse; + DetailedReadAreaResponse? model = await _service.Update(id, request) as DetailedReadAreaResponse; _logger.LogInformation("Área atualizada: {id}", model?.Id); return Ok(model); } @@ -165,7 +165,7 @@ public async Task> Delete(Guid? id) try { - var model = await _service.Delete(id.Value) as DetailedReadAreaResponse; + DetailedReadAreaResponse? model = await _service.Delete(id.Value) as DetailedReadAreaResponse; _logger.LogInformation("Área removida: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs b/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs index ab97bc10..01db3dac 100644 --- a/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs +++ b/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de Bolsa de Assistência. @@ -26,7 +26,7 @@ public AssistanceTypeController(IAssistanceTypePresenterController service, ILog _service = service; _logger = logger; } - #endregion + #endregion Global Scope /// /// Busca bolsa de assistência pelo id. @@ -47,7 +47,7 @@ public async Task> GetById(Guid try { - var model = await _service.GetById(id); + Adapters.Gateways.Base.IResponse model = await _service.GetById(id); _logger.LogInformation("Bolsa de Assistência encontrado para o id {id}.", id); return Ok(model); } @@ -68,7 +68,7 @@ public async Task> GetById(Guid [ProducesResponseType(StatusCodes.Status200OK)] public async Task>> GetAll(int skip = 0, int take = 50) { - var models = await _service.GetAll(skip, take); + IEnumerable models = await _service.GetAll(skip, take); if (models == null) { const string msg = "Nenhum Bolsa de Assistência encontrado."; @@ -92,7 +92,7 @@ public async Task> Create([From { try { - var model = await _service.Create(request) as DetailedReadAssistanceTypeResponse; + DetailedReadAssistanceTypeResponse? model = await _service.Create(request) as DetailedReadAssistanceTypeResponse; _logger.LogInformation("Bolsa de Assistência criado: {id}", model?.Id); return Ok(model); } @@ -115,7 +115,7 @@ public async Task> Update(Guid? { try { - var model = await _service.Update(id, request) as DetailedReadAssistanceTypeResponse; + DetailedReadAssistanceTypeResponse? model = await _service.Update(id, request) as DetailedReadAssistanceTypeResponse; _logger.LogInformation("Bolsa de Assistência atualizado: {id}", model?.Id); return Ok(model); } @@ -145,7 +145,7 @@ public async Task> Delete(Guid? try { - var model = await _service.Delete(id.Value) as DetailedReadAssistanceTypeResponse; + DetailedReadAssistanceTypeResponse? model = await _service.Delete(id.Value) as DetailedReadAssistanceTypeResponse; _logger.LogInformation("Bolsa de Assistência removido: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/AuthController.cs b/src/Infrastructure/WebAPI/Controllers/AuthController.cs index 77d5f1a6..0b030402 100644 --- a/src/Infrastructure/WebAPI/Controllers/AuthController.cs +++ b/src/Infrastructure/WebAPI/Controllers/AuthController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de Autenticação. @@ -25,7 +25,7 @@ public AuthController(IAuthPresenterController authService, ILogger /// Realiza a confirmação do e-mail do usuário através do token de validação fornecido e do E-mail do usuário. @@ -40,7 +40,7 @@ public async Task> ConfirmEmail(string? email, string? toke { try { - var result = await _authService.ConfirmEmail(email, token); + string result = await _authService.ConfirmEmail(email, token); _logger.LogInformation("Resultado: {Result}", result); return Ok(result); } @@ -64,7 +64,7 @@ public async Task> ForgotPassword(string? email) { try { - var result = await _authService.ForgotPassword(email); + string result = await _authService.ForgotPassword(email); _logger.LogInformation("Resultado: {Result}", result); return Ok(result); } @@ -87,7 +87,7 @@ public async Task> Login([FromBody] UserLoginReq { try { - var model = await _authService.Login(request); + UserLoginResponse model = await _authService.Login(request); _logger.LogInformation("Login realizado pelo usuário: {email}.", request.Email); return Ok(model); } @@ -110,7 +110,7 @@ public async Task> ResetPassword([FromBody] UserResetPasswo { try { - var result = await _authService.ResetPassword(request); + string result = await _authService.ResetPassword(request); _logger.LogInformation("Resultado: {Result}", result); return Ok(result); } diff --git a/src/Infrastructure/WebAPI/Controllers/CampusController.cs b/src/Infrastructure/WebAPI/Controllers/CampusController.cs index 53bf689e..129f42bb 100644 --- a/src/Infrastructure/WebAPI/Controllers/CampusController.cs +++ b/src/Infrastructure/WebAPI/Controllers/CampusController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de Campus. @@ -26,7 +26,7 @@ public CampusController(ICampusPresenterController service, ILogger /// Busca campus pelo id. @@ -47,7 +47,7 @@ public async Task> GetById(Guid? id) try { - var model = await _service.GetById(id); + Adapters.Gateways.Base.IResponse model = await _service.GetById(id); _logger.LogInformation("Campus encontrado para o id {id}.", id); return Ok(model); } @@ -68,7 +68,7 @@ public async Task> GetById(Guid? id) [ProducesResponseType(StatusCodes.Status200OK)] public async Task>> GetAll(int skip = 0, int take = 50) { - var models = await _service.GetAll(skip, take); + IEnumerable models = await _service.GetAll(skip, take); if (models == null) { const string msg = "Nenhum Campus encontrado."; @@ -92,7 +92,7 @@ public async Task> Create([FromBody] Cr { try { - var model = await _service.Create(request) as DetailedReadCampusResponse; + DetailedReadCampusResponse? model = await _service.Create(request) as DetailedReadCampusResponse; _logger.LogInformation("Campus criado: {id}", model?.Id); return Ok(model); } @@ -115,7 +115,7 @@ public async Task> Update(Guid? id, [Fr { try { - var model = await _service.Update(id, request) as DetailedReadCampusResponse; + DetailedReadCampusResponse? model = await _service.Update(id, request) as DetailedReadCampusResponse; _logger.LogInformation("Campus atualizado: {id}", model?.Id); return Ok(model); } @@ -145,7 +145,7 @@ public async Task> Delete(Guid? id) try { - var model = await _service.Delete(id.Value) as DetailedReadCampusResponse; + DetailedReadCampusResponse? model = await _service.Delete(id.Value) as DetailedReadCampusResponse; _logger.LogInformation("Campus removido: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/CourseController.cs b/src/Infrastructure/WebAPI/Controllers/CourseController.cs index 55326397..43663be4 100644 --- a/src/Infrastructure/WebAPI/Controllers/CourseController.cs +++ b/src/Infrastructure/WebAPI/Controllers/CourseController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de Curso. @@ -26,7 +26,7 @@ public CourseController(ICoursePresenterController service, ILogger /// Busca curso pelo id. @@ -47,7 +47,7 @@ public async Task> GetById(Guid? id) try { - var model = await _service.GetById(id); + Adapters.Gateways.Base.IResponse model = await _service.GetById(id); _logger.LogInformation("Curso encontrado para o id {id}.", id); return Ok(model); } @@ -68,7 +68,7 @@ public async Task> GetById(Guid? id) [ProducesResponseType(StatusCodes.Status200OK)] public async Task>> GetAll(int skip = 0, int take = 50) { - var models = await _service.GetAll(skip, take); + IEnumerable models = await _service.GetAll(skip, take); if (models == null) { const string msg = "Nenhum Curso encontrado."; @@ -92,7 +92,7 @@ public async Task> Create([FromBody] Cr { try { - var model = await _service.Create(request) as DetailedReadCourseResponse; + DetailedReadCourseResponse? model = await _service.Create(request) as DetailedReadCourseResponse; _logger.LogInformation("Curso criado: {id}", model?.Id); return Ok(model); } @@ -115,7 +115,7 @@ public async Task> Update(Guid? id, [Fr { try { - var model = await _service.Update(id, request) as DetailedReadCourseResponse; + DetailedReadCourseResponse? model = await _service.Update(id, request) as DetailedReadCourseResponse; _logger.LogInformation("Curso atualizado: {id}", model?.Id); return Ok(model); } @@ -145,7 +145,7 @@ public async Task> Delete(Guid? id) try { - var model = await _service.Delete(id.Value) as DetailedReadCourseResponse; + DetailedReadCourseResponse? model = await _service.Delete(id.Value) as DetailedReadCourseResponse; _logger.LogInformation("Curso removido: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/MainAreaController.cs b/src/Infrastructure/WebAPI/Controllers/MainAreaController.cs index 058dca53..30373af9 100644 --- a/src/Infrastructure/WebAPI/Controllers/MainAreaController.cs +++ b/src/Infrastructure/WebAPI/Controllers/MainAreaController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de Área Principal. @@ -26,7 +26,7 @@ public MainAreaController(IMainAreaPresenterController service, ILogger /// Busca área principal pelo id. @@ -47,7 +47,7 @@ public async Task> GetById(Guid? id) try { - var model = await _service.GetById(id); + Adapters.Gateways.Base.IResponse model = await _service.GetById(id); _logger.LogInformation("Área Principal encontrada para o id {id}.", id); return Ok(model); } @@ -68,7 +68,7 @@ public async Task> GetById(Guid? id) [ProducesResponseType(StatusCodes.Status200OK)] public async Task>> GetAll(int skip = 0, int take = 50) { - var models = await _service.GetAll(skip, take); + IEnumerable models = await _service.GetAll(skip, take); if (models == null) { const string msg = "Nenhuma Área Principal encontrada."; @@ -92,7 +92,7 @@ public async Task> Create([FromBody] { try { - var model = await _service.Create(request) as DetailedReadMainAreaResponse; + DetailedReadMainAreaResponse? model = await _service.Create(request) as DetailedReadMainAreaResponse; _logger.LogInformation("Área principal criada: {id}", model?.Id); return Ok(model); } @@ -115,7 +115,7 @@ public async Task> Update(Guid? id, [ { try { - var model = await _service.Update(id, request) as DetailedReadMainAreaResponse; + DetailedReadMainAreaResponse? model = await _service.Update(id, request) as DetailedReadMainAreaResponse; _logger.LogInformation("Área principal atualizada: {id}", model?.Id); return Ok(model); } @@ -145,7 +145,7 @@ public async Task> Delete(Guid? id) try { - var model = await _service.Delete(id.Value) as DetailedReadMainAreaResponse; + DetailedReadMainAreaResponse? model = await _service.Delete(id.Value) as DetailedReadMainAreaResponse; _logger.LogInformation("Área principal removida: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/NoticeController.cs b/src/Infrastructure/WebAPI/Controllers/NoticeController.cs index 9978faa6..beafdc6e 100644 --- a/src/Infrastructure/WebAPI/Controllers/NoticeController.cs +++ b/src/Infrastructure/WebAPI/Controllers/NoticeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de Edital. @@ -26,7 +26,7 @@ public NoticeController(INoticePresenterController service, ILogger /// Busca edital pelo id. @@ -47,7 +47,7 @@ public async Task> GetById(Guid? id) try { - var model = await _service.GetById(id); + Adapters.Gateways.Base.IResponse model = await _service.GetById(id); _logger.LogInformation("Edital encontrado para o id {id}.", id); return Ok(model); } @@ -68,7 +68,7 @@ public async Task> GetById(Guid? id) [ProducesResponseType(StatusCodes.Status200OK)] public async Task>> GetAll(int skip = 0, int take = 50) { - var models = await _service.GetAll(skip, take); + IEnumerable models = await _service.GetAll(skip, take); if (models == null) { const string msg = "Nenhum Edital encontrado."; @@ -92,7 +92,7 @@ public async Task> Create([FromForm] Cr { try { - var model = await _service.Create(request) as DetailedReadNoticeResponse; + DetailedReadNoticeResponse? model = await _service.Create(request) as DetailedReadNoticeResponse; _logger.LogInformation("Edital criado: {id}", model?.Id); return Ok(model); } @@ -115,7 +115,7 @@ public async Task> Update(Guid? id, [Fr { try { - var model = await _service.Update(id, request) as DetailedReadNoticeResponse; + DetailedReadNoticeResponse? model = await _service.Update(id, request) as DetailedReadNoticeResponse; _logger.LogInformation("Edital atualizado: {id}", model?.Id); return Ok(model); } @@ -145,7 +145,7 @@ public async Task> Delete(Guid? id) try { - var model = await _service.Delete(id.Value) as DetailedReadNoticeResponse; + DetailedReadNoticeResponse? model = await _service.Delete(id.Value) as DetailedReadNoticeResponse; _logger.LogInformation("Edital removido: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/ProfessorController.cs b/src/Infrastructure/WebAPI/Controllers/ProfessorController.cs index e9f6ab55..859ce787 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProfessorController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProfessorController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de Professor. @@ -26,7 +26,7 @@ public ProfessorController(IProfessorPresenterController service, ILogger /// Busca Professor pelo id. @@ -47,7 +47,7 @@ public async Task> GetById(Guid? id) try { - var model = await _service.GetById(id); + Adapters.Gateways.Base.IResponse model = await _service.GetById(id); _logger.LogInformation("Professor encontrado para o id {id}.", id); return Ok(model); } @@ -68,7 +68,7 @@ public async Task> GetById(Guid? id) [ProducesResponseType(StatusCodes.Status200OK)] public async Task>> GetAll(int skip = 0, int take = 50) { - var models = await _service.GetAll(skip, take); + IEnumerable models = await _service.GetAll(skip, take); if (models == null) { const string msg = "Nenhum Professor encontrado."; @@ -92,7 +92,7 @@ public async Task> Create([FromBody] { try { - var model = await _service.Create(request) as DetailedReadProfessorResponse; + DetailedReadProfessorResponse? model = await _service.Create(request) as DetailedReadProfessorResponse; _logger.LogInformation("Professor criado: {id}", model?.Id); return Ok(model); } @@ -115,7 +115,7 @@ public async Task> Update(Guid? id, { try { - var model = await _service.Update(id, request) as DetailedReadProfessorResponse; + DetailedReadProfessorResponse? model = await _service.Update(id, request) as DetailedReadProfessorResponse; _logger.LogInformation("Professor atualizado: {id}", model?.Id); return Ok(model); } @@ -145,7 +145,7 @@ public async Task> Delete(Guid? id) try { - var model = await _service.Delete(id.Value) as DetailedReadProfessorResponse; + DetailedReadProfessorResponse? model = await _service.Delete(id.Value) as DetailedReadProfessorResponse; _logger.LogInformation("Professor removido: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/ProgramTypeController.cs b/src/Infrastructure/WebAPI/Controllers/ProgramTypeController.cs index 17652f6c..df4f8ecf 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProgramTypeController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProgramTypeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de Tipo de Programa. @@ -26,7 +26,7 @@ public ProgramTypeController(IProgramTypePresenterController service, ILogger /// Busca tipo de programa pelo id. @@ -47,7 +47,7 @@ public async Task> GetById(Guid? i try { - var model = await _service.GetById(id); + Adapters.Gateways.Base.IResponse model = await _service.GetById(id); _logger.LogInformation("Tipo de Programa encontrado para o id {id}.", id); return Ok(model); } @@ -68,7 +68,7 @@ public async Task> GetById(Guid? i [ProducesResponseType(StatusCodes.Status200OK)] public async Task>> GetAll(int skip = 0, int take = 50) { - var models = await _service.GetAll(skip, take); + IEnumerable models = await _service.GetAll(skip, take); if (models == null) { const string msg = "Nenhum Tipo de Programa encontrado."; @@ -92,7 +92,7 @@ public async Task> Create([FromBod { try { - var model = await _service.Create(request) as DetailedReadProgramTypeResponse; + DetailedReadProgramTypeResponse? model = await _service.Create(request) as DetailedReadProgramTypeResponse; _logger.LogInformation("Tipo de Programa criado: {id}", model?.Id); return Ok(model); } @@ -115,7 +115,7 @@ public async Task> Update(Guid? id { try { - var model = await _service.Update(id, request) as DetailedReadProgramTypeResponse; + DetailedReadProgramTypeResponse? model = await _service.Update(id, request) as DetailedReadProgramTypeResponse; _logger.LogInformation("Tipo de Programa atualizado: {id}", model?.Id); return Ok(model); } @@ -145,7 +145,7 @@ public async Task> Delete(Guid? id try { - var model = await _service.Delete(id.Value) as DetailedReadProgramTypeResponse; + DetailedReadProgramTypeResponse? model = await _service.Delete(id.Value) as DetailedReadProgramTypeResponse; _logger.LogInformation("Tipo de Programa removido: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/ProjectController.cs b/src/Infrastructure/WebAPI/Controllers/ProjectController.cs index c4e82e5a..56be58a0 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProjectController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProjectController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de projetos. @@ -29,7 +29,7 @@ public ProjectController( _service = service; _logger = logger; } - #endregion + #endregion Global Scope /// /// Busca projeto pelo id. @@ -51,7 +51,7 @@ public async Task> GetProjectById(Guid try { - var model = await _service.GetProjectById(id); + DetailedReadProjectResponse model = await _service.GetProjectById(id); _logger.LogInformation("Projeto encontrado para o id {id}.", id); return Ok(model); } @@ -75,7 +75,7 @@ public async Task> GetProjectById(Guid [ProducesResponseType(StatusCodes.Status200OK)] public async Task>> GetOpenProjects(int skip = 0, int take = 50, bool onlyMyProjects = true) { - var models = await _service.GetOpenProjects(skip, take, onlyMyProjects); + IList models = await _service.GetOpenProjects(skip, take, onlyMyProjects); if (models == null) { const string msg = "Nenhum Projeto encontrado."; @@ -99,7 +99,7 @@ public async Task>> GetOpen [ProducesResponseType(StatusCodes.Status200OK)] public async Task>> GetClosedProjects(int skip = 0, int take = 50, bool onlyMyProjects = true) { - var models = await _service.GetClosedProjects(skip, take, onlyMyProjects); + IList models = await _service.GetClosedProjects(skip, take, onlyMyProjects); if (models == null) { const string msg = "Nenhum Projeto encontrado."; @@ -124,7 +124,7 @@ public async Task> OpenProject([FromBod { try { - var model = await _service.OpenProject(request); + ResumedReadProjectResponse? model = await _service.OpenProject(request); _logger.LogInformation("Projeto aberto: {id}", model?.Id); return Ok(model); } @@ -149,7 +149,7 @@ public async Task> UpdateProject(Guid? { try { - var model = await _service.UpdateProject(id, request); + ResumedReadProjectResponse? model = await _service.UpdateProject(id, request); _logger.LogInformation("Projeto atualizado: {id}", model?.Id); return Ok(model); } @@ -181,7 +181,7 @@ public async Task> CancelProject(Guid? try { - var model = await _service.CancelProject(id.Value, observation); + ResumedReadProjectResponse? model = await _service.CancelProject(id.Value, observation); _logger.LogInformation("Projeto removido: {id}", model?.Id); return Ok(model); } @@ -213,7 +213,7 @@ public async Task> AppealProject(Guid? try { - var model = await _service.AppealProject(id.Value, appealDescription); + ResumedReadProjectResponse? model = await _service.AppealProject(id.Value, appealDescription); _logger.LogInformation("Recurso do Projeto: {id}", model?.Id); return Ok(model); } @@ -244,7 +244,7 @@ public async Task> SubmitProject(Guid? try { - var model = await _service.SubmitProject(id.Value); + ResumedReadProjectResponse? model = await _service.SubmitProject(id.Value); _logger.LogInformation("Submissão do Projeto: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs b/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs index 6fcefc98..9bbdf0fa 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs @@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de projetos. @@ -30,7 +30,7 @@ public ProjectEvaluationController( _service = service; _logger = logger; } - #endregion + #endregion Global Scope /// /// Busca avaliação do projeto pelo id do projeto. @@ -52,7 +52,7 @@ public async Task> GetEvalua try { - var model = await _service.GetEvaluationByProjectId(projectId); + DetailedReadProjectEvaluationResponse model = await _service.GetEvaluationByProjectId(projectId); _logger.LogInformation("Avaliação do projeto encontrado para o id {id}.", projectId); return Ok(model); } @@ -76,7 +76,7 @@ public async Task> EvaluateSubmissionP { try { - var model = await _service.EvaluateSubmissionProject(request); + DetailedReadProjectResponse? model = await _service.EvaluateSubmissionProject(request); _logger.LogInformation("Avaliação da submissão do projeto {id} realizada.", model?.Id); return Ok(model); } @@ -99,7 +99,7 @@ public async Task> EvaluateAppealProje { try { - var model = await _service.EvaluateAppealProject(request); + DetailedReadProjectResponse? model = await _service.EvaluateAppealProject(request); _logger.LogInformation("Avaliação do recurso do projeto {id} realizada.", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/StudentController.cs b/src/Infrastructure/WebAPI/Controllers/StudentController.cs index 1dda9188..b897942f 100644 --- a/src/Infrastructure/WebAPI/Controllers/StudentController.cs +++ b/src/Infrastructure/WebAPI/Controllers/StudentController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de Estudante. @@ -26,7 +26,7 @@ public StudentController(IStudentPresenterController service, ILogger /// Busca Estudante pelo id. @@ -47,7 +47,7 @@ public async Task> GetById(Guid? id) try { - var model = await _service.GetById(id); + Adapters.Gateways.Base.IResponse model = await _service.GetById(id); _logger.LogInformation("Estudante encontrado para o id {id}.", id); return Ok(model); } @@ -68,7 +68,7 @@ public async Task> GetById(Guid? id) [ProducesResponseType(StatusCodes.Status200OK)] public async Task>> GetAll(int skip = 0, int take = 50) { - var models = await _service.GetAll(skip, take); + IEnumerable models = await _service.GetAll(skip, take); if (models == null) { const string msg = "Nenhum Estudante encontrado."; @@ -92,7 +92,7 @@ public async Task> Create([FromBody] C { try { - var model = await _service.Create(request) as DetailedReadStudentResponse; + DetailedReadStudentResponse? model = await _service.Create(request) as DetailedReadStudentResponse; _logger.LogInformation("Estudante criado: {id}", model?.Id); return Ok(model); } @@ -115,7 +115,7 @@ public async Task> Update(Guid? id, [F { try { - var model = await _service.Update(id, request) as DetailedReadStudentResponse; + DetailedReadStudentResponse? model = await _service.Update(id, request) as DetailedReadStudentResponse; _logger.LogInformation("Estudante atualizado: {id}", model?.Id); return Ok(model); } @@ -145,7 +145,7 @@ public async Task> Delete(Guid? id) try { - var model = await _service.Delete(id.Value) as DetailedReadStudentResponse; + DetailedReadStudentResponse? model = await _service.Delete(id.Value) as DetailedReadStudentResponse; _logger.LogInformation("Estudante removido: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/SubAreaController.cs b/src/Infrastructure/WebAPI/Controllers/SubAreaController.cs index c7977eee..07dadc6a 100644 --- a/src/Infrastructure/WebAPI/Controllers/SubAreaController.cs +++ b/src/Infrastructure/WebAPI/Controllers/SubAreaController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de Sub Área. @@ -26,7 +26,7 @@ public SubAreaController(ISubAreaPresenterController service, ILogger /// Busca sub área pelo id. @@ -47,7 +47,7 @@ public async Task> GetById(Guid? id) try { - var model = await _service.GetById(id); + Adapters.Gateways.Base.IResponse model = await _service.GetById(id); _logger.LogInformation("Sub Área encontrada para o id {id}.", id); return Ok(model); } @@ -75,7 +75,7 @@ public async Task>> GetSubA return BadRequest(msg); } - var models = await _service.GetSubAreasByArea(areaId, skip, take); + IEnumerable models = await _service.GetSubAreasByArea(areaId, skip, take); if (models == null) { const string msg = "Nenhuma Sub Área encontrada."; @@ -99,7 +99,7 @@ public async Task> Create([FromBody] C { try { - var model = await _service.Create(request) as DetailedReadSubAreaResponse; + DetailedReadSubAreaResponse? model = await _service.Create(request) as DetailedReadSubAreaResponse; _logger.LogInformation("Sub Área criada: {id}", model?.Id); return Ok(model); } @@ -122,7 +122,7 @@ public async Task> Update(Guid? id, [F { try { - var model = await _service.Update(id, request) as DetailedReadSubAreaResponse; + DetailedReadSubAreaResponse? model = await _service.Update(id, request) as DetailedReadSubAreaResponse; _logger.LogInformation("Sub Área atualizada: {id}", model?.Id); return Ok(model); } @@ -152,7 +152,7 @@ public async Task> Delete(Guid? id) try { - var model = await _service.Delete(id.Value) as DetailedReadSubAreaResponse; + DetailedReadSubAreaResponse? model = await _service.Delete(id.Value) as DetailedReadSubAreaResponse; _logger.LogInformation("Sub Área removida: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/UserController.cs b/src/Infrastructure/WebAPI/Controllers/UserController.cs index 869763a1..11815b2c 100644 --- a/src/Infrastructure/WebAPI/Controllers/UserController.cs +++ b/src/Infrastructure/WebAPI/Controllers/UserController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de Usuário. @@ -26,7 +26,7 @@ public UserController(IUserPresenterController service, ILogger _service = service; _logger = logger; } - #endregion + #endregion Global Scope /// /// Busca usuário pelo id. @@ -47,7 +47,7 @@ public async Task>> GetById(Guid? id) try { - var model = await _service.GetUserById(id); + UserReadResponse model = await _service.GetUserById(id); _logger.LogInformation("Usuário encontrado para o id {id}.", id); return Ok(model); } @@ -68,7 +68,7 @@ public async Task>> GetById(Guid? id) [ProducesResponseType(StatusCodes.Status200OK)] public async Task>> GetAllActive(int skip = 0, int take = 50) { - var models = await _service.GetActiveUsers(skip, take); + IEnumerable models = await _service.GetActiveUsers(skip, take); if (models == null) { const string msg = "Nenhum usuário encontrado."; @@ -89,7 +89,7 @@ public async Task>> GetAllActive(int [ProducesResponseType(StatusCodes.Status200OK)] public async Task>> GetAllInactive(int skip = 0, int take = 50) { - var models = await _service.GetInactiveUsers(skip, take); + IEnumerable models = await _service.GetInactiveUsers(skip, take); if (models == null) { const string msg = "Nenhum usuário encontrado."; @@ -113,7 +113,7 @@ public async Task> Update([FromBody] UserUpdateRe try { // Atualiza o usuário e retorna o usuário atualizado - var model = await _service.UpdateUser(request); + UserReadResponse? model = await _service.UpdateUser(request); _logger.LogInformation("Usuário atualizado: {id}", model?.Id); return Ok(model); @@ -145,7 +145,7 @@ public async Task> Activate(Guid? id) try { - var model = await _service.ActivateUser(id.Value); + UserReadResponse? model = await _service.ActivateUser(id.Value); _logger.LogInformation("Usuário ativado: {id}", model?.Id); return Ok(model); } @@ -176,7 +176,7 @@ public async Task> Deactivate(Guid? id) try { - var model = await _service.DeactivateUser(id.Value); + UserReadResponse? model = await _service.DeactivateUser(id.Value); _logger.LogInformation("Usuário desativado: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/VersionController.cs b/src/Infrastructure/WebAPI/Controllers/VersionController.cs index b16887a0..952d7e88 100644 --- a/src/Infrastructure/WebAPI/Controllers/VersionController.cs +++ b/src/Infrastructure/WebAPI/Controllers/VersionController.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc; -namespace Infrastructure.WebAPI.Controllers +namespace WebAPI.Controllers { /// /// Controller de validação. @@ -13,6 +13,9 @@ public class Version : ControllerBase /// Retorna a versão da API. /// [HttpGet] - public IActionResult Get() => Ok(GetType()?.Assembly?.GetName()?.Version?.ToString() ?? "Versão não identificada."); + public IActionResult Get() + { + return Ok(GetType()?.Assembly?.GetName()?.Version?.ToString() ?? "Versão não identificada."); + } } } \ No newline at end of file diff --git a/src/Infrastructure/WebAPI/Middlewares/ExceptionHandlingMiddleware.cs b/src/Infrastructure/WebAPI/Middlewares/ExceptionHandlingMiddleware.cs index 1a27e7c0..8f2c697f 100644 --- a/src/Infrastructure/WebAPI/Middlewares/ExceptionHandlingMiddleware.cs +++ b/src/Infrastructure/WebAPI/Middlewares/ExceptionHandlingMiddleware.cs @@ -1,7 +1,7 @@ using System.Net; using System.Text.Json; -namespace Infrastructure.WebAPI.Middleware +namespace WebAPI.Middlewares { /// /// Middleware para tratamento de exceções. diff --git a/src/Infrastructure/WebAPI/Properties/launchSettings.json b/src/Infrastructure/WebAPI/Properties/launchSettings.json index 0cab12e7..a6946a36 100644 --- a/src/Infrastructure/WebAPI/Properties/launchSettings.json +++ b/src/Infrastructure/WebAPI/Properties/launchSettings.json @@ -35,4 +35,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Infrastructure/WebAPI/Startup.cs b/src/Infrastructure/WebAPI/Startup.cs index 7736c427..87dd3614 100644 --- a/src/Infrastructure/WebAPI/Startup.cs +++ b/src/Infrastructure/WebAPI/Startup.cs @@ -1,6 +1,6 @@ using AspNetCoreRateLimit; -using Infrastructure.IoC; -using Infrastructure.WebAPI.Middleware; +using IoC; +using WebAPI.Middlewares; namespace WebAPI { From 6805f0a6068dd4596ffb9aa5d51b40378ab32a1b Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 1 Aug 2023 10:29:39 -0300 Subject: [PATCH 062/201] feat: add StudentDocuments endpoints --- src/Domain/Entities/StudentDocuments.cs | 30 ++-- .../CreateStudentDocuments.cs | 6 +- .../DeleteStudentDocuments.cs | 2 + .../UpdateStudentDocuments.cs | 10 +- .../Context/ApplicationDbContext.cs | 3 +- .../StudentDocumentsConfiguration.cs | 33 ++++ src/Infrastructure/Persistence/README.md | 2 +- .../StudentDocumentsRepository.cs | 81 +++++++++ .../Controllers/StudentDocumentsController.cs | 157 ++++++++++++++++++ 9 files changed, 298 insertions(+), 26 deletions(-) create mode 100644 src/Infrastructure/Persistence/EntitiesConfiguration/StudentDocumentsConfiguration.cs create mode 100644 src/Infrastructure/Persistence/Repositories/StudentDocumentsRepository.cs create mode 100644 src/Infrastructure/WebAPI/Controllers/StudentDocumentsController.cs diff --git a/src/Domain/Entities/StudentDocuments.cs b/src/Domain/Entities/StudentDocuments.cs index cbea7108..346bd2fa 100644 --- a/src/Domain/Entities/StudentDocuments.cs +++ b/src/Domain/Entities/StudentDocuments.cs @@ -13,7 +13,7 @@ public Guid? ProjectId set { EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(_projectId))); + ExceptionMessageFactory.Required(nameof(ProjectId))); _projectId = value; } } @@ -29,7 +29,7 @@ public string? IdentityDocument set { EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(_identityDocument))); + ExceptionMessageFactory.Required(nameof(IdentityDocument))); _identityDocument = value; } } @@ -44,7 +44,7 @@ public string? CPF set { EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(_cpf))); + ExceptionMessageFactory.Required(nameof(CPF))); _cpf = value; } } @@ -59,7 +59,7 @@ public string? Photo3x4 set { EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(_photo3x4))); + ExceptionMessageFactory.Required(nameof(Photo3x4))); _photo3x4 = value; } } @@ -74,7 +74,7 @@ public string? SchoolHistory set { EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(_schoolHistory))); + ExceptionMessageFactory.Required(nameof(SchoolHistory))); _schoolHistory = value; } } @@ -89,7 +89,7 @@ public string? ScholarCommitmentAgreement set { EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(_scholarCommitmentAgreement))); + ExceptionMessageFactory.Required(nameof(ScholarCommitmentAgreement))); _scholarCommitmentAgreement = value; } } @@ -106,12 +106,12 @@ public string? ParentalAuthorization if (Project?.Student?.BirthDate >= DateTime.UtcNow.AddYears(-18)) { EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(_parentalAuthorization))); + ExceptionMessageFactory.Required(nameof(ParentalAuthorization))); } _parentalAuthorization = value; } } - #endregion + #endregion Documents #region BankData private string? _agencyNumber; @@ -124,9 +124,9 @@ public string? AgencyNumber set { EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(_agencyNumber))); + ExceptionMessageFactory.Required(nameof(AgencyNumber))); EntityExceptionValidation.When(long.TryParse(value, out long tmp) && tmp <= 0, - ExceptionMessageFactory.Invalid(ExceptionMessageFactory.Invalid(nameof(_agencyNumber)))); + ExceptionMessageFactory.Invalid(ExceptionMessageFactory.Invalid(nameof(AgencyNumber)))); _agencyNumber = value; } } @@ -141,9 +141,9 @@ public string? AccountNumber set { EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(_accountNumber))); + ExceptionMessageFactory.Required(nameof(AccountNumber))); EntityExceptionValidation.When(long.TryParse(value, out long tmp) && tmp <= 0, - ExceptionMessageFactory.Invalid(ExceptionMessageFactory.Invalid(nameof(_accountNumber)))); + ExceptionMessageFactory.Invalid(ExceptionMessageFactory.Invalid(nameof(AccountNumber)))); _accountNumber = value; } } @@ -158,14 +158,14 @@ public string? AccountOpeningProof set { EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(_accountOpeningProof))); + ExceptionMessageFactory.Required(nameof(AccountOpeningProof))); _accountOpeningProof = value; } } - #endregion + #endregion BankData public virtual Project? Project { get; } - #endregion + #endregion Properties /// /// Constructor to dbcontext EF instancing. diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs b/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs index c8c662be..133a8dcb 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs @@ -44,11 +44,11 @@ public async Task Execute(CreateStudentDocum // Verifica se o projeto existe var project = await _projectRepository.GetById(input.ProjectId!); - UseCaseException.NotFoundEntityById(project is null, nameof(project)); + UseCaseException.NotFoundEntityById(project is null, nameof(Entities.Project)); - // Verifica se o projeto se encontra em situação de submissão de documentos + // Verifica se o projeto se encontra em situação de submissão de documentos (Aceito) UseCaseException.BusinessRuleViolation( - project?.Status != Entities.Enums.EProjectStatus.DocumentAnalysis, + project?.Status != Entities.Enums.EProjectStatus.Accepted, "O projeto não está na fase de apresentação de documentos."); // Cria entidade a partir do input informado diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs b/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs index d56decac..1548613b 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs @@ -26,6 +26,8 @@ public async Task Execute(Guid? id) // Remove a entidade Entities.StudentDocuments model = await _repository.Delete(id); + // TODO: Verificar se seria preciso remover os documentos do aluno caso fosse removido o registro de documentos do aluno + // Retorna o tipo de programa removido return _mapper.Map(model); } diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs b/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs index d40fb5df..611fd6ea 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs @@ -38,9 +38,9 @@ public async Task Execute(Guid? id, UpdateSt Entities.StudentDocuments? studentDocuments = await _studentDocumentRepository.GetById(id!); UseCaseException.NotFoundEntityById(studentDocuments is not null, nameof(studentDocuments)); - // Verifica se o projeto se encontra em situação de submissão de documentos + // Verifica se o projeto se encontra em situação de submissão de documentos (Aceito ou Pendente do envio de documentação) UseCaseException.BusinessRuleViolation( - studentDocuments!.Project?.Status is not Entities.Enums.EProjectStatus.DocumentAnalysis + studentDocuments!.Project?.Status is not Entities.Enums.EProjectStatus.Accepted and not Entities.Enums.EProjectStatus.Pending, "O projeto não está na fase de apresentação de documentos."); @@ -76,12 +76,10 @@ private async Task TryToSaveFileInCloud(IFormFile file, string? url) { try { - if (file is null) + if (file is not null) { - return; + _ = await _storageFileService.UploadFileAsync(file, url); } - - _ = await _storageFileService.UploadFileAsync(file, url); } catch (Exception ex) { diff --git a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs index 345cafba..4519aa57 100644 --- a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs +++ b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs @@ -20,6 +20,7 @@ public ApplicationDbContext(DbContextOptions options) : ba public DbSet Areas { get; set; } public DbSet Activities { get; set; } public DbSet ActivityTypes { get; set; } + public DbSet AssistanceTypes { get; set; } public DbSet Campuses { get; set; } public DbSet Courses { get; set; } public DbSet MainAreas { get; set; } @@ -29,8 +30,8 @@ public ApplicationDbContext(DbContextOptions options) : ba public DbSet ProjectEvaluations { get; set; } public DbSet ProjectActivities { get; set; } public DbSet ProgramTypes { get; set; } - public DbSet AssistanceTypes { get; set; } public DbSet Students { get; set; } + public DbSet StudentDocuments { get; set; } public DbSet SubAreas { get; set; } public DbSet Users { get; set; } diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/StudentDocumentsConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/StudentDocumentsConfiguration.cs new file mode 100644 index 00000000..61526902 --- /dev/null +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/StudentDocumentsConfiguration.cs @@ -0,0 +1,33 @@ +using Domain.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Persistence.EntitiesConfiguration +{ + public class StudentDocumentsConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + _ = builder.ToTable("StudentDocuments"); + _ = builder.HasKey(t => t.Id); + _ = builder.Property(p => p.Id).ValueGeneratedOnAdd(); + + _ = builder.Property(p => p.IdentityDocument).IsRequired(); + _ = builder.Property(p => p.CPF).IsRequired(); + _ = builder.Property(p => p.Photo3x4).IsRequired(); + _ = builder.Property(p => p.SchoolHistory).IsRequired(); + _ = builder.Property(p => p.ScholarCommitmentAgreement).IsRequired(); + _ = builder.Property(p => p.ParentalAuthorization); + _ = builder.Property(p => p.AgencyNumber).IsRequired(); + _ = builder.Property(p => p.AccountNumber).IsRequired(); + _ = builder.Property(p => p.AccountOpeningProof).IsRequired(); + _ = builder.Property(p => p.ProjectId).IsRequired(); + + _ = builder.HasOne(a => a.Project) + .WithOne() + .HasForeignKey(a => a.ProjectId); + + _ = builder.HasQueryFilter(x => x.DeletedAt == null); + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index c8f8881f..3371fd8f 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add AddDeletedAtToProjectEvaluation --project ../Persistence/Persistence.csproj +dotnet ef migrations add AddStudentDocuments --project ../Persistence/Persistence.csproj ``` Executando as Migrations: diff --git a/src/Infrastructure/Persistence/Repositories/StudentDocumentsRepository.cs b/src/Infrastructure/Persistence/Repositories/StudentDocumentsRepository.cs new file mode 100644 index 00000000..7cc1662e --- /dev/null +++ b/src/Infrastructure/Persistence/Repositories/StudentDocumentsRepository.cs @@ -0,0 +1,81 @@ +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Infrastructure.Persistence.Context; +using Microsoft.EntityFrameworkCore; + +namespace Persistence.Repositories +{ + public class StudentDocumentsRepository : IStudentDocumentsRepository + { + private readonly ApplicationDbContext _context; + + public StudentDocumentsRepository(ApplicationDbContext context) + { + _context = context; + } + + public async Task Create(StudentDocuments model) + { + _ = _context.Add(model); + _ = await _context.SaveChangesAsync(); + return model; + } + + public async Task Delete(Guid? id) + { + StudentDocuments model = await GetById(id) + ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); + model.DeactivateEntity(); + return await Update(model); + } + + public async Task> GetAll(int skip, int take) + { + return await _context.StudentDocuments + .Include(x => x.Project) + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .Skip(skip) + .Take(take) + .ToListAsync(); + } + + public async Task GetById(Guid? id) + { + return await _context.StudentDocuments + .Include(x => x.Project) + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.Id == id) + ?? throw new Exception($"Nenhum Documento encontrado para o id {id}"); + } + + public async Task GetByProjectId(Guid? projectId) + { + return await _context.StudentDocuments + .Include(x => x.Project) + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.ProjectId == projectId) + ?? throw new Exception($"Nenhum Documento encontrado para o projectId {projectId}"); + } + + public async Task GetByStudentId(Guid? studentId) + { + return await _context.StudentDocuments + .Include(x => x.Project) + .Include(x => x.Project!.Student) + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.Project?.StudentId == studentId) + ?? throw new Exception($"Nenhum Documento encontrado para o studentId {studentId}"); + } + + public async Task Update(StudentDocuments model) + { + _ = _context.Update(model); + _ = await _context.SaveChangesAsync(); + return model; + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/WebAPI/Controllers/StudentDocumentsController.cs b/src/Infrastructure/WebAPI/Controllers/StudentDocumentsController.cs new file mode 100644 index 00000000..b49d3d5d --- /dev/null +++ b/src/Infrastructure/WebAPI/Controllers/StudentDocumentsController.cs @@ -0,0 +1,157 @@ +using Adapters.Gateways.StudentDocuments; +using Adapters.Interfaces; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace WebAPI.Controllers +{ + /// + /// Controller de Documentos de Estudante. + /// + [ApiController] + [Route("api/v1/[controller]")] + public class StudentDocumentsController : ControllerBase + { + private readonly ILogger _logger; + private readonly IStudentDocumentsPresenterController _presenterController; + /// + /// Construtor do Controller de Documentos de Estudante. + /// + /// + /// + public StudentDocumentsController(ILogger logger, IStudentDocumentsPresenterController presenterController) + { + _logger = logger; + _presenterController = presenterController; + } + + /// + /// Busca documentos de estudante pelo id do projeto. + /// + /// Id do projeto + [HttpGet("project/{projectId}")] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task> GetByProjectId(Guid? projectId) + { + if (projectId == null) + { + const string msg = "O id informado não pode ser nulo."; + _logger.LogWarning(msg); + return BadRequest(msg); + } + + try + { + Adapters.Gateways.Base.IResponse model = await _presenterController.GetByProjectId(projectId); + _logger.LogInformation("Documentos encontrados para o projectId {projectId}.", projectId); + return Ok(model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return NotFound(ex.Message); + } + } + + /// + /// Busca documentos de estudante pelo id do estudante. + /// + /// Id do estudante + [HttpGet("student/{studentId}")] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task> GetByStudentId(Guid? studentId) + { + if (studentId == null) + { + const string msg = "O id informado não pode ser nulo."; + _logger.LogWarning(msg); + return BadRequest(msg); + } + + try + { + Adapters.Gateways.Base.IResponse model = await _presenterController.GetByStudentId(studentId); + _logger.LogInformation("Documentos encontrados para o studentId {studentId}.", studentId); + return Ok(model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return NotFound(ex.Message); + } + } + + /// + /// Adiciona documentos de estudante ao projeto. + /// + /// Dados para adição dos documentos. + [HttpPost] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Roles = "ADMIN, STUDENT")] + public async Task> Create([FromBody] CreateStudentDocumentsRequest request) + { + try + { + DetailedReadStudentDocumentsResponse? model = await _presenterController.Create(request); + _logger.LogInformation("Documentos do estudante adicionados: {id}", model?.Id); + return Ok(model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); + } + } + + /// + /// Atualiza documentos de estudante. + /// + /// Id dos documentos do estudante + /// Dados para atualização dos documentos. + [HttpPut("{id}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [Authorize(Roles = "ADMIN, STUDENT")] + public async Task> Update(Guid? id, [FromBody] UpdateStudentDocumentsRequest request) + { + try + { + DetailedReadStudentDocumentsResponse? model = await _presenterController.Update(id, request); + _logger.LogInformation("Documentos do estudante atualizados: {id}", model?.Id); + return Ok(model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); + } + } + + /// + /// Remove documentos de estudante. + /// + /// Id dos documentos do estudante + [HttpDelete("{id}")] + [Authorize(Roles = "ADMIN, STUDENT")] + public async Task> Delete(Guid? id) + { + if (id == null) + { + const string msg = "O id informado não pode ser nulo."; + _logger.LogWarning(msg); + return BadRequest(msg); + } + + try + { + DetailedReadStudentDocumentsResponse? model = await _presenterController.Delete(id.Value); + _logger.LogInformation("Documentos do estudante removidos: {id}", model?.Id); + return Ok(model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); + } + } + } +} \ No newline at end of file From 9d1e8190b336444dd1a14390be928a62e53837bd Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 2 Aug 2023 20:18:46 -0300 Subject: [PATCH 063/201] fix: adjust UpdateAreaInput namespace --- src/Domain/UseCases/Ports/Area/UpdateAreaInput.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Domain/UseCases/Ports/Area/UpdateAreaInput.cs b/src/Domain/UseCases/Ports/Area/UpdateAreaInput.cs index 2042426f..2eff62a1 100644 --- a/src/Domain/UseCases/Ports/Area/UpdateAreaInput.cs +++ b/src/Domain/UseCases/Ports/Area/UpdateAreaInput.cs @@ -1,7 +1,6 @@ -using System.ComponentModel.DataAnnotations; -using Domain.UseCases.Ports.Area; +using System.ComponentModel.DataAnnotations; -namespace Domain.Ports.Area +namespace Domain.UseCases.Ports.Area { public class UpdateAreaInput : BaseAreaContract { From 3341b9deb2217d840e58a32c94696e9bc8f93dce Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 2 Aug 2023 20:44:26 -0300 Subject: [PATCH 064/201] feat: add RegistrationCode to student --- src/Domain/Entities/Student.cs | 114 ++++++++++-------- .../Interactors/Student/CreateStudent.cs | 3 +- .../Ports/Student/BaseStudentContract.cs | 2 + .../StudentConfiguration.cs | 3 + src/Infrastructure/Persistence/README.md | 2 +- 5 files changed, 75 insertions(+), 49 deletions(-) diff --git a/src/Domain/Entities/Student.cs b/src/Domain/Entities/Student.cs index 84f8cdb6..9209aa32 100644 --- a/src/Domain/Entities/Student.cs +++ b/src/Domain/Entities/Student.cs @@ -10,177 +10,195 @@ namespace Domain.Entities public class Student : Entity { #region Properties + private string? _registrationCode; /// - /// Data de Nascimento + /// Código de Matrícula /// + public string? RegistrationCode + { + get { return _registrationCode; } + set + { + EntityExceptionValidation.When(string.IsNullOrEmpty(value), + ExceptionMessageFactory.Required(nameof(RegistrationCode))); + EntityExceptionValidation.When(value?.Length > 20, + ExceptionMessageFactory.MaxLength(nameof(RegistrationCode), 20)); + _registrationCode = value?.ToUpper(); + } + } + + private DateTime _birthDate; + /// + /// Data de Nascimento + /// public DateTime BirthDate { get { return _birthDate; } set { EntityExceptionValidation.When(value == default, - ExceptionMessageFactory.Required("Data de Nascimento")); + ExceptionMessageFactory.Required(nameof(BirthDate))); EntityExceptionValidation.When(value >= DateTime.UtcNow, - ExceptionMessageFactory.LessThan("Data de Nascimento", DateTime.UtcNow.ToString("dd/MM/yyyy"))); + ExceptionMessageFactory.LessThan(nameof(BirthDate), DateTime.UtcNow.ToString("dd/MM/yyyy"))); _birthDate = value.ToUniversalTime(); } } + private long _rg; /// /// RG /// - private long _rg; public long RG { get { return _rg; } set { EntityExceptionValidation.When(value <= 0, - ExceptionMessageFactory.Required("RG")); + ExceptionMessageFactory.Required(nameof(RG))); _rg = value; } } + private string? _issuingAgency; /// /// Órgão emissor da identidade /// - private string? _issuingAgency; public string? IssuingAgency { get { return _issuingAgency; } set { EntityExceptionValidation.When(string.IsNullOrEmpty(value), - ExceptionMessageFactory.Required("Órgão emissor da identidade")); + ExceptionMessageFactory.Required(nameof(IssuingAgency))); EntityExceptionValidation.When(value?.Length > 50, - ExceptionMessageFactory.MaxLength("Órgão emissor da identidade", 50)); + ExceptionMessageFactory.MaxLength(nameof(IssuingAgency), 50)); _issuingAgency = value; } } + private DateTime _dispatchDate; /// /// Data Expedição da identidade /// - private DateTime _dispatchDate; public DateTime DispatchDate { get { return _dispatchDate; } set { EntityExceptionValidation.When(value == default, - ExceptionMessageFactory.Required("Data Expedição da identidade")); + ExceptionMessageFactory.Required(nameof(DispatchDate))); EntityExceptionValidation.When(value >= DateTime.UtcNow, - ExceptionMessageFactory.LessThan("Data Expedição da identidade", + ExceptionMessageFactory.LessThan(nameof(DispatchDate), DateTime.UtcNow.ToString("dd/MM/yyyy"))); _dispatchDate = value.ToUniversalTime(); } } + private EGender? _gender; /// /// Sexo: Masculino e Feminino /// - private EGender? _gender; public EGender? Gender { get { return _gender; } set { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required("Sexo")); + ExceptionMessageFactory.Required(nameof(Gender))); EntityExceptionValidation.When(!Enum.TryParse(value.ToString(), out var _), - ExceptionMessageFactory.Invalid("Sexo")); + ExceptionMessageFactory.Invalid(nameof(Gender))); _gender = value; } } + private ERace? _race; /// /// Cor/Raça: Branca, Preta, Parda, Amarela, Indígena, Não declarado, Não dispõe da informação /// - private ERace? _race; public ERace? Race { get { return _race; } set { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required("Cor/Raça")); + ExceptionMessageFactory.Required(nameof(Race))); EntityExceptionValidation.When(!Enum.TryParse(value.ToString(), out var _), - ExceptionMessageFactory.Invalid("Cor/Raça")); + ExceptionMessageFactory.Invalid(nameof(Race))); _race = value; } } + private string? _homeAddress; /// /// Endereço Residencial (Rua, Avenida, N.º, complemento, bairro) /// - private string? _homeAddress; public string? HomeAddress { get { return _homeAddress; } set { EntityExceptionValidation.When(string.IsNullOrEmpty(value), - ExceptionMessageFactory.Required("Endereço Residencial")); + ExceptionMessageFactory.Required(nameof(HomeAddress))); EntityExceptionValidation.When(value?.Length > 300, - ExceptionMessageFactory.MaxLength("Endereço Residencial", 300)); + ExceptionMessageFactory.MaxLength(nameof(HomeAddress), 300)); _homeAddress = value; } } + private string? _city; /// /// Cidade /// - private string? _city; public string? City { get { return _city; } set { EntityExceptionValidation.When(string.IsNullOrEmpty(value), - ExceptionMessageFactory.Required("Cidade")); + ExceptionMessageFactory.Required(nameof(City))); EntityExceptionValidation.When(value?.Length > 50, - ExceptionMessageFactory.MaxLength("Cidade", 50)); + ExceptionMessageFactory.MaxLength(nameof(City), 50)); _city = value; } } + private string? _uf; /// /// Estado /// - private string? _uf; public string? UF { get { return _uf; } set { EntityExceptionValidation.When(string.IsNullOrEmpty(value), - ExceptionMessageFactory.Required("Estado")); + ExceptionMessageFactory.Required(nameof(UF))); EntityExceptionValidation.When(value?.Length != 2, - ExceptionMessageFactory.WithLength("Estado", 2)); + ExceptionMessageFactory.WithLength(nameof(UF), 2)); _uf = value; } } + private long _cep; /// /// CEP /// - private long _cep; public long CEP { get { return _cep; } set { EntityExceptionValidation.When(value <= 0, - ExceptionMessageFactory.Invalid("CEP")); + ExceptionMessageFactory.Invalid(nameof(CEP))); _cep = value; } } + private int? _phoneDDD; /// /// DDD Telefone /// - private int? _phoneDDD; public int? PhoneDDD { get { return _phoneDDD; } @@ -188,15 +206,15 @@ public int? PhoneDDD { if (value == null) return; EntityExceptionValidation.When(value <= 0, - ExceptionMessageFactory.Invalid("DDD Telefo")); + ExceptionMessageFactory.Invalid(nameof(PhoneDDD))); _phoneDDD = value; } } + private long? _phone; /// /// Telefone /// - private long? _phone; public long? Phone { get { return _phone; } @@ -204,15 +222,15 @@ public long? Phone { if (value == null) return; EntityExceptionValidation.When(value <= 0, - ExceptionMessageFactory.Invalid("Telefone")); + ExceptionMessageFactory.Invalid(nameof(Phone))); _phone = value; } } + private int? _cellPhoneDDD; /// /// DDD Celular /// - private int? _cellPhoneDDD; public int? CellPhoneDDD { get { return _cellPhoneDDD; } @@ -220,15 +238,15 @@ public int? CellPhoneDDD { if (value == null) return; EntityExceptionValidation.When(value <= 0, - ExceptionMessageFactory.Invalid("DDD Celular")); + ExceptionMessageFactory.Invalid(nameof(CellPhoneDDD))); _cellPhoneDDD = value; } } + private long? _cellPhone; /// /// Celular /// - private long? _cellPhone; public long? CellPhone { get { return _cellPhone; } @@ -236,75 +254,75 @@ public long? CellPhone { if (value == null) return; EntityExceptionValidation.When(value <= 0, - ExceptionMessageFactory.Invalid("Celular")); + ExceptionMessageFactory.Invalid(nameof(CellPhone))); _cellPhone = value; } } + private Guid? _campusId; /// /// ID do Campus /// - private Guid? _campusId; public Guid? CampusId { get { return _campusId; } set { EntityExceptionValidation.When(value == null || value == Guid.Empty, - ExceptionMessageFactory.Required("Campus")); + ExceptionMessageFactory.Required(nameof(CampusId))); _campusId = value; } } + private Guid? _courseId; /// /// ID do Curso /// - private Guid? _courseId; public Guid? CourseId { get { return _courseId; } set { EntityExceptionValidation.When(value == null || value == Guid.Empty, - ExceptionMessageFactory.Required("Curso")); + ExceptionMessageFactory.Required(nameof(CourseId))); _courseId = value; } } + private string? _startYear; /// /// Ano de entrada / Semestre /// - private string? _startYear; public string? StartYear { get { return _startYear; } set { EntityExceptionValidation.When(string.IsNullOrEmpty(value), - ExceptionMessageFactory.Required("Ano de entrada / Semestre")); + ExceptionMessageFactory.Required(nameof(StartYear))); _startYear = value; } } + private Guid? _assistanceTypeId; /// /// Tipo de Bolsa de Assistência Estudantil do aluno /// - private Guid? _assistanceTypeId; public Guid? AssistanceTypeId { get { return _assistanceTypeId; } set { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required("Tipo de Bolsa de Assistência Estudantil do aluno")); + ExceptionMessageFactory.Required(nameof(AssistanceTypeId))); _assistanceTypeId = value; } } + private Guid? _userId; /// /// ID do usuário /// - private Guid? _userId; public Guid? UserId { get { return _userId; } @@ -312,7 +330,7 @@ public Guid? UserId { { EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required("Usuário")); + ExceptionMessageFactory.Required(nameof(UserId))); _userId = value; } } @@ -343,7 +361,8 @@ public Student( Guid? campusId, Guid? courseId, string? startYear, - Guid? studentAssistanceProgramId) + Guid? studentAssistanceProgramId, + string? registrationCode) { BirthDate = birthDate; RG = rg; @@ -363,6 +382,7 @@ public Student( CourseId = courseId; StartYear = startYear; AssistanceTypeId = studentAssistanceProgramId; + RegistrationCode = registrationCode; } /// diff --git a/src/Domain/UseCases/Interactors/Student/CreateStudent.cs b/src/Domain/UseCases/Interactors/Student/CreateStudent.cs index 9485d25d..8f05422f 100644 --- a/src/Domain/UseCases/Interactors/Student/CreateStudent.cs +++ b/src/Domain/UseCases/Interactors/Student/CreateStudent.cs @@ -57,7 +57,8 @@ public async Task Execute(CreateStudentInput model) model.CampusId, model.CourseId, model.StartYear, - model.AssistanceTypeId); + model.AssistanceTypeId, + model.RegistrationCode); // Verifica se já existe um usuário com o e-mail informado Entities.User? user = await _userRepository.GetUserByEmail(model.Email); diff --git a/src/Domain/UseCases/Ports/Student/BaseStudentContract.cs b/src/Domain/UseCases/Ports/Student/BaseStudentContract.cs index b48a70bf..15e23c08 100644 --- a/src/Domain/UseCases/Ports/Student/BaseStudentContract.cs +++ b/src/Domain/UseCases/Ports/Student/BaseStudentContract.cs @@ -6,6 +6,8 @@ public abstract class BaseStudentContract { #region Required Properties [Required] + public string? RegistrationCode { get; set; } + [Required] public DateTime BirthDate { get; set; } [Required] public long RG { get; set; } diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/StudentConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/StudentConfiguration.cs index d9563e42..d531bfb1 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/StudentConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/StudentConfiguration.cs @@ -12,6 +12,9 @@ public void Configure(EntityTypeBuilder builder) builder.HasKey(t => t.Id); builder.Property(p => p.Id) .ValueGeneratedOnAdd(); + builder.Property(p => p.RegistrationCode) + .IsRequired() + .HasMaxLength(20); builder.Property(p => p.BirthDate) .IsRequired(); builder.Property(p => p.RG) diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index 3371fd8f..6761553d 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add AddStudentDocuments --project ../Persistence/Persistence.csproj +dotnet ef migrations add AddRegistrationCodeToStudent --project ../Persistence/Persistence.csproj ``` Executando as Migrations: From fc00e73ac4a27a90a3b2b022f2389a9b62928000 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 2 Aug 2023 20:44:49 -0300 Subject: [PATCH 065/201] fix: adjust Area namespaces --- src/Adapters/Gateways/Area/UpdateAreaRequest.cs | 2 +- src/Adapters/Mappings/AreaMappings.cs | 1 - src/Adapters/PresenterController/AreaPresenterController.cs | 1 - src/Domain/Mappings/AreaMappings.cs | 1 - src/Domain/UseCases/Interactors/Area/UpdateArea.cs | 1 - src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs | 1 - 6 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Adapters/Gateways/Area/UpdateAreaRequest.cs b/src/Adapters/Gateways/Area/UpdateAreaRequest.cs index 307c5ce0..448c3a9f 100644 --- a/src/Adapters/Gateways/Area/UpdateAreaRequest.cs +++ b/src/Adapters/Gateways/Area/UpdateAreaRequest.cs @@ -1,5 +1,5 @@ using Adapters.Gateways.Base; -using Domain.Ports.Area; +using Domain.UseCases.Ports.Area; namespace Adapters.Gateways.Area { diff --git a/src/Adapters/Mappings/AreaMappings.cs b/src/Adapters/Mappings/AreaMappings.cs index 908f6584..caa3a6fb 100755 --- a/src/Adapters/Mappings/AreaMappings.cs +++ b/src/Adapters/Mappings/AreaMappings.cs @@ -1,6 +1,5 @@ using Adapters.Gateways.Area; using AutoMapper; -using Domain.Ports.Area; using Domain.UseCases.Ports.Area; namespace Adapters.Mappings diff --git a/src/Adapters/PresenterController/AreaPresenterController.cs b/src/Adapters/PresenterController/AreaPresenterController.cs index 88a10d78..49c00ba2 100755 --- a/src/Adapters/PresenterController/AreaPresenterController.cs +++ b/src/Adapters/PresenterController/AreaPresenterController.cs @@ -2,7 +2,6 @@ using Adapters.Gateways.Base; using Adapters.Interfaces; using AutoMapper; -using Domain.Ports.Area; using Domain.UseCases.Interfaces.Area; using Domain.UseCases.Ports.Area; diff --git a/src/Domain/Mappings/AreaMappings.cs b/src/Domain/Mappings/AreaMappings.cs index 9a9f3bb7..bad0d88f 100644 --- a/src/Domain/Mappings/AreaMappings.cs +++ b/src/Domain/Mappings/AreaMappings.cs @@ -1,6 +1,5 @@ using AutoMapper; using Domain.Entities; -using Domain.Ports.Area; using Domain.UseCases.Ports.Area; namespace Domain.Mappings diff --git a/src/Domain/UseCases/Interactors/Area/UpdateArea.cs b/src/Domain/UseCases/Interactors/Area/UpdateArea.cs index 30ad7d23..5a93280c 100644 --- a/src/Domain/UseCases/Interactors/Area/UpdateArea.cs +++ b/src/Domain/UseCases/Interactors/Area/UpdateArea.cs @@ -1,6 +1,5 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Ports.Area; using Domain.UseCases.Interfaces.Area; using Domain.UseCases.Ports.Area; using Domain.Validation; diff --git a/src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs b/src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs index 29f37caf..a856b942 100644 --- a/src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs +++ b/src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs @@ -1,4 +1,3 @@ -using Domain.Ports.Area; using Domain.UseCases.Ports.Area; namespace Domain.UseCases.Interfaces.Area From 00dc89004e715d0216c3e08da4128eb9b057ad92 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 2 Aug 2023 21:38:14 -0300 Subject: [PATCH 066/201] refactor: remove Expiration from UserLoginOutput --- src/Domain/UseCases/Ports/Auth/UserLoginOutput.cs | 1 - src/Infrastructure/Services/TokenAuthenticationService.cs | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Domain/UseCases/Ports/Auth/UserLoginOutput.cs b/src/Domain/UseCases/Ports/Auth/UserLoginOutput.cs index baab46a4..876c2c42 100644 --- a/src/Domain/UseCases/Ports/Auth/UserLoginOutput.cs +++ b/src/Domain/UseCases/Ports/Auth/UserLoginOutput.cs @@ -3,6 +3,5 @@ public class UserLoginOutput { public string? Token { get; set; } - public DateTime Expiration { get; set; } } } \ No newline at end of file diff --git a/src/Infrastructure/Services/TokenAuthenticationService.cs b/src/Infrastructure/Services/TokenAuthenticationService.cs index f6e01e5d..c479c85d 100644 --- a/src/Infrastructure/Services/TokenAuthenticationService.cs +++ b/src/Infrastructure/Services/TokenAuthenticationService.cs @@ -81,7 +81,6 @@ public UserLoginOutput GenerateToken(Guid? id, string? userName, string? role) return new UserLoginOutput() { Token = new JwtSecurityTokenHandler().WriteToken(token), - Expiration = expiration }; } From a89c49144abbf4e6f53df15f0fbad3851624b949 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 2 Aug 2023 21:57:45 -0300 Subject: [PATCH 067/201] feat: add GetStudentByRegistrationCode endpoint --- .../Interfaces/IStudentPresenterController.cs | 6 +++- .../StudentPresenterController.cs | 10 +++++- .../Repositories/IStudentRepository.cs | 10 +++++- .../Student/GetStudentByRegistrationCode.cs | 34 +++++++++++++++++++ .../Student/IGetStudentByRegistrationCode.cs | 9 +++++ src/Domain/Validation/UseCaseException.cs | 15 +++++--- .../IoC/DependencyAdaptersInjection.cs | 2 +- .../IoC/DependencyDomainInjection.cs | 15 ++++---- src/Infrastructure/IoC/DependencyInjection.cs | 1 + .../Repositories/StudentRepository.cs | 11 ++++++ .../WebAPI/Controllers/StudentController.cs | 31 +++++++++++++++++ 11 files changed, 129 insertions(+), 15 deletions(-) create mode 100644 src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs create mode 100644 src/Domain/UseCases/Interfaces/Student/IGetStudentByRegistrationCode.cs diff --git a/src/Adapters/Interfaces/IStudentPresenterController.cs b/src/Adapters/Interfaces/IStudentPresenterController.cs index 665b441a..388edffc 100644 --- a/src/Adapters/Interfaces/IStudentPresenterController.cs +++ b/src/Adapters/Interfaces/IStudentPresenterController.cs @@ -1,4 +1,8 @@ +using Adapters.Gateways.Student; using Adapters.Interfaces.Base; namespace Adapters.Interfaces; -public interface IStudentPresenterController : IGenericCRUDPresenterController { } \ No newline at end of file +public interface IStudentPresenterController : IGenericCRUDPresenterController +{ + Task GetByRegistrationCode(string? registrationCode); +} \ No newline at end of file diff --git a/src/Adapters/PresenterController/StudentPresenterController.cs b/src/Adapters/PresenterController/StudentPresenterController.cs index 1e60d17f..8b35b71f 100755 --- a/src/Adapters/PresenterController/StudentPresenterController.cs +++ b/src/Adapters/PresenterController/StudentPresenterController.cs @@ -15,15 +15,17 @@ public class StudentPresenterController : IStudentPresenterController private readonly IDeleteStudent _deleteStudent; private readonly IGetStudents _getStudents; private readonly IGetStudentById _getStudentById; + private readonly IGetStudentByRegistrationCode _getStudentByRegistrationCode; private readonly IMapper _mapper; - public StudentPresenterController(ICreateStudent createStudent, IUpdateStudent updateStudent, IDeleteStudent deleteStudent, IGetStudents getStudents, IGetStudentById getStudentById, IMapper mapper) + public StudentPresenterController(ICreateStudent createStudent, IUpdateStudent updateStudent, IDeleteStudent deleteStudent, IGetStudents getStudents, IGetStudentById getStudentById, IGetStudentByRegistrationCode getStudentByRegistrationCode, IMapper mapper) { _createStudent = createStudent; _updateStudent = updateStudent; _deleteStudent = deleteStudent; _getStudents = getStudents; _getStudentById = getStudentById; + _getStudentByRegistrationCode = getStudentByRegistrationCode; _mapper = mapper; } #endregion Global Scope @@ -54,6 +56,12 @@ public async Task GetById(Guid? id) return _mapper.Map(result); } + public async Task GetByRegistrationCode(string? registrationCode) + { + DetailedReadStudentOutput result = await _getStudentByRegistrationCode.Execute(registrationCode); + return _mapper.Map(result); + } + public async Task Update(Guid? id, IRequest request) { UpdateStudentRequest? dto = request as UpdateStudentRequest; diff --git a/src/Domain/Interfaces/Repositories/IStudentRepository.cs b/src/Domain/Interfaces/Repositories/IStudentRepository.cs index 23a5d4d6..4e478cef 100644 --- a/src/Domain/Interfaces/Repositories/IStudentRepository.cs +++ b/src/Domain/Interfaces/Repositories/IStudentRepository.cs @@ -3,5 +3,13 @@ namespace Domain.Interfaces.Repositories { - public interface IStudentRepository : IGenericCRUDRepository { } + public interface IStudentRepository : IGenericCRUDRepository + { + /// + /// Busca aluno pelo código de matrícula + /// + /// Código de matrícula + /// Aluno encontrado + Task GetByRegistrationCode(string registrationCode); + } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs b/src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs new file mode 100644 index 00000000..851707ee --- /dev/null +++ b/src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs @@ -0,0 +1,34 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.Student; +using Domain.UseCases.Ports.Student; +using Domain.Validation; + +namespace Domain.UseCases.Interactors.Student +{ + public class GetStudentByRegistrationCode : IGetStudentByRegistrationCode + { + private readonly IStudentRepository _studentRepository; + private readonly IMapper _mapper; + public GetStudentByRegistrationCode(IStudentRepository studentRepository, IMapper mapper) + { + _studentRepository = studentRepository; + _mapper = mapper; + } + + public async Task Execute(string? registrationCode) + { + // Verifica de a matrícula do aluno foi informada + UseCaseException.NotInformedParam(string.IsNullOrEmpty(registrationCode), "Matrícula"); + + // Busca o aluno pelo código de matrícula + var student = await _studentRepository.GetByRegistrationCode(registrationCode!); + + // Verifica se o aluno foi encontrado + UseCaseException.NotFoundEntityByParams(student is null, nameof(Entities.Student)); + + // Mapeia o aluno para a saída detalhada + return _mapper.Map(student); + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Student/IGetStudentByRegistrationCode.cs b/src/Domain/UseCases/Interfaces/Student/IGetStudentByRegistrationCode.cs new file mode 100644 index 00000000..deb0c6f9 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/Student/IGetStudentByRegistrationCode.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.Student; + +namespace Domain.UseCases.Interfaces.Student +{ + public interface IGetStudentByRegistrationCode + { + Task Execute(string? registrationCode); + } +} \ No newline at end of file diff --git a/src/Domain/Validation/UseCaseException.cs b/src/Domain/Validation/UseCaseException.cs index dfafe943..4e829a79 100644 --- a/src/Domain/Validation/UseCaseException.cs +++ b/src/Domain/Validation/UseCaseException.cs @@ -6,21 +6,26 @@ public UseCaseException() : base() { } public UseCaseException(string? message, Exception? innerException) : base(message, innerException) { } public static Exception BusinessRuleViolation(string message) => new UseCaseException(message); - public static Exception NotFoundEntityById(string entityName) => new UseCaseException($"Entity ({entityName}) not found by informed id."); - public static Exception NotFoundEntityByParams(string entityName) => new UseCaseException($"Entity ({entityName}) not found by informed parameters."); + public static Exception NotFoundEntityById(string entityName) => new UseCaseException($"Entidade ({entityName}) não encontrada através do Id informado."); + public static Exception NotFoundEntityByParams(string entityName) => new UseCaseException($"Entidade ({entityName}) não encontrada através dos parâmetros informados."); + + public static void NotFoundEntityByParams(bool hasError, string entityName) + { + if (hasError) throw NotFoundEntityByParams(entityName); + } public static void NotFoundEntityById(bool hasError, string entityName) { - if (hasError) throw new UseCaseException($"Entity ({entityName}) not found by informed id."); + if (hasError) throw NotFoundEntityById(entityName); } public static void BusinessRuleViolation(bool hasError, string message) { - if (hasError) throw new UseCaseException(message); + if (hasError) throw BusinessRuleViolation(message); } public static void NotInformedParam(bool hasError, string paramName) { - if (hasError) throw new UseCaseException($"Parameter ({paramName}) is required."); + if (hasError) throw new UseCaseException($"Parâmetro ({paramName}) é obrigatório."); } } diff --git a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs index 9e24b7a6..90e0f8a4 100644 --- a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs +++ b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs @@ -22,7 +22,7 @@ public static IServiceCollection AddAdapters(this IServiceCollection services) _ = services.AddScoped(); _ = services.AddScoped(); _ = services.AddScoped(); - // services.AddScoped(); + _ = services.AddScoped(); _ = services.AddScoped(); _ = services.AddScoped(); _ = services.AddScoped(); diff --git a/src/Infrastructure/IoC/DependencyDomainInjection.cs b/src/Infrastructure/IoC/DependencyDomainInjection.cs index 6772ede1..66ecf84c 100644 --- a/src/Infrastructure/IoC/DependencyDomainInjection.cs +++ b/src/Infrastructure/IoC/DependencyDomainInjection.cs @@ -14,6 +14,7 @@ using Domain.UseCases.Interactors.Project; using Domain.UseCases.Interactors.ProjectEvaluation; using Domain.UseCases.Interactors.Student; +using Domain.UseCases.Interactors.StudentDocuments; using Domain.UseCases.Interactors.SubArea; using Domain.UseCases.Interactors.User; using Domain.UseCases.Interfaces.ActivityType; @@ -29,6 +30,7 @@ using Domain.UseCases.Interfaces.Project; using Domain.UseCases.Interfaces.ProjectEvaluation; using Domain.UseCases.Interfaces.Student; +using Domain.UseCases.Interfaces.StudentDocuments; using Domain.UseCases.Interfaces.SubArea; using Domain.UseCases.Interfaces.User; using Microsoft.Extensions.DependencyInjection; @@ -148,15 +150,16 @@ public static IServiceCollection AddDomain(this IServiceCollection services) _ = services.AddScoped(); _ = services.AddScoped(); _ = services.AddScoped(); + _ = services.AddScoped(); #endregion Student #region StudentDocuments - // services.AddScoped(); - // services.AddScoped(); - // services.AddScoped(); - // services.AddScoped(); - // services.AddScoped(); - // services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); + _ = services.AddScoped(); #endregion StudentDocuments #region SubArea diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs index 13414354..357ba475 100644 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ b/src/Infrastructure/IoC/DependencyInjection.cs @@ -72,6 +72,7 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi _ = services.AddScoped(); _ = services.AddScoped(); _ = services.AddScoped(); + _ = services.AddScoped(); _ = services.AddScoped(); _ = services.AddScoped(); #endregion Repositórios diff --git a/src/Infrastructure/Persistence/Repositories/StudentRepository.cs b/src/Infrastructure/Persistence/Repositories/StudentRepository.cs index 892f82f6..e2933fc9 100644 --- a/src/Infrastructure/Persistence/Repositories/StudentRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/StudentRepository.cs @@ -59,6 +59,17 @@ public async Task Update(Student model) _ = await _context.SaveChangesAsync(); return model; } + + public async Task GetByRegistrationCode(string registrationCode) + { + return await _context.Students + .Include(x => x.User) + .Include(x => x.Campus) + .Include(x => x.Course) + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.RegistrationCode == registrationCode.ToUpper()); + } #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/WebAPI/Controllers/StudentController.cs b/src/Infrastructure/WebAPI/Controllers/StudentController.cs index b897942f..60657cbc 100644 --- a/src/Infrastructure/WebAPI/Controllers/StudentController.cs +++ b/src/Infrastructure/WebAPI/Controllers/StudentController.cs @@ -58,6 +58,37 @@ public async Task> GetById(Guid? id) } } + /// + /// Busca Estudante pelo id. + /// + /// + /// Estudante correspondente + /// Retorna Estudante correspondente + [HttpGet("RegistrationCode/{registrationCode}")] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task> GetByRegistrationCode(string? registrationCode) + { + if (registrationCode == null) + { + const string msg = "A matrícula informada não pode ser nula."; + _logger.LogWarning(msg); + return BadRequest(msg); + } + + try + { + Adapters.Gateways.Base.IResponse model = await _service.GetByRegistrationCode(registrationCode); + _logger.LogInformation("Estudante encontrado para a matrícula {registrationCode}.", registrationCode); + return Ok(model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return NotFound(ex.Message); + } + } + + /// /// Busca todas os Estudante ativos. /// From 8942901a99e016d0b6c02d43e3102fb01a8c74a6 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 2 Aug 2023 22:53:54 -0300 Subject: [PATCH 068/201] feat: add RequestStudentRegister endpoint --- .vscode/settings.json | 5 +- .../Interfaces/IStudentPresenterController.cs | 1 + .../StudentPresenterController.cs | 9 +- src/CopetSystem.API.sln | 9 +- .../Interfaces/Services/IEmailService.cs | 1 + .../Student/RequestStudentRegister.cs | 60 ++++++++++++++ .../Student/IRequestStudentRegister.cs | 7 ++ .../IoC/DependencyDomainInjection.cs | 1 + src/Infrastructure/IoC/DependencyInjection.cs | 2 +- .../Services/Email/EmailService.cs | 25 +++++- .../Email/Factories/EmailServiceFactory.cs | 12 +-- .../Email/Factories/IEmailServiceFactory.cs | 3 +- .../Templates/RequestStudentRegister.html | 83 +++++++++++++++++++ src/Infrastructure/Services/Services.csproj | 9 ++ .../WebAPI/Controllers/StudentController.cs | 29 +++++++ .../WebAPI/Properties/launchSettings.json | 2 +- src/Infrastructure/WebAPI/appsettings.json | 1 + 17 files changed, 246 insertions(+), 13 deletions(-) create mode 100644 src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs create mode 100644 src/Domain/UseCases/Interfaces/Student/IRequestStudentRegister.cs create mode 100644 src/Infrastructure/Services/Email/Templates/RequestStudentRegister.html diff --git a/.vscode/settings.json b/.vscode/settings.json index 1501347a..46d1612b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "dotnet-test-explorer.testProjectPath": "src/Domain.Tests/Domain.Tests.csproj" -} + "dotnet-test-explorer.testProjectPath": "src/Domain.Tests/Domain.Tests.csproj", + "dotnet.defaultSolution": "src/CopetSystem.API.sln" +} \ No newline at end of file diff --git a/src/Adapters/Interfaces/IStudentPresenterController.cs b/src/Adapters/Interfaces/IStudentPresenterController.cs index 388edffc..185683e0 100644 --- a/src/Adapters/Interfaces/IStudentPresenterController.cs +++ b/src/Adapters/Interfaces/IStudentPresenterController.cs @@ -5,4 +5,5 @@ namespace Adapters.Interfaces; public interface IStudentPresenterController : IGenericCRUDPresenterController { Task GetByRegistrationCode(string? registrationCode); + Task RequestStudentRegister(string? email); } \ No newline at end of file diff --git a/src/Adapters/PresenterController/StudentPresenterController.cs b/src/Adapters/PresenterController/StudentPresenterController.cs index 8b35b71f..07783094 100755 --- a/src/Adapters/PresenterController/StudentPresenterController.cs +++ b/src/Adapters/PresenterController/StudentPresenterController.cs @@ -16,9 +16,10 @@ public class StudentPresenterController : IStudentPresenterController private readonly IGetStudents _getStudents; private readonly IGetStudentById _getStudentById; private readonly IGetStudentByRegistrationCode _getStudentByRegistrationCode; + private readonly IRequestStudentRegister _requestStudentRegister; private readonly IMapper _mapper; - public StudentPresenterController(ICreateStudent createStudent, IUpdateStudent updateStudent, IDeleteStudent deleteStudent, IGetStudents getStudents, IGetStudentById getStudentById, IGetStudentByRegistrationCode getStudentByRegistrationCode, IMapper mapper) + public StudentPresenterController(ICreateStudent createStudent, IUpdateStudent updateStudent, IDeleteStudent deleteStudent, IGetStudents getStudents, IGetStudentById getStudentById, IGetStudentByRegistrationCode getStudentByRegistrationCode, IRequestStudentRegister requestStudentRegister, IMapper mapper) { _createStudent = createStudent; _updateStudent = updateStudent; @@ -26,6 +27,7 @@ public StudentPresenterController(ICreateStudent createStudent, IUpdateStudent u _getStudents = getStudents; _getStudentById = getStudentById; _getStudentByRegistrationCode = getStudentByRegistrationCode; + _requestStudentRegister = requestStudentRegister; _mapper = mapper; } #endregion Global Scope @@ -69,5 +71,10 @@ public async Task Update(Guid? id, IRequest request) DetailedReadStudentOutput result = await _updateStudent.Execute(id, input); return _mapper.Map(result); } + + public async Task RequestStudentRegister(string? email) + { + return await _requestStudentRegister.Execute(email); + } } } \ No newline at end of file diff --git a/src/CopetSystem.API.sln b/src/CopetSystem.API.sln index 63cc7262..09b0f150 100644 --- a/src/CopetSystem.API.sln +++ b/src/CopetSystem.API.sln @@ -15,10 +15,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IoC", "Infrastructure\IoC\I EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAPI", "Infrastructure\WebAPI\WebAPI.csproj", "{163219BE-A0D2-41A1-A028-501AAB069BD9}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Domain.Tests", "Domain.Tests\Domain.Tests.csproj", "{370C1BE1-63EE-4D2E-AD4A-6D8392EEFF40}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Domain.Tests", "Domain.Tests", "{370C1BE1-63EE-4D2E-AD4A-6D8392EEFF40}" EndProject Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "Docker\docker-compose.dcproj", "{58DF51E2-67F0-4740-B20B-8DE70C99FE2B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Services", "Infrastructure\Services\Services.csproj", "{7555C53A-BADC-49D9-82BE-C4D8587260EB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -88,10 +90,15 @@ Global {58DF51E2-67F0-4740-B20B-8DE70C99FE2B}.Debug|Any CPU.Build.0 = Debug|Any CPU {58DF51E2-67F0-4740-B20B-8DE70C99FE2B}.Release|Any CPU.ActiveCfg = Release|Any CPU {58DF51E2-67F0-4740-B20B-8DE70C99FE2B}.Release|Any CPU.Build.0 = Release|Any CPU + {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {FCC65F72-7AF9-4940-B07A-E7DDDC7967B7} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} {DC12A23D-7BF2-4F0A-A317-B9FA8818C9C2} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} {163219BE-A0D2-41A1-A028-501AAB069BD9} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} + {7555C53A-BADC-49D9-82BE-C4D8587260EB} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} EndGlobalSection EndGlobal diff --git a/src/Domain/Interfaces/Services/IEmailService.cs b/src/Domain/Interfaces/Services/IEmailService.cs index 76aee112..071a4cdb 100644 --- a/src/Domain/Interfaces/Services/IEmailService.cs +++ b/src/Domain/Interfaces/Services/IEmailService.cs @@ -6,5 +6,6 @@ public interface IEmailService Task SendResetPasswordEmail(string? email, string? name, string? token); Task SendNoticeEmail(string? email, string? name, DateTime? registrationStartDate, DateTime? registrationEndDate, string? noticeUrl); Task SendProjectNotificationEmail(string? email, string? name, string? projectTitle, string? status, string? description); + Task SendRequestStudentRegisterEmail(string? email); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs b/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs new file mode 100644 index 00000000..e4ecd7ca --- /dev/null +++ b/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs @@ -0,0 +1,60 @@ +using System.Text.RegularExpressions; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Domain.UseCases.Interfaces.Student; +using Domain.Validation; + +namespace Domain.UseCases.Interactors.Student +{ + public class RequestStudentRegister : IRequestStudentRegister + { + private readonly IEmailService _emailService; + private readonly IUserRepository _userRepository; + public RequestStudentRegister(IEmailService emailService, IUserRepository userRepository) + { + _emailService = emailService; + _userRepository = userRepository; + } + + public async Task Execute(string? email) + { + // Verifica se o email foi informado + UseCaseException.NotInformedParam(string.IsNullOrEmpty(email), "Email"); + + // Verifica se o email é válido + UseCaseException.BusinessRuleViolation(!ValidateStudentEmail(email!), "Email inválido."); + + // Verifica se o email já está cadastrado + var user = await _userRepository.GetUserByEmail(email!); + + // Se o usuário já existe, lança uma exceção + UseCaseException.BusinessRuleViolation(user is not null, "Email já cadastrado."); + + // Solicita o registro do usuário + await _emailService.SendRequestStudentRegisterEmail(email!); + + // Retorna resultado + return "Solicitação de registro enviada com sucesso."; + } + + /// + /// Verifica se o e-mail informado é válido para o estudante. + /// Padrões aceitos: + /// - nome.sobrenome@aluno.cefet-rj.br + /// - 12345678912@cefet-rj.br + /// + /// E-mail a ser validado + /// True se o e-mail é válido, caso contrário, False + public bool ValidateStudentEmail(string email) + { + // Padrão de e-mail para estudantes + string studentEmailPattern = @"^(?[a-zA-Z0-9._-]+)@(?aluno\.cefet-rj\.br|cefet-rj\.br)$"; + + // Realiza o match do e-mail com o padrão + Match emailMatch = Regex.Match(email, studentEmailPattern); + + // Retorna se o e-mail é válido de acordo com o padrão + return emailMatch.Success; + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Student/IRequestStudentRegister.cs b/src/Domain/UseCases/Interfaces/Student/IRequestStudentRegister.cs new file mode 100644 index 00000000..1a817396 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/Student/IRequestStudentRegister.cs @@ -0,0 +1,7 @@ +namespace Domain.UseCases.Interfaces.Student +{ + public interface IRequestStudentRegister + { + Task Execute(string? email); + } +} \ No newline at end of file diff --git a/src/Infrastructure/IoC/DependencyDomainInjection.cs b/src/Infrastructure/IoC/DependencyDomainInjection.cs index 66ecf84c..820d2ad4 100644 --- a/src/Infrastructure/IoC/DependencyDomainInjection.cs +++ b/src/Infrastructure/IoC/DependencyDomainInjection.cs @@ -151,6 +151,7 @@ public static IServiceCollection AddDomain(this IServiceCollection services) _ = services.AddScoped(); _ = services.AddScoped(); _ = services.AddScoped(); + _ = services.AddScoped(); #endregion Student #region StudentDocuments diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs index 357ba475..890d3d32 100644 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ b/src/Infrastructure/IoC/DependencyInjection.cs @@ -53,7 +53,7 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi _ = services.AddSingleton(sp => { IEmailServiceFactory factory = sp.GetRequiredService(); - return factory.Create(smtpConfig); + return factory.Create(smtpConfig, configuration); }); #endregion Serviço de E-mail diff --git a/src/Infrastructure/Services/Email/EmailService.cs b/src/Infrastructure/Services/Email/EmailService.cs index ea1d113b..6fe20225 100644 --- a/src/Infrastructure/Services/Email/EmailService.cs +++ b/src/Infrastructure/Services/Email/EmailService.cs @@ -1,6 +1,7 @@ using System.Net; using System.Net.Mail; using Domain.Interfaces.Services; +using Microsoft.Extensions.Configuration; namespace Services.Email { @@ -12,14 +13,16 @@ public class EmailService : IEmailService private readonly string? _smtpUsername; private readonly string? _smtpPassword; private readonly string? _currentDirectory; + private readonly string? _siteUrl; - public EmailService(string? smtpServer, int smtpPort, string? smtpUsername, string? smtpPassword) + public EmailService(string? smtpServer, int smtpPort, string? smtpUsername, string? smtpPassword, IConfiguration configuration) { _smtpServer = smtpServer; _smtpPort = smtpPort; _smtpUsername = smtpUsername; _smtpPassword = smtpPassword; _currentDirectory = Path.GetDirectoryName(typeof(EmailService).Assembly.Location); + _siteUrl = configuration.GetSection("SiteUrl").Value; } #endregion Global Scope @@ -109,6 +112,26 @@ public async Task SendProjectNotificationEmail(string? email, string? name, stri await SendEmailAsync(email, subject, body); } + public async Task SendRequestStudentRegisterEmail(string? email) + { + // Verifica se os parâmetros são nulos ou vazios + if (string.IsNullOrEmpty(email)) + { + throw new Exception("Parâmetros inválidos. Email é obrigatório."); + } + + // Lê mensagem do template em html salvo localmente + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/RequestStudentRegister.html")); + + // Gera mensagem de envio + const string subject = "Solicitação de Registro"; + string body = template + .Replace("#REGISTRATION_LINK#", _siteUrl); + + // Tentativa de envio de email + await SendEmailAsync(email, subject, body); + } + #region Private Methods public async Task SendEmailAsync(string email, string subject, string message) { diff --git a/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs b/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs index f41647e8..c59a00f9 100644 --- a/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs +++ b/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs @@ -1,17 +1,19 @@ using Domain.Interfaces.Services; using Services.Email.Configs; +using Microsoft.Extensions.Configuration; namespace Services.Email.Factories { public class EmailServiceFactory : IEmailServiceFactory { - public IEmailService Create(SmtpConfiguration configuration) + public IEmailService Create(SmtpConfiguration settings, IConfiguration configuration) { return new EmailService( - configuration.Server, - configuration.Port, - configuration.Username, - configuration.Password); + settings.Server, + settings.Port, + settings.Username, + settings.Password, + configuration); } } } \ No newline at end of file diff --git a/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs b/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs index 3cf70abe..c0ceb9cd 100644 --- a/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs +++ b/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs @@ -1,10 +1,11 @@ using Domain.Interfaces.Services; +using Microsoft.Extensions.Configuration; using Services.Email.Configs; namespace Services.Email.Factories { public interface IEmailServiceFactory { - IEmailService Create(SmtpConfiguration configuration); + IEmailService Create(SmtpConfiguration settings, IConfiguration configuration); } } \ No newline at end of file diff --git a/src/Infrastructure/Services/Email/Templates/RequestStudentRegister.html b/src/Infrastructure/Services/Email/Templates/RequestStudentRegister.html new file mode 100644 index 00000000..c5e8fb6a --- /dev/null +++ b/src/Infrastructure/Services/Email/Templates/RequestStudentRegister.html @@ -0,0 +1,83 @@ + + + + + + Solicitação de Cadastro + + + +
+

Solicitação de Cadastro

+

Olá,

+

+ Um professor do CEFET solicitou o seu cadastro para a sua inclusão em um + processo de Iniciação Científica. +

+

+ Para prosseguir, clique no link abaixo e complete seu cadastro em nossa + plataforma. +

+ +

Atenciosamente,
G-PIC

+

+ Este e-mail foi enviado automaticamente. Por favor, não responda. + +
Gerenciador de Projetos de Iniciação Científica, CEFET +
+

+
+ + diff --git a/src/Infrastructure/Services/Services.csproj b/src/Infrastructure/Services/Services.csproj index 50eee9ea..afb0a3db 100644 --- a/src/Infrastructure/Services/Services.csproj +++ b/src/Infrastructure/Services/Services.csproj @@ -22,6 +22,15 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/src/Infrastructure/WebAPI/Controllers/StudentController.cs b/src/Infrastructure/WebAPI/Controllers/StudentController.cs index 60657cbc..c1b763bf 100644 --- a/src/Infrastructure/WebAPI/Controllers/StudentController.cs +++ b/src/Infrastructure/WebAPI/Controllers/StudentController.cs @@ -88,6 +88,35 @@ public async Task> GetByRegistrationCo } } + /// + /// Solicita registro de Estudante através do e-mail. + /// + /// E-mail do estudante + /// Informa se o envio do e-mail foi bem sucedido + /// E-mail enviado com sucesso + [HttpGet("RequestRegister/{email}")] + [ProducesResponseType(StatusCodes.Status200OK)] + public async Task> RequestStudentRegister(string? email) + { + if (email == null) + { + const string msg = "A matrícula informada não pode ser nula."; + _logger.LogWarning(msg); + return BadRequest(msg); + } + + try + { + string? message = await _service.RequestStudentRegister(email); + _logger.LogInformation("{message}.", message); + return Ok(message); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return NotFound(ex.Message); + } + } /// /// Busca todas os Estudante ativos. diff --git a/src/Infrastructure/WebAPI/Properties/launchSettings.json b/src/Infrastructure/WebAPI/Properties/launchSettings.json index a6946a36..0cab12e7 100644 --- a/src/Infrastructure/WebAPI/Properties/launchSettings.json +++ b/src/Infrastructure/WebAPI/Properties/launchSettings.json @@ -35,4 +35,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/Infrastructure/WebAPI/appsettings.json b/src/Infrastructure/WebAPI/appsettings.json index 3d405741..4e12f1af 100644 --- a/src/Infrastructure/WebAPI/appsettings.json +++ b/src/Infrastructure/WebAPI/appsettings.json @@ -1,4 +1,5 @@ { + "SiteUrl": "https://localhost:5001", "ConnectionStrings": { "DefaultConnection": "Server=localhost;Database=COPET_DB;Port=15432;User ID=copet-admin;password=Copet@123;Include Error Detail=true;" }, From 4d59cb23431be65eef6245a0bc028ad553e34fbb Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 2 Aug 2023 22:56:41 -0300 Subject: [PATCH 069/201] refactor: replace Exectue methods for ExecuteAsync --- .../AreaPresenterController.cs | 10 +++++----- .../AuthPresenterController.cs | 8 ++++---- .../CampusPresenterController.cs | 10 +++++----- .../CoursePresenterController.cs | 10 +++++----- .../MainAreaPresenterController.cs | 10 +++++----- .../NoticePresenterController.cs | 10 +++++----- .../ProfessorPresenterController.cs | 10 +++++----- .../ProgramTypePresenterController.cs | 10 +++++----- .../ProjectEvaluationPresenterController.cs | 6 +++--- .../ProjectPresenterController.cs | 16 ++++++++-------- .../StudentDocumentsPresenterController.cs | 10 +++++----- .../StudentPresenterController.cs | 14 +++++++------- .../SubAreaPresenterController.cs | 10 +++++----- .../TypeAssistancePresenterController.cs | 10 +++++----- .../UserPresenterController.cs | 12 ++++++------ .../UseCases/Area/CreateAreaTests.cs | 8 ++++---- .../UseCases/Area/DeleteAreaTests.cs | 4 ++-- .../UseCases/Area/GetAreaByIdTests.cs | 4 ++-- .../UseCases/Area/UpdateAreaTests.cs | 6 +++--- .../UseCases/Interactors/Area/CreateArea.cs | 2 +- .../UseCases/Interactors/Area/DeleteArea.cs | 2 +- .../UseCases/Interactors/Area/GetAreaById.cs | 2 +- .../Interactors/Area/GetAreasByMainArea.cs | 2 +- .../UseCases/Interactors/Area/UpdateArea.cs | 2 +- .../AssistanceType/CreateAssistanceType.cs | 2 +- .../AssistanceType/DeleteAssistanceType.cs | 2 +- .../AssistanceType/GetAssistanceTypeById.cs | 2 +- .../AssistanceType/GetAssistanceTypes.cs | 2 +- .../AssistanceType/UpdateAssistanceType.cs | 2 +- .../UseCases/Interactors/Auth/ConfirmEmail.cs | 2 +- .../UseCases/Interactors/Auth/ForgotPassword.cs | 2 +- src/Domain/UseCases/Interactors/Auth/Login.cs | 2 +- .../UseCases/Interactors/Auth/ResetPassword.cs | 2 +- .../UseCases/Interactors/Campus/CreateCampus.cs | 2 +- .../UseCases/Interactors/Campus/DeleteCampus.cs | 2 +- .../UseCases/Interactors/Campus/GetCampusById.cs | 2 +- .../UseCases/Interactors/Campus/GetCampuses.cs | 2 +- .../UseCases/Interactors/Campus/UpdateCampus.cs | 2 +- .../UseCases/Interactors/Course/CreateCourse.cs | 2 +- .../UseCases/Interactors/Course/DeleteCourse.cs | 2 +- .../UseCases/Interactors/Course/GetCourseById.cs | 2 +- .../UseCases/Interactors/Course/GetCourses.cs | 2 +- .../UseCases/Interactors/Course/UpdateCourse.cs | 2 +- .../Interactors/MainArea/CreateMainArea.cs | 2 +- .../Interactors/MainArea/DeleteMainArea.cs | 2 +- .../Interactors/MainArea/GetMainAreaById.cs | 2 +- .../Interactors/MainArea/GetMainAreas.cs | 2 +- .../Interactors/MainArea/UpdateMainArea.cs | 2 +- .../UseCases/Interactors/Notice/CreateNotice.cs | 2 +- .../UseCases/Interactors/Notice/DeleteNotice.cs | 2 +- .../UseCases/Interactors/Notice/GetNoticeById.cs | 2 +- .../UseCases/Interactors/Notice/GetNotices.cs | 2 +- .../UseCases/Interactors/Notice/UpdateNotice.cs | 2 +- .../Interactors/Professor/CreateProfessor.cs | 2 +- .../Interactors/Professor/DeleteProfessor.cs | 2 +- .../Interactors/Professor/GetProfessorById.cs | 2 +- .../Interactors/Professor/GetProfessors.cs | 2 +- .../Interactors/Professor/UpdateProfessor.cs | 2 +- .../Interactors/ProgramType/CreateProgramType.cs | 2 +- .../Interactors/ProgramType/DeleteProgramType.cs | 2 +- .../ProgramType/GetProgramTypeById.cs | 2 +- .../Interactors/ProgramType/GetProgramTypes.cs | 2 +- .../Interactors/ProgramType/UpdateProgramType.cs | 2 +- .../Interactors/Project/AppealProject.cs | 2 +- .../Interactors/Project/CancelProject.cs | 2 +- .../Interactors/Project/GetClosedProjects.cs | 2 +- .../Interactors/Project/GetOpenProjects.cs | 2 +- .../Interactors/Project/GetProjectById.cs | 2 +- .../UseCases/Interactors/Project/OpenProject.cs | 2 +- .../Interactors/Project/SubmitProject.cs | 2 +- .../Interactors/Project/UpdateProject.cs | 2 +- .../ProjectEvaluation/EvaluateAppealProject.cs | 2 +- .../EvaluateSubmissionProject.cs | 2 +- .../GetEvaluationByProjectId.cs | 2 +- .../Interactors/Student/CreateStudent.cs | 2 +- .../Interactors/Student/DeleteStudent.cs | 2 +- .../Interactors/Student/GetStudentById.cs | 2 +- .../Student/GetStudentByRegistrationCode.cs | 2 +- .../UseCases/Interactors/Student/GetStudents.cs | 2 +- .../Student/RequestStudentRegister.cs | 2 +- .../Interactors/Student/UpdateStudent.cs | 2 +- .../StudentDocuments/CreateStudentDocuments.cs | 2 +- .../StudentDocuments/DeleteStudentDocuments.cs | 2 +- .../GetStudentDocumentsByProjectId.cs | 2 +- .../GetStudentDocumentsByStudentId.cs | 2 +- .../StudentDocuments/UpdateStudentDocuments.cs | 2 +- .../Interactors/SubArea/CreateSubArea.cs | 2 +- .../Interactors/SubArea/DeleteSubArea.cs | 2 +- .../Interactors/SubArea/GetSubAreaById.cs | 2 +- .../Interactors/SubArea/GetSubAreasByArea.cs | 2 +- .../Interactors/SubArea/UpdateSubArea.cs | 2 +- .../UseCases/Interactors/User/ActivateUser.cs | 2 +- .../UseCases/Interactors/User/DeactivateUser.cs | 2 +- .../UseCases/Interactors/User/GetActiveUsers.cs | 2 +- .../Interactors/User/GetInactiveUsers.cs | 2 +- .../UseCases/Interactors/User/GetUserById.cs | 2 +- .../UseCases/Interactors/User/UpdateUser.cs | 2 +- .../UseCases/Interfaces/Area/ICreateArea.cs | 2 +- .../UseCases/Interfaces/Area/IDeleteArea.cs | 2 +- .../UseCases/Interfaces/Area/IGetAreaById.cs | 2 +- .../Interfaces/Area/IGetAreasByMainArea.cs | 2 +- .../UseCases/Interfaces/Area/IUpdateArea.cs | 2 +- .../AssistanceType/ICreateAssistanceType.cs | 2 +- .../AssistanceType/IDeleteAssistanceType.cs | 2 +- .../AssistanceType/IGetAssistanceTypeById.cs | 2 +- .../AssistanceType/IGetAssistanceTypes.cs | 2 +- .../AssistanceType/IUpdateAssistanceType.cs | 2 +- .../UseCases/Interfaces/Auth/IConfirmEmail.cs | 2 +- .../UseCases/Interfaces/Auth/IForgotPassword.cs | 2 +- src/Domain/UseCases/Interfaces/Auth/ILogin.cs | 2 +- .../UseCases/Interfaces/Auth/IResetPassword.cs | 2 +- .../UseCases/Interfaces/Campus/ICreateCampus.cs | 2 +- .../UseCases/Interfaces/Campus/IDeleteCampus.cs | 2 +- .../UseCases/Interfaces/Campus/IGetCampusById.cs | 2 +- .../UseCases/Interfaces/Campus/IGetCampuses.cs | 2 +- .../UseCases/Interfaces/Campus/IUpdateCampus.cs | 2 +- .../UseCases/Interfaces/Course/ICreateCourse.cs | 2 +- .../UseCases/Interfaces/Course/IDeleteCourse.cs | 2 +- .../UseCases/Interfaces/Course/IGetCourseById.cs | 2 +- .../UseCases/Interfaces/Course/IGetCourses.cs | 2 +- .../UseCases/Interfaces/Course/IUpdateCourse.cs | 2 +- .../Interfaces/MainArea/ICreateMainArea.cs | 2 +- .../Interfaces/MainArea/IDeleteMainArea.cs | 2 +- .../Interfaces/MainArea/IGetMainAreaById.cs | 2 +- .../Interfaces/MainArea/IGetMainAreas.cs | 2 +- .../Interfaces/MainArea/IUpdateMainArea.cs | 2 +- .../UseCases/Interfaces/Notice/ICreateNotice.cs | 2 +- .../UseCases/Interfaces/Notice/IDeleteNotice.cs | 2 +- .../UseCases/Interfaces/Notice/IGetNoticeById.cs | 2 +- .../UseCases/Interfaces/Notice/IGetNotices.cs | 2 +- .../UseCases/Interfaces/Notice/IUpdateNotice.cs | 2 +- .../Interfaces/Professor/ICreateProfessor.cs | 2 +- .../Interfaces/Professor/IDeleteProfessor.cs | 2 +- .../Interfaces/Professor/IGetProfessorById.cs | 2 +- .../Interfaces/Professor/IGetProfessors.cs | 2 +- .../Interfaces/Professor/IUpdateProfessor.cs | 2 +- .../Interfaces/ProgramType/ICreateProgramType.cs | 2 +- .../Interfaces/ProgramType/IDeleteProgramType.cs | 2 +- .../ProgramType/IGetProgramTypeById.cs | 2 +- .../Interfaces/ProgramType/IGetProgramTypes.cs | 2 +- .../Interfaces/ProgramType/IUpdateProgramType.cs | 2 +- .../Interfaces/Project/IAppealProject.cs | 2 +- .../Interfaces/Project/ICancelProject.cs | 2 +- .../Interfaces/Project/IGetClosedProjects.cs | 2 +- .../Interfaces/Project/IGetOpenProjects.cs | 2 +- .../Interfaces/Project/IGetProjectById.cs | 2 +- .../UseCases/Interfaces/Project/IOpenProject.cs | 2 +- .../Interfaces/Project/ISubmitProject.cs | 2 +- .../Interfaces/Project/IUpdateProject.cs | 2 +- .../ProjectEvaluation/IEvaluateAppealProject.cs | 2 +- .../IEvaluateSubmissionProject.cs | 2 +- .../IGetEvaluationByProjectId.cs | 2 +- .../Interfaces/Student/ICreateStudent.cs | 2 +- .../Interfaces/Student/IDeleteStudent.cs | 2 +- .../Interfaces/Student/IGetStudentById.cs | 2 +- .../Student/IGetStudentByRegistrationCode.cs | 2 +- .../UseCases/Interfaces/Student/IGetStudents.cs | 2 +- .../Student/IRequestStudentRegister.cs | 2 +- .../Interfaces/Student/IUpdateStudent.cs | 2 +- .../StudentDocuments/ICreateStudentDocuments.cs | 2 +- .../StudentDocuments/IDeleteStudentDocuments.cs | 2 +- .../IGetStudentDocumentsByProjectId.cs | 2 +- .../IGetStudentDocumentsByStudentId.cs | 2 +- .../StudentDocuments/IUpdateStudentDocuments.cs | 2 +- .../Interfaces/SubArea/ICreateSubArea.cs | 2 +- .../Interfaces/SubArea/IDeleteSubArea.cs | 2 +- .../Interfaces/SubArea/IGetSubAreaById.cs | 2 +- .../Interfaces/SubArea/IGetSubAreasByArea.cs | 2 +- .../Interfaces/SubArea/IUpdateSubArea.cs | 2 +- .../UseCases/Interfaces/User/IActivateUser.cs | 2 +- .../UseCases/Interfaces/User/IDeactivateUser.cs | 2 +- .../UseCases/Interfaces/User/IGetActiveUsers.cs | 2 +- .../Interfaces/User/IGetInactiveUsers.cs | 2 +- .../UseCases/Interfaces/User/IGetUserById.cs | 2 +- .../UseCases/Interfaces/User/IUpdateUser.cs | 2 +- .../WebAPI/Controllers/StudentController.cs | 2 +- 176 files changed, 246 insertions(+), 246 deletions(-) diff --git a/src/Adapters/PresenterController/AreaPresenterController.cs b/src/Adapters/PresenterController/AreaPresenterController.cs index 49c00ba2..49a53a68 100755 --- a/src/Adapters/PresenterController/AreaPresenterController.cs +++ b/src/Adapters/PresenterController/AreaPresenterController.cs @@ -32,19 +32,19 @@ public async Task Create(IRequest request) { CreateAreaRequest? dto = request as CreateAreaRequest; CreateAreaInput input = _mapper.Map(dto); - DetailedReadAreaOutput result = await _createArea.Execute(input); + DetailedReadAreaOutput result = await _createArea.ExecuteAsync(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - DetailedReadAreaOutput result = await _deleteArea.Execute(id); + DetailedReadAreaOutput result = await _deleteArea.ExecuteAsync(id); return _mapper.Map(result); } public async Task> GetAreasByMainArea(Guid? mainAreaId, int skip, int take) { - IQueryable result = await _getAreasByMainArea.Execute(mainAreaId, skip, take); + IQueryable result = await _getAreasByMainArea.ExecuteAsync(mainAreaId, skip, take); return _mapper.Map>(result); } @@ -55,7 +55,7 @@ public Task> GetAll(int skip, int take) public async Task GetById(Guid? id) { - DetailedReadAreaOutput result = await _getAreaById.Execute(id); + DetailedReadAreaOutput result = await _getAreaById.ExecuteAsync(id); return _mapper.Map(result); } @@ -63,7 +63,7 @@ public async Task Update(Guid? id, IRequest request) { UpdateAreaRequest? dto = request as UpdateAreaRequest; UpdateAreaInput input = _mapper.Map(dto); - DetailedReadAreaOutput result = await _updateArea.Execute(id, input); + DetailedReadAreaOutput result = await _updateArea.ExecuteAsync(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/AuthPresenterController.cs b/src/Adapters/PresenterController/AuthPresenterController.cs index 73ced67d..badb5c70 100755 --- a/src/Adapters/PresenterController/AuthPresenterController.cs +++ b/src/Adapters/PresenterController/AuthPresenterController.cs @@ -27,25 +27,25 @@ public AuthPresenterController(IMapper mapper, IConfirmEmail confirmUserEmail, I public async Task ConfirmEmail(string? email, string? token) { - return await _confirmUserEmail.Execute(email, token); + return await _confirmUserEmail.ExecuteAsync(email, token); } public async Task ForgotPassword(string? email) { - return await _forgotPassword.Execute(email); + return await _forgotPassword.ExecuteAsync(email); } public async Task Login(UserLoginRequest request) { return _mapper .Map(await _login - .Execute(_mapper + .ExecuteAsync(_mapper .Map(request))); } public async Task ResetPassword(UserResetPasswordRequest request) { - return await _resetPassword.Execute(_mapper.Map(request)); + return await _resetPassword.ExecuteAsync(_mapper.Map(request)); } } } \ No newline at end of file diff --git a/src/Adapters/PresenterController/CampusPresenterController.cs b/src/Adapters/PresenterController/CampusPresenterController.cs index 0f821bf2..080a3441 100755 --- a/src/Adapters/PresenterController/CampusPresenterController.cs +++ b/src/Adapters/PresenterController/CampusPresenterController.cs @@ -32,25 +32,25 @@ public async Task Create(IRequest request) { CreateCampusRequest? dto = request as CreateCampusRequest; CreateCampusInput input = _mapper.Map(dto); - DetailedReadCampusOutput result = await _createCampus.Execute(input); + DetailedReadCampusOutput result = await _createCampus.ExecuteAsync(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - DetailedReadCampusOutput result = await _deleteCampus.Execute(id); + DetailedReadCampusOutput result = await _deleteCampus.ExecuteAsync(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - IQueryable result = await _getCampuses.Execute(skip, take); + IQueryable result = await _getCampuses.ExecuteAsync(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - DetailedReadCampusOutput result = await _getCampusById.Execute(id); + DetailedReadCampusOutput result = await _getCampusById.ExecuteAsync(id); return _mapper.Map(result); } @@ -58,7 +58,7 @@ public async Task Update(Guid? id, IRequest request) { UpdateCampusRequest? dto = request as UpdateCampusRequest; UpdateCampusInput input = _mapper.Map(dto); - DetailedReadCampusOutput result = await _updateCampus.Execute(id, input); + DetailedReadCampusOutput result = await _updateCampus.ExecuteAsync(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/CoursePresenterController.cs b/src/Adapters/PresenterController/CoursePresenterController.cs index 9b4aff7c..44dc0dab 100755 --- a/src/Adapters/PresenterController/CoursePresenterController.cs +++ b/src/Adapters/PresenterController/CoursePresenterController.cs @@ -33,25 +33,25 @@ public async Task Create(IRequest request) { CreateCourseRequest? dto = request as CreateCourseRequest; CreateCourseInput input = _mapper.Map(dto); - DetailedReadCourseOutput result = await _createCourse.Execute(input); + DetailedReadCourseOutput result = await _createCourse.ExecuteAsync(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - DetailedReadCourseOutput result = await _deleteCourse.Execute(id); + DetailedReadCourseOutput result = await _deleteCourse.ExecuteAsync(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - IQueryable result = await _getCourses.Execute(skip, take); + IQueryable result = await _getCourses.ExecuteAsync(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - DetailedReadCourseOutput result = await _getCourseById.Execute(id); + DetailedReadCourseOutput result = await _getCourseById.ExecuteAsync(id); return _mapper.Map(result); } @@ -59,7 +59,7 @@ public async Task Update(Guid? id, IRequest request) { UpdateCourseRequest? dto = request as UpdateCourseRequest; UpdateCourseInput input = _mapper.Map(dto); - DetailedReadCourseOutput result = await _updateCourse.Execute(id, input); + DetailedReadCourseOutput result = await _updateCourse.ExecuteAsync(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/MainAreaPresenterController.cs b/src/Adapters/PresenterController/MainAreaPresenterController.cs index 89e7fdf8..f11fe4cd 100755 --- a/src/Adapters/PresenterController/MainAreaPresenterController.cs +++ b/src/Adapters/PresenterController/MainAreaPresenterController.cs @@ -32,25 +32,25 @@ public async Task Create(IRequest request) { CreateMainAreaRequest? dto = request as CreateMainAreaRequest; CreateMainAreaInput input = _mapper.Map(dto); - DetailedMainAreaOutput result = await _createMainArea.Execute(input); + DetailedMainAreaOutput result = await _createMainArea.ExecuteAsync(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - DetailedMainAreaOutput result = await _deleteMainArea.Execute(id); + DetailedMainAreaOutput result = await _deleteMainArea.ExecuteAsync(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - IQueryable result = await _getMainAreas.Execute(skip, take); + IQueryable result = await _getMainAreas.ExecuteAsync(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - DetailedMainAreaOutput result = await _getMainAreaById.Execute(id); + DetailedMainAreaOutput result = await _getMainAreaById.ExecuteAsync(id); return _mapper.Map(result); } @@ -58,7 +58,7 @@ public async Task Update(Guid? id, IRequest request) { UpdateMainAreaRequest? dto = request as UpdateMainAreaRequest; UpdateMainAreaInput input = _mapper.Map(dto); - DetailedMainAreaOutput result = await _updateMainArea.Execute(id, input); + DetailedMainAreaOutput result = await _updateMainArea.ExecuteAsync(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/NoticePresenterController.cs b/src/Adapters/PresenterController/NoticePresenterController.cs index 05c59c11..3b3ef872 100755 --- a/src/Adapters/PresenterController/NoticePresenterController.cs +++ b/src/Adapters/PresenterController/NoticePresenterController.cs @@ -37,32 +37,32 @@ public NoticePresenterController( public async Task Create(IRequest request) { CreateNoticeInput input = _mapper.Map(request as CreateNoticeRequest); - DetailedReadNoticeOutput result = await _createNotice.Execute(input); + DetailedReadNoticeOutput result = await _createNotice.ExecuteAsync(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - DetailedReadNoticeOutput result = await _deleteNotice.Execute(id); + DetailedReadNoticeOutput result = await _deleteNotice.ExecuteAsync(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - IEnumerable result = await _getNotices.Execute(skip, take); + IEnumerable result = await _getNotices.ExecuteAsync(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - DetailedReadNoticeOutput result = await _getNoticeById.Execute(id); + DetailedReadNoticeOutput result = await _getNoticeById.ExecuteAsync(id); return _mapper.Map(result); } public async Task Update(Guid? id, IRequest request) { UpdateNoticeInput input = _mapper.Map(request as UpdateNoticeRequest); - DetailedReadNoticeOutput result = await _updateNotice.Execute(id, input); + DetailedReadNoticeOutput result = await _updateNotice.ExecuteAsync(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/ProfessorPresenterController.cs b/src/Adapters/PresenterController/ProfessorPresenterController.cs index 8a6823fc..3b709c19 100755 --- a/src/Adapters/PresenterController/ProfessorPresenterController.cs +++ b/src/Adapters/PresenterController/ProfessorPresenterController.cs @@ -37,25 +37,25 @@ public async Task Create(IRequest request) { CreateProfessorRequest? dto = request as CreateProfessorRequest; CreateProfessorInput input = _mapper.Map(dto); - DetailedReadProfessorOutput result = await _createProfessor.Execute(input); + DetailedReadProfessorOutput result = await _createProfessor.ExecuteAsync(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - DetailedReadProfessorOutput result = await _deleteProfessor.Execute(id); + DetailedReadProfessorOutput result = await _deleteProfessor.ExecuteAsync(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - IQueryable result = await _getProfessors.Execute(skip, take); + IQueryable result = await _getProfessors.ExecuteAsync(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - DetailedReadProfessorOutput result = await _getProfessorById.Execute(id); + DetailedReadProfessorOutput result = await _getProfessorById.ExecuteAsync(id); return _mapper.Map(result); } @@ -63,7 +63,7 @@ public async Task Update(Guid? id, IRequest request) { UpdateProfessorRequest? dto = request as UpdateProfessorRequest; UpdateProfessorInput input = _mapper.Map(dto); - DetailedReadProfessorOutput result = await _updateProfessor.Execute(id, input); + DetailedReadProfessorOutput result = await _updateProfessor.ExecuteAsync(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/ProgramTypePresenterController.cs b/src/Adapters/PresenterController/ProgramTypePresenterController.cs index 031ed6a7..dd341e11 100755 --- a/src/Adapters/PresenterController/ProgramTypePresenterController.cs +++ b/src/Adapters/PresenterController/ProgramTypePresenterController.cs @@ -32,25 +32,25 @@ public async Task Create(IRequest request) { CreateProgramTypeRequest? dto = request as CreateProgramTypeRequest; CreateProgramTypeInput input = _mapper.Map(dto); - DetailedReadProgramTypeOutput result = await _createProgramType.Execute(input); + DetailedReadProgramTypeOutput result = await _createProgramType.ExecuteAsync(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - DetailedReadProgramTypeOutput result = await _deleteProgramType.Execute(id); + DetailedReadProgramTypeOutput result = await _deleteProgramType.ExecuteAsync(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - IQueryable result = await _getProgramTypes.Execute(skip, take); + IQueryable result = await _getProgramTypes.ExecuteAsync(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - DetailedReadProgramTypeOutput result = await _getProgramTypeById.Execute(id); + DetailedReadProgramTypeOutput result = await _getProgramTypeById.ExecuteAsync(id); return _mapper.Map(result); } @@ -58,7 +58,7 @@ public async Task Update(Guid? id, IRequest request) { UpdateProgramTypeRequest? dto = request as UpdateProgramTypeRequest; UpdateProgramTypeInput input = _mapper.Map(dto); - DetailedReadProgramTypeOutput result = await _updateProgramType.Execute(id, input); + DetailedReadProgramTypeOutput result = await _updateProgramType.ExecuteAsync(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/ProjectEvaluationPresenterController.cs b/src/Adapters/PresenterController/ProjectEvaluationPresenterController.cs index 72844afc..afcb20aa 100644 --- a/src/Adapters/PresenterController/ProjectEvaluationPresenterController.cs +++ b/src/Adapters/PresenterController/ProjectEvaluationPresenterController.cs @@ -31,20 +31,20 @@ public ProjectEvaluationPresenterController( public async Task EvaluateAppealProject(EvaluateAppealProjectRequest request) { EvaluateAppealProjectInput input = _mapper.Map(request); - Domain.UseCases.Ports.Project.DetailedReadProjectOutput output = await _evaluateAppealProject.Execute(input); + Domain.UseCases.Ports.Project.DetailedReadProjectOutput output = await _evaluateAppealProject.ExecuteAsync(input); return _mapper.Map(output); } public async Task EvaluateSubmissionProject(EvaluateSubmissionProjectRequest request) { EvaluateSubmissionProjectInput input = _mapper.Map(request); - Domain.UseCases.Ports.Project.DetailedReadProjectOutput output = await _evaluateSubmissionProject.Execute(input); + Domain.UseCases.Ports.Project.DetailedReadProjectOutput output = await _evaluateSubmissionProject.ExecuteAsync(input); return _mapper.Map(output); } public async Task GetEvaluationByProjectId(Guid? projectId) { - DetailedReadProjectEvaluationOutput output = await _getEvaluationByProjectId.Execute(projectId); + DetailedReadProjectEvaluationOutput output = await _getEvaluationByProjectId.ExecuteAsync(projectId); return _mapper.Map(output); } } diff --git a/src/Adapters/PresenterController/ProjectPresenterController.cs b/src/Adapters/PresenterController/ProjectPresenterController.cs index 94654add..9f296edd 100644 --- a/src/Adapters/PresenterController/ProjectPresenterController.cs +++ b/src/Adapters/PresenterController/ProjectPresenterController.cs @@ -44,51 +44,51 @@ public ProjectPresenterController( public async Task AppealProject(Guid? projectId, string? appealDescription) { - ResumedReadProjectOutput output = await _appealProject.Execute(projectId, appealDescription); + ResumedReadProjectOutput output = await _appealProject.ExecuteAsync(projectId, appealDescription); return _mapper.Map(output); } public async Task CancelProject(Guid? id, string? observation) { - ResumedReadProjectOutput output = await _cancelProject.Execute(id, observation); + ResumedReadProjectOutput output = await _cancelProject.ExecuteAsync(id, observation); return _mapper.Map(output); } public async Task> GetClosedProjects(int skip, int take, bool onlyMyProjects = true) { - IList output = await _getClosedProjects.Execute(skip, take, onlyMyProjects); + IList output = await _getClosedProjects.ExecuteAsync(skip, take, onlyMyProjects); return _mapper.Map>(output); } public async Task> GetOpenProjects(int skip, int take, bool onlyMyProjects = true) { - IList output = await _getOpenProjects.Execute(skip, take, onlyMyProjects); + IList output = await _getOpenProjects.ExecuteAsync(skip, take, onlyMyProjects); return _mapper.Map>(output); } public async Task GetProjectById(Guid? id) { - DetailedReadProjectOutput output = await _getProjectById.Execute(id); + DetailedReadProjectOutput output = await _getProjectById.ExecuteAsync(id); return _mapper.Map(output); } public async Task OpenProject(OpenProjectRequest request) { OpenProjectInput input = _mapper.Map(request); - ResumedReadProjectOutput output = await _openProject.Execute(input); + ResumedReadProjectOutput output = await _openProject.ExecuteAsync(input); return _mapper.Map(output); } public async Task SubmitProject(Guid? projectId) { - ResumedReadProjectOutput output = await _submitProject.Execute(projectId); + ResumedReadProjectOutput output = await _submitProject.ExecuteAsync(projectId); return _mapper.Map(output); } public async Task UpdateProject(Guid? id, UpdateProjectRequest request) { UpdateProjectInput input = _mapper.Map(request); - ResumedReadProjectOutput output = await _updateProject.Execute(id, input); + ResumedReadProjectOutput output = await _updateProject.ExecuteAsync(id, input); return _mapper.Map(output); } } diff --git a/src/Adapters/PresenterController/StudentDocumentsPresenterController.cs b/src/Adapters/PresenterController/StudentDocumentsPresenterController.cs index ab1939ea..cedbf4a4 100644 --- a/src/Adapters/PresenterController/StudentDocumentsPresenterController.cs +++ b/src/Adapters/PresenterController/StudentDocumentsPresenterController.cs @@ -35,32 +35,32 @@ public StudentDocumentsPresenterController( public async Task Create(CreateStudentDocumentsRequest model) { CreateStudentDocumentsInput input = _mapper.Map(model); - DetailedReadStudentDocumentsOutput result = await _createStudentDocuments.Execute(input); + DetailedReadStudentDocumentsOutput result = await _createStudentDocuments.ExecuteAsync(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - DetailedReadStudentDocumentsOutput result = await _deleteStudentDocuments.Execute(id); + DetailedReadStudentDocumentsOutput result = await _deleteStudentDocuments.ExecuteAsync(id); return _mapper.Map(result); } public async Task GetByProjectId(Guid? projectId) { - ResumedReadStudentDocumentsOutput result = await _getStudentDocumentsByProject.Execute(projectId); + ResumedReadStudentDocumentsOutput result = await _getStudentDocumentsByProject.ExecuteAsync(projectId); return _mapper.Map(result); } public async Task GetByStudentId(Guid? studentId) { - ResumedReadStudentDocumentsOutput result = await _getStudentDocumentsByStudent.Execute(studentId); + ResumedReadStudentDocumentsOutput result = await _getStudentDocumentsByStudent.ExecuteAsync(studentId); return _mapper.Map(result); } public async Task Update(Guid? id, UpdateStudentDocumentsRequest model) { UpdateStudentDocumentsInput input = _mapper.Map(model); - DetailedReadStudentDocumentsOutput result = await _updateStudentDocuments.Execute(id, input); + DetailedReadStudentDocumentsOutput result = await _updateStudentDocuments.ExecuteAsync(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/StudentPresenterController.cs b/src/Adapters/PresenterController/StudentPresenterController.cs index 07783094..fe0bfbf4 100755 --- a/src/Adapters/PresenterController/StudentPresenterController.cs +++ b/src/Adapters/PresenterController/StudentPresenterController.cs @@ -36,31 +36,31 @@ public async Task Create(IRequest request) { CreateStudentRequest? dto = request as CreateStudentRequest; CreateStudentInput input = _mapper.Map(dto); - DetailedReadStudentOutput result = await _createStudent.Execute(input); + DetailedReadStudentOutput result = await _createStudent.ExecuteAsync(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - DetailedReadStudentOutput result = await _deleteStudent.Execute(id); + DetailedReadStudentOutput result = await _deleteStudent.ExecuteAsync(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - IQueryable result = await _getStudents.Execute(skip, take); + IQueryable result = await _getStudents.ExecuteAsync(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - DetailedReadStudentOutput result = await _getStudentById.Execute(id); + DetailedReadStudentOutput result = await _getStudentById.ExecuteAsync(id); return _mapper.Map(result); } public async Task GetByRegistrationCode(string? registrationCode) { - DetailedReadStudentOutput result = await _getStudentByRegistrationCode.Execute(registrationCode); + DetailedReadStudentOutput result = await _getStudentByRegistrationCode.ExecuteAsync(registrationCode); return _mapper.Map(result); } @@ -68,13 +68,13 @@ public async Task Update(Guid? id, IRequest request) { UpdateStudentRequest? dto = request as UpdateStudentRequest; UpdateStudentInput input = _mapper.Map(dto); - DetailedReadStudentOutput result = await _updateStudent.Execute(id, input); + DetailedReadStudentOutput result = await _updateStudent.ExecuteAsync(id, input); return _mapper.Map(result); } public async Task RequestStudentRegister(string? email) { - return await _requestStudentRegister.Execute(email); + return await _requestStudentRegister.ExecuteAsync(email); } } } \ No newline at end of file diff --git a/src/Adapters/PresenterController/SubAreaPresenterController.cs b/src/Adapters/PresenterController/SubAreaPresenterController.cs index 411b6521..85b5c683 100755 --- a/src/Adapters/PresenterController/SubAreaPresenterController.cs +++ b/src/Adapters/PresenterController/SubAreaPresenterController.cs @@ -33,13 +33,13 @@ public async Task Create(IRequest request) { CreateSubAreaRequest? dto = request as CreateSubAreaRequest; CreateSubAreaInput input = _mapper.Map(dto); - DetailedReadSubAreaOutput result = await _createSubArea.Execute(input); + DetailedReadSubAreaOutput result = await _createSubArea.ExecuteAsync(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - DetailedReadSubAreaOutput result = await _deleteSubArea.Execute(id); + DetailedReadSubAreaOutput result = await _deleteSubArea.ExecuteAsync(id); return _mapper.Map(result); } @@ -50,13 +50,13 @@ public Task> GetAll(int skip, int take) public async Task GetById(Guid? id) { - DetailedReadSubAreaOutput result = await _getSubAreaById.Execute(id); + DetailedReadSubAreaOutput result = await _getSubAreaById.ExecuteAsync(id); return _mapper.Map(result); } public async Task> GetSubAreasByArea(Guid? areaId, int skip, int take) { - IQueryable result = await _getSubAreasByArea.Execute(areaId, skip, take); + IQueryable result = await _getSubAreasByArea.ExecuteAsync(areaId, skip, take); return _mapper.Map>(result); } @@ -64,7 +64,7 @@ public async Task Update(Guid? id, IRequest request) { UpdateSubAreaRequest? dto = request as UpdateSubAreaRequest; UpdateSubAreaInput input = _mapper.Map(dto); - DetailedReadSubAreaOutput result = await _updateSubArea.Execute(id, input); + DetailedReadSubAreaOutput result = await _updateSubArea.ExecuteAsync(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/TypeAssistancePresenterController.cs b/src/Adapters/PresenterController/TypeAssistancePresenterController.cs index 63310174..3dcfe967 100755 --- a/src/Adapters/PresenterController/TypeAssistancePresenterController.cs +++ b/src/Adapters/PresenterController/TypeAssistancePresenterController.cs @@ -37,25 +37,25 @@ public async Task Create(IRequest request) { CreateAssistanceTypeRequest? dto = request as CreateAssistanceTypeRequest; CreateAssistanceTypeInput input = _mapper.Map(dto); - DetailedReadAssistanceTypeOutput result = await _createAssistanceType.Execute(input); + DetailedReadAssistanceTypeOutput result = await _createAssistanceType.ExecuteAsync(input); return _mapper.Map(result); } public async Task Delete(Guid? id) { - DetailedReadAssistanceTypeOutput result = await _deleteAssistanceType.Execute(id); + DetailedReadAssistanceTypeOutput result = await _deleteAssistanceType.ExecuteAsync(id); return _mapper.Map(result); } public async Task> GetAll(int skip, int take) { - IQueryable result = await _getAssistanceTypes.Execute(skip, take); + IQueryable result = await _getAssistanceTypes.ExecuteAsync(skip, take); return _mapper.Map>(result); } public async Task GetById(Guid? id) { - DetailedReadAssistanceTypeOutput result = await _getAssistanceTypeById.Execute(id); + DetailedReadAssistanceTypeOutput result = await _getAssistanceTypeById.ExecuteAsync(id); return _mapper.Map(result); } @@ -63,7 +63,7 @@ public async Task Update(Guid? id, IRequest request) { UpdateAssistanceTypeRequest? dto = request as UpdateAssistanceTypeRequest; UpdateAssistanceTypeInput input = _mapper.Map(dto); - DetailedReadAssistanceTypeOutput result = await _updateAssistanceType.Execute(id, input); + DetailedReadAssistanceTypeOutput result = await _updateAssistanceType.ExecuteAsync(id, input); return _mapper.Map(result); } } diff --git a/src/Adapters/PresenterController/UserPresenterController.cs b/src/Adapters/PresenterController/UserPresenterController.cs index 2c55fb2a..31597858 100755 --- a/src/Adapters/PresenterController/UserPresenterController.cs +++ b/src/Adapters/PresenterController/UserPresenterController.cs @@ -36,38 +36,38 @@ public UserPresenterController(IActivateUser activateUser, public async Task ActivateUser(Guid? id) { - UserReadOutput result = await _activateUser.Execute(id); + UserReadOutput result = await _activateUser.ExecuteAsync(id); return _mapper.Map(result); } public async Task DeactivateUser(Guid? id) { - UserReadOutput result = await _deactivateUser.Execute(id); + UserReadOutput result = await _deactivateUser.ExecuteAsync(id); return _mapper.Map(result); } public async Task> GetActiveUsers(int skip, int take) { - IEnumerable result = await _getActiveUsers.Execute(skip, take); + IEnumerable result = await _getActiveUsers.ExecuteAsync(skip, take); return _mapper.Map>(result); } public async Task> GetInactiveUsers(int skip, int take) { - IEnumerable result = await _getInactiveUsers.Execute(skip, take); + IEnumerable result = await _getInactiveUsers.ExecuteAsync(skip, take); return _mapper.Map>(result); } public async Task GetUserById(Guid? id) { - UserReadOutput result = await _getUserById.Execute(id); + UserReadOutput result = await _getUserById.ExecuteAsync(id); return _mapper.Map(result); } public async Task UpdateUser(UserUpdateRequest request) { UserUpdateInput input = _mapper.Map(request); - UserReadOutput result = await _updateUser.Execute(input); + UserReadOutput result = await _updateUser.ExecuteAsync(input); return _mapper.Map(result); } } diff --git a/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs b/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs index 94a7d7bb..0dcffc2d 100644 --- a/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs +++ b/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs @@ -56,7 +56,7 @@ public async Task Execute_WithValidInput_ShouldCreateArea() _mapperMock.Setup(m => m.Map(areaEntity)).Returns(detailedOutput); // Act - var result = await _createArea.Execute(input); + var result = await _createArea.ExecuteAsync(input); // Assert Assert.IsNotNull(result); @@ -83,7 +83,7 @@ public void Execute_WithExistingCode_ShouldThrowException() _areaRepositoryMock.Setup(r => r.GetByCode(input.Code)).ReturnsAsync(existingArea); // Act & Assert - Assert.ThrowsAsync(async () => await _createArea.Execute(input)); + Assert.ThrowsAsync(async () => await _createArea.ExecuteAsync(input)); _areaRepositoryMock.Verify(r => r.GetByCode(input.Code), Times.Once); _mainAreaRepositoryMock.Verify(r => r.GetById(It.IsAny()), Times.Never); _areaRepositoryMock.Verify(r => r.Create(It.IsAny()), Times.Never); @@ -102,7 +102,7 @@ public void Execute_WithMissingMainAreaId_ShouldThrowException() }; // Act & Assert - Assert.ThrowsAsync(async () => await _createArea.Execute(input)); + Assert.ThrowsAsync(async () => await _createArea.ExecuteAsync(input)); _areaRepositoryMock.Verify(r => r.GetByCode(It.IsAny()), Times.Once); _mainAreaRepositoryMock.Verify(r => r.GetById(It.IsAny()), Times.Never); _areaRepositoryMock.Verify(r => r.Create(It.IsAny()), Times.Never); @@ -125,7 +125,7 @@ public void Execute_WithInactiveMainArea_ShouldThrowException() _mainAreaRepositoryMock.Setup(r => r.GetById(input.MainAreaId)).ReturnsAsync(inactiveMainArea); // Act & Assert - Assert.ThrowsAsync(async () => await _createArea.Execute(input)); + Assert.ThrowsAsync(async () => await _createArea.ExecuteAsync(input)); _areaRepositoryMock.Verify(r => r.GetByCode(input.Code), Times.Once); _mainAreaRepositoryMock.Verify(r => r.GetById(input.MainAreaId), Times.Once); _areaRepositoryMock.Verify(r => r.Create(It.IsAny()), Times.Never); diff --git a/src/Domain.Tests/UseCases/Area/DeleteAreaTests.cs b/src/Domain.Tests/UseCases/Area/DeleteAreaTests.cs index 757c581c..b75bfc3d 100644 --- a/src/Domain.Tests/UseCases/Area/DeleteAreaTests.cs +++ b/src/Domain.Tests/UseCases/Area/DeleteAreaTests.cs @@ -48,7 +48,7 @@ public async Task Execute_WithValidId_ShouldDeleteAreaAndReturnOutput() Guid? id = _areaId; // Act - var result = await _deleteArea.Execute(id); + var result = await _deleteArea.ExecuteAsync(id); // Assert Assert.AreEqual(_mappedOutput, result); @@ -63,7 +63,7 @@ public void Execute_WithNullId_ShouldThrowArgumentNullException() Guid? id = null; // Act & Assert - Assert.ThrowsAsync(async () => await _deleteArea.Execute(id)); + Assert.ThrowsAsync(async () => await _deleteArea.ExecuteAsync(id)); _areaRepositoryMock.Verify(r => r.Delete(It.IsAny()), Times.Never); _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); } diff --git a/src/Domain.Tests/UseCases/Area/GetAreaByIdTests.cs b/src/Domain.Tests/UseCases/Area/GetAreaByIdTests.cs index ee9ab2cf..7e593718 100644 --- a/src/Domain.Tests/UseCases/Area/GetAreaByIdTests.cs +++ b/src/Domain.Tests/UseCases/Area/GetAreaByIdTests.cs @@ -44,7 +44,7 @@ public async Task Execute_WithValidId_ShouldReturnDetailedReadAreaOutput() _mapperMock.Setup(m => m.Map(areaEntity)).Returns(detailedOutput); // Act - var result = await _getAreaById.Execute(id); + var result = await _getAreaById.ExecuteAsync(id); // Assert Assert.IsNotNull(result); @@ -60,7 +60,7 @@ public void Execute_WithNullId_ShouldThrowException() Guid? id = null; // Act & Assert - Assert.ThrowsAsync(async () => await _getAreaById.Execute(id)); + Assert.ThrowsAsync(async () => await _getAreaById.ExecuteAsync(id)); _areaRepositoryMock.Verify(r => r.GetById(It.IsAny()), Times.Never); _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); } diff --git a/src/Domain.Tests/UseCases/Area/UpdateAreaTests.cs b/src/Domain.Tests/UseCases/Area/UpdateAreaTests.cs index d2488390..bcb83782 100644 --- a/src/Domain.Tests/UseCases/Area/UpdateAreaTests.cs +++ b/src/Domain.Tests/UseCases/Area/UpdateAreaTests.cs @@ -51,7 +51,7 @@ public async Task Execute_WithValidIdAndInput_ShouldReturnDetailedReadAreaOutput _mapperMock.Setup(m => m.Map(areaEntity)).Returns(detailedOutput); // Act - var result = await _updateArea.Execute(id, input); + var result = await _updateArea.ExecuteAsync(id, input); // Assert Assert.IsNotNull(result); @@ -74,7 +74,7 @@ public void Execute_WithNullId_ShouldThrowException() }; // Act & Assert - Assert.ThrowsAsync(async () => await _updateArea.Execute(id, input)); + Assert.ThrowsAsync(async () => await _updateArea.ExecuteAsync(id, input)); _areaRepositoryMock.Verify(r => r.GetById(It.IsAny()), Times.Never); _areaRepositoryMock.Verify(r => r.Update(It.IsAny()), Times.Never); _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); @@ -95,7 +95,7 @@ public void Execute_WithNonExistingId_ShouldThrowException() _areaRepositoryMock.Setup(r => r.GetById(id)).ReturnsAsync((Domain.Entities.Area)null); // Act & Assert - Assert.ThrowsAsync(async () => await _updateArea.Execute(id, input)); + Assert.ThrowsAsync(async () => await _updateArea.ExecuteAsync(id, input)); _areaRepositoryMock.Verify(r => r.GetById(id), Times.Once); _areaRepositoryMock.Verify(r => r.Update(It.IsAny()), Times.Never); _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); diff --git a/src/Domain/UseCases/Interactors/Area/CreateArea.cs b/src/Domain/UseCases/Interactors/Area/CreateArea.cs index 00f1cce2..6ae0d243 100644 --- a/src/Domain/UseCases/Interactors/Area/CreateArea.cs +++ b/src/Domain/UseCases/Interactors/Area/CreateArea.cs @@ -20,7 +20,7 @@ public CreateArea(IAreaRepository areaRepository, IMainAreaRepository mainAreaRe } #endregion - public async Task Execute(CreateAreaInput input) + public async Task ExecuteAsync(CreateAreaInput input) { var entity = await _areaRepository.GetByCode(input.Code); UseCaseException.BusinessRuleViolation(entity != null, $"Já existe uma área principal para o código {input.Code}."); diff --git a/src/Domain/UseCases/Interactors/Area/DeleteArea.cs b/src/Domain/UseCases/Interactors/Area/DeleteArea.cs index ab7f149a..6e83de16 100644 --- a/src/Domain/UseCases/Interactors/Area/DeleteArea.cs +++ b/src/Domain/UseCases/Interactors/Area/DeleteArea.cs @@ -18,7 +18,7 @@ public DeleteArea(IAreaRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id == null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Area/GetAreaById.cs b/src/Domain/UseCases/Interactors/Area/GetAreaById.cs index e1d37098..1f79726b 100644 --- a/src/Domain/UseCases/Interactors/Area/GetAreaById.cs +++ b/src/Domain/UseCases/Interactors/Area/GetAreaById.cs @@ -18,7 +18,7 @@ public GetAreaById(IAreaRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se Id foi informado. UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs b/src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs index 71bf8fd5..ac9873b4 100644 --- a/src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs +++ b/src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs @@ -18,7 +18,7 @@ public GetAreasByMainArea(IAreaRepository repository, IMapper mapper) } #endregion Global Scope - public async Task> Execute(Guid? mainAreaId, int skip, int take) + public async Task> ExecuteAsync(Guid? mainAreaId, int skip, int take) { UseCaseException.NotInformedParam(mainAreaId is null, nameof(mainAreaId)); IEnumerable entities = (IEnumerable)await _repository.GetAreasByMainArea(mainAreaId, skip, take); diff --git a/src/Domain/UseCases/Interactors/Area/UpdateArea.cs b/src/Domain/UseCases/Interactors/Area/UpdateArea.cs index 5a93280c..0b9ddce9 100644 --- a/src/Domain/UseCases/Interactors/Area/UpdateArea.cs +++ b/src/Domain/UseCases/Interactors/Area/UpdateArea.cs @@ -18,7 +18,7 @@ public UpdateArea(IAreaRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id, UpdateAreaInput input) + public async Task ExecuteAsync(Guid? id, UpdateAreaInput input) { // Verifica se Id foi informado. UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs b/src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs index f831c289..526edb35 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs @@ -18,7 +18,7 @@ public CreateAssistanceType(IAssistanceTypeRepository repository, IMapper mapper } #endregion Global Scope - public async Task Execute(CreateAssistanceTypeInput model) + public async Task ExecuteAsync(CreateAssistanceTypeInput model) { // Verifica se nome foi informado UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Name), nameof(model.Name)); diff --git a/src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs b/src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs index 736d39a0..4f334c63 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs @@ -18,7 +18,7 @@ public DeleteAssistanceType(IAssistanceTypeRepository repository, IMapper mapper } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs b/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs index 08a6bdc1..985d8ca7 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs @@ -18,7 +18,7 @@ public GetAssistanceTypeById(IAssistanceTypeRepository repository, IMapper mappe } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); Entities.AssistanceType? entity = await _repository.GetById(id); diff --git a/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs b/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs index 9b3af536..8a500955 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs @@ -17,7 +17,7 @@ public GetAssistanceTypes(IAssistanceTypeRepository repository, IMapper mapper) } #endregion Global Scope - public async Task> Execute(int skip, int take) + public async Task> ExecuteAsync(int skip, int take) { IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); diff --git a/src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs b/src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs index c8ee0695..245f478d 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs @@ -18,7 +18,7 @@ public UpdateAssistanceType(IAssistanceTypeRepository repository, IMapper mapper } #endregion Global Scope - public async Task Execute(Guid? id, UpdateAssistanceTypeInput input) + public async Task ExecuteAsync(Guid? id, UpdateAssistanceTypeInput input) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs b/src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs index 8a5a5fd5..2844711a 100644 --- a/src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs +++ b/src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs @@ -14,7 +14,7 @@ public ConfirmEmail(IUserRepository userRepository) } #endregion Global Scope - public async Task Execute(string? email, string? token) + public async Task ExecuteAsync(string? email, string? token) { // Verifica se o email é nulo UseCaseException.NotInformedParam(string.IsNullOrEmpty(email), nameof(email)); diff --git a/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs b/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs index 3a4a94f8..a9545477 100644 --- a/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs +++ b/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs @@ -17,7 +17,7 @@ public ForgotPassword(IUserRepository userRepository, IEmailService emailService } #endregion Global Scope - public async Task Execute(string? email) + public async Task ExecuteAsync(string? email) { // Verifica se o email é nulo UseCaseException.NotInformedParam(string.IsNullOrEmpty(email), nameof(email)); diff --git a/src/Domain/UseCases/Interactors/Auth/Login.cs b/src/Domain/UseCases/Interactors/Auth/Login.cs index f3f4c586..d8fda843 100644 --- a/src/Domain/UseCases/Interactors/Auth/Login.cs +++ b/src/Domain/UseCases/Interactors/Auth/Login.cs @@ -20,7 +20,7 @@ public Login(ITokenAuthenticationService tokenService, IUserRepository userRepos } #endregion Global Scope - public async Task Execute(UserLoginInput input) + public async Task ExecuteAsync(UserLoginInput input) { // Verifica se o email é nulo UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Email), nameof(input.Email)); diff --git a/src/Domain/UseCases/Interactors/Auth/ResetPassword.cs b/src/Domain/UseCases/Interactors/Auth/ResetPassword.cs index 7819944f..2a719f0a 100644 --- a/src/Domain/UseCases/Interactors/Auth/ResetPassword.cs +++ b/src/Domain/UseCases/Interactors/Auth/ResetPassword.cs @@ -18,7 +18,7 @@ public ResetPassword(IUserRepository userRepository, IHashService hashService) } #endregion Global Scope - public async Task Execute(UserResetPasswordInput input) + public async Task ExecuteAsync(UserResetPasswordInput input) { // Verifica se o id do usuário é nulo UseCaseException.NotInformedParam(input.Id == null, nameof(input.Id)); diff --git a/src/Domain/UseCases/Interactors/Campus/CreateCampus.cs b/src/Domain/UseCases/Interactors/Campus/CreateCampus.cs index 88bf4bc0..dbd9bf68 100644 --- a/src/Domain/UseCases/Interactors/Campus/CreateCampus.cs +++ b/src/Domain/UseCases/Interactors/Campus/CreateCampus.cs @@ -18,7 +18,7 @@ public CreateCampus(ICampusRepository repository, IMapper mapper) } #endregion - public async Task Execute(CreateCampusInput input) + public async Task ExecuteAsync(CreateCampusInput input) { // Verifica se nome foi informado UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); diff --git a/src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs b/src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs index f1e9f4e6..be0830df 100644 --- a/src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs +++ b/src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs @@ -18,7 +18,7 @@ public DeleteCampus(ICampusRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Campus/GetCampusById.cs b/src/Domain/UseCases/Interactors/Campus/GetCampusById.cs index 3bec3309..862f4eaa 100644 --- a/src/Domain/UseCases/Interactors/Campus/GetCampusById.cs +++ b/src/Domain/UseCases/Interactors/Campus/GetCampusById.cs @@ -18,7 +18,7 @@ public GetCampusById(ICampusRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Campus/GetCampuses.cs b/src/Domain/UseCases/Interactors/Campus/GetCampuses.cs index 52cd2547..2b8d670d 100644 --- a/src/Domain/UseCases/Interactors/Campus/GetCampuses.cs +++ b/src/Domain/UseCases/Interactors/Campus/GetCampuses.cs @@ -17,7 +17,7 @@ public GetCampuses(ICampusRepository repository, IMapper mapper) } #endregion Global Scope - public async Task> Execute(int skip, int take) + public async Task> ExecuteAsync(int skip, int take) { IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); diff --git a/src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs b/src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs index 7aec9228..85102ec4 100644 --- a/src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs +++ b/src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs @@ -18,7 +18,7 @@ public UpdateCampus(ICampusRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id, UpdateCampusInput input) + public async Task ExecuteAsync(Guid? id, UpdateCampusInput input) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Course/CreateCourse.cs b/src/Domain/UseCases/Interactors/Course/CreateCourse.cs index 80d37c59..7d79f1ed 100644 --- a/src/Domain/UseCases/Interactors/Course/CreateCourse.cs +++ b/src/Domain/UseCases/Interactors/Course/CreateCourse.cs @@ -19,7 +19,7 @@ public CreateCourse(ICourseRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(CreateCourseInput model) + public async Task ExecuteAsync(CreateCourseInput model) { // Verifica se nome foi informado UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Name), nameof(model.Name)); diff --git a/src/Domain/UseCases/Interactors/Course/DeleteCourse.cs b/src/Domain/UseCases/Interactors/Course/DeleteCourse.cs index d3ecf727..b6ff1949 100644 --- a/src/Domain/UseCases/Interactors/Course/DeleteCourse.cs +++ b/src/Domain/UseCases/Interactors/Course/DeleteCourse.cs @@ -18,7 +18,7 @@ public DeleteCourse(ICourseRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Course/GetCourseById.cs b/src/Domain/UseCases/Interactors/Course/GetCourseById.cs index 6b8660f6..65e2395e 100644 --- a/src/Domain/UseCases/Interactors/Course/GetCourseById.cs +++ b/src/Domain/UseCases/Interactors/Course/GetCourseById.cs @@ -18,7 +18,7 @@ public GetCourseById(ICourseRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Course/GetCourses.cs b/src/Domain/UseCases/Interactors/Course/GetCourses.cs index ba0486cb..4a4b638d 100644 --- a/src/Domain/UseCases/Interactors/Course/GetCourses.cs +++ b/src/Domain/UseCases/Interactors/Course/GetCourses.cs @@ -17,7 +17,7 @@ public GetCourses(ICourseRepository repository, IMapper mapper) } #endregion Global Scope - public async Task> Execute(int skip, int take) + public async Task> ExecuteAsync(int skip, int take) { IEnumerable entities = await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); diff --git a/src/Domain/UseCases/Interactors/Course/UpdateCourse.cs b/src/Domain/UseCases/Interactors/Course/UpdateCourse.cs index dcce210c..3e342e8d 100644 --- a/src/Domain/UseCases/Interactors/Course/UpdateCourse.cs +++ b/src/Domain/UseCases/Interactors/Course/UpdateCourse.cs @@ -18,7 +18,7 @@ public UpdateCourse(ICourseRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id, UpdateCourseInput input) + public async Task ExecuteAsync(Guid? id, UpdateCourseInput input) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs b/src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs index 43054dd7..45d150da 100644 --- a/src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs +++ b/src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs @@ -18,7 +18,7 @@ public CreateMainArea(IMainAreaRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(CreateMainAreaInput model) + public async Task ExecuteAsync(CreateMainAreaInput model) { // Validação de código da Área Entities.MainArea? entity = await _repository.GetByCode(model.Code); diff --git a/src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs b/src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs index f6c77c2b..016bcdfb 100644 --- a/src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs +++ b/src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs @@ -18,7 +18,7 @@ public DeleteMainArea(IMainAreaRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs b/src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs index 01aff4de..814541cd 100644 --- a/src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs +++ b/src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs @@ -18,7 +18,7 @@ public GetMainAreaById(IMainAreaRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs b/src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs index 4dac0ae6..9492cc19 100644 --- a/src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs +++ b/src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs @@ -17,7 +17,7 @@ public GetMainAreas(IMainAreaRepository repository, IMapper mapper) } #endregion Global Scope - public async Task> Execute(int skip, int take) + public async Task> ExecuteAsync(int skip, int take) { IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); diff --git a/src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs b/src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs index b618126e..02d800e8 100644 --- a/src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs +++ b/src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs @@ -17,7 +17,7 @@ public UpdateMainArea(IMainAreaRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id, UpdateMainAreaInput input) + public async Task ExecuteAsync(Guid? id, UpdateMainAreaInput input) { // Recupera entidade que será atualizada Entities.MainArea entity = await _repository.GetById(id) diff --git a/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs b/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs index 55600e16..a9c084be 100644 --- a/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs +++ b/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs @@ -36,7 +36,7 @@ public CreateNotice( } #endregion - public async Task Execute(CreateNoticeInput input) + public async Task ExecuteAsync(CreateNoticeInput input) { // Verifica se atividades foram informadas UseCaseException.BusinessRuleViolation(input.Activities == null || input.Activities.Count == 0, diff --git a/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs b/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs index c7ed637d..01eb4f38 100644 --- a/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs +++ b/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs @@ -21,7 +21,7 @@ public DeleteNotice(INoticeRepository repository, IStorageFileService storageFil } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id == null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs b/src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs index 9b6ec3fc..277bc88c 100644 --- a/src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs +++ b/src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs @@ -18,7 +18,7 @@ public GetNoticeById(INoticeRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Notice/GetNotices.cs b/src/Domain/UseCases/Interactors/Notice/GetNotices.cs index 53c081fe..a05533eb 100644 --- a/src/Domain/UseCases/Interactors/Notice/GetNotices.cs +++ b/src/Domain/UseCases/Interactors/Notice/GetNotices.cs @@ -17,7 +17,7 @@ public GetNotices(INoticeRepository repository, IMapper mapper) } #endregion Global Scope - public async Task> Execute(int skip, int take) + public async Task> ExecuteAsync(int skip, int take) { IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities); diff --git a/src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs b/src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs index b5d101aa..a5ce8bbc 100644 --- a/src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs +++ b/src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs @@ -32,7 +32,7 @@ public UpdateNotice( } #endregion Global Scope - public async Task Execute(Guid? id, UpdateNoticeInput model) + public async Task ExecuteAsync(Guid? id, UpdateNoticeInput model) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id == null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs b/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs index cd2bf521..6138173c 100644 --- a/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs +++ b/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs @@ -29,7 +29,7 @@ public CreateProfessor(IProfessorRepository professorRepository, } #endregion - public async Task Execute(CreateProfessorInput input) + public async Task ExecuteAsync(CreateProfessorInput input) { // Realiza o map da entidade e a validação dos campos informados var entity = new Entities.Professor(input.SIAPEEnrollment, input.IdentifyLattes); diff --git a/src/Domain/UseCases/Interactors/Professor/DeleteProfessor.cs b/src/Domain/UseCases/Interactors/Professor/DeleteProfessor.cs index 3ab0a84e..6ad705dd 100644 --- a/src/Domain/UseCases/Interactors/Professor/DeleteProfessor.cs +++ b/src/Domain/UseCases/Interactors/Professor/DeleteProfessor.cs @@ -20,7 +20,7 @@ public DeleteProfessor(IProfessorRepository professorRepository, IUserRepository } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs b/src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs index db55766a..d2d01343 100644 --- a/src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs +++ b/src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs @@ -18,7 +18,7 @@ public GetProfessorById(IProfessorRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); Entities.Professor? entity = await _repository.GetById(id); diff --git a/src/Domain/UseCases/Interactors/Professor/GetProfessors.cs b/src/Domain/UseCases/Interactors/Professor/GetProfessors.cs index 8fe38fb6..3df35b4b 100644 --- a/src/Domain/UseCases/Interactors/Professor/GetProfessors.cs +++ b/src/Domain/UseCases/Interactors/Professor/GetProfessors.cs @@ -17,7 +17,7 @@ public GetProfessors(IProfessorRepository repository, IMapper mapper) } #endregion Global Scope - public async Task> Execute(int skip, int take) + public async Task> ExecuteAsync(int skip, int take) { IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); diff --git a/src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs b/src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs index c47688fe..551d5c2b 100644 --- a/src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs +++ b/src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs @@ -18,7 +18,7 @@ public UpdateProfessor(IProfessorRepository professorRepository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id, UpdateProfessorInput model) + public async Task ExecuteAsync(Guid? id, UpdateProfessorInput model) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs b/src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs index a2ec2942..6ad53799 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs @@ -18,7 +18,7 @@ public CreateProgramType(IProgramTypeRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(CreateProgramTypeInput model) + public async Task ExecuteAsync(CreateProgramTypeInput model) { // Verifica se nome foi informado UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Name), nameof(model.Name)); diff --git a/src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs b/src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs index 1af8c50b..6fd0ff8d 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs @@ -18,7 +18,7 @@ public DeleteProgramType(IProgramTypeRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs b/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs index 3380254e..12d92acf 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs @@ -18,7 +18,7 @@ public GetProgramTypeById(IProgramTypeRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); Entities.ProgramType? entity = await _repository.GetById(id); diff --git a/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs b/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs index 4a863b78..4de3a661 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs @@ -17,7 +17,7 @@ public GetProgramTypes(IProgramTypeRepository repository, IMapper mapper) } #endregion Global Scope - public async Task> Execute(int skip, int take) + public async Task> ExecuteAsync(int skip, int take) { IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); diff --git a/src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs b/src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs index 95e26c0b..afe8e024 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs @@ -18,7 +18,7 @@ public UpdateProgramType(IProgramTypeRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id, UpdateProgramTypeInput input) + public async Task ExecuteAsync(Guid? id, UpdateProgramTypeInput input) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Project/AppealProject.cs b/src/Domain/UseCases/Interactors/Project/AppealProject.cs index b9d8ca8d..3537a9ad 100644 --- a/src/Domain/UseCases/Interactors/Project/AppealProject.cs +++ b/src/Domain/UseCases/Interactors/Project/AppealProject.cs @@ -20,7 +20,7 @@ public AppealProject(IProjectRepository projectRepository, } #endregion Global Scope - public async Task Execute(Guid? projectId, string? appealDescription) + public async Task ExecuteAsync(Guid? projectId, string? appealDescription) { // Verifica se Id foi informado. UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); diff --git a/src/Domain/UseCases/Interactors/Project/CancelProject.cs b/src/Domain/UseCases/Interactors/Project/CancelProject.cs index 3c77b2f9..aa307009 100644 --- a/src/Domain/UseCases/Interactors/Project/CancelProject.cs +++ b/src/Domain/UseCases/Interactors/Project/CancelProject.cs @@ -20,7 +20,7 @@ public CancelProject(IProjectRepository projectRepository, } #endregion Global Scope - public async Task Execute(Guid? id, string? observation) + public async Task ExecuteAsync(Guid? id, string? observation) { // Verifica se o projeto existe Entities.Project project = await _projectRepository.GetById(id) diff --git a/src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs b/src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs index c73c4248..5e5b234a 100644 --- a/src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs +++ b/src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs @@ -24,7 +24,7 @@ public GetClosedProjects(IProjectRepository projectRepository, } #endregion Global Scope - public async Task> Execute(int skip, int take, bool onlyMyProjects = true) + public async Task> ExecuteAsync(int skip, int take, bool onlyMyProjects = true) { // Obtém as claims do usuário autenticado. Ports.Auth.UserClaimsOutput? userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); diff --git a/src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs b/src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs index 6ca07790..e7798f04 100644 --- a/src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs +++ b/src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs @@ -24,7 +24,7 @@ public GetOpenProjects(IProjectRepository projectRepository, } #endregion Global Scope - public async Task> Execute(int skip, int take, bool onlyMyProjects = true) + public async Task> ExecuteAsync(int skip, int take, bool onlyMyProjects = true) { // Obtém as claims do usuário autenticado. Ports.Auth.UserClaimsOutput? userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); diff --git a/src/Domain/UseCases/Interactors/Project/GetProjectById.cs b/src/Domain/UseCases/Interactors/Project/GetProjectById.cs index 1f4d146a..2d6d1f90 100644 --- a/src/Domain/UseCases/Interactors/Project/GetProjectById.cs +++ b/src/Domain/UseCases/Interactors/Project/GetProjectById.cs @@ -19,7 +19,7 @@ public GetProjectById(IProjectRepository projectRepository, } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Busca projeto pelo Id informado Entities.Project project = await _projectRepository.GetById(id) diff --git a/src/Domain/UseCases/Interactors/Project/OpenProject.cs b/src/Domain/UseCases/Interactors/Project/OpenProject.cs index a971c0dd..317d80d3 100644 --- a/src/Domain/UseCases/Interactors/Project/OpenProject.cs +++ b/src/Domain/UseCases/Interactors/Project/OpenProject.cs @@ -41,7 +41,7 @@ public OpenProject(IProjectRepository projectRepository, } #endregion Global Scope - public async Task Execute(OpenProjectInput input) + public async Task ExecuteAsync(OpenProjectInput input) { // Mapeia input para entidade e realiza validação dos campos informados Entities.Project project = new( diff --git a/src/Domain/UseCases/Interactors/Project/SubmitProject.cs b/src/Domain/UseCases/Interactors/Project/SubmitProject.cs index a7326561..2ce32d34 100644 --- a/src/Domain/UseCases/Interactors/Project/SubmitProject.cs +++ b/src/Domain/UseCases/Interactors/Project/SubmitProject.cs @@ -20,7 +20,7 @@ public SubmitProject(IProjectRepository projectRepository, } #endregion Global Scope - public async Task Execute(Guid? projectId) + public async Task ExecuteAsync(Guid? projectId) { // Verifica se Id foi informado. UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); diff --git a/src/Domain/UseCases/Interactors/Project/UpdateProject.cs b/src/Domain/UseCases/Interactors/Project/UpdateProject.cs index f556607d..ed2fb4d7 100644 --- a/src/Domain/UseCases/Interactors/Project/UpdateProject.cs +++ b/src/Domain/UseCases/Interactors/Project/UpdateProject.cs @@ -41,7 +41,7 @@ public UpdateProject(IProjectRepository projectRepository, } #endregion Global Scope - public async Task Execute(Guid? id, UpdateProjectInput input) + public async Task ExecuteAsync(Guid? id, UpdateProjectInput input) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs index 0692a4c7..779491f2 100644 --- a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs @@ -31,7 +31,7 @@ public EvaluateAppealProject(IMapper mapper, } #endregion Global Scope - public async Task Execute(EvaluateAppealProjectInput input) + public async Task ExecuteAsync(EvaluateAppealProjectInput input) { // Obtém informações do usuário logado. Ports.Auth.UserClaimsOutput user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); diff --git a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs index 7725aef1..0637356e 100644 --- a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -37,7 +37,7 @@ public EvaluateSubmissionProject(IMapper mapper, } #endregion Global Scope - public async Task Execute(EvaluateSubmissionProjectInput input) + public async Task ExecuteAsync(EvaluateSubmissionProjectInput input) { // Obtém informações do usuário logado. Ports.Auth.UserClaimsOutput user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); diff --git a/src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs b/src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs index bcfcc9a8..0a4199c3 100644 --- a/src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs +++ b/src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs @@ -19,7 +19,7 @@ public GetEvaluationByProjectId(IMapper mapper, } #endregion Global Scope - public async Task Execute(Guid? projectId) + public async Task ExecuteAsync(Guid? projectId) { // Verifica se Id foi informado. UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); diff --git a/src/Domain/UseCases/Interactors/Student/CreateStudent.cs b/src/Domain/UseCases/Interactors/Student/CreateStudent.cs index 8f05422f..4754d924 100644 --- a/src/Domain/UseCases/Interactors/Student/CreateStudent.cs +++ b/src/Domain/UseCases/Interactors/Student/CreateStudent.cs @@ -36,7 +36,7 @@ public CreateStudent(IStudentRepository studentRepository, } #endregion Global Scope - public async Task Execute(CreateStudentInput model) + public async Task ExecuteAsync(CreateStudentInput model) { // Realiza o map da entidade e a validação dos campos informados // var entity = _mapper.Map(input); diff --git a/src/Domain/UseCases/Interactors/Student/DeleteStudent.cs b/src/Domain/UseCases/Interactors/Student/DeleteStudent.cs index 035bc239..aa7f45cf 100644 --- a/src/Domain/UseCases/Interactors/Student/DeleteStudent.cs +++ b/src/Domain/UseCases/Interactors/Student/DeleteStudent.cs @@ -20,7 +20,7 @@ public DeleteStudent(IStudentRepository studentRepository, IUserRepository userR } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/Student/GetStudentById.cs b/src/Domain/UseCases/Interactors/Student/GetStudentById.cs index ebd55704..0647be14 100644 --- a/src/Domain/UseCases/Interactors/Student/GetStudentById.cs +++ b/src/Domain/UseCases/Interactors/Student/GetStudentById.cs @@ -18,7 +18,7 @@ public GetStudentById(IStudentRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); Entities.Student? entity = await _repository.GetById(id); diff --git a/src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs b/src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs index 851707ee..4c3fc2e2 100644 --- a/src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs +++ b/src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs @@ -16,7 +16,7 @@ public GetStudentByRegistrationCode(IStudentRepository studentRepository, IMappe _mapper = mapper; } - public async Task Execute(string? registrationCode) + public async Task ExecuteAsync(string? registrationCode) { // Verifica de a matrícula do aluno foi informada UseCaseException.NotInformedParam(string.IsNullOrEmpty(registrationCode), "Matrícula"); diff --git a/src/Domain/UseCases/Interactors/Student/GetStudents.cs b/src/Domain/UseCases/Interactors/Student/GetStudents.cs index ab33d91d..371a6dd4 100644 --- a/src/Domain/UseCases/Interactors/Student/GetStudents.cs +++ b/src/Domain/UseCases/Interactors/Student/GetStudents.cs @@ -17,7 +17,7 @@ public GetStudents(IStudentRepository repository, IMapper mapper) } #endregion Global Scope - public async Task> Execute(int skip, int take) + public async Task> ExecuteAsync(int skip, int take) { IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); return _mapper.Map>(entities).AsQueryable(); diff --git a/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs b/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs index e4ecd7ca..37694fc7 100644 --- a/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs +++ b/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs @@ -16,7 +16,7 @@ public RequestStudentRegister(IEmailService emailService, IUserRepository userRe _userRepository = userRepository; } - public async Task Execute(string? email) + public async Task ExecuteAsync(string? email) { // Verifica se o email foi informado UseCaseException.NotInformedParam(string.IsNullOrEmpty(email), "Email"); diff --git a/src/Domain/UseCases/Interactors/Student/UpdateStudent.cs b/src/Domain/UseCases/Interactors/Student/UpdateStudent.cs index 23f20ca5..8c059339 100644 --- a/src/Domain/UseCases/Interactors/Student/UpdateStudent.cs +++ b/src/Domain/UseCases/Interactors/Student/UpdateStudent.cs @@ -19,7 +19,7 @@ public UpdateStudent(IStudentRepository studentRepository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id, UpdateStudentInput model) + public async Task ExecuteAsync(Guid? id, UpdateStudentInput model) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs b/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs index 133a8dcb..2cdd3fe0 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs @@ -36,7 +36,7 @@ public CreateStudentDocuments( } #endregion - public async Task Execute(CreateStudentDocumentsInput input) + public async Task ExecuteAsync(CreateStudentDocumentsInput input) { // Verifica se já há documentos para o projeto informado var documents = await _studentDocumentRepository.GetByProjectId(input.ProjectId!); diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs b/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs index 1548613b..6cb228bb 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs @@ -18,7 +18,7 @@ public DeleteStudentDocuments(IStudentDocumentsRepository repository, IMapper ma } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs b/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs index b7f83c77..1a011b25 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs @@ -20,7 +20,7 @@ public GetStudentDocumentsByProjectId( } #endregion Global Scope - public async Task Execute(Guid? projectId) + public async Task ExecuteAsync(Guid? projectId) { // Verifica se o id foi informado UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs b/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs index b2c0d1d5..7fc55490 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs @@ -20,7 +20,7 @@ public GetStudentDocumentsByStudentId( } #endregion Global Scope - public async Task Execute(Guid? studentId) + public async Task ExecuteAsync(Guid? studentId) { // Verifica se o id foi informado UseCaseException.NotInformedParam(studentId is null, nameof(studentId)); diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs b/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs index 611fd6ea..ed70904b 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs @@ -29,7 +29,7 @@ public UpdateStudentDocuments( } #endregion Global Scope - public async Task Execute(Guid? id, UpdateStudentDocumentsInput model) + public async Task ExecuteAsync(Guid? id, UpdateStudentDocumentsInput model) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs b/src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs index a698d2ae..516fdec6 100644 --- a/src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs +++ b/src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs @@ -20,7 +20,7 @@ public CreateSubArea(ISubAreaRepository subAreaRepository, IAreaRepository areaR } #endregion - public async Task Execute(CreateSubAreaInput input) + public async Task ExecuteAsync(CreateSubAreaInput input) { var entity = await _subAreaRepository.GetByCode(input.Code); UseCaseException.BusinessRuleViolation(entity != null, diff --git a/src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs b/src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs index d0b8b54c..d1924bae 100644 --- a/src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs +++ b/src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs @@ -18,7 +18,7 @@ public DeleteSubArea(ISubAreaRepository subAreaRepository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs b/src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs index 79175713..b4d6d8f5 100644 --- a/src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs +++ b/src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs @@ -17,7 +17,7 @@ public GetSubAreaById(ISubAreaRepository subAreaRepository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { Entities.SubArea? entity = await _subAreaRepository.GetById(id); return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs b/src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs index 780b389e..ddf9aa9e 100644 --- a/src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs +++ b/src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs @@ -18,7 +18,7 @@ public GetSubAreasByArea(ISubAreaRepository subAreaRepository, IMapper mapper) } #endregion Global Scope - public async Task> Execute(Guid? areaId, int skip, int take) + public async Task> ExecuteAsync(Guid? areaId, int skip, int take) { UseCaseException.NotInformedParam(areaId is null, nameof(areaId)); IEnumerable entities = (IEnumerable)await _subAreaRepository.GetSubAreasByArea(areaId, skip, take); diff --git a/src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs b/src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs index a5bc2492..07d0c92a 100644 --- a/src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs +++ b/src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs @@ -17,7 +17,7 @@ public UpdateSubArea(ISubAreaRepository subAreaRepository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id, UpdateSubAreaInput input) + public async Task ExecuteAsync(Guid? id, UpdateSubAreaInput input) { // Recupera entidade que será atualizada Entities.SubArea entity = await _subAreaRepository.GetById(id) diff --git a/src/Domain/UseCases/Interactors/User/ActivateUser.cs b/src/Domain/UseCases/Interactors/User/ActivateUser.cs index 94d297ea..78c8fd49 100644 --- a/src/Domain/UseCases/Interactors/User/ActivateUser.cs +++ b/src/Domain/UseCases/Interactors/User/ActivateUser.cs @@ -18,7 +18,7 @@ public ActivateUser(IUserRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se id é nulo UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/User/DeactivateUser.cs b/src/Domain/UseCases/Interactors/User/DeactivateUser.cs index 0c14ba96..b53bf843 100644 --- a/src/Domain/UseCases/Interactors/User/DeactivateUser.cs +++ b/src/Domain/UseCases/Interactors/User/DeactivateUser.cs @@ -18,7 +18,7 @@ public DeactivateUser(IUserRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se id é nulo UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/User/GetActiveUsers.cs b/src/Domain/UseCases/Interactors/User/GetActiveUsers.cs index 12309417..bb9fbb1c 100644 --- a/src/Domain/UseCases/Interactors/User/GetActiveUsers.cs +++ b/src/Domain/UseCases/Interactors/User/GetActiveUsers.cs @@ -17,7 +17,7 @@ public GetActiveUsers(IUserRepository repository, IMapper mapper) } #endregion Global Scope - public async Task> Execute(int skip, int take) + public async Task> ExecuteAsync(int skip, int take) { IEnumerable entities = (IEnumerable)await _repository.GetActiveUsers(skip, take); return _mapper.Map>(entities).AsQueryable(); diff --git a/src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs b/src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs index 0e0a3efd..e32c3313 100644 --- a/src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs +++ b/src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs @@ -17,7 +17,7 @@ public GetInactiveUsers(IUserRepository repository, IMapper mapper) } #endregion Global Scope - public async Task> Execute(int skip, int take) + public async Task> ExecuteAsync(int skip, int take) { IEnumerable entities = (IEnumerable)await _repository.GetInactiveUsers(skip, take); return _mapper.Map>(entities).AsQueryable(); diff --git a/src/Domain/UseCases/Interactors/User/GetUserById.cs b/src/Domain/UseCases/Interactors/User/GetUserById.cs index 7eb65089..8b56a44a 100644 --- a/src/Domain/UseCases/Interactors/User/GetUserById.cs +++ b/src/Domain/UseCases/Interactors/User/GetUserById.cs @@ -18,7 +18,7 @@ public GetUserById(IUserRepository repository, IMapper mapper) } #endregion Global Scope - public async Task Execute(Guid? id) + public async Task ExecuteAsync(Guid? id) { // Verifica se o id informado é nulo UseCaseException.NotInformedParam(id is null, nameof(id)); diff --git a/src/Domain/UseCases/Interactors/User/UpdateUser.cs b/src/Domain/UseCases/Interactors/User/UpdateUser.cs index 700c6a4c..d2251c6d 100644 --- a/src/Domain/UseCases/Interactors/User/UpdateUser.cs +++ b/src/Domain/UseCases/Interactors/User/UpdateUser.cs @@ -21,7 +21,7 @@ public UpdateUser(IUserRepository repository, ITokenAuthenticationService tokenA } #endregion Global Scope - public async Task Execute(UserUpdateInput input) + public async Task ExecuteAsync(UserUpdateInput input) { // Busca as claims do usuário autenticado Ports.Auth.UserClaimsOutput userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); diff --git a/src/Domain/UseCases/Interfaces/Area/ICreateArea.cs b/src/Domain/UseCases/Interfaces/Area/ICreateArea.cs index 0e8088fc..2e6e204e 100644 --- a/src/Domain/UseCases/Interfaces/Area/ICreateArea.cs +++ b/src/Domain/UseCases/Interfaces/Area/ICreateArea.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Area { public interface ICreateArea { - Task Execute(CreateAreaInput model); + Task ExecuteAsync(CreateAreaInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Area/IDeleteArea.cs b/src/Domain/UseCases/Interfaces/Area/IDeleteArea.cs index eaf35f46..e4785eb0 100644 --- a/src/Domain/UseCases/Interfaces/Area/IDeleteArea.cs +++ b/src/Domain/UseCases/Interfaces/Area/IDeleteArea.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Area { public interface IDeleteArea { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Area/IGetAreaById.cs b/src/Domain/UseCases/Interfaces/Area/IGetAreaById.cs index 25d97a90..fef38c94 100644 --- a/src/Domain/UseCases/Interfaces/Area/IGetAreaById.cs +++ b/src/Domain/UseCases/Interfaces/Area/IGetAreaById.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Area { public interface IGetAreaById { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Area/IGetAreasByMainArea.cs b/src/Domain/UseCases/Interfaces/Area/IGetAreasByMainArea.cs index 2955604a..6c801339 100644 --- a/src/Domain/UseCases/Interfaces/Area/IGetAreasByMainArea.cs +++ b/src/Domain/UseCases/Interfaces/Area/IGetAreasByMainArea.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Area { public interface IGetAreasByMainArea { - Task> Execute(Guid? mainAreaId, int skip, int take); + Task> ExecuteAsync(Guid? mainAreaId, int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs b/src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs index a856b942..372469c9 100644 --- a/src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs +++ b/src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Area { public interface IUpdateArea { - Task Execute(Guid? id, UpdateAreaInput input); + Task ExecuteAsync(Guid? id, UpdateAreaInput input); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/AssistanceType/ICreateAssistanceType.cs b/src/Domain/UseCases/Interfaces/AssistanceType/ICreateAssistanceType.cs index 2bd34c40..aff6bffb 100644 --- a/src/Domain/UseCases/Interfaces/AssistanceType/ICreateAssistanceType.cs +++ b/src/Domain/UseCases/Interfaces/AssistanceType/ICreateAssistanceType.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.AssistanceType { public interface ICreateAssistanceType { - Task Execute(CreateAssistanceTypeInput model); + Task ExecuteAsync(CreateAssistanceTypeInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/AssistanceType/IDeleteAssistanceType.cs b/src/Domain/UseCases/Interfaces/AssistanceType/IDeleteAssistanceType.cs index d2bc8012..dce5b6a8 100644 --- a/src/Domain/UseCases/Interfaces/AssistanceType/IDeleteAssistanceType.cs +++ b/src/Domain/UseCases/Interfaces/AssistanceType/IDeleteAssistanceType.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.AssistanceType { public interface IDeleteAssistanceType { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypeById.cs b/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypeById.cs index 0b888442..5d5aa090 100644 --- a/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypeById.cs +++ b/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypeById.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.AssistanceType { public interface IGetAssistanceTypeById { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypes.cs b/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypes.cs index 0012ce34..6d35ab5e 100644 --- a/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypes.cs +++ b/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypes.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.AssistanceType { public interface IGetAssistanceTypes { - Task> Execute(int skip, int take); + Task> ExecuteAsync(int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/AssistanceType/IUpdateAssistanceType.cs b/src/Domain/UseCases/Interfaces/AssistanceType/IUpdateAssistanceType.cs index aa6489f7..5577984c 100644 --- a/src/Domain/UseCases/Interfaces/AssistanceType/IUpdateAssistanceType.cs +++ b/src/Domain/UseCases/Interfaces/AssistanceType/IUpdateAssistanceType.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.AssistanceType { public interface IUpdateAssistanceType { - Task Execute(Guid? id, UpdateAssistanceTypeInput input); + Task ExecuteAsync(Guid? id, UpdateAssistanceTypeInput input); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Auth/IConfirmEmail.cs b/src/Domain/UseCases/Interfaces/Auth/IConfirmEmail.cs index ba06c013..e9e110c2 100644 --- a/src/Domain/UseCases/Interfaces/Auth/IConfirmEmail.cs +++ b/src/Domain/UseCases/Interfaces/Auth/IConfirmEmail.cs @@ -2,6 +2,6 @@ namespace Domain.UseCases.Interfaces.Auth { public interface IConfirmEmail { - Task Execute(string? email, string? token); + Task ExecuteAsync(string? email, string? token); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Auth/IForgotPassword.cs b/src/Domain/UseCases/Interfaces/Auth/IForgotPassword.cs index 29518a9d..dec64fcf 100644 --- a/src/Domain/UseCases/Interfaces/Auth/IForgotPassword.cs +++ b/src/Domain/UseCases/Interfaces/Auth/IForgotPassword.cs @@ -2,6 +2,6 @@ namespace Domain.UseCases.Interfaces.Auth { public interface IForgotPassword { - Task Execute(string? email); + Task ExecuteAsync(string? email); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Auth/ILogin.cs b/src/Domain/UseCases/Interfaces/Auth/ILogin.cs index 949c69f3..8f381259 100644 --- a/src/Domain/UseCases/Interfaces/Auth/ILogin.cs +++ b/src/Domain/UseCases/Interfaces/Auth/ILogin.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Auth { public interface ILogin { - Task Execute(UserLoginInput input); + Task ExecuteAsync(UserLoginInput input); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Auth/IResetPassword.cs b/src/Domain/UseCases/Interfaces/Auth/IResetPassword.cs index b26283ab..644231b1 100644 --- a/src/Domain/UseCases/Interfaces/Auth/IResetPassword.cs +++ b/src/Domain/UseCases/Interfaces/Auth/IResetPassword.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Auth { public interface IResetPassword { - Task Execute(UserResetPasswordInput input); + Task ExecuteAsync(UserResetPasswordInput input); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Campus/ICreateCampus.cs b/src/Domain/UseCases/Interfaces/Campus/ICreateCampus.cs index 5e32a66d..b3a289b4 100644 --- a/src/Domain/UseCases/Interfaces/Campus/ICreateCampus.cs +++ b/src/Domain/UseCases/Interfaces/Campus/ICreateCampus.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Campus { public interface ICreateCampus { - Task Execute(CreateCampusInput model); + Task ExecuteAsync(CreateCampusInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Campus/IDeleteCampus.cs b/src/Domain/UseCases/Interfaces/Campus/IDeleteCampus.cs index c48161b0..e6c85101 100644 --- a/src/Domain/UseCases/Interfaces/Campus/IDeleteCampus.cs +++ b/src/Domain/UseCases/Interfaces/Campus/IDeleteCampus.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Campus { public interface IDeleteCampus { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Campus/IGetCampusById.cs b/src/Domain/UseCases/Interfaces/Campus/IGetCampusById.cs index de31e7e8..fac263f5 100644 --- a/src/Domain/UseCases/Interfaces/Campus/IGetCampusById.cs +++ b/src/Domain/UseCases/Interfaces/Campus/IGetCampusById.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Campus { public interface IGetCampusById { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Campus/IGetCampuses.cs b/src/Domain/UseCases/Interfaces/Campus/IGetCampuses.cs index 7bcded9b..1b1037e2 100644 --- a/src/Domain/UseCases/Interfaces/Campus/IGetCampuses.cs +++ b/src/Domain/UseCases/Interfaces/Campus/IGetCampuses.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Campus { public interface IGetCampuses { - Task> Execute(int skip, int take); + Task> ExecuteAsync(int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Campus/IUpdateCampus.cs b/src/Domain/UseCases/Interfaces/Campus/IUpdateCampus.cs index 32c5e18f..d7a93c77 100644 --- a/src/Domain/UseCases/Interfaces/Campus/IUpdateCampus.cs +++ b/src/Domain/UseCases/Interfaces/Campus/IUpdateCampus.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Campus { public interface IUpdateCampus { - Task Execute(Guid? id, UpdateCampusInput input); + Task ExecuteAsync(Guid? id, UpdateCampusInput input); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Course/ICreateCourse.cs b/src/Domain/UseCases/Interfaces/Course/ICreateCourse.cs index 7a830c03..8ec1cab0 100644 --- a/src/Domain/UseCases/Interfaces/Course/ICreateCourse.cs +++ b/src/Domain/UseCases/Interfaces/Course/ICreateCourse.cs @@ -5,6 +5,6 @@ namespace Domain.UseCases.Interfaces.Course { public interface ICreateCourse { - Task Execute(CreateCourseInput model); + Task ExecuteAsync(CreateCourseInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Course/IDeleteCourse.cs b/src/Domain/UseCases/Interfaces/Course/IDeleteCourse.cs index b778ea9e..e2333b62 100644 --- a/src/Domain/UseCases/Interfaces/Course/IDeleteCourse.cs +++ b/src/Domain/UseCases/Interfaces/Course/IDeleteCourse.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Course { public interface IDeleteCourse { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Course/IGetCourseById.cs b/src/Domain/UseCases/Interfaces/Course/IGetCourseById.cs index 118e9b72..2b12d7af 100644 --- a/src/Domain/UseCases/Interfaces/Course/IGetCourseById.cs +++ b/src/Domain/UseCases/Interfaces/Course/IGetCourseById.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Course { public interface IGetCourseById { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Course/IGetCourses.cs b/src/Domain/UseCases/Interfaces/Course/IGetCourses.cs index bd69105d..8e3e7dda 100644 --- a/src/Domain/UseCases/Interfaces/Course/IGetCourses.cs +++ b/src/Domain/UseCases/Interfaces/Course/IGetCourses.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Course { public interface IGetCourses { - Task> Execute(int skip, int take); + Task> ExecuteAsync(int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Course/IUpdateCourse.cs b/src/Domain/UseCases/Interfaces/Course/IUpdateCourse.cs index 058ffcd4..2e93a3a2 100644 --- a/src/Domain/UseCases/Interfaces/Course/IUpdateCourse.cs +++ b/src/Domain/UseCases/Interfaces/Course/IUpdateCourse.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Course { public interface IUpdateCourse { - Task Execute(Guid? id, UpdateCourseInput input); + Task ExecuteAsync(Guid? id, UpdateCourseInput input); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/MainArea/ICreateMainArea.cs b/src/Domain/UseCases/Interfaces/MainArea/ICreateMainArea.cs index 8e6860a8..194fd97f 100644 --- a/src/Domain/UseCases/Interfaces/MainArea/ICreateMainArea.cs +++ b/src/Domain/UseCases/Interfaces/MainArea/ICreateMainArea.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.MainArea { public interface ICreateMainArea { - Task Execute(CreateMainAreaInput model); + Task ExecuteAsync(CreateMainAreaInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/MainArea/IDeleteMainArea.cs b/src/Domain/UseCases/Interfaces/MainArea/IDeleteMainArea.cs index df91c51a..aab75e6e 100644 --- a/src/Domain/UseCases/Interfaces/MainArea/IDeleteMainArea.cs +++ b/src/Domain/UseCases/Interfaces/MainArea/IDeleteMainArea.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.MainArea { public interface IDeleteMainArea { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreaById.cs b/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreaById.cs index 641c20dd..111d275e 100644 --- a/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreaById.cs +++ b/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreaById.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.MainArea { public interface IGetMainAreaById { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreas.cs b/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreas.cs index bb6f321a..7cc8604c 100644 --- a/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreas.cs +++ b/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreas.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.MainArea { public interface IGetMainAreas { - Task> Execute(int skip, int take); + Task> ExecuteAsync(int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/MainArea/IUpdateMainArea.cs b/src/Domain/UseCases/Interfaces/MainArea/IUpdateMainArea.cs index 042653ad..5ab223da 100644 --- a/src/Domain/UseCases/Interfaces/MainArea/IUpdateMainArea.cs +++ b/src/Domain/UseCases/Interfaces/MainArea/IUpdateMainArea.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.MainArea { public interface IUpdateMainArea { - Task Execute(Guid? id, UpdateMainAreaInput input); + Task ExecuteAsync(Guid? id, UpdateMainAreaInput input); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Notice/ICreateNotice.cs b/src/Domain/UseCases/Interfaces/Notice/ICreateNotice.cs index e4a88581..57041783 100644 --- a/src/Domain/UseCases/Interfaces/Notice/ICreateNotice.cs +++ b/src/Domain/UseCases/Interfaces/Notice/ICreateNotice.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Notice { public interface ICreateNotice { - Task Execute(CreateNoticeInput model); + Task ExecuteAsync(CreateNoticeInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Notice/IDeleteNotice.cs b/src/Domain/UseCases/Interfaces/Notice/IDeleteNotice.cs index c8b60d5e..afe14ac8 100644 --- a/src/Domain/UseCases/Interfaces/Notice/IDeleteNotice.cs +++ b/src/Domain/UseCases/Interfaces/Notice/IDeleteNotice.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Notice { public interface IDeleteNotice { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Notice/IGetNoticeById.cs b/src/Domain/UseCases/Interfaces/Notice/IGetNoticeById.cs index 9191b876..4fc54e73 100644 --- a/src/Domain/UseCases/Interfaces/Notice/IGetNoticeById.cs +++ b/src/Domain/UseCases/Interfaces/Notice/IGetNoticeById.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Notice { public interface IGetNoticeById { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Notice/IGetNotices.cs b/src/Domain/UseCases/Interfaces/Notice/IGetNotices.cs index 54f932cf..3ed411bd 100644 --- a/src/Domain/UseCases/Interfaces/Notice/IGetNotices.cs +++ b/src/Domain/UseCases/Interfaces/Notice/IGetNotices.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Notice { public interface IGetNotices { - Task> Execute(int skip, int take); + Task> ExecuteAsync(int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Notice/IUpdateNotice.cs b/src/Domain/UseCases/Interfaces/Notice/IUpdateNotice.cs index 49fe0fb6..79b3fee1 100644 --- a/src/Domain/UseCases/Interfaces/Notice/IUpdateNotice.cs +++ b/src/Domain/UseCases/Interfaces/Notice/IUpdateNotice.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Notice { public interface IUpdateNotice { - Task Execute(Guid? id, UpdateNoticeInput model); + Task ExecuteAsync(Guid? id, UpdateNoticeInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Professor/ICreateProfessor.cs b/src/Domain/UseCases/Interfaces/Professor/ICreateProfessor.cs index c0af468d..aa677b6c 100644 --- a/src/Domain/UseCases/Interfaces/Professor/ICreateProfessor.cs +++ b/src/Domain/UseCases/Interfaces/Professor/ICreateProfessor.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Professor { public interface ICreateProfessor { - Task Execute(CreateProfessorInput model); + Task ExecuteAsync(CreateProfessorInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Professor/IDeleteProfessor.cs b/src/Domain/UseCases/Interfaces/Professor/IDeleteProfessor.cs index 50081b68..c8edd9c4 100644 --- a/src/Domain/UseCases/Interfaces/Professor/IDeleteProfessor.cs +++ b/src/Domain/UseCases/Interfaces/Professor/IDeleteProfessor.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Professor { public interface IDeleteProfessor { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Professor/IGetProfessorById.cs b/src/Domain/UseCases/Interfaces/Professor/IGetProfessorById.cs index a98b75d5..41533bbd 100644 --- a/src/Domain/UseCases/Interfaces/Professor/IGetProfessorById.cs +++ b/src/Domain/UseCases/Interfaces/Professor/IGetProfessorById.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Professor { public interface IGetProfessorById { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Professor/IGetProfessors.cs b/src/Domain/UseCases/Interfaces/Professor/IGetProfessors.cs index 0915bd00..32769cc3 100644 --- a/src/Domain/UseCases/Interfaces/Professor/IGetProfessors.cs +++ b/src/Domain/UseCases/Interfaces/Professor/IGetProfessors.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Professor { public interface IGetProfessors { - Task> Execute(int skip, int take); + Task> ExecuteAsync(int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Professor/IUpdateProfessor.cs b/src/Domain/UseCases/Interfaces/Professor/IUpdateProfessor.cs index c7247b8d..b39e0054 100644 --- a/src/Domain/UseCases/Interfaces/Professor/IUpdateProfessor.cs +++ b/src/Domain/UseCases/Interfaces/Professor/IUpdateProfessor.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Professor { public interface IUpdateProfessor { - Task Execute(Guid? id, UpdateProfessorInput model); + Task ExecuteAsync(Guid? id, UpdateProfessorInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/ProgramType/ICreateProgramType.cs b/src/Domain/UseCases/Interfaces/ProgramType/ICreateProgramType.cs index 436609da..2471f7fb 100644 --- a/src/Domain/UseCases/Interfaces/ProgramType/ICreateProgramType.cs +++ b/src/Domain/UseCases/Interfaces/ProgramType/ICreateProgramType.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.ProgramType { public interface ICreateProgramType { - Task Execute(CreateProgramTypeInput model); + Task ExecuteAsync(CreateProgramTypeInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/ProgramType/IDeleteProgramType.cs b/src/Domain/UseCases/Interfaces/ProgramType/IDeleteProgramType.cs index b3dfe3df..32870a1c 100644 --- a/src/Domain/UseCases/Interfaces/ProgramType/IDeleteProgramType.cs +++ b/src/Domain/UseCases/Interfaces/ProgramType/IDeleteProgramType.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.ProgramType { public interface IDeleteProgramType { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypeById.cs b/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypeById.cs index 3c11c1d7..07b05e03 100644 --- a/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypeById.cs +++ b/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypeById.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.ProgramType { public interface IGetProgramTypeById { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypes.cs b/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypes.cs index c0ec71c0..29fa9ae5 100644 --- a/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypes.cs +++ b/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypes.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.ProgramType { public interface IGetProgramTypes { - Task> Execute(int skip, int take); + Task> ExecuteAsync(int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/ProgramType/IUpdateProgramType.cs b/src/Domain/UseCases/Interfaces/ProgramType/IUpdateProgramType.cs index ddbcced2..c092cec2 100644 --- a/src/Domain/UseCases/Interfaces/ProgramType/IUpdateProgramType.cs +++ b/src/Domain/UseCases/Interfaces/ProgramType/IUpdateProgramType.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.ProgramType { public interface IUpdateProgramType { - Task Execute(Guid? id, UpdateProgramTypeInput input); + Task ExecuteAsync(Guid? id, UpdateProgramTypeInput input); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Project/IAppealProject.cs b/src/Domain/UseCases/Interfaces/Project/IAppealProject.cs index 52c2e53d..301683b8 100644 --- a/src/Domain/UseCases/Interfaces/Project/IAppealProject.cs +++ b/src/Domain/UseCases/Interfaces/Project/IAppealProject.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Project { public interface IAppealProject { - Task Execute(Guid? projectId, string? appealDescription); + Task ExecuteAsync(Guid? projectId, string? appealDescription); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Project/ICancelProject.cs b/src/Domain/UseCases/Interfaces/Project/ICancelProject.cs index 9e5c004f..ece15ee7 100644 --- a/src/Domain/UseCases/Interfaces/Project/ICancelProject.cs +++ b/src/Domain/UseCases/Interfaces/Project/ICancelProject.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Project { public interface ICancelProject { - Task Execute(Guid? id, string? observation); + Task ExecuteAsync(Guid? id, string? observation); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Project/IGetClosedProjects.cs b/src/Domain/UseCases/Interfaces/Project/IGetClosedProjects.cs index 16d63062..bc30c9f0 100644 --- a/src/Domain/UseCases/Interfaces/Project/IGetClosedProjects.cs +++ b/src/Domain/UseCases/Interfaces/Project/IGetClosedProjects.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Project { public interface IGetClosedProjects { - Task> Execute(int skip, int take, bool onlyMyProjects = true); + Task> ExecuteAsync(int skip, int take, bool onlyMyProjects = true); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Project/IGetOpenProjects.cs b/src/Domain/UseCases/Interfaces/Project/IGetOpenProjects.cs index b2a803fa..027a6341 100644 --- a/src/Domain/UseCases/Interfaces/Project/IGetOpenProjects.cs +++ b/src/Domain/UseCases/Interfaces/Project/IGetOpenProjects.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Project { public interface IGetOpenProjects { - Task> Execute(int skip, int take, bool onlyMyProjects = true); + Task> ExecuteAsync(int skip, int take, bool onlyMyProjects = true); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Project/IGetProjectById.cs b/src/Domain/UseCases/Interfaces/Project/IGetProjectById.cs index b0e902a4..01baf78b 100644 --- a/src/Domain/UseCases/Interfaces/Project/IGetProjectById.cs +++ b/src/Domain/UseCases/Interfaces/Project/IGetProjectById.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Project { public interface IGetProjectById { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Project/IOpenProject.cs b/src/Domain/UseCases/Interfaces/Project/IOpenProject.cs index 75ee0229..7e92cc72 100644 --- a/src/Domain/UseCases/Interfaces/Project/IOpenProject.cs +++ b/src/Domain/UseCases/Interfaces/Project/IOpenProject.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Project { public interface IOpenProject { - Task Execute(OpenProjectInput input); + Task ExecuteAsync(OpenProjectInput input); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Project/ISubmitProject.cs b/src/Domain/UseCases/Interfaces/Project/ISubmitProject.cs index d77289a9..fea387f7 100644 --- a/src/Domain/UseCases/Interfaces/Project/ISubmitProject.cs +++ b/src/Domain/UseCases/Interfaces/Project/ISubmitProject.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Project { public interface ISubmitProject { - Task Execute(Guid? projectId); + Task ExecuteAsync(Guid? projectId); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Project/IUpdateProject.cs b/src/Domain/UseCases/Interfaces/Project/IUpdateProject.cs index 8d458ae5..f056a822 100644 --- a/src/Domain/UseCases/Interfaces/Project/IUpdateProject.cs +++ b/src/Domain/UseCases/Interfaces/Project/IUpdateProject.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Project { public interface IUpdateProject { - Task Execute(Guid? id, UpdateProjectInput input); + Task ExecuteAsync(Guid? id, UpdateProjectInput input); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateAppealProject.cs b/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateAppealProject.cs index 2a7fda5e..a3cedd81 100644 --- a/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateAppealProject.cs +++ b/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateAppealProject.cs @@ -5,6 +5,6 @@ namespace Domain.UseCases.Interfaces.ProjectEvaluation { public interface IEvaluateAppealProject { - Task Execute(EvaluateAppealProjectInput input); + Task ExecuteAsync(EvaluateAppealProjectInput input); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateSubmissionProject.cs b/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateSubmissionProject.cs index f18ce9e8..96b09f2b 100644 --- a/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateSubmissionProject.cs @@ -5,6 +5,6 @@ namespace Domain.UseCases.Interfaces.ProjectEvaluation { public interface IEvaluateSubmissionProject { - Task Execute(EvaluateSubmissionProjectInput input); + Task ExecuteAsync(EvaluateSubmissionProjectInput input); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/ProjectEvaluation/IGetEvaluationByProjectId.cs b/src/Domain/UseCases/Interfaces/ProjectEvaluation/IGetEvaluationByProjectId.cs index 2154a8ff..58db5670 100644 --- a/src/Domain/UseCases/Interfaces/ProjectEvaluation/IGetEvaluationByProjectId.cs +++ b/src/Domain/UseCases/Interfaces/ProjectEvaluation/IGetEvaluationByProjectId.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.ProjectEvaluation { public interface IGetEvaluationByProjectId { - Task Execute(Guid? projectId); + Task ExecuteAsync(Guid? projectId); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Student/ICreateStudent.cs b/src/Domain/UseCases/Interfaces/Student/ICreateStudent.cs index a4194787..d0de61cc 100644 --- a/src/Domain/UseCases/Interfaces/Student/ICreateStudent.cs +++ b/src/Domain/UseCases/Interfaces/Student/ICreateStudent.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Student { public interface ICreateStudent { - Task Execute(CreateStudentInput model); + Task ExecuteAsync(CreateStudentInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Student/IDeleteStudent.cs b/src/Domain/UseCases/Interfaces/Student/IDeleteStudent.cs index d922036b..56553e8d 100644 --- a/src/Domain/UseCases/Interfaces/Student/IDeleteStudent.cs +++ b/src/Domain/UseCases/Interfaces/Student/IDeleteStudent.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Student { public interface IDeleteStudent { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Student/IGetStudentById.cs b/src/Domain/UseCases/Interfaces/Student/IGetStudentById.cs index 62084c50..90e11d53 100644 --- a/src/Domain/UseCases/Interfaces/Student/IGetStudentById.cs +++ b/src/Domain/UseCases/Interfaces/Student/IGetStudentById.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Student { public interface IGetStudentById { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Student/IGetStudentByRegistrationCode.cs b/src/Domain/UseCases/Interfaces/Student/IGetStudentByRegistrationCode.cs index deb0c6f9..3fa5d36c 100644 --- a/src/Domain/UseCases/Interfaces/Student/IGetStudentByRegistrationCode.cs +++ b/src/Domain/UseCases/Interfaces/Student/IGetStudentByRegistrationCode.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Student { public interface IGetStudentByRegistrationCode { - Task Execute(string? registrationCode); + Task ExecuteAsync(string? registrationCode); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Student/IGetStudents.cs b/src/Domain/UseCases/Interfaces/Student/IGetStudents.cs index 6a4f9bcd..b352ca4d 100644 --- a/src/Domain/UseCases/Interfaces/Student/IGetStudents.cs +++ b/src/Domain/UseCases/Interfaces/Student/IGetStudents.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Student { public interface IGetStudents { - Task> Execute(int skip, int take); + Task> ExecuteAsync(int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Student/IRequestStudentRegister.cs b/src/Domain/UseCases/Interfaces/Student/IRequestStudentRegister.cs index 1a817396..2432653b 100644 --- a/src/Domain/UseCases/Interfaces/Student/IRequestStudentRegister.cs +++ b/src/Domain/UseCases/Interfaces/Student/IRequestStudentRegister.cs @@ -2,6 +2,6 @@ namespace Domain.UseCases.Interfaces.Student { public interface IRequestStudentRegister { - Task Execute(string? email); + Task ExecuteAsync(string? email); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/Student/IUpdateStudent.cs b/src/Domain/UseCases/Interfaces/Student/IUpdateStudent.cs index 053dc505..dbd9fc1a 100644 --- a/src/Domain/UseCases/Interfaces/Student/IUpdateStudent.cs +++ b/src/Domain/UseCases/Interfaces/Student/IUpdateStudent.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.Student { public interface IUpdateStudent { - Task Execute(Guid? id, UpdateStudentInput model); + Task ExecuteAsync(Guid? id, UpdateStudentInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/StudentDocuments/ICreateStudentDocuments.cs b/src/Domain/UseCases/Interfaces/StudentDocuments/ICreateStudentDocuments.cs index 63fec887..dbefe4bf 100644 --- a/src/Domain/UseCases/Interfaces/StudentDocuments/ICreateStudentDocuments.cs +++ b/src/Domain/UseCases/Interfaces/StudentDocuments/ICreateStudentDocuments.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.StudentDocuments { public interface ICreateStudentDocuments { - Task Execute(CreateStudentDocumentsInput model); + Task ExecuteAsync(CreateStudentDocumentsInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/StudentDocuments/IDeleteStudentDocuments.cs b/src/Domain/UseCases/Interfaces/StudentDocuments/IDeleteStudentDocuments.cs index 8d85206a..44ea5a2b 100644 --- a/src/Domain/UseCases/Interfaces/StudentDocuments/IDeleteStudentDocuments.cs +++ b/src/Domain/UseCases/Interfaces/StudentDocuments/IDeleteStudentDocuments.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.StudentDocuments { public interface IDeleteStudentDocuments { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByProjectId.cs b/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByProjectId.cs index 46bf7eb3..5dcfa315 100644 --- a/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByProjectId.cs +++ b/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByProjectId.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.StudentDocuments { public interface IGetStudentDocumentsByProjectId { - Task Execute(Guid? projectId); + Task ExecuteAsync(Guid? projectId); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByStudentId.cs b/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByStudentId.cs index f130152c..e539b8e4 100644 --- a/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByStudentId.cs +++ b/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByStudentId.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.StudentDocuments { public interface IGetStudentDocumentsByStudentId { - Task Execute(Guid? studentId); + Task ExecuteAsync(Guid? studentId); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/StudentDocuments/IUpdateStudentDocuments.cs b/src/Domain/UseCases/Interfaces/StudentDocuments/IUpdateStudentDocuments.cs index 24806fbb..58ebb94a 100644 --- a/src/Domain/UseCases/Interfaces/StudentDocuments/IUpdateStudentDocuments.cs +++ b/src/Domain/UseCases/Interfaces/StudentDocuments/IUpdateStudentDocuments.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.StudentDocuments { public interface IUpdateStudentDocuments { - Task Execute(Guid? id, UpdateStudentDocumentsInput model); + Task ExecuteAsync(Guid? id, UpdateStudentDocumentsInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/SubArea/ICreateSubArea.cs b/src/Domain/UseCases/Interfaces/SubArea/ICreateSubArea.cs index fcc99852..2278b22f 100644 --- a/src/Domain/UseCases/Interfaces/SubArea/ICreateSubArea.cs +++ b/src/Domain/UseCases/Interfaces/SubArea/ICreateSubArea.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.SubArea { public interface ICreateSubArea { - Task Execute(CreateSubAreaInput model); + Task ExecuteAsync(CreateSubAreaInput model); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/SubArea/IDeleteSubArea.cs b/src/Domain/UseCases/Interfaces/SubArea/IDeleteSubArea.cs index 77d10ee2..c3d83686 100644 --- a/src/Domain/UseCases/Interfaces/SubArea/IDeleteSubArea.cs +++ b/src/Domain/UseCases/Interfaces/SubArea/IDeleteSubArea.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.SubArea { public interface IDeleteSubArea { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreaById.cs b/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreaById.cs index 4cb4ab52..c928abfd 100644 --- a/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreaById.cs +++ b/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreaById.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.SubArea { public interface IGetSubAreaById { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreasByArea.cs b/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreasByArea.cs index 9c7f0c61..4792e5f1 100644 --- a/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreasByArea.cs +++ b/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreasByArea.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.SubArea { public interface IGetSubAreasByArea { - Task> Execute(Guid? areaId, int skip, int take); + Task> ExecuteAsync(Guid? areaId, int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/SubArea/IUpdateSubArea.cs b/src/Domain/UseCases/Interfaces/SubArea/IUpdateSubArea.cs index 44512337..ceb1dd06 100644 --- a/src/Domain/UseCases/Interfaces/SubArea/IUpdateSubArea.cs +++ b/src/Domain/UseCases/Interfaces/SubArea/IUpdateSubArea.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.SubArea { public interface IUpdateSubArea { - Task Execute(Guid? id, UpdateSubAreaInput input); + Task ExecuteAsync(Guid? id, UpdateSubAreaInput input); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/User/IActivateUser.cs b/src/Domain/UseCases/Interfaces/User/IActivateUser.cs index c6a7583e..4b0527ef 100644 --- a/src/Domain/UseCases/Interfaces/User/IActivateUser.cs +++ b/src/Domain/UseCases/Interfaces/User/IActivateUser.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.User { public interface IActivateUser { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/User/IDeactivateUser.cs b/src/Domain/UseCases/Interfaces/User/IDeactivateUser.cs index 2dbf0724..509d6b83 100644 --- a/src/Domain/UseCases/Interfaces/User/IDeactivateUser.cs +++ b/src/Domain/UseCases/Interfaces/User/IDeactivateUser.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.User { public interface IDeactivateUser { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/User/IGetActiveUsers.cs b/src/Domain/UseCases/Interfaces/User/IGetActiveUsers.cs index 77f18d55..d24e3a81 100644 --- a/src/Domain/UseCases/Interfaces/User/IGetActiveUsers.cs +++ b/src/Domain/UseCases/Interfaces/User/IGetActiveUsers.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.User { public interface IGetActiveUsers { - Task> Execute(int skip, int take); + Task> ExecuteAsync(int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/User/IGetInactiveUsers.cs b/src/Domain/UseCases/Interfaces/User/IGetInactiveUsers.cs index e22fce0f..6915679c 100644 --- a/src/Domain/UseCases/Interfaces/User/IGetInactiveUsers.cs +++ b/src/Domain/UseCases/Interfaces/User/IGetInactiveUsers.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.User { public interface IGetInactiveUsers { - Task> Execute(int skip, int take); + Task> ExecuteAsync(int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/User/IGetUserById.cs b/src/Domain/UseCases/Interfaces/User/IGetUserById.cs index cf7c0f30..6d20a298 100644 --- a/src/Domain/UseCases/Interfaces/User/IGetUserById.cs +++ b/src/Domain/UseCases/Interfaces/User/IGetUserById.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.User { public interface IGetUserById { - Task Execute(Guid? id); + Task ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/User/IUpdateUser.cs b/src/Domain/UseCases/Interfaces/User/IUpdateUser.cs index fda97b6c..77e174d8 100644 --- a/src/Domain/UseCases/Interfaces/User/IUpdateUser.cs +++ b/src/Domain/UseCases/Interfaces/User/IUpdateUser.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.User { public interface IUpdateUser { - Task Execute(UserUpdateInput input); + Task ExecuteAsync(UserUpdateInput input); } } \ No newline at end of file diff --git a/src/Infrastructure/WebAPI/Controllers/StudentController.cs b/src/Infrastructure/WebAPI/Controllers/StudentController.cs index c1b763bf..d5ff60a1 100644 --- a/src/Infrastructure/WebAPI/Controllers/StudentController.cs +++ b/src/Infrastructure/WebAPI/Controllers/StudentController.cs @@ -114,7 +114,7 @@ public async Task> GetByRegistrationCo catch (Exception ex) { _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); - return NotFound(ex.Message); + return BadRequest(ex.Message); } } From 991181f7bf2dc8f37a2f79ebb3fa8e1f890743b5 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 2 Aug 2023 23:02:19 -0300 Subject: [PATCH 070/201] refactor: add Async to EmailService methods --- src/Domain/Interfaces/Services/IEmailService.cs | 10 +++++----- .../UseCases/Interactors/Auth/ForgotPassword.cs | 2 +- .../UseCases/Interactors/Notice/CreateNotice.cs | 2 +- .../Interactors/Professor/CreateProfessor.cs | 2 +- .../ProjectEvaluation/EvaluateAppealProject.cs | 2 +- .../ProjectEvaluation/EvaluateSubmissionProject.cs | 2 +- .../UseCases/Interactors/Student/CreateStudent.cs | 2 +- .../Interactors/Student/RequestStudentRegister.cs | 2 +- .../ActivityType/IGetActivitiesByNoticeId.cs | 2 +- .../ActivityType/IGetLastNoticeActivities.cs | 2 +- src/Infrastructure/Services/Email/EmailService.cs | 12 +++++------- 11 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/Domain/Interfaces/Services/IEmailService.cs b/src/Domain/Interfaces/Services/IEmailService.cs index 071a4cdb..c7a58bbc 100644 --- a/src/Domain/Interfaces/Services/IEmailService.cs +++ b/src/Domain/Interfaces/Services/IEmailService.cs @@ -2,10 +2,10 @@ namespace Domain.Interfaces.Services { public interface IEmailService { - Task SendConfirmationEmail(string? email, string? name, string? token); - Task SendResetPasswordEmail(string? email, string? name, string? token); - Task SendNoticeEmail(string? email, string? name, DateTime? registrationStartDate, DateTime? registrationEndDate, string? noticeUrl); - Task SendProjectNotificationEmail(string? email, string? name, string? projectTitle, string? status, string? description); - Task SendRequestStudentRegisterEmail(string? email); + Task SendConfirmationEmailAsync(string? email, string? name, string? token); + Task SendResetPasswordEmailAsync(string? email, string? name, string? token); + Task SendNoticeEmailAsync(string? email, string? name, DateTime? registrationStartDate, DateTime? registrationEndDate, string? noticeUrl); + Task SendProjectNotificationEmailAsync(string? email, string? name, string? projectTitle, string? status, string? description); + Task SendRequestStudentRegisterEmailAsync(string? email); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs b/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs index a9545477..4a22e400 100644 --- a/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs +++ b/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs @@ -33,7 +33,7 @@ public async Task ExecuteAsync(string? email) await _userRepository.Update(user); // Envia email de recuperação de senha - await _emailService.SendResetPasswordEmail(user.Email, user.Name, user.ResetPasswordToken); + await _emailService.SendResetPasswordEmailAsync(user.Email, user.Name, user.ResetPasswordToken); // Verifica se o token foi gerado if (string.IsNullOrEmpty(user.ResetPasswordToken)) diff --git a/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs b/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs index a9c084be..b99a9fa3 100644 --- a/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs +++ b/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs @@ -102,7 +102,7 @@ public async Task ExecuteAsync(CreateNoticeInput input foreach (var professor in professors) { // Envia email de notificação - await _emailService.SendNoticeEmail( + await _emailService.SendNoticeEmailAsync( professor.User!.Email, professor.User!.Name, notice.RegistrationStartDate, diff --git a/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs b/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs index 6138173c..816e9274 100644 --- a/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs +++ b/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs @@ -61,7 +61,7 @@ public async Task ExecuteAsync(CreateProfessorInput UseCaseException.BusinessRuleViolation(entity == null, "Não foi possível criar o professor."); // Envia e-mail de confirmação - await _emailService.SendConfirmationEmail(user?.Email, user?.Name, user?.ValidationCode); + await _emailService.SendConfirmationEmailAsync(user?.Email, user?.Name, user?.ValidationCode); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs index 779491f2..9b26739a 100644 --- a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs @@ -92,7 +92,7 @@ public async Task ExecuteAsync(EvaluateAppealProjectI } // Informa ao professor o resultado da avaliação. - await _emailService.SendProjectNotificationEmail( + await _emailService.SendProjectNotificationEmailAsync( project.Professor!.User!.Email, project.Professor!.User!.Name, project.Title, diff --git a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs index 0637356e..4d3fcd9c 100644 --- a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -137,7 +137,7 @@ public async Task ExecuteAsync(EvaluateSubmissionProj } // Informa ao professor o resultado da avaliação. - await _emailService.SendProjectNotificationEmail( + await _emailService.SendProjectNotificationEmailAsync( project.Professor!.User!.Email, project.Professor!.User!.Name, project.Title, diff --git a/src/Domain/UseCases/Interactors/Student/CreateStudent.cs b/src/Domain/UseCases/Interactors/Student/CreateStudent.cs index 4754d924..e0ced819 100644 --- a/src/Domain/UseCases/Interactors/Student/CreateStudent.cs +++ b/src/Domain/UseCases/Interactors/Student/CreateStudent.cs @@ -101,7 +101,7 @@ public async Task ExecuteAsync(CreateStudentInput mod "Não foi possível criar o estudante."); // Envia e-mail de confirmação - _ = await _emailService.SendConfirmationEmail(user?.Email, user?.Name, user?.ValidationCode); + await _emailService.SendConfirmationEmailAsync(user?.Email, user?.Name, user?.ValidationCode); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs b/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs index 37694fc7..7436c096 100644 --- a/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs +++ b/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs @@ -31,7 +31,7 @@ public RequestStudentRegister(IEmailService emailService, IUserRepository userRe UseCaseException.BusinessRuleViolation(user is not null, "Email já cadastrado."); // Solicita o registro do usuário - await _emailService.SendRequestStudentRegisterEmail(email!); + await _emailService.SendRequestStudentRegisterEmailAsync(email!); // Retorna resultado return "Solicitação de registro enviada com sucesso."; diff --git a/src/Domain/UseCases/Interfaces/ActivityType/IGetActivitiesByNoticeId.cs b/src/Domain/UseCases/Interfaces/ActivityType/IGetActivitiesByNoticeId.cs index cdd9c374..f0b8c1e7 100644 --- a/src/Domain/UseCases/Interfaces/ActivityType/IGetActivitiesByNoticeId.cs +++ b/src/Domain/UseCases/Interfaces/ActivityType/IGetActivitiesByNoticeId.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.ActivityType { public interface IGetActivitiesByNoticeId { - Task> GetActivitiesByNoticeId(Guid? id); + Task> ExecuteAsync(Guid? id); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/ActivityType/IGetLastNoticeActivities.cs b/src/Domain/UseCases/Interfaces/ActivityType/IGetLastNoticeActivities.cs index 58fd711f..955558bd 100644 --- a/src/Domain/UseCases/Interfaces/ActivityType/IGetLastNoticeActivities.cs +++ b/src/Domain/UseCases/Interfaces/ActivityType/IGetLastNoticeActivities.cs @@ -4,6 +4,6 @@ namespace Domain.UseCases.Interfaces.ActivityType { public interface IGetLastNoticeActivities { - Task> GetLastNoticeActivities(); + Task> ExecuteAsync(); } } \ No newline at end of file diff --git a/src/Infrastructure/Services/Email/EmailService.cs b/src/Infrastructure/Services/Email/EmailService.cs index 6fe20225..b3be07a2 100644 --- a/src/Infrastructure/Services/Email/EmailService.cs +++ b/src/Infrastructure/Services/Email/EmailService.cs @@ -26,7 +26,7 @@ public EmailService(string? smtpServer, int smtpPort, string? smtpUsername, stri } #endregion Global Scope - public async Task SendConfirmationEmail(string? email, string? name, string? token) + public async Task SendConfirmationEmailAsync(string? email, string? name, string? token) { // Verifica se os parâmetros são nulos ou vazios if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(token)) @@ -43,10 +43,9 @@ public async Task SendConfirmationEmail(string? email, string? name, strin // Tentativa de envio de email await SendEmailAsync(email, subject, body); - return true; } - public async Task SendResetPasswordEmail(string? email, string? name, string? token) + public async Task SendResetPasswordEmailAsync(string? email, string? name, string? token) { // Verifica se os parâmetros são nulos ou vazios if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(token)) @@ -63,10 +62,9 @@ public async Task SendResetPasswordEmail(string? email, string? name, stri // Tentativa de envio de email await SendEmailAsync(email, subject, body); - return true; } - public async Task SendNoticeEmail(string? email, string? name, DateTime? registrationStartDate, DateTime? registrationEndDate, string? noticeUrl) + public async Task SendNoticeEmailAsync(string? email, string? name, DateTime? registrationStartDate, DateTime? registrationEndDate, string? noticeUrl) { // Verifica se os parâmetros são nulos ou vazios if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || registrationStartDate == null || registrationEndDate == null || string.IsNullOrEmpty(noticeUrl)) @@ -89,7 +87,7 @@ public async Task SendNoticeEmail(string? email, string? name, DateTime? registr await SendEmailAsync(email, subject, body); } - public async Task SendProjectNotificationEmail(string? email, string? name, string? projectTitle, string? status, string? description) + public async Task SendProjectNotificationEmailAsync(string? email, string? name, string? projectTitle, string? status, string? description) { // Verifica se os parâmetros são nulos ou vazios if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(projectTitle) || string.IsNullOrEmpty(status) || string.IsNullOrEmpty(description)) @@ -112,7 +110,7 @@ public async Task SendProjectNotificationEmail(string? email, string? name, stri await SendEmailAsync(email, subject, body); } - public async Task SendRequestStudentRegisterEmail(string? email) + public async Task SendRequestStudentRegisterEmailAsync(string? email) { // Verifica se os parâmetros são nulos ou vazios if (string.IsNullOrEmpty(email)) From 085ab3d734d06a36c6c3f25d336c66e7258ec00d Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 2 Aug 2023 23:02:56 -0300 Subject: [PATCH 071/201] refactor: adjust Activity usecase methods name --- .../PresenterController/ActivityPresenterController.cs | 4 ++-- .../Interactors/ActivityType/GetActivitiesByNoticeId.cs | 2 +- .../Interactors/ActivityType/GetLastNoticeActivities.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Adapters/PresenterController/ActivityPresenterController.cs b/src/Adapters/PresenterController/ActivityPresenterController.cs index 12cdf1c8..356f8c7b 100644 --- a/src/Adapters/PresenterController/ActivityPresenterController.cs +++ b/src/Adapters/PresenterController/ActivityPresenterController.cs @@ -22,13 +22,13 @@ public ActivityPresenterController( public async Task> GetActivitiesByNoticeId(Guid? noticeId) { - IEnumerable activityTypes = await _getActivitiesByNoticeId.GetActivitiesByNoticeId(noticeId); + IEnumerable activityTypes = await _getActivitiesByNoticeId.ExecuteAsync(noticeId); return _mapper.Map>(activityTypes); } public async Task> GetLastNoticeActivities() { - IEnumerable activityTypes = await _getLastNoticeActivities.GetLastNoticeActivities(); + IEnumerable activityTypes = await _getLastNoticeActivities.ExecuteAsync(); return _mapper.Map>(activityTypes); } } diff --git a/src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs b/src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs index d359aedd..b5a9199f 100644 --- a/src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs +++ b/src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs @@ -16,7 +16,7 @@ public GetActivitiesByNoticeId(IActivityTypeRepository activityTypeRepository, I _mapper = mapper; } - async Task> IGetActivitiesByNoticeId.GetActivitiesByNoticeId(Guid? id) + async Task> IGetActivitiesByNoticeId.ExecuteAsync(Guid? id) { // Obtém os tipos de atividades do edital IList activityTypes = (IList)await _activityTypeRepository.GetByNoticeId(id); diff --git a/src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs b/src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs index b2750510..9843abc5 100644 --- a/src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs +++ b/src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs @@ -15,7 +15,7 @@ public GetLastNoticeActivities(IActivityTypeRepository activityTypeRepository, I _activityTypeRepository = activityTypeRepository; _mapper = mapper; } - async Task> IGetLastNoticeActivities.GetLastNoticeActivities() + async Task> IGetLastNoticeActivities.ExecuteAsync() { // Obtém os tipos de atividades do último edital IList activityTypes = (IList)await _activityTypeRepository.GetLastNoticeActivities(); From f296ae4b54aff1e415bdefaaa0f6598442010506 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 2 Aug 2023 23:04:00 -0300 Subject: [PATCH 072/201] refactor: add Async to StorageFileService --- src/Domain/Interfaces/Services/IStorageFileService.cs | 2 +- src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs | 2 +- .../Interactors/StudentDocuments/CreateStudentDocuments.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Domain/Interfaces/Services/IStorageFileService.cs b/src/Domain/Interfaces/Services/IStorageFileService.cs index e893e22c..56a50d53 100644 --- a/src/Domain/Interfaces/Services/IStorageFileService.cs +++ b/src/Domain/Interfaces/Services/IStorageFileService.cs @@ -16,6 +16,6 @@ public interface IStorageFileService /// Deleta um arquivo /// /// Caminho completo até o arquivo - Task DeleteFile(string filePath); + Task DeleteFileAsync(string filePath); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs b/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs index 01eb4f38..2b99e044 100644 --- a/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs +++ b/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs @@ -32,7 +32,7 @@ public async Task ExecuteAsync(Guid? id) // Deleta o arquivo do edital if (!string.IsNullOrEmpty(entity.DocUrl)) { - await _storageFileService.DeleteFile(entity.DocUrl); + await _storageFileService.DeleteFileAsync(entity.DocUrl); } // Retorna o edital removido diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs b/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs index 2cdd3fe0..d1f875fe 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs @@ -92,7 +92,7 @@ private async Task TryToSaveFileInCloud(IFormFile file) { // Caso dê erro, remove da nuvem os arquivos que foram salvos foreach (var url in _urlFiles) - await _storageFileService.DeleteFile(url); + await _storageFileService.DeleteFileAsync(url); throw UseCaseException.BusinessRuleViolation($"Erro ao salvar arquivos na nuvem.\n{ex}"); } } From ef8e4265040c2207dd8a7f19710f2a178f798dc2 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 2 Aug 2023 23:08:20 -0300 Subject: [PATCH 073/201] refactor: add Async to Repositories and Services --- .../Bases/IGenericCRUDRepository.cs | 10 +++++----- .../Repositories/IActivityTypeRepository.cs | 4 ++-- .../Repositories/IAreaRepository.cs | 4 ++-- .../Repositories/IAssistanceTypeRepository.cs | 2 +- .../Repositories/ICampusRepository.cs | 2 +- .../Repositories/ICourseRepository.cs | 2 +- .../Repositories/IMainAreaRepository.cs | 2 +- .../Repositories/INoticeRepository.cs | 2 +- .../Repositories/IProfessorRepository.cs | 2 +- .../Repositories/IProgramTypeRepository.cs | 2 +- .../IProjectActivityRepository.cs | 2 +- .../IProjectEvaluationRepository.cs | 8 ++++---- .../Repositories/IProjectRepository.cs | 14 ++++++------- .../IStudentDocumentsRepository.cs | 4 ++-- .../Repositories/IStudentRepository.cs | 2 +- .../Repositories/ISubAreaRepository.cs | 4 ++-- .../Repositories/IUserRepository.cs | 16 +++++++-------- .../ActivityType/GetActivitiesByNoticeId.cs | 2 +- .../ActivityType/GetLastNoticeActivities.cs | 2 +- .../UseCases/Interactors/Area/CreateArea.cs | 6 +++--- .../UseCases/Interactors/Area/DeleteArea.cs | 2 +- .../UseCases/Interactors/Area/GetAreaById.cs | 2 +- .../Interactors/Area/GetAreasByMainArea.cs | 2 +- .../UseCases/Interactors/Area/UpdateArea.cs | 4 ++-- .../AssistanceType/CreateAssistanceType.cs | 4 ++-- .../AssistanceType/DeleteAssistanceType.cs | 2 +- .../AssistanceType/GetAssistanceTypeById.cs | 2 +- .../AssistanceType/GetAssistanceTypes.cs | 2 +- .../AssistanceType/UpdateAssistanceType.cs | 6 +++--- .../UseCases/Interactors/Auth/ConfirmEmail.cs | 4 ++-- .../Interactors/Auth/ForgotPassword.cs | 4 ++-- src/Domain/UseCases/Interactors/Auth/Login.cs | 2 +- .../Interactors/Auth/ResetPassword.cs | 4 ++-- .../Interactors/Campus/CreateCampus.cs | 4 ++-- .../Interactors/Campus/DeleteCampus.cs | 2 +- .../Interactors/Campus/GetCampusById.cs | 2 +- .../Interactors/Campus/GetCampuses.cs | 2 +- .../Interactors/Campus/UpdateCampus.cs | 6 +++--- .../Interactors/Course/CreateCourse.cs | 4 ++-- .../Interactors/Course/DeleteCourse.cs | 2 +- .../Interactors/Course/GetCourseById.cs | 2 +- .../UseCases/Interactors/Course/GetCourses.cs | 2 +- .../Interactors/Course/UpdateCourse.cs | 6 +++--- .../Interactors/MainArea/CreateMainArea.cs | 4 ++-- .../Interactors/MainArea/DeleteMainArea.cs | 2 +- .../Interactors/MainArea/GetMainAreaById.cs | 2 +- .../Interactors/MainArea/GetMainAreas.cs | 2 +- .../Interactors/MainArea/UpdateMainArea.cs | 4 ++-- .../Interactors/Notice/CreateNotice.cs | 10 +++++----- .../Interactors/Notice/DeleteNotice.cs | 2 +- .../Interactors/Notice/GetNoticeById.cs | 2 +- .../UseCases/Interactors/Notice/GetNotices.cs | 2 +- .../Interactors/Notice/UpdateNotice.cs | 18 ++++++++--------- .../Interactors/Professor/CreateProfessor.cs | 8 ++++---- .../Interactors/Professor/DeleteProfessor.cs | 8 ++++---- .../Interactors/Professor/GetProfessorById.cs | 2 +- .../Interactors/Professor/GetProfessors.cs | 2 +- .../Interactors/Professor/UpdateProfessor.cs | 4 ++-- .../ProgramType/CreateProgramType.cs | 4 ++-- .../ProgramType/DeleteProgramType.cs | 2 +- .../ProgramType/GetProgramTypeById.cs | 2 +- .../ProgramType/GetProgramTypes.cs | 2 +- .../ProgramType/UpdateProgramType.cs | 6 +++--- .../Interactors/Project/AppealProject.cs | 4 ++-- .../Interactors/Project/CancelProject.cs | 4 ++-- .../Interactors/Project/GetClosedProjects.cs | 8 ++++---- .../Interactors/Project/GetOpenProjects.cs | 8 ++++---- .../Interactors/Project/GetProjectById.cs | 2 +- .../Interactors/Project/OpenProject.cs | 18 ++++++++--------- .../Interactors/Project/SubmitProject.cs | 4 ++-- .../Interactors/Project/UpdateProject.cs | 20 +++++++++---------- .../EvaluateAppealProject.cs | 8 ++++---- .../EvaluateSubmissionProject.cs | 14 ++++++------- .../GetEvaluationByProjectId.cs | 2 +- .../Interactors/Student/CreateStudent.cs | 12 +++++------ .../Interactors/Student/DeleteStudent.cs | 8 ++++---- .../Interactors/Student/GetStudentById.cs | 2 +- .../Student/GetStudentByRegistrationCode.cs | 2 +- .../Interactors/Student/GetStudents.cs | 2 +- .../Student/RequestStudentRegister.cs | 2 +- .../Interactors/Student/UpdateStudent.cs | 4 ++-- .../CreateStudentDocuments.cs | 6 +++--- .../DeleteStudentDocuments.cs | 2 +- .../GetStudentDocumentsByProjectId.cs | 2 +- .../GetStudentDocumentsByStudentId.cs | 2 +- .../UpdateStudentDocuments.cs | 8 ++++---- .../Interactors/SubArea/CreateSubArea.cs | 6 +++--- .../Interactors/SubArea/DeleteSubArea.cs | 2 +- .../Interactors/SubArea/GetSubAreaById.cs | 2 +- .../Interactors/SubArea/GetSubAreasByArea.cs | 2 +- .../Interactors/SubArea/UpdateSubArea.cs | 4 ++-- .../UseCases/Interactors/User/ActivateUser.cs | 4 ++-- .../Interactors/User/DeactivateUser.cs | 4 ++-- .../Interactors/User/GetActiveUsers.cs | 2 +- .../Interactors/User/GetInactiveUsers.cs | 2 +- .../UseCases/Interactors/User/GetUserById.cs | 2 +- .../UseCases/Interactors/User/UpdateUser.cs | 4 ++-- .../Repositories/ActivityRepository.cs | 14 ++++++------- .../Repositories/ActivityTypeRepository.cs | 20 +++++++++---------- .../Repositories/AreaRepository.cs | 18 ++++++++--------- .../Repositories/AssistanceTypeRepository.cs | 16 +++++++-------- .../Repositories/CampusRepository.cs | 16 +++++++-------- .../Repositories/CourseRepository.cs | 16 +++++++-------- .../Repositories/MainAreaRepository.cs | 16 +++++++-------- .../Repositories/NoticeRepository.cs | 16 +++++++-------- .../Repositories/ProfessorRepository.cs | 16 +++++++-------- .../Repositories/ProgramTypeRepository.cs | 16 +++++++-------- .../Repositories/ProjectActivityRepository.cs | 16 +++++++-------- .../ProjectEvaluationRepository.cs | 8 ++++---- .../Repositories/ProjectRepository.cs | 18 ++++++++--------- .../StudentDocumentsRepository.cs | 18 ++++++++--------- .../Repositories/StudentRepository.cs | 16 +++++++-------- .../Repositories/SubAreaRepository.cs | 18 ++++++++--------- .../Repositories/UserRepository.cs | 20 +++++++++---------- .../Services/AzureStorageService.cs | 4 ++-- .../Services/StorageFileService.cs | 4 ++-- 116 files changed, 358 insertions(+), 358 deletions(-) diff --git a/src/Domain/Interfaces/Repositories/Bases/IGenericCRUDRepository.cs b/src/Domain/Interfaces/Repositories/Bases/IGenericCRUDRepository.cs index 1b3c00ec..69836b1a 100644 --- a/src/Domain/Interfaces/Repositories/Bases/IGenericCRUDRepository.cs +++ b/src/Domain/Interfaces/Repositories/Bases/IGenericCRUDRepository.cs @@ -8,7 +8,7 @@ public interface IGenericCRUDRepository ///
/// Id da entidade. /// Entidade encontrada. - Task GetById(Guid? id); + Task GetByIdAsync(Guid? id); /// /// Busca todas as entidades ativas. @@ -16,27 +16,27 @@ public interface IGenericCRUDRepository /// /// /// Lista de entidades ativas. - Task> GetAll(int skip, int take); + Task> GetAllAsync(int skip, int take); /// /// Cria entidade conforme parâmetros fornecidos. /// /// Parâmetros de criação. /// Entidade criada. - Task Create(T model); + Task CreateAsync(T model); /// /// Remove entidade através do Id informado. /// /// Id da entidade a ser removida. /// Entidade removida. - Task Delete(Guid? id); + Task DeleteAsync(Guid? id); /// /// Atualiza entidade conforme parâmetros fornecidos. /// /// Parâmetros de atualização. /// Entidade atualizada. - Task Update(T model); + Task UpdateAsync(T model); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs b/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs index 5415bc2e..2100fb40 100644 --- a/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs +++ b/src/Domain/Interfaces/Repositories/IActivityTypeRepository.cs @@ -5,7 +5,7 @@ namespace Domain.Interfaces.Repositories { public interface IActivityTypeRepository : IGenericCRUDRepository { - Task> GetByNoticeId(Guid? noticeId); - Task> GetLastNoticeActivities(); + Task> GetByNoticeIdAsync(Guid? noticeId); + Task> GetLastNoticeActivitiesAsync(); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IAreaRepository.cs b/src/Domain/Interfaces/Repositories/IAreaRepository.cs index e162877d..f509ba18 100644 --- a/src/Domain/Interfaces/Repositories/IAreaRepository.cs +++ b/src/Domain/Interfaces/Repositories/IAreaRepository.cs @@ -5,7 +5,7 @@ namespace Domain.Interfaces.Repositories { public interface IAreaRepository : IGenericCRUDRepository { - Task GetByCode(string? code); - Task> GetAreasByMainArea(Guid? mainAreaId, int skip, int take); + Task GetByCodeAsync(string? code); + Task> GetAreasByMainAreaAsync(Guid? mainAreaId, int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IAssistanceTypeRepository.cs b/src/Domain/Interfaces/Repositories/IAssistanceTypeRepository.cs index 4be71919..43ef0913 100644 --- a/src/Domain/Interfaces/Repositories/IAssistanceTypeRepository.cs +++ b/src/Domain/Interfaces/Repositories/IAssistanceTypeRepository.cs @@ -5,6 +5,6 @@ namespace Domain.Interfaces.Repositories { public interface IAssistanceTypeRepository : IGenericCRUDRepository { - Task GetAssistanceTypeByName(string name); + Task GetAssistanceTypeByNameAsync(string name); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/ICampusRepository.cs b/src/Domain/Interfaces/Repositories/ICampusRepository.cs index 6c0aa8e2..bd1a61ff 100644 --- a/src/Domain/Interfaces/Repositories/ICampusRepository.cs +++ b/src/Domain/Interfaces/Repositories/ICampusRepository.cs @@ -5,6 +5,6 @@ namespace Domain.Interfaces.Repositories { public interface ICampusRepository : IGenericCRUDRepository { - Task GetCampusByName(string name); + Task GetCampusByNameAsync(string name); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/ICourseRepository.cs b/src/Domain/Interfaces/Repositories/ICourseRepository.cs index 4874ac60..87e761da 100644 --- a/src/Domain/Interfaces/Repositories/ICourseRepository.cs +++ b/src/Domain/Interfaces/Repositories/ICourseRepository.cs @@ -5,6 +5,6 @@ namespace Domain.Interfaces.Repositories { public interface ICourseRepository : IGenericCRUDRepository { - Task GetCourseByName(string name); + Task GetCourseByNameAsync(string name); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IMainAreaRepository.cs b/src/Domain/Interfaces/Repositories/IMainAreaRepository.cs index b078f1d3..63ddb802 100644 --- a/src/Domain/Interfaces/Repositories/IMainAreaRepository.cs +++ b/src/Domain/Interfaces/Repositories/IMainAreaRepository.cs @@ -5,6 +5,6 @@ namespace Domain.Interfaces.Repositories { public interface IMainAreaRepository : IGenericCRUDRepository { - Task GetByCode(string? code); + Task GetByCodeAsync(string? code); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/INoticeRepository.cs b/src/Domain/Interfaces/Repositories/INoticeRepository.cs index 28908083..342a4989 100644 --- a/src/Domain/Interfaces/Repositories/INoticeRepository.cs +++ b/src/Domain/Interfaces/Repositories/INoticeRepository.cs @@ -5,6 +5,6 @@ namespace Domain.Interfaces.Repositories { public interface INoticeRepository : IGenericCRUDRepository { - Task GetNoticeByPeriod(DateTime start, DateTime end); + Task GetNoticeByPeriodAsync(DateTime start, DateTime end); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs index 2d6daf5f..da84b558 100644 --- a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs @@ -5,6 +5,6 @@ namespace Domain.Interfaces.Repositories { public interface IProfessorRepository : IGenericCRUDRepository { - Task> GetAllActiveProfessors(); + Task> GetAllActiveProfessorsAsync(); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProgramTypeRepository.cs b/src/Domain/Interfaces/Repositories/IProgramTypeRepository.cs index 1f5cc774..3e22ebd3 100644 --- a/src/Domain/Interfaces/Repositories/IProgramTypeRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProgramTypeRepository.cs @@ -5,6 +5,6 @@ namespace Domain.Interfaces.Repositories { public interface IProgramTypeRepository : IGenericCRUDRepository { - Task GetProgramTypeByName(string name); + Task GetProgramTypeByNameAsync(string name); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs b/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs index cfc7cb1a..8de2dc9b 100644 --- a/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProjectActivityRepository.cs @@ -5,6 +5,6 @@ namespace Domain.Interfaces.Repositories { public interface IProjectActivityRepository : IGenericCRUDRepository { - Task> GetByProjectId(Guid? projectId); + Task> GetByProjectIdAsync(Guid? projectId); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProjectEvaluationRepository.cs b/src/Domain/Interfaces/Repositories/IProjectEvaluationRepository.cs index 714e90fa..e05820c5 100644 --- a/src/Domain/Interfaces/Repositories/IProjectEvaluationRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProjectEvaluationRepository.cs @@ -9,27 +9,27 @@ public interface IProjectEvaluationRepository /// /// Id da avaliação. /// Avaliação de projeto encontrado. - Task GetById(Guid? id); + Task GetByIdAsync(Guid? id); /// /// Busca uma avaliação de projeto pelo id do projeto. /// /// Id do projeto em avaliação. /// Avaliação de projeto encontrado. - Task GetByProjectId(Guid? projectId); + Task GetByProjectIdAsync(Guid? projectId); /// /// Cria uma avaliação de projeto. /// /// Modelo da avaliação de projeto. /// Avaliação de projeto criado. - Task Create(ProjectEvaluation model); + Task CreateAsync(ProjectEvaluation model); /// /// Atualiza uma avaliação de projeto. /// /// Modelo da avaliação de projeto. /// Avaliação de projeto atualizado. - Task Update(ProjectEvaluation model); + Task UpdateAsync(ProjectEvaluation model); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProjectRepository.cs b/src/Domain/Interfaces/Repositories/IProjectRepository.cs index 4987c4ee..84a7af06 100644 --- a/src/Domain/Interfaces/Repositories/IProjectRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProjectRepository.cs @@ -9,7 +9,7 @@ public interface IProjectRepository ///
/// Id do projeto. /// Projeto encontrado. - Task GetById(Guid? id); + Task GetByIdAsync(Guid? id); /// /// Permite a busca de todos os projetos abertos. @@ -18,7 +18,7 @@ public interface IProjectRepository /// /// Filtra por projetos encerrados. /// Retorna todos os projetos. - Task> GetProjects(int skip, int take, bool isClosed = false); + Task> GetProjectsAsync(int skip, int take, bool isClosed = false); /// /// Permite a busca dos projetos associados ao aluno. @@ -28,7 +28,7 @@ public interface IProjectRepository /// Id do aluno. /// Filtra por projetos encerrados. /// Retorna os projetos do aluno. - Task> GetStudentProjects(int skip, int take, Guid? id, bool isClosed = false); + Task> GetStudentProjectsAsync(int skip, int take, Guid? id, bool isClosed = false); /// /// Permite a busca dos projetos associados ao professor. @@ -38,27 +38,27 @@ public interface IProjectRepository /// Id do professor. /// Filtra por projetos encerrados. /// Retorna os projetos do professor. - Task> GetProfessorProjects(int skip, int take, Guid? id, bool isClosed = false); + Task> GetProfessorProjectsAsync(int skip, int take, Guid? id, bool isClosed = false); /// /// Cria projeto conforme parâmetros fornecidos. /// /// Parâmetros de criação. /// Projeto criado. - Task Create(Project model); + Task CreateAsync(Project model); /// /// Remove projeto através do Id informado. /// /// Id do projeto a ser removido. /// Projeto removido. - Task Delete(Guid? id); + Task DeleteAsync(Guid? id); /// /// Atualiza projeto conforme parâmetros fornecidos. /// /// Parâmetros de atualização. /// Projeto atualizado. - Task Update(Project model); + Task UpdateAsync(Project model); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IStudentDocumentsRepository.cs b/src/Domain/Interfaces/Repositories/IStudentDocumentsRepository.cs index fe98a4ef..6f2848c6 100644 --- a/src/Domain/Interfaces/Repositories/IStudentDocumentsRepository.cs +++ b/src/Domain/Interfaces/Repositories/IStudentDocumentsRepository.cs @@ -5,7 +5,7 @@ namespace Domain.Interfaces.Repositories { public interface IStudentDocumentsRepository : IGenericCRUDRepository { - Task GetByProjectId(Guid? projectId); - Task GetByStudentId(Guid? studentId); + Task GetByProjectIdAsync(Guid? projectId); + Task GetByStudentIdAsync(Guid? studentId); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IStudentRepository.cs b/src/Domain/Interfaces/Repositories/IStudentRepository.cs index 4e478cef..2138255a 100644 --- a/src/Domain/Interfaces/Repositories/IStudentRepository.cs +++ b/src/Domain/Interfaces/Repositories/IStudentRepository.cs @@ -10,6 +10,6 @@ public interface IStudentRepository : IGenericCRUDRepository /// /// Código de matrícula /// Aluno encontrado - Task GetByRegistrationCode(string registrationCode); + Task GetByRegistrationCodeAsync(string registrationCode); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/ISubAreaRepository.cs b/src/Domain/Interfaces/Repositories/ISubAreaRepository.cs index 9ba0414c..a76e0986 100644 --- a/src/Domain/Interfaces/Repositories/ISubAreaRepository.cs +++ b/src/Domain/Interfaces/Repositories/ISubAreaRepository.cs @@ -5,7 +5,7 @@ namespace Domain.Interfaces.Repositories { public interface ISubAreaRepository : IGenericCRUDRepository { - Task GetByCode(string? code); - Task> GetSubAreasByArea(Guid? areaId, int skip, int take); + Task GetByCodeAsync(string? code); + Task> GetSubAreasByAreaAsync(Guid? areaId, int skip, int take); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IUserRepository.cs b/src/Domain/Interfaces/Repositories/IUserRepository.cs index 01bf94f9..4815110f 100644 --- a/src/Domain/Interfaces/Repositories/IUserRepository.cs +++ b/src/Domain/Interfaces/Repositories/IUserRepository.cs @@ -10,7 +10,7 @@ public interface IUserRepository /// /// /// Usuários encontrados. - Task> GetActiveUsers(int skip, int take); + Task> GetActiveUsersAsync(int skip, int take); /// /// Retorna usuários inativos no sistema. @@ -18,35 +18,35 @@ public interface IUserRepository /// /// /// Usuários encontrados. - Task> GetInactiveUsers(int skip, int take); + Task> GetInactiveUsersAsync(int skip, int take); /// /// Recupera usuário através do Id informado. /// /// Id do usuário. /// Usuário encontrado. - Task GetById(Guid? id); + Task GetByIdAsync(Guid? id); /// /// Atualiza usuário utilizando os parâmetros informados. /// /// Parâmetros de atualização do usuário. /// Usuário atualizado. - Task Update(User user); + Task UpdateAsync(User user); /// /// Realiza a criação do usuário utilizando os parâmetros informados. /// /// Parâmetros de criação do usuário. /// Usuário criado. - Task Create(User user); + Task CreateAsync(User user); /// /// Realiza a remoção do usuário utilizando o id informado. /// /// Id do usuário. /// Usuário removido. - Task Delete(Guid? id); + Task DeleteAsync(Guid? id); /// /// Retorna usuário com o Email informado. @@ -54,7 +54,7 @@ public interface IUserRepository /// /// Email do usuário. /// Usuário encontrado. - Task GetUserByEmail(string? email); + Task GetUserByEmailAsync(string? email); /// /// Retorna usuário com o CPF informado. @@ -62,6 +62,6 @@ public interface IUserRepository /// /// CPF do usuário. /// Usuário encontrado. - Task GetUserByCPF(string? cpf); + Task GetUserByCPFAsync(string? cpf); } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs b/src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs index b5a9199f..c6936a44 100644 --- a/src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs +++ b/src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs @@ -19,7 +19,7 @@ public GetActivitiesByNoticeId(IActivityTypeRepository activityTypeRepository, I async Task> IGetActivitiesByNoticeId.ExecuteAsync(Guid? id) { // Obtém os tipos de atividades do edital - IList activityTypes = (IList)await _activityTypeRepository.GetByNoticeId(id); + IList activityTypes = (IList)await _activityTypeRepository.GetByNoticeIdAsync(id); // Mapeia os tipos de atividades para o output _ = _mapper.Map>(activityTypes); diff --git a/src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs b/src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs index 9843abc5..9dcfe431 100644 --- a/src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs +++ b/src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs @@ -18,7 +18,7 @@ public GetLastNoticeActivities(IActivityTypeRepository activityTypeRepository, I async Task> IGetLastNoticeActivities.ExecuteAsync() { // Obtém os tipos de atividades do último edital - IList activityTypes = (IList)await _activityTypeRepository.GetLastNoticeActivities(); + IList activityTypes = (IList)await _activityTypeRepository.GetLastNoticeActivitiesAsync(); // Mapeia os tipos de atividades para o output _ = _mapper.Map>(activityTypes); diff --git a/src/Domain/UseCases/Interactors/Area/CreateArea.cs b/src/Domain/UseCases/Interactors/Area/CreateArea.cs index 6ae0d243..546173d3 100644 --- a/src/Domain/UseCases/Interactors/Area/CreateArea.cs +++ b/src/Domain/UseCases/Interactors/Area/CreateArea.cs @@ -22,21 +22,21 @@ public CreateArea(IAreaRepository areaRepository, IMainAreaRepository mainAreaRe public async Task ExecuteAsync(CreateAreaInput input) { - var entity = await _areaRepository.GetByCode(input.Code); + var entity = await _areaRepository.GetByCodeAsync(input.Code); UseCaseException.BusinessRuleViolation(entity != null, $"Já existe uma área principal para o código {input.Code}."); // Verifica id da área princial UseCaseException.NotInformedParam(input.MainAreaId == null, nameof(input.MainAreaId)); // Valida se existe área principal - var area = await _mainAreaRepository.GetById(input.MainAreaId); + var area = await _mainAreaRepository.GetByIdAsync(input.MainAreaId); UseCaseException.BusinessRuleViolation(area?.DeletedAt != null, "A Área Principal informada está inativa."); // Mapeia input para entidade var newEntity = new Entities.Area(input.MainAreaId, input.Code, input.Name); // Cria nova área - entity = await _areaRepository.Create(newEntity); + entity = await _areaRepository.CreateAsync(newEntity); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/Area/DeleteArea.cs b/src/Domain/UseCases/Interactors/Area/DeleteArea.cs index 6e83de16..35f5f45b 100644 --- a/src/Domain/UseCases/Interactors/Area/DeleteArea.cs +++ b/src/Domain/UseCases/Interactors/Area/DeleteArea.cs @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id == null, nameof(id)); // Remove a entidade - Entities.Area model = await _repository.Delete(id); + Entities.Area model = await _repository.DeleteAsync(id); // Retorna a área removida return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/Area/GetAreaById.cs b/src/Domain/UseCases/Interactors/Area/GetAreaById.cs index 1f79726b..d01758f8 100644 --- a/src/Domain/UseCases/Interactors/Area/GetAreaById.cs +++ b/src/Domain/UseCases/Interactors/Area/GetAreaById.cs @@ -23,7 +23,7 @@ public async Task ExecuteAsync(Guid? id) // Verifica se Id foi informado. UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.Area? entity = await _repository.GetById(id); + Entities.Area? entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs b/src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs index ac9873b4..0a825911 100644 --- a/src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs +++ b/src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs @@ -21,7 +21,7 @@ public GetAreasByMainArea(IAreaRepository repository, IMapper mapper) public async Task> ExecuteAsync(Guid? mainAreaId, int skip, int take) { UseCaseException.NotInformedParam(mainAreaId is null, nameof(mainAreaId)); - IEnumerable entities = (IEnumerable)await _repository.GetAreasByMainArea(mainAreaId, skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAreasByMainAreaAsync(mainAreaId, skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/Area/UpdateArea.cs b/src/Domain/UseCases/Interactors/Area/UpdateArea.cs index 0b9ddce9..310d82fa 100644 --- a/src/Domain/UseCases/Interactors/Area/UpdateArea.cs +++ b/src/Domain/UseCases/Interactors/Area/UpdateArea.cs @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id, UpdateAreaInput UseCaseException.NotInformedParam(id is null, nameof(id)); // Recupera entidade que será atualizada - Entities.Area entity = await _repository.GetById(id) + Entities.Area entity = await _repository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.MainArea)); // Atualiza atributos permitidos @@ -33,7 +33,7 @@ public async Task ExecuteAsync(Guid? id, UpdateAreaInput entity.MainAreaId = input.MainAreaId; // Salva entidade atualizada no banco - Entities.Area model = await _repository.Update(entity); + Entities.Area model = await _repository.UpdateAsync(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs b/src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs index 526edb35..40fb306f 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs @@ -24,12 +24,12 @@ public async Task ExecuteAsync(CreateAssistanc UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Name), nameof(model.Name)); // Verifica se já existe um tipo de programa com o nome indicado - Entities.AssistanceType? entity = await _repository.GetAssistanceTypeByName(model.Name!); + Entities.AssistanceType? entity = await _repository.GetAssistanceTypeByNameAsync(model.Name!); UseCaseException.BusinessRuleViolation(entity != null, "Já existe um Tipo de Programa para o nome informado."); // Cria entidade - entity = await _repository.Create(_mapper.Map(model)); + entity = await _repository.CreateAsync(_mapper.Map(model)); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs b/src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs index 4f334c63..4f580716 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.AssistanceType model = await _repository.Delete(id); + Entities.AssistanceType model = await _repository.DeleteAsync(id); // Retorna o tipo de programa removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs b/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs index 985d8ca7..6f662369 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs @@ -21,7 +21,7 @@ public GetAssistanceTypeById(IAssistanceTypeRepository repository, IMapper mappe public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.AssistanceType? entity = await _repository.GetById(id); + Entities.AssistanceType? entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs b/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs index 8a500955..c4235954 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs @@ -19,7 +19,7 @@ public GetAssistanceTypes(IAssistanceTypeRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs b/src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs index 245f478d..960573a8 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs +++ b/src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs @@ -27,7 +27,7 @@ public async Task ExecuteAsync(Guid? id, Updat UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - Entities.AssistanceType entity = await _repository.GetById(id) + Entities.AssistanceType entity = await _repository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.AssistanceType)); // Verifica se a entidade foi excluída @@ -37,7 +37,7 @@ public async Task ExecuteAsync(Guid? id, Updat // Verifica se o nome já está sendo usado UseCaseException.BusinessRuleViolation( !string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) - && await _repository.GetAssistanceTypeByName(input.Name!) != null, + && await _repository.GetAssistanceTypeByNameAsync(input.Name!) != null, "Já existe um Bolsa de Assistência para o nome informado."); // Atualiza atributos permitidos @@ -45,7 +45,7 @@ public async Task ExecuteAsync(Guid? id, Updat entity.Description = input.Description; // Salva entidade atualizada no banco - Entities.AssistanceType model = await _repository.Update(entity); + Entities.AssistanceType model = await _repository.UpdateAsync(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs b/src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs index 2844711a..1fe89b45 100644 --- a/src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs +++ b/src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs @@ -23,14 +23,14 @@ public async Task ExecuteAsync(string? email, string? token) UseCaseException.NotInformedParam(string.IsNullOrEmpty(token), nameof(token)); // Busca usuário pelo email informado - var user = await _userRepository.GetUserByEmail(email) + var user = await _userRepository.GetUserByEmailAsync(email) ?? throw UseCaseException.NotFoundEntityByParams(nameof(Entities.User)); // Confirma usuário user.ConfirmUserEmail(token!); // Atualiza usuário - await _userRepository.Update(user); + await _userRepository.UpdateAsync(user); // Retorna mensagem de sucesso return "Usuário confirmado com sucesso."; diff --git a/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs b/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs index 4a22e400..fc3eafba 100644 --- a/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs +++ b/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs @@ -23,14 +23,14 @@ public async Task ExecuteAsync(string? email) UseCaseException.NotInformedParam(string.IsNullOrEmpty(email), nameof(email)); // Busca usuário pelo email - var user = await _userRepository.GetUserByEmail(email) + var user = await _userRepository.GetUserByEmailAsync(email) ?? throw UseCaseException.NotFoundEntityByParams(nameof(Entities.User)); // Gera token de recuperação de senha user.GenerateResetPasswordToken(); // Salva alterações - await _userRepository.Update(user); + await _userRepository.UpdateAsync(user); // Envia email de recuperação de senha await _emailService.SendResetPasswordEmailAsync(user.Email, user.Name, user.ResetPasswordToken); diff --git a/src/Domain/UseCases/Interactors/Auth/Login.cs b/src/Domain/UseCases/Interactors/Auth/Login.cs index d8fda843..32a80400 100644 --- a/src/Domain/UseCases/Interactors/Auth/Login.cs +++ b/src/Domain/UseCases/Interactors/Auth/Login.cs @@ -29,7 +29,7 @@ public async Task ExecuteAsync(UserLoginInput input) UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Password), nameof(input.Password)); // Busca usuário pelo email - Entities.User entity = await _userRepository.GetUserByEmail(input.Email) + Entities.User entity = await _userRepository.GetUserByEmailAsync(input.Email) ?? throw UseCaseException.NotFoundEntityByParams(nameof(Entities.User)); // Verifica se o usuário está confirmado diff --git a/src/Domain/UseCases/Interactors/Auth/ResetPassword.cs b/src/Domain/UseCases/Interactors/Auth/ResetPassword.cs index 2a719f0a..d132351e 100644 --- a/src/Domain/UseCases/Interactors/Auth/ResetPassword.cs +++ b/src/Domain/UseCases/Interactors/Auth/ResetPassword.cs @@ -30,7 +30,7 @@ public async Task ExecuteAsync(UserResetPasswordInput input) UseCaseException.NotInformedParam(input.Token == null, nameof(input.Token)); // Busca o usuário pelo id - Entities.User entity = await _userRepository.GetById(input.Id) + Entities.User entity = await _userRepository.GetByIdAsync(input.Id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); // Verifica se o token de validação é nulo @@ -49,7 +49,7 @@ public async Task ExecuteAsync(UserResetPasswordInput input) } // Salva as alterações - _ = await _userRepository.Update(entity); + _ = await _userRepository.UpdateAsync(entity); // Retorna o resultado return "Senha atualizada com sucesso."; diff --git a/src/Domain/UseCases/Interactors/Campus/CreateCampus.cs b/src/Domain/UseCases/Interactors/Campus/CreateCampus.cs index dbd9bf68..369ddc6e 100644 --- a/src/Domain/UseCases/Interactors/Campus/CreateCampus.cs +++ b/src/Domain/UseCases/Interactors/Campus/CreateCampus.cs @@ -24,13 +24,13 @@ public async Task ExecuteAsync(CreateCampusInput input UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Verifica se já existe um edital para o período indicado - var entity = await _repository.GetCampusByName(input.Name!); + var entity = await _repository.GetCampusByNameAsync(input.Name!); if (entity != null) throw UseCaseException.BusinessRuleViolation("Já existe um Campus para o nome informado."); // Cria entidade var newEntity = new Entities.Campus(input.Name); - entity = await _repository.Create(newEntity); + entity = await _repository.CreateAsync(newEntity); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs b/src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs index be0830df..b3e6e622 100644 --- a/src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs +++ b/src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.Campus model = await _repository.Delete(id); + Entities.Campus model = await _repository.DeleteAsync(id); // Retorna o curso removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/Campus/GetCampusById.cs b/src/Domain/UseCases/Interactors/Campus/GetCampusById.cs index 862f4eaa..b83fd580 100644 --- a/src/Domain/UseCases/Interactors/Campus/GetCampusById.cs +++ b/src/Domain/UseCases/Interactors/Campus/GetCampusById.cs @@ -22,7 +22,7 @@ public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.Campus? entity = await _repository.GetById(id); + Entities.Campus? entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/Campus/GetCampuses.cs b/src/Domain/UseCases/Interactors/Campus/GetCampuses.cs index 2b8d670d..a590ad4f 100644 --- a/src/Domain/UseCases/Interactors/Campus/GetCampuses.cs +++ b/src/Domain/UseCases/Interactors/Campus/GetCampuses.cs @@ -19,7 +19,7 @@ public GetCampuses(ICampusRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs b/src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs index 85102ec4..07d2de39 100644 --- a/src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs +++ b/src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs @@ -27,7 +27,7 @@ public async Task ExecuteAsync(Guid? id, UpdateCampusI UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - Entities.Campus entity = await _repository.GetById(id) ?? throw new Exception("Campus não encontrado."); + Entities.Campus entity = await _repository.GetByIdAsync(id) ?? throw new Exception("Campus não encontrado."); // Verifica se a entidade foi excluída if (entity.DeletedAt != null) @@ -36,7 +36,7 @@ public async Task ExecuteAsync(Guid? id, UpdateCampusI } // Verifica se o nome já está sendo usado - if (!string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) && await _repository.GetCampusByName(input.Name!) != null) + if (!string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) && await _repository.GetCampusByNameAsync(input.Name!) != null) { throw UseCaseException.BusinessRuleViolation("Já existe um Campus para o nome informado."); } @@ -45,7 +45,7 @@ public async Task ExecuteAsync(Guid? id, UpdateCampusI entity.Name = input.Name; // Salva entidade atualizada no banco - Entities.Campus model = await _repository.Update(entity); + Entities.Campus model = await _repository.UpdateAsync(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Interactors/Course/CreateCourse.cs b/src/Domain/UseCases/Interactors/Course/CreateCourse.cs index 7d79f1ed..df1b4dcb 100644 --- a/src/Domain/UseCases/Interactors/Course/CreateCourse.cs +++ b/src/Domain/UseCases/Interactors/Course/CreateCourse.cs @@ -25,7 +25,7 @@ public async Task ExecuteAsync(CreateCourseInput model UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Name), nameof(model.Name)); // Verifica se já existe um edital para o período indicado - Entities.Course? entity = await _repository.GetCourseByName(model.Name!); + Entities.Course? entity = await _repository.GetCourseByNameAsync(model.Name!); if (entity != null) { throw UseCaseException.BusinessRuleViolation("Já existe um Curso para o nome informado."); @@ -33,7 +33,7 @@ public async Task ExecuteAsync(CreateCourseInput model // Cria entidade Entities.Course newEntity = new(model.Name); - entity = await _repository.Create(newEntity); + entity = await _repository.CreateAsync(newEntity); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/Course/DeleteCourse.cs b/src/Domain/UseCases/Interactors/Course/DeleteCourse.cs index b6ff1949..6a7723c1 100644 --- a/src/Domain/UseCases/Interactors/Course/DeleteCourse.cs +++ b/src/Domain/UseCases/Interactors/Course/DeleteCourse.cs @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.Course model = await _repository.Delete(id); + Entities.Course model = await _repository.DeleteAsync(id); // Retorna o curso removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/Course/GetCourseById.cs b/src/Domain/UseCases/Interactors/Course/GetCourseById.cs index 65e2395e..6fb456ad 100644 --- a/src/Domain/UseCases/Interactors/Course/GetCourseById.cs +++ b/src/Domain/UseCases/Interactors/Course/GetCourseById.cs @@ -22,7 +22,7 @@ public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.Course? entity = await _repository.GetById(id); + Entities.Course? entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/Course/GetCourses.cs b/src/Domain/UseCases/Interactors/Course/GetCourses.cs index 4a4b638d..8aa8727c 100644 --- a/src/Domain/UseCases/Interactors/Course/GetCourses.cs +++ b/src/Domain/UseCases/Interactors/Course/GetCourses.cs @@ -19,7 +19,7 @@ public GetCourses(ICourseRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = await _repository.GetAll(skip, take); + IEnumerable entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/Course/UpdateCourse.cs b/src/Domain/UseCases/Interactors/Course/UpdateCourse.cs index 3e342e8d..3ff8999e 100644 --- a/src/Domain/UseCases/Interactors/Course/UpdateCourse.cs +++ b/src/Domain/UseCases/Interactors/Course/UpdateCourse.cs @@ -27,7 +27,7 @@ public async Task ExecuteAsync(Guid? id, UpdateCourseI UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - Entities.Course entity = await _repository.GetById(id) ?? + Entities.Course entity = await _repository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Course)); // Verifica se a entidade foi excluída @@ -37,7 +37,7 @@ public async Task ExecuteAsync(Guid? id, UpdateCourseI } // Verifica se o nome já está sendo usado - if (!string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) && await _repository.GetCourseByName(input.Name!) != null) + if (!string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) && await _repository.GetCourseByNameAsync(input.Name!) != null) { throw UseCaseException.BusinessRuleViolation("Já existe um Curso para o nome informado."); } @@ -46,7 +46,7 @@ public async Task ExecuteAsync(Guid? id, UpdateCourseI entity.Name = input.Name; // Salva entidade atualizada no banco - Entities.Course model = await _repository.Update(entity); + Entities.Course model = await _repository.UpdateAsync(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs b/src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs index 45d150da..af1ffb65 100644 --- a/src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs +++ b/src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs @@ -21,13 +21,13 @@ public CreateMainArea(IMainAreaRepository repository, IMapper mapper) public async Task ExecuteAsync(CreateMainAreaInput model) { // Validação de código da Área - Entities.MainArea? entity = await _repository.GetByCode(model.Code); + Entities.MainArea? entity = await _repository.GetByCodeAsync(model.Code); if (entity != null) { throw UseCaseException.BusinessRuleViolation($"Já existe uma Área Principal para o código {model.Code}"); } - entity = await _repository.Create(_mapper.Map(model)); + entity = await _repository.CreateAsync(_mapper.Map(model)); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs b/src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs index 016bcdfb..351799d3 100644 --- a/src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs +++ b/src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.MainArea model = await _repository.Delete(id); + Entities.MainArea model = await _repository.DeleteAsync(id); // Retorna o edital removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs b/src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs index 814541cd..d92bac85 100644 --- a/src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs +++ b/src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs @@ -22,7 +22,7 @@ public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.MainArea? entity = await _repository.GetById(id); + Entities.MainArea? entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs b/src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs index 9492cc19..f474dbde 100644 --- a/src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs +++ b/src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs @@ -19,7 +19,7 @@ public GetMainAreas(IMainAreaRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs b/src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs index 02d800e8..fae8b0f3 100644 --- a/src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs +++ b/src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs @@ -20,7 +20,7 @@ public UpdateMainArea(IMainAreaRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id, UpdateMainAreaInput input) { // Recupera entidade que será atualizada - Entities.MainArea entity = await _repository.GetById(id) + Entities.MainArea entity = await _repository.GetByIdAsync(id) ?? throw Validation.UseCaseException.BusinessRuleViolation("Área Principal não encontrada."); // Atualiza atributos permitidos @@ -28,7 +28,7 @@ public async Task ExecuteAsync(Guid? id, UpdateMainAreaI entity.Code = input.Code; // Salva entidade atualizada no banco - Entities.MainArea model = await _repository.Update(entity); + Entities.MainArea model = await _repository.UpdateAsync(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs b/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs index b99a9fa3..48eed628 100644 --- a/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs +++ b/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs @@ -58,7 +58,7 @@ public async Task ExecuteAsync(CreateNoticeInput input ); // Verifica se já existe um edital para o período indicado - var noticeFound = await _repository.GetNoticeByPeriod((DateTime)input.RegistrationStartDate!, (DateTime)input.RegistrationEndDate!); + var noticeFound = await _repository.GetNoticeByPeriodAsync((DateTime)input.RegistrationStartDate!, (DateTime)input.RegistrationEndDate!); UseCaseException.BusinessRuleViolation(noticeFound != null, "Já existe um Edital para o período indicado."); // Salva arquivo no repositório e atualiza atributo DocUrl @@ -78,25 +78,25 @@ public async Task ExecuteAsync(CreateNoticeInput input } // Cria edital no banco - notice = await _repository.Create(notice); + notice = await _repository.CreateAsync(notice); // Salva atividades no banco foreach (var activityType in input.Activities!) { // Salva tipo de atividade no banco var activityTypeEntity = new Entities.ActivityType(activityType.Name, activityType.Unity, notice.Id); - activityTypeEntity = await _activityTypeRepository.Create(activityTypeEntity); + activityTypeEntity = await _activityTypeRepository.CreateAsync(activityTypeEntity); // Salva atividades no banco foreach (var activity in activityType.Activities!) { var activityEntity = new Entities.Activity(activity.Name, activity.Points, activity.Limits, activityTypeEntity.Id); - await _activityRepository.Create(activityEntity); + await _activityRepository.CreateAsync(activityEntity); } } // Obtém professores ativos - var professors = await _professorRepository.GetAllActiveProfessors(); + var professors = await _professorRepository.GetAllActiveProfessorsAsync(); // Envia email de notificação para todos os professores ativos foreach (var professor in professors) diff --git a/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs b/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs index 2b99e044..588cb664 100644 --- a/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs +++ b/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs @@ -27,7 +27,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id == null, nameof(id)); // Remove a entidade - Entities.Notice entity = await _repository.Delete(id); + Entities.Notice entity = await _repository.DeleteAsync(id); // Deleta o arquivo do edital if (!string.IsNullOrEmpty(entity.DocUrl)) diff --git a/src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs b/src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs index 277bc88c..38329994 100644 --- a/src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs +++ b/src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs @@ -22,7 +22,7 @@ public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.Notice? entity = await _repository.GetById(id); + Entities.Notice? entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/Notice/GetNotices.cs b/src/Domain/UseCases/Interactors/Notice/GetNotices.cs index a05533eb..6399329f 100644 --- a/src/Domain/UseCases/Interactors/Notice/GetNotices.cs +++ b/src/Domain/UseCases/Interactors/Notice/GetNotices.cs @@ -19,7 +19,7 @@ public GetNotices(INoticeRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities); } } diff --git a/src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs b/src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs index a5ce8bbc..1be331f6 100644 --- a/src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs +++ b/src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs @@ -42,7 +42,7 @@ public async Task ExecuteAsync(Guid? id, UpdateNoticeI "As atividades devem ser informadas."); // Recupera entidade que será atualizada - Entities.Notice notice = await _repository.GetById(id) + Entities.Notice notice = await _repository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Notice)); // Verifica se a entidade foi excluída @@ -82,10 +82,10 @@ public async Task ExecuteAsync(Guid? id, UpdateNoticeI } // Salva entidade atualizada no banco - _ = await _repository.Update(notice); + _ = await _repository.UpdateAsync(notice); // Recupera atividades do edital - IList noticeActivities = await _activityTypeRepository.GetByNoticeId(notice.Id); + IList noticeActivities = await _activityTypeRepository.GetByNoticeIdAsync(notice.Id); // Atualiza atividades await HandleActivityType(model.Activities!, noticeActivities, notice.Id); @@ -114,7 +114,7 @@ private async Task HandleActivityType(IList newActivity activityType = new Entities.ActivityType(newActivityType.Name, newActivityType.Unity, noticeId); // Salva tipo de atividade no banco - _ = await _activityTypeRepository.Create(activityType); + _ = await _activityTypeRepository.CreateAsync(activityType); // Cria atividades await HandleActivity(newActivityType.Activities!, new List(), activityType.Id); @@ -128,7 +128,7 @@ private async Task HandleActivityType(IList newActivity activityType.Unity = newActivityType.Unity; // Salva tipo de atividade atualizado no banco - _ = await _activityTypeRepository.Update(activityType); + _ = await _activityTypeRepository.UpdateAsync(activityType); // Atualiza atividades await HandleActivity(newActivityType.Activities!, activityType.Activities!, activityType.Id); @@ -143,7 +143,7 @@ private async Task HandleActivityType(IList newActivity foreach (Entities.ActivityType activityTypeToRemove in oldActivityTypes) { // Remove tipo de atividade do banco - _ = await _activityTypeRepository.Delete(activityTypeToRemove.Id); + _ = await _activityTypeRepository.DeleteAsync(activityTypeToRemove.Id); } } @@ -168,7 +168,7 @@ private async Task HandleActivity(IList newActivities, ILis activity = new Entities.Activity(newActivity.Name, newActivity.Points, newActivity.Limits, activityTypeId); // Salva atividade no banco - _ = await _activityRepository.Create(activity); + _ = await _activityRepository.CreateAsync(activity); } // Se o tipo de atividade existir, atualiza @@ -180,7 +180,7 @@ private async Task HandleActivity(IList newActivities, ILis activity.Limits = newActivity.Limits; // Salva atividade atualizada no banco - _ = await _activityRepository.Update(activity); + _ = await _activityRepository.UpdateAsync(activity); // Remove atividade da lista de atividades do tipo de atividade _ = oldActivities.Remove(activity); @@ -192,7 +192,7 @@ private async Task HandleActivity(IList newActivities, ILis foreach (Entities.Activity activityToRemove in oldActivities) { // Remove atividade do banco - _ = await _activityRepository.Delete(activityToRemove.Id); + _ = await _activityRepository.DeleteAsync(activityToRemove.Id); } } } diff --git a/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs b/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs index 816e9274..99cb5065 100644 --- a/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs +++ b/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs @@ -38,11 +38,11 @@ public async Task ExecuteAsync(CreateProfessorInput UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Password), nameof(input.Password)); // Verifica se já existe um usuário com o e-mail informado - var user = await _userRepository.GetUserByEmail(input.Email); + var user = await _userRepository.GetUserByEmailAsync(input.Email); UseCaseException.BusinessRuleViolation(user != null, "Já existe um usuário com o e-mail informado."); // Verifica se já existe um usuário com o CPF informado - user = await _userRepository.GetUserByCPF(input.CPF); + user = await _userRepository.GetUserByCPFAsync(input.CPF); UseCaseException.BusinessRuleViolation(user != null, "Já existe um usuário com o CPF informado."); // Gera hash da senha @@ -52,12 +52,12 @@ public async Task ExecuteAsync(CreateProfessorInput user = new Entities.User(input.Name, input.Email, input.Password, input.CPF, Entities.Enums.ERole.PROFESSOR); // Adiciona usuário no banco - user = await _userRepository.Create(user); + user = await _userRepository.CreateAsync(user); UseCaseException.BusinessRuleViolation(user == null, "Não foi possível criar o usuário."); // Adiciona professor no banco entity.UserId = user?.Id; - entity = await _professorRepository.Create(entity); + entity = await _professorRepository.CreateAsync(entity); UseCaseException.BusinessRuleViolation(entity == null, "Não foi possível criar o professor."); // Envia e-mail de confirmação diff --git a/src/Domain/UseCases/Interactors/Professor/DeleteProfessor.cs b/src/Domain/UseCases/Interactors/Professor/DeleteProfessor.cs index 6ad705dd..5619c422 100644 --- a/src/Domain/UseCases/Interactors/Professor/DeleteProfessor.cs +++ b/src/Domain/UseCases/Interactors/Professor/DeleteProfessor.cs @@ -26,19 +26,19 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se o professor existe - Entities.Professor? professor = await _professorRepository.GetById(id) + Entities.Professor? professor = await _professorRepository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Professor)); // Verifica se o usuário existe - _ = await _userRepository.GetById(professor.UserId) + _ = await _userRepository.GetByIdAsync(professor.UserId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); // Remove o professor - professor = await _professorRepository.Delete(id); + professor = await _professorRepository.DeleteAsync(id); UseCaseException.BusinessRuleViolation(professor == null, "O professor não pôde ser removido."); // Remove o usuário - _ = await _userRepository.Delete(professor?.UserId) + _ = await _userRepository.DeleteAsync(professor?.UserId) ?? throw UseCaseException.BusinessRuleViolation("O usuário não pôde ser removido."); // Retorna o professor removido diff --git a/src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs b/src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs index d2d01343..177ddc46 100644 --- a/src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs +++ b/src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs @@ -21,7 +21,7 @@ public GetProfessorById(IProfessorRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.Professor? entity = await _repository.GetById(id); + Entities.Professor? entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/Professor/GetProfessors.cs b/src/Domain/UseCases/Interactors/Professor/GetProfessors.cs index 3df35b4b..2f957b16 100644 --- a/src/Domain/UseCases/Interactors/Professor/GetProfessors.cs +++ b/src/Domain/UseCases/Interactors/Professor/GetProfessors.cs @@ -19,7 +19,7 @@ public GetProfessors(IProfessorRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs b/src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs index 551d5c2b..ea67d456 100644 --- a/src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs +++ b/src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id, UpdateProf UseCaseException.NotInformedParam(id is null, nameof(id)); // Recupera entidade que será atualizada - Entities.Professor professor = await _professorRepository.GetById(id) + Entities.Professor professor = await _professorRepository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Professor)); // Verifica se a entidade foi excluída @@ -38,7 +38,7 @@ public async Task ExecuteAsync(Guid? id, UpdateProf professor.SIAPEEnrollment = model.SIAPEEnrollment; // Atualiza professor com as informações fornecidas - professor = await _professorRepository.Update(professor); + professor = await _professorRepository.UpdateAsync(professor); // Salva entidade atualizada no banco return _mapper.Map(professor); diff --git a/src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs b/src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs index 6ad53799..36d36bed 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs @@ -24,14 +24,14 @@ public async Task ExecuteAsync(CreateProgramTypeI UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Name), nameof(model.Name)); // Verifica se já existe um tipo de programa com o nome indicado - Entities.ProgramType? entity = await _repository.GetProgramTypeByName(model.Name!); + Entities.ProgramType? entity = await _repository.GetProgramTypeByNameAsync(model.Name!); if (entity != null) { throw UseCaseException.BusinessRuleViolation("Já existe um Tipo de Programa para o nome informado."); } // Cria entidade - entity = await _repository.Create(_mapper.Map(model)); + entity = await _repository.CreateAsync(_mapper.Map(model)); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs b/src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs index 6fd0ff8d..58bf63b6 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.ProgramType model = await _repository.Delete(id); + Entities.ProgramType model = await _repository.DeleteAsync(id); // Retorna o tipo de programa removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs b/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs index 12d92acf..41194cac 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs @@ -21,7 +21,7 @@ public GetProgramTypeById(IProgramTypeRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.ProgramType? entity = await _repository.GetById(id); + Entities.ProgramType? entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs b/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs index 4de3a661..bf8cecea 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs @@ -19,7 +19,7 @@ public GetProgramTypes(IProgramTypeRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs b/src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs index afe8e024..2d066b0e 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs +++ b/src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs @@ -27,7 +27,7 @@ public async Task ExecuteAsync(Guid? id, UpdatePr UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - Entities.ProgramType entity = await _repository.GetById(id) + Entities.ProgramType entity = await _repository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); // Verifica se a entidade foi excluída @@ -36,7 +36,7 @@ public async Task ExecuteAsync(Guid? id, UpdatePr // Verifica se o nome já está sendo usado UseCaseException.BusinessRuleViolation( !string.Equals(entity.Name, input.Name, StringComparison.OrdinalIgnoreCase) - && await _repository.GetProgramTypeByName(input.Name!) != null, + && await _repository.GetProgramTypeByNameAsync(input.Name!) != null, "Já existe um Tipo de Programa para o nome informado."); // Atualiza atributos permitidos @@ -44,7 +44,7 @@ public async Task ExecuteAsync(Guid? id, UpdatePr entity.Description = input.Description; // Salva entidade atualizada no banco - Entities.ProgramType model = await _repository.Update(entity); + Entities.ProgramType model = await _repository.UpdateAsync(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Interactors/Project/AppealProject.cs b/src/Domain/UseCases/Interactors/Project/AppealProject.cs index 3537a9ad..5749087a 100644 --- a/src/Domain/UseCases/Interactors/Project/AppealProject.cs +++ b/src/Domain/UseCases/Interactors/Project/AppealProject.cs @@ -30,7 +30,7 @@ public async Task ExecuteAsync(Guid? projectId, string nameof(appealDescription)); // Verifica se o projeto existe - Entities.Project project = await _projectRepository.GetById(projectId!.Value) + Entities.Project project = await _projectRepository.GetByIdAsync(projectId!.Value) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Verifica se o projeto está em recurso @@ -48,7 +48,7 @@ public async Task ExecuteAsync(Guid? projectId, string project.AppealDate = DateTime.UtcNow; // Salva alterações no banco de dados - _ = await _projectRepository.Update(project); + _ = await _projectRepository.UpdateAsync(project); // Retorna o projeto return _mapper.Map(project); diff --git a/src/Domain/UseCases/Interactors/Project/CancelProject.cs b/src/Domain/UseCases/Interactors/Project/CancelProject.cs index aa307009..8b3b8d4b 100644 --- a/src/Domain/UseCases/Interactors/Project/CancelProject.cs +++ b/src/Domain/UseCases/Interactors/Project/CancelProject.cs @@ -23,7 +23,7 @@ public CancelProject(IProjectRepository projectRepository, public async Task ExecuteAsync(Guid? id, string? observation) { // Verifica se o projeto existe - Entities.Project project = await _projectRepository.GetById(id) + Entities.Project project = await _projectRepository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Verifica se o projeto já não foi cancelado ou está encerrado @@ -38,7 +38,7 @@ public async Task ExecuteAsync(Guid? id, string? obser project.CancellationDate = DateTime.UtcNow; // Atualiza projeto - project = await _projectRepository.Update(project); + project = await _projectRepository.UpdateAsync(project); // Mapeia entidade para output e retorna return _mapper.Map(project); diff --git a/src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs b/src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs index 5e5b234a..e0685cc0 100644 --- a/src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs +++ b/src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs @@ -42,22 +42,22 @@ public async Task> ExecuteAsync(int skip, int ta // Se o usuário for um professor, retorna apenas os seus projetos. if (userRole == ERole.PROFESSOR) { - projects = (IEnumerable)await _projectRepository.GetProfessorProjects(skip, take, userClaims?.Id, true); + projects = (IEnumerable)await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id, true); } // Se o usuário for um aluno, retorna apenas os seus projetos. else if (userRole == ERole.STUDENT) { - projects = (IEnumerable)await _projectRepository.GetStudentProjects(skip, take, userClaims?.Id, true); + projects = (IEnumerable)await _projectRepository.GetStudentProjectsAsync(skip, take, userClaims?.Id, true); } // Se o usuário for um administrador, permite a busca apenas pelo seu ID. else { projects = userRole == ERole.ADMIN && onlyMyProjects - ? (IEnumerable)await _projectRepository.GetProfessorProjects(skip, take, userClaims?.Id, true) + ? (IEnumerable)await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id, true) : userRole == ERole.ADMIN && !onlyMyProjects - ? (IEnumerable)await _projectRepository.GetProjects(skip, take, true) + ? (IEnumerable)await _projectRepository.GetProjectsAsync(skip, take, true) : throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); } diff --git a/src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs b/src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs index e7798f04..88dc029f 100644 --- a/src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs +++ b/src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs @@ -42,22 +42,22 @@ public async Task> ExecuteAsync(int skip, int ta // Se o usuário for um professor, retorna apenas os seus projetos. if (userRole == ERole.PROFESSOR) { - projects = (IEnumerable)await _projectRepository.GetProfessorProjects(skip, take, userClaims?.Id); + projects = (IEnumerable)await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id); } // Se o usuário for um aluno, retorna apenas os seus projetos. else if (userRole == ERole.STUDENT) { - projects = (IEnumerable)await _projectRepository.GetStudentProjects(skip, take, userClaims?.Id); + projects = (IEnumerable)await _projectRepository.GetStudentProjectsAsync(skip, take, userClaims?.Id); } // Se o usuário for um administrador, permite a busca apenas pelo seu ID. else { projects = userRole == ERole.ADMIN && onlyMyProjects - ? (IEnumerable)await _projectRepository.GetProfessorProjects(skip, take, userClaims?.Id) + ? (IEnumerable)await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id) : userRole == ERole.ADMIN && !onlyMyProjects - ? (IEnumerable)await _projectRepository.GetProjects(skip, take) + ? (IEnumerable)await _projectRepository.GetProjectsAsync(skip, take) : throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); } diff --git a/src/Domain/UseCases/Interactors/Project/GetProjectById.cs b/src/Domain/UseCases/Interactors/Project/GetProjectById.cs index 2d6d1f90..aa5d2ac3 100644 --- a/src/Domain/UseCases/Interactors/Project/GetProjectById.cs +++ b/src/Domain/UseCases/Interactors/Project/GetProjectById.cs @@ -22,7 +22,7 @@ public GetProjectById(IProjectRepository projectRepository, public async Task ExecuteAsync(Guid? id) { // Busca projeto pelo Id informado - Entities.Project project = await _projectRepository.GetById(id) + Entities.Project project = await _projectRepository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Mapeia entidade para output e retorna diff --git a/src/Domain/UseCases/Interactors/Project/OpenProject.cs b/src/Domain/UseCases/Interactors/Project/OpenProject.cs index 317d80d3..7fdb483d 100644 --- a/src/Domain/UseCases/Interactors/Project/OpenProject.cs +++ b/src/Domain/UseCases/Interactors/Project/OpenProject.cs @@ -68,7 +68,7 @@ public async Task ExecuteAsync(OpenProjectInput input) null); // Verifica se Edital existe - Entities.Notice notice = await _noticeRepository.GetById(project.NoticeId) + Entities.Notice notice = await _noticeRepository.GetByIdAsync(project.NoticeId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Notice)); // Verifica se o período do edital é válido @@ -78,26 +78,26 @@ public async Task ExecuteAsync(OpenProjectInput input) } // Verifica se a Subárea existe - _ = await _subAreaRepository.GetById(project.SubAreaId) + _ = await _subAreaRepository.GetByIdAsync(project.SubAreaId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); // Verifica se o Tipo de Programa existe - _ = await _programTypeRepository.GetById(project.ProgramTypeId) + _ = await _programTypeRepository.GetByIdAsync(project.ProgramTypeId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); // Verifica se o Professor existe - _ = await _professorRepository.GetById(project.ProfessorId) + _ = await _professorRepository.GetByIdAsync(project.ProfessorId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Professor)); // Caso tenha sido informado algum aluno no processo de abertura do projeto if (project.StudentId.HasValue) { // Verifica se o aluno existe - Entities.Student student = await _studentRepository.GetById(project.StudentId) + Entities.Student student = await _studentRepository.GetByIdAsync(project.StudentId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); // Verifica se o aluno já está em um projeto - IEnumerable studentProjects = await _projectRepository.GetStudentProjects(0, 1, student.Id); + IEnumerable studentProjects = await _projectRepository.GetStudentProjectsAsync(0, 1, student.Id); if (studentProjects.Any()) { throw UseCaseException.BusinessRuleViolation("Aluno já está em um projeto."); @@ -111,7 +111,7 @@ public async Task ExecuteAsync(OpenProjectInput input) } // Obtém atividades do Edital - IList noticeActivities = await _activityTypeRepository.GetByNoticeId(notice.Id); + IList noticeActivities = await _activityTypeRepository.GetByNoticeIdAsync(notice.Id); // Valida se todas as atividades do projeto foram informadas corretamente List newProjectActivities = new(); @@ -135,13 +135,13 @@ public async Task ExecuteAsync(OpenProjectInput input) } // Cria o projeto - project = await _projectRepository.Create(project); + project = await _projectRepository.CreateAsync(project); // Cria as atividades do projeto foreach (Entities.ProjectActivity projectActivity in newProjectActivities) { projectActivity.ProjectId = project.Id; - _ = await _projectActivityRepository.Create(projectActivity); + _ = await _projectActivityRepository.CreateAsync(projectActivity); } // Mapeia o projeto para o retorno e retorna diff --git a/src/Domain/UseCases/Interactors/Project/SubmitProject.cs b/src/Domain/UseCases/Interactors/Project/SubmitProject.cs index 2ce32d34..898807d7 100644 --- a/src/Domain/UseCases/Interactors/Project/SubmitProject.cs +++ b/src/Domain/UseCases/Interactors/Project/SubmitProject.cs @@ -26,7 +26,7 @@ public async Task ExecuteAsync(Guid? projectId) UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); // Verifica se o projeto existe - Entities.Project project = await _projectRepository.GetById(projectId!.Value) + Entities.Project project = await _projectRepository.GetByIdAsync(projectId!.Value) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Verifica se edital está em fase de inscrição @@ -46,7 +46,7 @@ public async Task ExecuteAsync(Guid? projectId) project.SubmissionDate = DateTime.UtcNow; // Salva alterações no banco de dados - _ = await _projectRepository.Update(project); + _ = await _projectRepository.UpdateAsync(project); // Mapeia entidade para output e retorna return _mapper.Map(project); diff --git a/src/Domain/UseCases/Interactors/Project/UpdateProject.cs b/src/Domain/UseCases/Interactors/Project/UpdateProject.cs index ed2fb4d7..95577ae7 100644 --- a/src/Domain/UseCases/Interactors/Project/UpdateProject.cs +++ b/src/Domain/UseCases/Interactors/Project/UpdateProject.cs @@ -47,7 +47,7 @@ public async Task ExecuteAsync(Guid? id, UpdateProject UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se o projeto existe - Entities.Project project = await _projectRepository.GetById(id) + Entities.Project project = await _projectRepository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Verifica se o edital está no período de inscrições @@ -62,14 +62,14 @@ public async Task ExecuteAsync(Guid? id, UpdateProject // Verifica se a nova Subárea existe if (input.SubAreaId != project.SubAreaId) { - _ = await _subAreaRepository.GetById(input.SubAreaId) + _ = await _subAreaRepository.GetByIdAsync(input.SubAreaId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); } // Verifica se o novo Tipo de Programa existe if (input.ProgramTypeId != project.ProgramTypeId) { - _ = await _programTypeRepository.GetById(input.ProgramTypeId) + _ = await _programTypeRepository.GetByIdAsync(input.ProgramTypeId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); } @@ -77,11 +77,11 @@ public async Task ExecuteAsync(Guid? id, UpdateProject if (input.StudentId.HasValue && input.StudentId != project.StudentId) { // Verifica se o aluno existe - Entities.Student student = await _studentRepository.GetById(input.StudentId) + Entities.Student student = await _studentRepository.GetByIdAsync(input.StudentId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); // Verifica se o aluno já está em um projeto - IEnumerable studentProjects = await _projectRepository.GetStudentProjects(0, 1, student.Id); + IEnumerable studentProjects = await _projectRepository.GetStudentProjectsAsync(0, 1, student.Id); UseCaseException.BusinessRuleViolation(studentProjects.Any(), "Student is already on a project."); } @@ -106,10 +106,10 @@ public async Task ExecuteAsync(Guid? id, UpdateProject } // Obtém atividades do Edital - IList noticeActivities = await _activityTypeRepository.GetByNoticeId(project.Notice!.Id); + IList noticeActivities = await _activityTypeRepository.GetByNoticeIdAsync(project.Notice!.Id); // Obtém atividades do projeto - IList projectActivities = await _projectActivityRepository.GetByProjectId(project.Id); + IList projectActivities = await _projectActivityRepository.GetByProjectIdAsync(project.Id); // Valida se todas as atividades do projeto foram informadas corretamente List updateProjectActivities = new(); @@ -130,17 +130,17 @@ public async Task ExecuteAsync(Guid? id, UpdateProject updateProjectActivity!.InformedActivities = inputActivity.InformedActivities; // Atualiza atividade do projeto no banco de dados - _ = await _projectActivityRepository.Update(updateProjectActivity); + _ = await _projectActivityRepository.UpdateAsync(updateProjectActivity); } } // Atualiza o projeto - _ = await _projectRepository.Update(project); + _ = await _projectRepository.UpdateAsync(project); // Atualiza atividades do projeto no banco foreach (Entities.ProjectActivity projectActivity in updateProjectActivities) { - _ = await _projectActivityRepository.Update(projectActivity); + _ = await _projectActivityRepository.UpdateAsync(projectActivity); } // Mapeia o projeto para o retorno e retorna diff --git a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs index 9b26739a..edf05964 100644 --- a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs @@ -41,11 +41,11 @@ public async Task ExecuteAsync(EvaluateAppealProjectI "O usuário não é um avaliador."); // Busca avaliação do projeto pelo Id. - Entities.ProjectEvaluation? projectEvaluation = await _projectEvaluationRepository.GetByProjectId(input.ProjectId) + Entities.ProjectEvaluation? projectEvaluation = await _projectEvaluationRepository.GetByProjectIdAsync(input.ProjectId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProjectEvaluation)); // Recupera projeto pelo Id. - Entities.Project project = await _projectRepository.GetById(input.ProjectId) + Entities.Project project = await _projectRepository.GetByIdAsync(input.ProjectId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Verifica se o avaliador é o professor orientador do projeto. @@ -77,7 +77,7 @@ public async Task ExecuteAsync(EvaluateAppealProjectI projectEvaluation.AppealEvaluationStatus = (EProjectStatus)input.AppealEvaluationStatus!; // Atualiza avaliação do projeto. - _ = await _projectEvaluationRepository.Update(projectEvaluation); + _ = await _projectEvaluationRepository.UpdateAsync(projectEvaluation); // Se projeto foi aceito, adiciona prazo para envio da documentação. if ((EProjectStatus)input.AppealEvaluationStatus == EProjectStatus.Accepted) @@ -100,7 +100,7 @@ await _emailService.SendProjectNotificationEmailAsync( projectEvaluation.SubmissionEvaluationDescription); // Atualiza projeto. - Entities.Project output = await _projectRepository.Update(project); + Entities.Project output = await _projectRepository.UpdateAsync(project); // Mapeia dados de saída e retorna. return _mapper.Map(output); diff --git a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs index 4d3fcd9c..65e1e293 100644 --- a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -48,12 +48,12 @@ public async Task ExecuteAsync(EvaluateSubmissionProj "O usuário não é um avaliador."); // Verifica se já existe alguma avaliação para o projeto. - Entities.ProjectEvaluation? projectEvaluation = await _projectEvaluationRepository.GetByProjectId(input.ProjectId); + Entities.ProjectEvaluation? projectEvaluation = await _projectEvaluationRepository.GetByProjectIdAsync(input.ProjectId); UseCaseException.BusinessRuleViolation(projectEvaluation != null, "Projeto já avaliado."); // Busca projeto pelo Id. - Entities.Project project = await _projectRepository.GetById(input.ProjectId) + Entities.Project project = await _projectRepository.GetByIdAsync(input.ProjectId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); // Verifica se o avaliador é o professor orientador do projeto. @@ -87,10 +87,10 @@ public async Task ExecuteAsync(EvaluateSubmissionProj 0); // Obtém atividades do Edital - IList noticeActivities = (IList)await _activityTypeRepository.GetByNoticeId(project.Notice!.Id); + IList noticeActivities = (IList)await _activityTypeRepository.GetByNoticeIdAsync(project.Notice!.Id); // Obtém atividades do projeto - IList projectActivities = await _projectActivityRepository.GetByProjectId(project.Id); + IList projectActivities = await _projectActivityRepository.GetByProjectIdAsync(project.Id); // Valida se todas as atividades do projeto foram informadas corretamente List updateProjectActivities = new(); @@ -114,7 +114,7 @@ public async Task ExecuteAsync(EvaluateSubmissionProj projectEvaluation.APIndex += updateProjectActivity.CalculatePoints(); // Atualiza atividade do projeto no banco de dados - _ = await _projectActivityRepository.Update(updateProjectActivity); + _ = await _projectActivityRepository.UpdateAsync(updateProjectActivity); } } @@ -122,7 +122,7 @@ public async Task ExecuteAsync(EvaluateSubmissionProj projectEvaluation.CalculateFinalScore(); // Adiciona avaliação do projeto. - _ = await _projectEvaluationRepository.Create(projectEvaluation); + _ = await _projectEvaluationRepository.CreateAsync(projectEvaluation); // Se projeto foi aceito, adiciona prazo para envio da documentação. if (projectEvaluation.SubmissionEvaluationStatus == EProjectStatus.Accepted) @@ -145,7 +145,7 @@ await _emailService.SendProjectNotificationEmailAsync( projectEvaluation.SubmissionEvaluationDescription); // Atualiza projeto. - Entities.Project output = await _projectRepository.Update(project); + Entities.Project output = await _projectRepository.UpdateAsync(project); // Mapeia dados de saída e retorna. return _mapper.Map(output); diff --git a/src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs b/src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs index 0a4199c3..44a7ffbd 100644 --- a/src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs +++ b/src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs @@ -25,7 +25,7 @@ public async Task ExecuteAsync(Guid? projec UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); // Obtém a avaliação do projeto pelo Id do projeto. - Entities.ProjectEvaluation? entity = await _repository.GetByProjectId(projectId); + Entities.ProjectEvaluation? entity = await _repository.GetByProjectIdAsync(projectId); // Converte e retorna o resultado. return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/Student/CreateStudent.cs b/src/Domain/UseCases/Interactors/Student/CreateStudent.cs index e0ced819..1237d975 100644 --- a/src/Domain/UseCases/Interactors/Student/CreateStudent.cs +++ b/src/Domain/UseCases/Interactors/Student/CreateStudent.cs @@ -61,22 +61,22 @@ public async Task ExecuteAsync(CreateStudentInput mod model.RegistrationCode); // Verifica se já existe um usuário com o e-mail informado - Entities.User? user = await _userRepository.GetUserByEmail(model.Email); + Entities.User? user = await _userRepository.GetUserByEmailAsync(model.Email); UseCaseException.BusinessRuleViolation(user != null, "Já existe um usuário com o e-mail informado."); // Verifica se já existe um usuário com o CPF informado - user = await _userRepository.GetUserByCPF(model.CPF); + user = await _userRepository.GetUserByCPFAsync(model.CPF); UseCaseException.BusinessRuleViolation(user != null, "Já existe um usuário com o CPF informado."); // Verifica se curso informado existe - Entities.Course? course = await _courseRepository.GetById(model.CourseId); + Entities.Course? course = await _courseRepository.GetByIdAsync(model.CourseId); UseCaseException.BusinessRuleViolation(course == null || course.DeletedAt != null, "Curso informado não existe."); // Verifica se campus informado existe - Entities.Campus? campus = await _campusRepository.GetById(model.CampusId); + Entities.Campus? campus = await _campusRepository.GetByIdAsync(model.CampusId); UseCaseException.BusinessRuleViolation(campus == null || campus.DeletedAt != null, "Campus informado não existe."); @@ -90,13 +90,13 @@ public async Task ExecuteAsync(CreateStudentInput mod user = new Entities.User(model.Name, model.Email, model.Password, model.CPF, ERole.STUDENT); // Adiciona usuário no banco - user = await _userRepository.Create(user); + user = await _userRepository.CreateAsync(user); UseCaseException.BusinessRuleViolation(user == null, "Não foi possível criar o usuário."); // Adiciona estudante no banco entity.UserId = user?.Id; - entity = await _studentRepository.Create(entity); + entity = await _studentRepository.CreateAsync(entity); UseCaseException.BusinessRuleViolation(entity == null, "Não foi possível criar o estudante."); diff --git a/src/Domain/UseCases/Interactors/Student/DeleteStudent.cs b/src/Domain/UseCases/Interactors/Student/DeleteStudent.cs index aa7f45cf..e6a1f601 100644 --- a/src/Domain/UseCases/Interactors/Student/DeleteStudent.cs +++ b/src/Domain/UseCases/Interactors/Student/DeleteStudent.cs @@ -26,19 +26,19 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se o estudante existe - Entities.Student? student = await _studentRepository.GetById(id) + Entities.Student? student = await _studentRepository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); // Verifica se o usuário existe - _ = await _userRepository.GetById(student.UserId) + _ = await _userRepository.GetByIdAsync(student.UserId) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); // Remove o estudante - student = await _studentRepository.Delete(id); + student = await _studentRepository.DeleteAsync(id); UseCaseException.BusinessRuleViolation(student == null, "O estudante não pôde ser removido."); // Remove o usuário - _ = await _userRepository.Delete(student?.UserId) + _ = await _userRepository.DeleteAsync(student?.UserId) ?? throw UseCaseException.BusinessRuleViolation("O usuário não pôde ser removido."); // Retorna o estudante removido diff --git a/src/Domain/UseCases/Interactors/Student/GetStudentById.cs b/src/Domain/UseCases/Interactors/Student/GetStudentById.cs index 0647be14..72b922c5 100644 --- a/src/Domain/UseCases/Interactors/Student/GetStudentById.cs +++ b/src/Domain/UseCases/Interactors/Student/GetStudentById.cs @@ -21,7 +21,7 @@ public GetStudentById(IStudentRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.Student? entity = await _repository.GetById(id); + Entities.Student? entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs b/src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs index 4c3fc2e2..c9d58ba5 100644 --- a/src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs +++ b/src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs @@ -22,7 +22,7 @@ public async Task ExecuteAsync(string? registrationCo UseCaseException.NotInformedParam(string.IsNullOrEmpty(registrationCode), "Matrícula"); // Busca o aluno pelo código de matrícula - var student = await _studentRepository.GetByRegistrationCode(registrationCode!); + var student = await _studentRepository.GetByRegistrationCodeAsync(registrationCode!); // Verifica se o aluno foi encontrado UseCaseException.NotFoundEntityByParams(student is null, nameof(Entities.Student)); diff --git a/src/Domain/UseCases/Interactors/Student/GetStudents.cs b/src/Domain/UseCases/Interactors/Student/GetStudents.cs index 371a6dd4..9d01550a 100644 --- a/src/Domain/UseCases/Interactors/Student/GetStudents.cs +++ b/src/Domain/UseCases/Interactors/Student/GetStudents.cs @@ -19,7 +19,7 @@ public GetStudents(IStudentRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAll(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs b/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs index 7436c096..440d9c29 100644 --- a/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs +++ b/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs @@ -25,7 +25,7 @@ public RequestStudentRegister(IEmailService emailService, IUserRepository userRe UseCaseException.BusinessRuleViolation(!ValidateStudentEmail(email!), "Email inválido."); // Verifica se o email já está cadastrado - var user = await _userRepository.GetUserByEmail(email!); + var user = await _userRepository.GetUserByEmailAsync(email!); // Se o usuário já existe, lança uma exceção UseCaseException.BusinessRuleViolation(user is not null, "Email já cadastrado."); diff --git a/src/Domain/UseCases/Interactors/Student/UpdateStudent.cs b/src/Domain/UseCases/Interactors/Student/UpdateStudent.cs index 8c059339..57737918 100644 --- a/src/Domain/UseCases/Interactors/Student/UpdateStudent.cs +++ b/src/Domain/UseCases/Interactors/Student/UpdateStudent.cs @@ -25,7 +25,7 @@ public async Task ExecuteAsync(Guid? id, UpdateStuden UseCaseException.NotInformedParam(id is null, nameof(id)); // Recupera entidade que será atualizada - Entities.Student student = await _studentRepository.GetById(id) + Entities.Student student = await _studentRepository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); // Verifica se a entidade foi excluída @@ -55,7 +55,7 @@ public async Task ExecuteAsync(Guid? id, UpdateStuden student.Gender = (EGender)model.Gender; // Atualiza estudante com as informações fornecidas - student = await _studentRepository.Update(student); + student = await _studentRepository.UpdateAsync(student); // Salva entidade atualizada no banco return _mapper.Map(student); diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs b/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs index d1f875fe..d2c8754f 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs @@ -39,11 +39,11 @@ public CreateStudentDocuments( public async Task ExecuteAsync(CreateStudentDocumentsInput input) { // Verifica se já há documentos para o projeto informado - var documents = await _studentDocumentRepository.GetByProjectId(input.ProjectId!); + var documents = await _studentDocumentRepository.GetByProjectIdAsync(input.ProjectId!); UseCaseException.BusinessRuleViolation(documents is null, "Já existem documentos do aluno para o projeto indicado."); // Verifica se o projeto existe - var project = await _projectRepository.GetById(input.ProjectId!); + var project = await _projectRepository.GetByIdAsync(input.ProjectId!); UseCaseException.NotFoundEntityById(project is null, nameof(Entities.Project)); // Verifica se o projeto se encontra em situação de submissão de documentos (Aceito) @@ -74,7 +74,7 @@ public async Task ExecuteAsync(CreateStudent entity.AccountOpeningProof = await TryToSaveFileInCloud(input.AccountOpeningProof!); // Cria entidade - entity = await _studentDocumentRepository.Create(entity); + entity = await _studentDocumentRepository.CreateAsync(entity); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs b/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs index 6cb228bb..ef155ea1 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.StudentDocuments model = await _repository.Delete(id); + Entities.StudentDocuments model = await _repository.DeleteAsync(id); // TODO: Verificar se seria preciso remover os documentos do aluno caso fosse removido o registro de documentos do aluno diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs b/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs index 1a011b25..435c6523 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs @@ -26,7 +26,7 @@ public async Task ExecuteAsync(Guid? projectI UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); // Busca documentos do estudante pelo id do projeto - Entities.StudentDocuments? entity = await _repository.GetByProjectId(projectId); + Entities.StudentDocuments? entity = await _repository.GetByProjectIdAsync(projectId); // Retorna entidade mapeada return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs b/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs index 7fc55490..a35275c4 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs @@ -26,7 +26,7 @@ public async Task ExecuteAsync(Guid? studentI UseCaseException.NotInformedParam(studentId is null, nameof(studentId)); // Busca documentos do estudante pelo id do projeto - Entities.StudentDocuments? entity = await _repository.GetByStudentId(studentId); + Entities.StudentDocuments? entity = await _repository.GetByStudentIdAsync(studentId); // Retorna entidade mapeada return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs b/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs index ed70904b..d0fd023b 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs +++ b/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs @@ -35,7 +35,7 @@ public async Task ExecuteAsync(Guid? id, Upd UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se já foram enviados documentos para o projeto informado - Entities.StudentDocuments? studentDocuments = await _studentDocumentRepository.GetById(id!); + Entities.StudentDocuments? studentDocuments = await _studentDocumentRepository.GetByIdAsync(id!); UseCaseException.NotFoundEntityById(studentDocuments is not null, nameof(studentDocuments)); // Verifica se o projeto se encontra em situação de submissão de documentos (Aceito ou Pendente do envio de documentação) @@ -58,14 +58,14 @@ public async Task ExecuteAsync(Guid? id, Upd await TryToSaveFileInCloud(model.AccountOpeningProof!, studentDocuments.AccountOpeningProof); // Atualiza entidade - studentDocuments = await _studentDocumentRepository.Update(studentDocuments); + studentDocuments = await _studentDocumentRepository.UpdateAsync(studentDocuments); // Se o projeto está no status de pendente, atualiza para o status de análise de documentos if (studentDocuments.Project?.Status == Entities.Enums.EProjectStatus.Pending) { - Entities.Project? project = await _projectRepository.GetById(studentDocuments.ProjectId); + Entities.Project? project = await _projectRepository.GetByIdAsync(studentDocuments.ProjectId); project!.Status = Entities.Enums.EProjectStatus.DocumentAnalysis; - _ = await _projectRepository.Update(project); + _ = await _projectRepository.UpdateAsync(project); } // Retorna entidade atualizada diff --git a/src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs b/src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs index 516fdec6..c9b7416f 100644 --- a/src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs +++ b/src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs @@ -22,7 +22,7 @@ public CreateSubArea(ISubAreaRepository subAreaRepository, IAreaRepository areaR public async Task ExecuteAsync(CreateSubAreaInput input) { - var entity = await _subAreaRepository.GetByCode(input.Code); + var entity = await _subAreaRepository.GetByCodeAsync(input.Code); UseCaseException.BusinessRuleViolation(entity != null, "Já existe uma Subárea para o código informado."); @@ -30,7 +30,7 @@ public async Task ExecuteAsync(CreateSubAreaInput inp UseCaseException.NotInformedParam(input.AreaId == null, nameof(input.AreaId)); // Valida se existe área - var area = await _areaRepository.GetById(input.AreaId) + var area = await _areaRepository.GetByIdAsync(input.AreaId) ?? throw UseCaseException.NotFoundEntityByParams(nameof(Entities.Area)); // Verifica se área está ativa @@ -38,7 +38,7 @@ public async Task ExecuteAsync(CreateSubAreaInput inp "A Área informada está inativa."); // Cria nova área - entity = await _subAreaRepository.Create(_mapper.Map(input)); + entity = await _subAreaRepository.CreateAsync(_mapper.Map(input)); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs b/src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs index d1924bae..91b65bc8 100644 --- a/src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs +++ b/src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.SubArea model = await _repository.Delete(id); + Entities.SubArea model = await _repository.DeleteAsync(id); // Retorna o entidade removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs b/src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs index b4d6d8f5..f4b8fb3b 100644 --- a/src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs +++ b/src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs @@ -19,7 +19,7 @@ public GetSubAreaById(ISubAreaRepository subAreaRepository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { - Entities.SubArea? entity = await _subAreaRepository.GetById(id); + Entities.SubArea? entity = await _subAreaRepository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs b/src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs index ddf9aa9e..9253cb64 100644 --- a/src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs +++ b/src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs @@ -21,7 +21,7 @@ public GetSubAreasByArea(ISubAreaRepository subAreaRepository, IMapper mapper) public async Task> ExecuteAsync(Guid? areaId, int skip, int take) { UseCaseException.NotInformedParam(areaId is null, nameof(areaId)); - IEnumerable entities = (IEnumerable)await _subAreaRepository.GetSubAreasByArea(areaId, skip, take); + IEnumerable entities = (IEnumerable)await _subAreaRepository.GetSubAreasByAreaAsync(areaId, skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs b/src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs index 07d0c92a..09a0a2d9 100644 --- a/src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs +++ b/src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs @@ -20,7 +20,7 @@ public UpdateSubArea(ISubAreaRepository subAreaRepository, IMapper mapper) public async Task ExecuteAsync(Guid? id, UpdateSubAreaInput input) { // Recupera entidade que será atualizada - Entities.SubArea entity = await _subAreaRepository.GetById(id) + Entities.SubArea entity = await _subAreaRepository.GetByIdAsync(id) ?? throw Validation.UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); // Atualiza atributos permitidos @@ -29,7 +29,7 @@ public async Task ExecuteAsync(Guid? id, UpdateSubAre entity.AreaId = input.AreaId; // Salva entidade atualizada no banco - Entities.SubArea model = await _subAreaRepository.Update(entity); + Entities.SubArea model = await _subAreaRepository.UpdateAsync(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Interactors/User/ActivateUser.cs b/src/Domain/UseCases/Interactors/User/ActivateUser.cs index 78c8fd49..4aeda1bb 100644 --- a/src/Domain/UseCases/Interactors/User/ActivateUser.cs +++ b/src/Domain/UseCases/Interactors/User/ActivateUser.cs @@ -24,12 +24,12 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Encontra usuário pelo Id e o ativa - Entities.User user = await _repository.GetById(id) + Entities.User user = await _repository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); user.ActivateEntity(); // Atualiza usuário - Entities.User entity = await _repository.Update(user); + Entities.User entity = await _repository.UpdateAsync(user); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/User/DeactivateUser.cs b/src/Domain/UseCases/Interactors/User/DeactivateUser.cs index b53bf843..9b4a51ba 100644 --- a/src/Domain/UseCases/Interactors/User/DeactivateUser.cs +++ b/src/Domain/UseCases/Interactors/User/DeactivateUser.cs @@ -24,12 +24,12 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Encontra usuário pelo Id e o desativa - Entities.User user = await _repository.GetById(id) + Entities.User user = await _repository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); user.DeactivateEntity(); // Atualiza usuário - Entities.User entity = await _repository.Update(user); + Entities.User entity = await _repository.UpdateAsync(user); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/User/GetActiveUsers.cs b/src/Domain/UseCases/Interactors/User/GetActiveUsers.cs index bb9fbb1c..3e79bc47 100644 --- a/src/Domain/UseCases/Interactors/User/GetActiveUsers.cs +++ b/src/Domain/UseCases/Interactors/User/GetActiveUsers.cs @@ -19,7 +19,7 @@ public GetActiveUsers(IUserRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetActiveUsers(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetActiveUsersAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs b/src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs index e32c3313..4b77c353 100644 --- a/src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs +++ b/src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs @@ -19,7 +19,7 @@ public GetInactiveUsers(IUserRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetInactiveUsers(skip, take); + IEnumerable entities = (IEnumerable)await _repository.GetInactiveUsersAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/User/GetUserById.cs b/src/Domain/UseCases/Interactors/User/GetUserById.cs index 8b56a44a..1697a7b2 100644 --- a/src/Domain/UseCases/Interactors/User/GetUserById.cs +++ b/src/Domain/UseCases/Interactors/User/GetUserById.cs @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Busca usuário pelo id informado - Entities.User entity = await _repository.GetById(id) + Entities.User entity = await _repository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); // Retorna usuário encontrado diff --git a/src/Domain/UseCases/Interactors/User/UpdateUser.cs b/src/Domain/UseCases/Interactors/User/UpdateUser.cs index d2251c6d..f2872bc4 100644 --- a/src/Domain/UseCases/Interactors/User/UpdateUser.cs +++ b/src/Domain/UseCases/Interactors/User/UpdateUser.cs @@ -30,7 +30,7 @@ public async Task ExecuteAsync(UserUpdateInput input) UseCaseException.NotInformedParam(userClaims.Id is null, nameof(userClaims.Id)); // Busca usuário pelo id informado - Entities.User user = await _repository.GetById(userClaims.Id) + Entities.User user = await _repository.GetByIdAsync(userClaims.Id) ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); // Atualiza atributos permitidos @@ -38,7 +38,7 @@ public async Task ExecuteAsync(UserUpdateInput input) user.CPF = input.CPF; // Salva usuário atualizado no banco - Entities.User entity = await _repository.Update(user); + Entities.User entity = await _repository.UpdateAsync(user); return _mapper.Map(entity); } } diff --git a/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs b/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs index d68b9116..e1095dd2 100644 --- a/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs @@ -13,14 +13,14 @@ public ActivityRepository(ApplicationDbContext context) _context = context; } - public async Task Create(Activity model) + public async Task CreateAsync(Activity model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) + public async Task> GetAllAsync(int skip, int take) { return await _context.Activities .Skip(skip) @@ -30,7 +30,7 @@ public async Task> GetAll(int skip, int take) .ToListAsync(); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.Activities .IgnoreQueryFilters() @@ -38,15 +38,15 @@ public async Task> GetAll(int skip, int take) .FirstOrDefaultAsync(x => x.Id == id); } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - Activity model = await GetById(id) + Activity model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task Update(Activity model) + public async Task UpdateAsync(Activity model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); diff --git a/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs b/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs index 2fc7c8fc..4646b031 100644 --- a/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ActivityTypeRepository.cs @@ -15,22 +15,22 @@ public ActivityTypeRepository(ApplicationDbContext context) } #endregion Global Scope - public async Task Create(ActivityType model) + public async Task CreateAsync(ActivityType model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - ActivityType model = await GetById(id) + ActivityType model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.ActivityTypes .Include(x => x.Notice) @@ -40,7 +40,7 @@ public async Task Delete(Guid? id) ?? throw new Exception($"Nenhum tipo de atividade encontrado para o id {id}"); } - public async Task> GetByNoticeId(Guid? noticeId) + public async Task> GetByNoticeIdAsync(Guid? noticeId) { List activityTypes = await _context.ActivityTypes .Include(x => x.Activities) @@ -60,7 +60,7 @@ await _context.Entry(activityType) return activityTypes; } - public async Task> GetLastNoticeActivities() + public async Task> GetLastNoticeActivitiesAsync() { Guid lastNoticeId = await _context.Notices .AsAsyncEnumerable() @@ -68,17 +68,17 @@ public async Task> GetLastNoticeActivities() .Select(x => x.Id) .FirstOrDefaultAsync() ?? throw new Exception("Nenhum Edital encontrado."); - return await GetByNoticeId(lastNoticeId); + return await GetByNoticeIdAsync(lastNoticeId); } - public async Task Update(ActivityType model) + public async Task UpdateAsync(ActivityType model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) + public async Task> GetAllAsync(int skip, int take) { return await _context.ActivityTypes .Skip(skip) diff --git a/src/Infrastructure/Persistence/Repositories/AreaRepository.cs b/src/Infrastructure/Persistence/Repositories/AreaRepository.cs index 12a45bfe..b781a077 100644 --- a/src/Infrastructure/Persistence/Repositories/AreaRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/AreaRepository.cs @@ -16,14 +16,14 @@ public AreaRepository(ApplicationDbContext context) #endregion Global Scope #region Public Methods - public async Task Create(Area model) + public async Task CreateAsync(Area model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task GetByCode(string? code) + public async Task GetByCodeAsync(string? code) { return await _context.Areas .Where(x => x.Code == code) @@ -31,7 +31,7 @@ public async Task Create(Area model) .FirstOrDefaultAsync(); } - public async Task> GetAreasByMainArea(Guid? mainAreaId, int skip, int take) + public async Task> GetAreasByMainAreaAsync(Guid? mainAreaId, int skip, int take) { return await _context.Areas .Where(x => x.MainAreaId == mainAreaId) @@ -43,7 +43,7 @@ public async Task> GetAreasByMainArea(Guid? mainAreaId, int sk .ToListAsync(); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.Areas .Include(x => x.MainArea) @@ -53,22 +53,22 @@ public async Task> GetAreasByMainArea(Guid? mainAreaId, int sk ?? throw new Exception($"Nenhuma Área encontrada para o id {id}"); } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - Area model = await GetById(id) + Area model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task Update(Area model) + public async Task UpdateAsync(Area model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); return model; } - public Task> GetAll(int skip, int take) + public Task> GetAllAsync(int skip, int take) { throw new NotImplementedException(); } diff --git a/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs b/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs index 428c8e79..0828f4e4 100644 --- a/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs @@ -16,14 +16,14 @@ public AssistanceTypeRepository(ApplicationDbContext context) #endregion Global Scope #region Public Methods - public async Task Create(AssistanceType model) + public async Task CreateAsync(AssistanceType model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) + public async Task> GetAllAsync(int skip, int take) { return await _context.AssistanceTypes .Skip(skip) @@ -33,7 +33,7 @@ public async Task> GetAll(int skip, int take) .ToListAsync(); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.AssistanceTypes .IgnoreQueryFilters() @@ -41,22 +41,22 @@ public async Task> GetAll(int skip, int take) .FirstOrDefaultAsync(x => x.Id == id); } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - AssistanceType model = await GetById(id) + AssistanceType model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task Update(AssistanceType model) + public async Task UpdateAsync(AssistanceType model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task GetAssistanceTypeByName(string name) + public async Task GetAssistanceTypeByNameAsync(string name) { string loweredName = name.ToLower(System.Globalization.CultureInfo.CurrentCulture); List entities = await _context.AssistanceTypes diff --git a/src/Infrastructure/Persistence/Repositories/CampusRepository.cs b/src/Infrastructure/Persistence/Repositories/CampusRepository.cs index 6e2c5dde..4f369238 100644 --- a/src/Infrastructure/Persistence/Repositories/CampusRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/CampusRepository.cs @@ -17,14 +17,14 @@ public CampusRepository(ApplicationDbContext context) #endregion Global Scope #region Public Methods - public async Task Create(Campus model) + public async Task CreateAsync(Campus model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) + public async Task> GetAllAsync(int skip, int take) { return await _context.Campuses .Skip(skip) @@ -34,7 +34,7 @@ public async Task> GetAll(int skip, int take) .ToListAsync(); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.Campuses .IgnoreQueryFilters() @@ -42,22 +42,22 @@ public async Task> GetAll(int skip, int take) .FirstOrDefaultAsync(x => x.Id == id); } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - Campus model = await GetById(id) + Campus model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task Update(Campus model) + public async Task UpdateAsync(Campus model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task GetCampusByName(string name) + public async Task GetCampusByNameAsync(string name) { string loweredName = name.ToLower(System.Globalization.CultureInfo.CurrentCulture); List entities = await _context.Campuses diff --git a/src/Infrastructure/Persistence/Repositories/CourseRepository.cs b/src/Infrastructure/Persistence/Repositories/CourseRepository.cs index 203eac05..10912efa 100644 --- a/src/Infrastructure/Persistence/Repositories/CourseRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/CourseRepository.cs @@ -17,14 +17,14 @@ public CourseRepository(ApplicationDbContext context) #endregion Global Scope #region Public Methods - public async Task Create(Course model) + public async Task CreateAsync(Course model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) + public async Task> GetAllAsync(int skip, int take) { return await _context.Courses .Skip(skip) @@ -34,7 +34,7 @@ public async Task> GetAll(int skip, int take) .ToListAsync(); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.Courses .IgnoreQueryFilters() @@ -42,22 +42,22 @@ public async Task> GetAll(int skip, int take) .FirstOrDefaultAsync(x => x.Id == id); } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - Course model = await GetById(id) + Course model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task Update(Course model) + public async Task UpdateAsync(Course model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task GetCourseByName(string name) + public async Task GetCourseByNameAsync(string name) { string loweredName = name.ToLower(System.Globalization.CultureInfo.CurrentCulture); List entities = await _context.Courses diff --git a/src/Infrastructure/Persistence/Repositories/MainAreaRepository.cs b/src/Infrastructure/Persistence/Repositories/MainAreaRepository.cs index 8e56bae2..924d7829 100644 --- a/src/Infrastructure/Persistence/Repositories/MainAreaRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/MainAreaRepository.cs @@ -17,14 +17,14 @@ public MainAreaRepository(ApplicationDbContext context) #endregion Global Scope #region Public Methods - public async Task Create(MainArea model) + public async Task CreateAsync(MainArea model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task GetByCode(string? code) + public async Task GetByCodeAsync(string? code) { return await _context.MainAreas .Where(x => x.Code == code) @@ -32,7 +32,7 @@ public async Task Create(MainArea model) .FirstOrDefaultAsync(); } - public async Task> GetAll(int skip, int take) + public async Task> GetAllAsync(int skip, int take) { return await _context.MainAreas .Skip(skip) @@ -42,7 +42,7 @@ public async Task> GetAll(int skip, int take) .ToListAsync(); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.MainAreas .IgnoreQueryFilters() @@ -50,15 +50,15 @@ public async Task> GetAll(int skip, int take) .FirstOrDefaultAsync(x => x.Id == id); } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - MainArea model = await GetById(id) + MainArea model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task Update(MainArea model) + public async Task UpdateAsync(MainArea model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); diff --git a/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs b/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs index eb41ebdc..9c684d6b 100644 --- a/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs @@ -17,14 +17,14 @@ public NoticeRepository(ApplicationDbContext context) #endregion Global Scope #region Public Methods - public async Task Create(Notice model) + public async Task CreateAsync(Notice model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) + public async Task> GetAllAsync(int skip, int take) { return await _context.Notices .Skip(skip) @@ -34,7 +34,7 @@ public async Task> GetAll(int skip, int take) .ToListAsync(); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.Notices .IgnoreQueryFilters() @@ -42,22 +42,22 @@ public async Task> GetAll(int skip, int take) .FirstOrDefaultAsync(x => x.Id == id); } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - Notice model = await GetById(id) + Notice model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task Update(Notice model) + public async Task UpdateAsync(Notice model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task GetNoticeByPeriod(DateTime start, DateTime end) + public async Task GetNoticeByPeriodAsync(DateTime start, DateTime end) { DateTime startDate = start.ToUniversalTime(); DateTime finalDate = end.ToUniversalTime(); diff --git a/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs b/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs index ff7b566f..b4aed51f 100644 --- a/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs @@ -16,14 +16,14 @@ public ProfessorRepository(ApplicationDbContext context) #endregion Global Scope #region Public Methods - public async Task Create(Professor model) + public async Task CreateAsync(Professor model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) + public async Task> GetAllAsync(int skip, int take) { return await _context.Professors .Include(x => x.User) @@ -34,7 +34,7 @@ public async Task> GetAll(int skip, int take) .ToListAsync(); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.Professors .Include(x => x.User) @@ -43,22 +43,22 @@ public async Task> GetAll(int skip, int take) .FirstOrDefaultAsync(x => x.Id == id); } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - Professor model = await GetById(id) + Professor model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task Update(Professor model) + public async Task UpdateAsync(Professor model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAllActiveProfessors() + public async Task> GetAllActiveProfessorsAsync() { return await _context.Professors .Include(x => x.User) diff --git a/src/Infrastructure/Persistence/Repositories/ProgramTypeRepository.cs b/src/Infrastructure/Persistence/Repositories/ProgramTypeRepository.cs index d594cf3f..f0fc6a6f 100644 --- a/src/Infrastructure/Persistence/Repositories/ProgramTypeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProgramTypeRepository.cs @@ -17,14 +17,14 @@ public ProgramTypeRepository(ApplicationDbContext context) #endregion Global Scope #region Public Methods - public async Task Create(ProgramType model) + public async Task CreateAsync(ProgramType model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) + public async Task> GetAllAsync(int skip, int take) { return await _context.ProgramTypes .Skip(skip) @@ -34,7 +34,7 @@ public async Task> GetAll(int skip, int take) .ToListAsync(); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.ProgramTypes .IgnoreQueryFilters() @@ -42,22 +42,22 @@ public async Task> GetAll(int skip, int take) .FirstOrDefaultAsync(x => x.Id == id); } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - ProgramType model = await GetById(id) + ProgramType model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task Update(ProgramType model) + public async Task UpdateAsync(ProgramType model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task GetProgramTypeByName(string name) + public async Task GetProgramTypeByNameAsync(string name) { string loweredName = name.ToLower(System.Globalization.CultureInfo.CurrentCulture); List entities = await _context.ProgramTypes diff --git a/src/Infrastructure/Persistence/Repositories/ProjectActivityRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectActivityRepository.cs index 2aa3c374..5ad2bfaa 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectActivityRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectActivityRepository.cs @@ -13,14 +13,14 @@ public ProjectActivityRepository(ApplicationDbContext context) _context = context; } - public async Task Create(ProjectActivity model) + public async Task CreateAsync(ProjectActivity model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) + public async Task> GetAllAsync(int skip, int take) { return await _context.ProjectActivities .Skip(skip) @@ -29,7 +29,7 @@ public async Task> GetAll(int skip, int take) .ToListAsync(); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.ProjectActivities .IgnoreQueryFilters() @@ -37,22 +37,22 @@ public async Task> GetAll(int skip, int take) .FirstOrDefaultAsync(x => x.Id == id); } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - ProjectActivity model = await GetById(id) + ProjectActivity model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task Update(ProjectActivity model) + public async Task UpdateAsync(ProjectActivity model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetByProjectId(Guid? projectId) + public async Task> GetByProjectIdAsync(Guid? projectId) { return await _context.ProjectActivities .AsAsyncEnumerable() diff --git a/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs index 4441005e..bd75b3d8 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectEvaluationRepository.cs @@ -13,14 +13,14 @@ public ProjectEvaluationRepository(ApplicationDbContext context) _context = context; } - public async Task Create(ProjectEvaluation model) + public async Task CreateAsync(ProjectEvaluation model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.ProjectEvaluations .Include(x => x.Project) @@ -33,7 +33,7 @@ public async Task Create(ProjectEvaluation model) ?? throw new Exception($"Nenhuma avaliação encontrada para o id {id}"); } - public async Task GetByProjectId(Guid? projectId) + public async Task GetByProjectIdAsync(Guid? projectId) { return await _context.ProjectEvaluations .Include(x => x.Project) @@ -46,7 +46,7 @@ public async Task Create(ProjectEvaluation model) ?? throw new Exception($"Nenhuma avaliação encontrada para o ProjectId {projectId}"); } - public async Task Update(ProjectEvaluation model) + public async Task UpdateAsync(ProjectEvaluation model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); diff --git a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs index 81d7fb6d..c8f41d66 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs @@ -14,29 +14,29 @@ public ProjectRepository(ApplicationDbContext context) _context = context; } - public async Task Create(Project model) + public async Task CreateAsync(Project model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task Update(Project model) + public async Task UpdateAsync(Project model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - Project model = await GetById(id) + Project model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.Projects .Include(x => x.Notice) @@ -51,7 +51,7 @@ public async Task Delete(Guid? id) ?? throw new Exception($"Nenhum Projeto encontrado para o id {id}"); } - public async Task> GetProfessorProjects(int skip, int take, Guid? id, bool isClosed = false) + public async Task> GetProfessorProjectsAsync(int skip, int take, Guid? id, bool isClosed = false) { return isClosed ? await _context.Projects @@ -84,7 +84,7 @@ public async Task> GetProfessorProjects(int skip, int take, .ToListAsync(); } - public async Task> GetProjects(int skip, int take, bool isClosed = false) + public async Task> GetProjectsAsync(int skip, int take, bool isClosed = false) { return isClosed ? await _context.Projects @@ -113,7 +113,7 @@ public async Task> GetProjects(int skip, int take, bool isC .ToListAsync(); } - public async Task> GetStudentProjects(int skip, int take, Guid? id, bool isClosed = false) + public async Task> GetStudentProjectsAsync(int skip, int take, Guid? id, bool isClosed = false) { return isClosed ? await _context.Projects diff --git a/src/Infrastructure/Persistence/Repositories/StudentDocumentsRepository.cs b/src/Infrastructure/Persistence/Repositories/StudentDocumentsRepository.cs index 7cc1662e..81c9b771 100644 --- a/src/Infrastructure/Persistence/Repositories/StudentDocumentsRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/StudentDocumentsRepository.cs @@ -14,22 +14,22 @@ public StudentDocumentsRepository(ApplicationDbContext context) _context = context; } - public async Task Create(StudentDocuments model) + public async Task CreateAsync(StudentDocuments model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - StudentDocuments model = await GetById(id) + StudentDocuments model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task> GetAll(int skip, int take) + public async Task> GetAllAsync(int skip, int take) { return await _context.StudentDocuments .Include(x => x.Project) @@ -40,7 +40,7 @@ public async Task> GetAll(int skip, int take) .ToListAsync(); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.StudentDocuments .Include(x => x.Project) @@ -50,7 +50,7 @@ public async Task> GetAll(int skip, int take) ?? throw new Exception($"Nenhum Documento encontrado para o id {id}"); } - public async Task GetByProjectId(Guid? projectId) + public async Task GetByProjectIdAsync(Guid? projectId) { return await _context.StudentDocuments .Include(x => x.Project) @@ -60,7 +60,7 @@ public async Task> GetAll(int skip, int take) ?? throw new Exception($"Nenhum Documento encontrado para o projectId {projectId}"); } - public async Task GetByStudentId(Guid? studentId) + public async Task GetByStudentIdAsync(Guid? studentId) { return await _context.StudentDocuments .Include(x => x.Project) @@ -71,7 +71,7 @@ public async Task> GetAll(int skip, int take) ?? throw new Exception($"Nenhum Documento encontrado para o studentId {studentId}"); } - public async Task Update(StudentDocuments model) + public async Task UpdateAsync(StudentDocuments model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); diff --git a/src/Infrastructure/Persistence/Repositories/StudentRepository.cs b/src/Infrastructure/Persistence/Repositories/StudentRepository.cs index e2933fc9..b6513c6b 100644 --- a/src/Infrastructure/Persistence/Repositories/StudentRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/StudentRepository.cs @@ -16,14 +16,14 @@ public StudentRepository(ApplicationDbContext context) #endregion Global Scope #region Public Methods - public async Task Create(Student model) + public async Task CreateAsync(Student model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task> GetAll(int skip, int take) + public async Task> GetAllAsync(int skip, int take) { return await _context.Students .Include(x => x.User) @@ -34,7 +34,7 @@ public async Task> GetAll(int skip, int take) .ToListAsync(); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.Students .Include(x => x.User) @@ -45,22 +45,22 @@ public async Task> GetAll(int skip, int take) .FirstOrDefaultAsync(x => x.Id == id); } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - Student model = await GetById(id) + Student model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task Update(Student model) + public async Task UpdateAsync(Student model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task GetByRegistrationCode(string registrationCode) + public async Task GetByRegistrationCodeAsync(string registrationCode) { return await _context.Students .Include(x => x.User) diff --git a/src/Infrastructure/Persistence/Repositories/SubAreaRepository.cs b/src/Infrastructure/Persistence/Repositories/SubAreaRepository.cs index 506be875..e656c15a 100644 --- a/src/Infrastructure/Persistence/Repositories/SubAreaRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/SubAreaRepository.cs @@ -16,14 +16,14 @@ public SubAreaRepository(ApplicationDbContext context) #endregion Global Scope #region Public Methods - public async Task Create(SubArea model) + public async Task CreateAsync(SubArea model) { _ = _context.Add(model); _ = await _context.SaveChangesAsync(); return model; } - public async Task GetByCode(string? code) + public async Task GetByCodeAsync(string? code) { return await _context.SubAreas .Where(x => x.Code == code) @@ -33,7 +33,7 @@ public async Task Create(SubArea model) .FirstOrDefaultAsync(); } - public async Task> GetSubAreasByArea(Guid? areaId, int skip, int take) + public async Task> GetSubAreasByAreaAsync(Guid? areaId, int skip, int take) { return await _context.SubAreas .Where(x => x.AreaId == areaId) @@ -46,7 +46,7 @@ public async Task> GetSubAreasByArea(Guid? areaId, int skip .ToListAsync(); } - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.SubAreas .Include(x => x.Area) @@ -56,22 +56,22 @@ public async Task> GetSubAreasByArea(Guid? areaId, int skip .FirstOrDefaultAsync(x => x.Id == id); } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - SubArea model = await GetById(id) + SubArea model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } - public async Task Update(SubArea model) + public async Task UpdateAsync(SubArea model) { _ = _context.Update(model); _ = await _context.SaveChangesAsync(); return model; } - public Task> GetAll(int skip, int take) + public Task> GetAllAsync(int skip, int take) { throw new NotImplementedException(); } diff --git a/src/Infrastructure/Persistence/Repositories/UserRepository.cs b/src/Infrastructure/Persistence/Repositories/UserRepository.cs index 52794ed9..6a9db1b5 100644 --- a/src/Infrastructure/Persistence/Repositories/UserRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/UserRepository.cs @@ -16,13 +16,13 @@ public UserRepository(ApplicationDbContext context) #endregion Global Scope #region CRUD Methods - public async Task GetById(Guid? id) + public async Task GetByIdAsync(Guid? id) { return await _context.Users .FindAsync(id); } - public async Task> GetActiveUsers(int skip, int take) + public async Task> GetActiveUsersAsync(int skip, int take) { return await _context.Users .Skip(skip) @@ -31,7 +31,7 @@ public async Task> GetActiveUsers(int skip, int take) .ToListAsync(); } - public async Task> GetInactiveUsers(int skip, int take) + public async Task> GetInactiveUsersAsync(int skip, int take) { return await _context.Users .IgnoreQueryFilters() @@ -43,36 +43,36 @@ public async Task> GetInactiveUsers(int skip, int take) .ToListAsync(); } - public async Task Update(User user) + public async Task UpdateAsync(User user) { _ = _context.Update(user); _ = await _context.SaveChangesAsync(); return user; } - public async Task Create(User user) + public async Task CreateAsync(User user) { _ = _context.Add(user); _ = await _context.SaveChangesAsync(); return user; } - public async Task Delete(Guid? id) + public async Task DeleteAsync(Guid? id) { - User model = await GetById(id) + User model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); model.DeactivateEntity(); - return await Update(model); + return await UpdateAsync(model); } #endregion CRUD Methods #region Auth Methods - public async Task GetUserByEmail(string? email) + public async Task GetUserByEmailAsync(string? email) { return await _context.Users.FirstOrDefaultAsync(x => x.Email == email); } - public async Task GetUserByCPF(string? cpf) + public async Task GetUserByCPFAsync(string? cpf) { return await _context.Users.FirstOrDefaultAsync(x => x.CPF == cpf); } diff --git a/src/Infrastructure/Services/AzureStorageService.cs b/src/Infrastructure/Services/AzureStorageService.cs index 6303c5d2..33499b33 100644 --- a/src/Infrastructure/Services/AzureStorageService.cs +++ b/src/Infrastructure/Services/AzureStorageService.cs @@ -35,7 +35,7 @@ public AzureStorageService(IConfiguration configuration, IDotEnvSecrets dotEnvSe } #endregion Global Scope - public async Task DeleteFile(string filePath) + public async Task DeleteFileAsync(string filePath) { // Cria o cliente do blob string? fileName = filePath.Split("/").LastOrDefault(); @@ -53,7 +53,7 @@ public async Task UploadFileAsync(IFormFile file, string? filePath = nul if (!string.IsNullOrEmpty(filePath)) { // Deleta o arquivo - await DeleteFile(filePath); + await DeleteFileAsync(filePath); // Utiliza o mesmo nome do arquivo anterior para o arquivo atual filePath = filePath.Split("/").LastOrDefault(); diff --git a/src/Infrastructure/Services/StorageFileService.cs b/src/Infrastructure/Services/StorageFileService.cs index 7f858734..9ddda683 100644 --- a/src/Infrastructure/Services/StorageFileService.cs +++ b/src/Infrastructure/Services/StorageFileService.cs @@ -52,7 +52,7 @@ public async Task UploadFileAsync(IFormFile file, string? filePath = nul return filePath; } - public async Task DeleteFile(string filePath) + public async Task DeleteFileAsync(string filePath) { try { @@ -105,7 +105,7 @@ private async Task GenerateFilePath(IFormFile file, string custom_direct // Deleta o arquivo se o caminho do arquivo for informado else { - await DeleteFile(filePath); + await DeleteFileAsync(filePath); } return filePath; } From 64ed9d8ec55ec39b45b7b282d75db80d565da0a5 Mon Sep 17 00:00:00 2001 From: eduardo Date: Fri, 4 Aug 2023 09:05:22 -0300 Subject: [PATCH 074/201] feat: enable CORS --- src/Infrastructure/WebAPI/Startup.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Infrastructure/WebAPI/Startup.cs b/src/Infrastructure/WebAPI/Startup.cs index 87dd3614..d09efabe 100644 --- a/src/Infrastructure/WebAPI/Startup.cs +++ b/src/Infrastructure/WebAPI/Startup.cs @@ -74,6 +74,14 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) // Redirect HTTP requests to HTTPS for secure communication _ = app.UseHttpsRedirection(); + // Enable CORS + _ = app.UseCors(builder => + { + builder.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader(); + }); + // Enable routing for incoming requests _ = app.UseRouting(); From d77df0f7f21ce52a49e2cd01b336fa7c062fa220 Mon Sep 17 00:00:00 2001 From: eduardo Date: Fri, 4 Aug 2023 16:26:16 -0300 Subject: [PATCH 075/201] fix: adjust CORS configuration --- src/Infrastructure/IoC/DependencyInjection.cs | 18 +++++- src/Infrastructure/WebAPI/Startup.cs | 57 +++++++------------ 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs index 890d3d32..804cd851 100644 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ b/src/Infrastructure/IoC/DependencyInjection.cs @@ -32,7 +32,7 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); #endregion Inicialização do banco de dados - #region Serviço de Log  + #region Serviço de Log Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .CreateLogger(); @@ -41,10 +41,22 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi _ = loggingBuilder.ClearProviders(); _ = loggingBuilder.AddSerilog(Log.Logger, dispose: true); }); - #endregion Serviço de Log  + #endregion Serviço de Log - #region Serviço de E-mail + #region CORS + services.AddCors(options => + { + options.AddDefaultPolicy( + policy => + { + _ = policy.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader(); + }); + }); + #endregion CORS + #region Serviço de E-mail SmtpConfiguration smtpConfig = new(); configuration.GetSection("SmtpConfiguration").Bind(smtpConfig); smtpConfig.Password = dotEnvSecrets.GetSmtpUserPassword(); diff --git a/src/Infrastructure/WebAPI/Startup.cs b/src/Infrastructure/WebAPI/Startup.cs index d09efabe..39fa0c7c 100644 --- a/src/Infrastructure/WebAPI/Startup.cs +++ b/src/Infrastructure/WebAPI/Startup.cs @@ -16,33 +16,21 @@ public class Startup public void ConfigureServices(IServiceCollection services) { // Adição dos Controllers - _ = services.AddControllers(); + services.AddControllers(); // Realiza comunicação com os demais Projetos. - _ = services.AddInfrastructure(); - _ = services.AddAdapters(); - _ = services.AddDomain(); + services.AddInfrastructure(); + services.AddAdapters(); + services.AddDomain(); // Configuração do Swagger - _ = services.AddInfrastructureSwagger(); + services.AddInfrastructureSwagger(); // Configuração do JWT - _ = services.AddInfrastructureJWT(); + services.AddInfrastructureJWT(); // Permite que rotas sejam acessíveis em lowercase - _ = services.AddRouting(options => options.LowercaseUrls = true); - - // Configuração do CORS - _ = services.AddCors(options => - { - options.AddDefaultPolicy( - policy => - { - _ = policy.AllowAnyOrigin() - .AllowAnyMethod() - .AllowAnyHeader(); - }); - }); + services.AddRouting(options => options.LowercaseUrls = true); } /// @@ -55,48 +43,43 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) if (env.IsDevelopment()) { // Show detailed error page in development mode - _ = app.UseDeveloperExceptionPage(); + app.UseDeveloperExceptionPage(); // Enable Swagger middleware for API documentation in development mode - _ = app.UseSwagger(); - _ = app.UseSwaggerUI(); + app.UseSwagger(); + app.UseSwaggerUI(); // Show development mode message Console.WriteLine("Development mode"); } // UseExceptionHandler for non-development environments - _ = app.UseMiddleware(); + app.UseMiddleware(); // Enable HTTP Strict Transport Security (HSTS) headers for secure communication - _ = app.UseHsts(); + app.UseHsts(); // Redirect HTTP requests to HTTPS for secure communication - _ = app.UseHttpsRedirection(); + app.UseHttpsRedirection(); // Enable CORS - _ = app.UseCors(builder => - { - builder.AllowAnyOrigin() - .AllowAnyMethod() - .AllowAnyHeader(); - }); + app.UseCors(); // Enable routing for incoming requests - _ = app.UseRouting(); + app.UseRouting(); // Enable authentication for the API - _ = app.UseAuthentication(); + app.UseAuthentication(); // Enable authorization for the API - _ = app.UseAuthorization(); + app.UseAuthorization(); // Apply rate limiting middleware to control the number of requests allowed - _ = app.UseClientRateLimiting(); - _ = app.UseIpRateLimiting(); + app.UseClientRateLimiting(); + app.UseIpRateLimiting(); // Configure API endpoints - _ = app.UseEndpoints(endpoints => endpoints.MapControllers()); + app.UseEndpoints(endpoints => endpoints.MapControllers()); } } } \ No newline at end of file From 315c0429d951a4794b256284e78b95c102eea530 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 5 Aug 2023 09:44:34 -0300 Subject: [PATCH 076/201] feat: add ProjectReport usecases and entity --- src/CopetSystem.API.sln | 7 ++ src/Domain/Entities/Enums/EReportType.cs | 12 +++ src/Domain/Entities/ProjectEvaluation.cs | 2 +- src/Domain/Entities/ProjectReport.cs | 90 ++++++++++++++++ .../Repositories/IProjectReportRepository.cs | 7 ++ .../ProjectReport/CreateProjectReport.cs | 100 ++++++++++++++++++ .../ProjectReport/DeleteProjectReport.cs | 33 ++++++ .../ProjectReport/GetProjectReportById.cs | 29 +++++ .../ProjectReport/UpdateProjectReport.cs | 86 +++++++++++++++ .../ProjectReport/ICreateProjectReport.cs | 10 ++ .../ProjectReport/IDeleteProjectReport.cs | 9 ++ .../ProjectReport/IGetProjectReportById.cs | 9 ++ .../ProjectReport/IUpdateProjectReport.cs | 9 ++ .../BaseProjectReportContract.cs | 12 +++ .../ProjectReport/CreateProjectReportInput.cs | 12 +++ .../DetailedReadProjectReportOutput.cs | 11 ++ .../ProjectReport/UpdateProjectReportInput.cs | 11 ++ 17 files changed, 448 insertions(+), 1 deletion(-) create mode 100644 src/Domain/Entities/Enums/EReportType.cs create mode 100644 src/Domain/Entities/ProjectReport.cs create mode 100644 src/Domain/Interfaces/Repositories/IProjectReportRepository.cs create mode 100644 src/Domain/UseCases/Interactors/ProjectReport/CreateProjectReport.cs create mode 100644 src/Domain/UseCases/Interactors/ProjectReport/DeleteProjectReport.cs create mode 100644 src/Domain/UseCases/Interactors/ProjectReport/GetProjectReportById.cs create mode 100644 src/Domain/UseCases/Interactors/ProjectReport/UpdateProjectReport.cs create mode 100644 src/Domain/UseCases/Interfaces/ProjectReport/ICreateProjectReport.cs create mode 100644 src/Domain/UseCases/Interfaces/ProjectReport/IDeleteProjectReport.cs create mode 100644 src/Domain/UseCases/Interfaces/ProjectReport/IGetProjectReportById.cs create mode 100644 src/Domain/UseCases/Interfaces/ProjectReport/IUpdateProjectReport.cs create mode 100644 src/Domain/UseCases/Ports/ProjectReport/BaseProjectReportContract.cs create mode 100644 src/Domain/UseCases/Ports/ProjectReport/CreateProjectReportInput.cs create mode 100644 src/Domain/UseCases/Ports/ProjectReport/DetailedReadProjectReportOutput.cs create mode 100644 src/Domain/UseCases/Ports/ProjectReport/UpdateProjectReportInput.cs diff --git a/src/CopetSystem.API.sln b/src/CopetSystem.API.sln index 09b0f150..3bf58dd0 100644 --- a/src/CopetSystem.API.sln +++ b/src/CopetSystem.API.sln @@ -21,6 +21,8 @@ Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "Docker\do EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Services", "Infrastructure\Services\Services.csproj", "{7555C53A-BADC-49D9-82BE-C4D8587260EB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain.Tests", "Domain.Tests\Domain.Tests.csproj", "{8462166B-3145-422A-A658-47F32BFBDF0D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -94,11 +96,16 @@ Global {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Debug|Any CPU.Build.0 = Debug|Any CPU {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Release|Any CPU.ActiveCfg = Release|Any CPU {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Release|Any CPU.Build.0 = Release|Any CPU + {8462166B-3145-422A-A658-47F32BFBDF0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8462166B-3145-422A-A658-47F32BFBDF0D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8462166B-3145-422A-A658-47F32BFBDF0D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8462166B-3145-422A-A658-47F32BFBDF0D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {FCC65F72-7AF9-4940-B07A-E7DDDC7967B7} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} {DC12A23D-7BF2-4F0A-A317-B9FA8818C9C2} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} {163219BE-A0D2-41A1-A028-501AAB069BD9} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} {7555C53A-BADC-49D9-82BE-C4D8587260EB} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} + {8462166B-3145-422A-A658-47F32BFBDF0D} = {370C1BE1-63EE-4D2E-AD4A-6D8392EEFF40} EndGlobalSection EndGlobal diff --git a/src/Domain/Entities/Enums/EReportType.cs b/src/Domain/Entities/Enums/EReportType.cs new file mode 100644 index 00000000..50098cae --- /dev/null +++ b/src/Domain/Entities/Enums/EReportType.cs @@ -0,0 +1,12 @@ +using System.ComponentModel; + +namespace Domain.Entities.Enums +{ + public enum EReportType + { + [Description("Parcial")] + Partial, + [Description("Final")] + Final + } +} \ No newline at end of file diff --git a/src/Domain/Entities/ProjectEvaluation.cs b/src/Domain/Entities/ProjectEvaluation.cs index 4ad99afc..6747422a 100644 --- a/src/Domain/Entities/ProjectEvaluation.cs +++ b/src/Domain/Entities/ProjectEvaluation.cs @@ -15,7 +15,7 @@ public Guid? ProjectId set { EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(IsProductivityFellow))); + ExceptionMessageFactory.Required(nameof(ProjectId))); _projectId = value; } } diff --git a/src/Domain/Entities/ProjectReport.cs b/src/Domain/Entities/ProjectReport.cs new file mode 100644 index 00000000..6f6747f3 --- /dev/null +++ b/src/Domain/Entities/ProjectReport.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Domain.Entities.Enums; +using Domain.Entities.Primitives; +using Domain.Validation; + +namespace Domain.Entities +{ + public class ProjectReport : Entity + { + /// + /// URL do relatório. + /// + public string? ReportUrl { get; set; } + + private EReportType? _reportType; + /// + /// Tipo do relatório. + /// + public EReportType? ReportType + { + get { return _reportType; } + set + { + EntityExceptionValidation.When(value == null, + ExceptionMessageFactory.Required(nameof(ReportType))); + EntityExceptionValidation.When(!Enum.TryParse(value.ToString(), out var _), + ExceptionMessageFactory.Invalid(nameof(ReportType))); + _reportType = value; + } + } + + private DateTime? _sendDate; + /// + /// Data de envio do relatório. + /// + public DateTime? SendDate + { + get => _sendDate; + set + { + EntityExceptionValidation.When(value is null, + ExceptionMessageFactory.Required(nameof(SendDate))); + _sendDate = value.HasValue ? value.Value.ToUniversalTime() : null; + } + } + + private Guid? _projectId; + /// + /// Id do projeto. + /// + public Guid? ProjectId + { + get => _projectId; + set + { + EntityExceptionValidation.When(value is null, + ExceptionMessageFactory.Required(nameof(ProjectId))); + _projectId = value; + } + } + + private Guid? _userId; + /// + /// Id do usuário que fez o envio do relatório. + /// + public Guid? UserId + { + get => _userId; + set + { + EntityExceptionValidation.When(value is null, + ExceptionMessageFactory.Required(nameof(UserId))); + _userId = value; + } + } + + public virtual Project? Project { get; set; } + public virtual User? User { get; set; } + + public ProjectReport(EReportType? reportType, Guid? projectId) + { + ReportType = reportType; + SendDate = DateTime.UtcNow; + ProjectId = projectId; + } + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProjectReportRepository.cs b/src/Domain/Interfaces/Repositories/IProjectReportRepository.cs new file mode 100644 index 00000000..6a3e65b3 --- /dev/null +++ b/src/Domain/Interfaces/Repositories/IProjectReportRepository.cs @@ -0,0 +1,7 @@ +using Domain.Entities; +using Domain.Interfaces.Repositories.Bases; + +namespace Domain.Interfaces.Repositories +{ + public interface IProjectReportRepository : IGenericCRUDRepository { } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interactors/ProjectReport/CreateProjectReport.cs b/src/Domain/UseCases/Interactors/ProjectReport/CreateProjectReport.cs new file mode 100644 index 00000000..0b139a12 --- /dev/null +++ b/src/Domain/UseCases/Interactors/ProjectReport/CreateProjectReport.cs @@ -0,0 +1,100 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Domain.Ports.ProjectReport; +using Domain.UseCases.Interfaces.ProjectReport; +using Domain.UseCases.Ports.ProjectReport; +using Domain.Validation; + +namespace Domain.UseCases.Interactors.ProjectReport +{ + public class CreateProjectReport : ICreateProjectReport + { + #region Global Scope + private readonly IProjectReportRepository _projectReportRepository; + private readonly IProjectRepository _projectRepository; + private readonly IStorageFileService _storageFileService; + private readonly ITokenAuthenticationService _tokenAuthenticationService; + private readonly IMapper _mapper; + public CreateProjectReport(IProjectReportRepository projectReportRepository, + IProjectRepository projectRepository, + IStorageFileService storageFileService, + ITokenAuthenticationService tokenAuthenticationService, + IMapper mapper) + { + _projectReportRepository = projectReportRepository; + _projectRepository = projectRepository; + _storageFileService = storageFileService; + _tokenAuthenticationService = tokenAuthenticationService; + _mapper = mapper; + } + #endregion Global Scope + + public async Task ExecuteAsync(CreateProjectReportInput input) + { + // Cria entidade a partir do modelo + Entities.ProjectReport report = new( + TryCastEnum(input.ReportType), + input.ProjectId + ); + + // Obtém usuário logado + Ports.Auth.UserClaimsOutput user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + + // Verifica se o projeto existe + Entities.Project project = await _projectRepository.GetByIdAsync(report.ProjectId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + + // Verifica se o projeto foi excluído + UseCaseException.BusinessRuleViolation(project.DeletedAt != null, + "O projeto informado já foi removido."); + + // Verifica se o projeto está em andamento + UseCaseException.BusinessRuleViolation(project.Status != Entities.Enums.EProjectStatus.Started, + "O projeto informado não está em andamento."); + + // Verifica se o relatório está sendo enviado dentro do prazo + var isBeforeDeadline = report.ReportType == Entities.Enums.EReportType.Final + ? project.Notice?.FinalReportDeadline < DateTime.UtcNow + : project.Notice?.PartialReportDeadline < DateTime.UtcNow; + + // Lança exceção caso o relatório esteja sendo enviado fora do prazo + UseCaseException.BusinessRuleViolation(isBeforeDeadline, + "Relatório enviado fora do prazo estipulado no edital."); + + // Tenta salvar o relatório no repositório de arquivos na núvem + string? fileUrl = await _storageFileService.UploadFileAsync(input.ReportFile!); + + // Salva o link do arquivo no relatório + report.ReportUrl = fileUrl; + + // Salva o Id do usuário logado no relatório + report.UserId = user.Id; + + // Cria entidade + report = await _projectReportRepository.CreateAsync(report); + + // Salva entidade no banco + return _mapper.Map(report); + } + + /// + /// Tenta converter um objeto para um tipo Enum. + /// + /// Valor a ser convertido. + /// Tipo para o qual ser convertido. + /// Objeto com tipo convertido. + private static T TryCastEnum(object? value) + { + try + { + UseCaseException.NotInformedParam(value is null, typeof(T).ToString()); + return (T)Enum.Parse(typeof(T), value?.ToString()!); + } + catch (Exception) + { + throw UseCaseException.BusinessRuleViolation($"Não foi possível converter o valor {value} para o tipo {typeof(T)}."); + } + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interactors/ProjectReport/DeleteProjectReport.cs b/src/Domain/UseCases/Interactors/ProjectReport/DeleteProjectReport.cs new file mode 100644 index 00000000..9ee9b9c7 --- /dev/null +++ b/src/Domain/UseCases/Interactors/ProjectReport/DeleteProjectReport.cs @@ -0,0 +1,33 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.ProjectReport; +using Domain.UseCases.Ports.ProjectReport; +using Domain.Validation; + +namespace Domain.UseCases.Interactors.ProjectReport +{ + public class DeleteProjectReport : IDeleteProjectReport + { + #region Global Scope + private readonly IProjectReportRepository _repository; + private readonly IMapper _mapper; + public DeleteProjectReport(IProjectReportRepository repository, IMapper mapper) + { + _repository = repository; + _mapper = mapper; + } + #endregion Global Scope + + public async Task ExecuteAsync(Guid? id) + { + // Verifica se o id foi informado + UseCaseException.NotInformedParam(id is null, nameof(id)); + + // Remove a entidade + Entities.ProjectReport model = await _repository.DeleteAsync(id); + + // Retorna o curso removido + return _mapper.Map(model); + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interactors/ProjectReport/GetProjectReportById.cs b/src/Domain/UseCases/Interactors/ProjectReport/GetProjectReportById.cs new file mode 100644 index 00000000..9f431ced --- /dev/null +++ b/src/Domain/UseCases/Interactors/ProjectReport/GetProjectReportById.cs @@ -0,0 +1,29 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Domain.UseCases.Interfaces.ProjectReport; +using Domain.UseCases.Ports.ProjectReport; +using Domain.Validation; + +namespace Domain.UseCases.Interactors.ProjectReport +{ + public class GetProjectReportById : IGetProjectReportById + { + #region Global Scope + private readonly IProjectReportRepository _repository; + private readonly IMapper _mapper; + public GetProjectReportById(IProjectReportRepository repository, IMapper mapper) + { + _repository = repository; + _mapper = mapper; + } + #endregion Global Scope + + public async Task ExecuteAsync(Guid? id) + { + UseCaseException.NotInformedParam(id is null, nameof(id)); + + Entities.ProjectReport? entity = await _repository.GetByIdAsync(id); + return _mapper.Map(entity); + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interactors/ProjectReport/UpdateProjectReport.cs b/src/Domain/UseCases/Interactors/ProjectReport/UpdateProjectReport.cs new file mode 100644 index 00000000..278c5757 --- /dev/null +++ b/src/Domain/UseCases/Interactors/ProjectReport/UpdateProjectReport.cs @@ -0,0 +1,86 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Domain.UseCases.Interfaces.ProjectReport; +using Domain.UseCases.Ports.ProjectReport; +using Domain.Validation; + +namespace Domain.UseCases.Interactors.ProjectReport +{ + public class UpdateProjectReport : IUpdateProjectReport + { + #region Global Scope + private readonly IProjectReportRepository _projectReportRepository; + private readonly IProjectRepository _projectRepository; + private readonly IStorageFileService _storageFileService; + private readonly ITokenAuthenticationService _tokenAuthenticationService; + private readonly IMapper _mapper; + public UpdateProjectReport(IProjectReportRepository projectReportRepository, + IProjectRepository projectRepository, + IStorageFileService storageFileService, + ITokenAuthenticationService tokenAuthenticationService, + IMapper mapper) + { + _projectReportRepository = projectReportRepository; + _projectRepository = projectRepository; + _storageFileService = storageFileService; + _tokenAuthenticationService = tokenAuthenticationService; + _mapper = mapper; + } + #endregion Global Scope + + public async Task ExecuteAsync(Guid? id, UpdateProjectReportInput input) + { + // Verifica se o id foi informado + UseCaseException.NotInformedParam(id is null, nameof(id)); + + // Verifica se o arquivo foi informado + UseCaseException.NotInformedParam(input.ReportFile is null, nameof(input.ReportFile)); + + // Obtém usuário logado + Ports.Auth.UserClaimsOutput user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + + // Recupera entidade que será atualizada + Entities.ProjectReport report = await _projectReportRepository.GetByIdAsync(id) ?? + throw UseCaseException.NotFoundEntityById(nameof(Entities.ProjectReport)); + + // Verifica se a entidade foi excluída + UseCaseException.BusinessRuleViolation(report.DeletedAt != null, + "O relatório informado já foi removido."); + + // Verifica se o projeto existe + Entities.Project project = await _projectRepository.GetByIdAsync(report.ProjectId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + + // Verifica se o projeto foi excluído + UseCaseException.BusinessRuleViolation(project.DeletedAt != null, + "O projeto informado já foi removido."); + + // Verifica se o projeto está em andamento + UseCaseException.BusinessRuleViolation(project.Status != Entities.Enums.EProjectStatus.Started, + "O projeto informado não está em andamento."); + + // Verifica se o relatório está sendo enviado dentro do prazo + var isBeforeDeadline = report.ReportType == Entities.Enums.EReportType.Final + ? project.Notice?.FinalReportDeadline < DateTime.UtcNow + : project.Notice?.PartialReportDeadline < DateTime.UtcNow; + + // Lança exceção caso o relatório esteja sendo enviado fora do prazo + UseCaseException.BusinessRuleViolation(isBeforeDeadline, + "Relatório enviado fora do prazo estipulado no edital."); + + // Atualiza o relatório na núvem + await _storageFileService.UploadFileAsync(input.ReportFile!, report.ReportUrl); + + // Atualiza atributos permitidos + report.UserId = user.Id; + report.SendDate = DateTime.UtcNow; + + // Salva entidade atualizada no banco + await _projectReportRepository.UpdateAsync(report); + + // Mapeia entidade para o modelo de saída e retorna + return _mapper.Map(report); + } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/ProjectReport/ICreateProjectReport.cs b/src/Domain/UseCases/Interfaces/ProjectReport/ICreateProjectReport.cs new file mode 100644 index 00000000..b7d8465c --- /dev/null +++ b/src/Domain/UseCases/Interfaces/ProjectReport/ICreateProjectReport.cs @@ -0,0 +1,10 @@ +using Domain.Ports.ProjectReport; +using Domain.UseCases.Ports.ProjectReport; + +namespace Domain.UseCases.Interfaces.ProjectReport +{ + public interface ICreateProjectReport + { + Task ExecuteAsync(CreateProjectReportInput input); + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/ProjectReport/IDeleteProjectReport.cs b/src/Domain/UseCases/Interfaces/ProjectReport/IDeleteProjectReport.cs new file mode 100644 index 00000000..c42bd689 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/ProjectReport/IDeleteProjectReport.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.ProjectReport; + +namespace Domain.UseCases.Interfaces.ProjectReport +{ + public interface IDeleteProjectReport + { + Task ExecuteAsync(Guid? id); + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/ProjectReport/IGetProjectReportById.cs b/src/Domain/UseCases/Interfaces/ProjectReport/IGetProjectReportById.cs new file mode 100644 index 00000000..7527b159 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/ProjectReport/IGetProjectReportById.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.ProjectReport; + +namespace Domain.UseCases.Interfaces.ProjectReport +{ + public interface IGetProjectReportById + { + Task ExecuteAsync(Guid? id); + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Interfaces/ProjectReport/IUpdateProjectReport.cs b/src/Domain/UseCases/Interfaces/ProjectReport/IUpdateProjectReport.cs new file mode 100644 index 00000000..b4acd8b0 --- /dev/null +++ b/src/Domain/UseCases/Interfaces/ProjectReport/IUpdateProjectReport.cs @@ -0,0 +1,9 @@ +using Domain.UseCases.Ports.ProjectReport; + +namespace Domain.UseCases.Interfaces.ProjectReport +{ + public interface IUpdateProjectReport + { + Task ExecuteAsync(Guid? id, UpdateProjectReportInput input); + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectReport/BaseProjectReportContract.cs b/src/Domain/UseCases/Ports/ProjectReport/BaseProjectReportContract.cs new file mode 100644 index 00000000..c04a2fbd --- /dev/null +++ b/src/Domain/UseCases/Ports/ProjectReport/BaseProjectReportContract.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace Domain.UseCases.Ports.ProjectReport +{ + public abstract class BaseProjectReportContract + { + [Required] + public int? ReportType { get; set; } + [Required] + public Guid? ProjectId { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectReport/CreateProjectReportInput.cs b/src/Domain/UseCases/Ports/ProjectReport/CreateProjectReportInput.cs new file mode 100644 index 00000000..dee1cc6b --- /dev/null +++ b/src/Domain/UseCases/Ports/ProjectReport/CreateProjectReportInput.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; +using Domain.UseCases.Ports.ProjectReport; +using Microsoft.AspNetCore.Http; + +namespace Domain.Ports.ProjectReport +{ + public class CreateProjectReportInput : BaseProjectReportContract + { + [Required] + public IFormFile? ReportFile { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectReport/DetailedReadProjectReportOutput.cs b/src/Domain/UseCases/Ports/ProjectReport/DetailedReadProjectReportOutput.cs new file mode 100644 index 00000000..a44778fa --- /dev/null +++ b/src/Domain/UseCases/Ports/ProjectReport/DetailedReadProjectReportOutput.cs @@ -0,0 +1,11 @@ +namespace Domain.UseCases.Ports.ProjectReport +{ + public class DetailedReadProjectReportOutput : BaseProjectReportContract + { + public Guid? Id { get; set; } + public DateTime? DeletedAt { get; set; } + public DateTime? SendDate { get; set; } + public string? ReportUrl { get; set; } + public Guid? UserId { get; set; } + } +} \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectReport/UpdateProjectReportInput.cs b/src/Domain/UseCases/Ports/ProjectReport/UpdateProjectReportInput.cs new file mode 100644 index 00000000..9745fdcd --- /dev/null +++ b/src/Domain/UseCases/Ports/ProjectReport/UpdateProjectReportInput.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Http; + +namespace Domain.UseCases.Ports.ProjectReport +{ + public class UpdateProjectReportInput + { + [Required] + public IFormFile? ReportFile { get; set; } + } +} \ No newline at end of file From fd6b610228b0d8dd92f7e90266e09986b59da485 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 5 Aug 2023 14:21:01 -0300 Subject: [PATCH 077/201] refactor: simplify projects architecture * replace Adapters for Application layer * move UseCases from Domain to Application * update layers to support changes --- src/Adapters/Adapters.csproj | 39 ---- .../Gateways/Activity/ActivityResponse.cs | 6 - .../Gateways/Activity/ActivityTypeResponse.cs | 7 - .../Gateways/Activity/BaseActivity.cs | 11 - .../Gateways/Activity/BaseActivityType.cs | 12 - .../Activity/CreateActivityRequest.cs | 12 - .../Activity/CreateActivityTypeRequest.cs | 12 - .../Activity/UpdateActivityRequest.cs | 13 -- .../Activity/UpdateActivityTypeRequest.cs | 13 -- .../Gateways/Area/CreateAreaRequest.cs | 7 - .../Gateways/Area/DetailedReadAreaResponse.cs | 14 -- .../Gateways/Area/ResumedReadAreaResponse.cs | 7 - .../Gateways/Area/UpdateAreaRequest.cs | 7 - .../CreateTypeAssistanceRequest.cs | 7 - .../DetailedReadTypeAssistanceResponse.cs | 7 - .../ResumedReadTypeAssistanceResponse.cs | 7 - .../UpdateTypeAssistanceRequest.cs | 7 - .../Gateways/Auth/UserLoginRequest.cs | 7 - .../Gateways/Auth/UserLoginResponse.cs | 7 - .../Gateways/Auth/UserResetPasswordRequest.cs | 7 - src/Adapters/Gateways/Base/IRequest.cs | 4 - src/Adapters/Gateways/Base/IResponse.cs | 4 - .../Gateways/Campus/CreateCampusRequest.cs | 7 - .../Campus/DetailedReadCampusResponse.cs | 7 - .../Campus/ResumedReadCampusResponse.cs | 7 - .../Gateways/Campus/UpdateCampusRequest.cs | 7 - .../Gateways/Course/CreateCourseRequest.cs | 7 - .../Course/DetailedReadCourseResponse.cs | 7 - .../Course/ResumedReadCourseResponse.cs | 7 - .../Gateways/Course/UpdateCourseRequest.cs | 7 - .../MainArea/CreateMainAreaRequest.cs | 7 - .../MainArea/DetailedReadMainAreaResponse.cs | 7 - .../MainArea/ResumedReadMainAreaResponse.cs | 7 - .../MainArea/UpdateMainAreaRequest.cs | 7 - .../Gateways/Notice/CreateNoticeRequest.cs | 13 -- .../Notice/DetailedReadNoticeResponse.cs | 7 - .../Notice/ResumedReadNoticeResponse.cs | 7 - .../Gateways/Notice/UpdateNoticeRequest.cs | 14 -- .../Professor/CreateProfessorRequest.cs | 7 - .../DetailedReadProfessorResponse.cs | 17 -- .../Professor/ResumedReadProfessorResponse.cs | 7 - .../Professor/UpdateProfessorRequest.cs | 7 - .../ProgramType/CreateProgramTypeRequest.cs | 7 - .../DetailedReadProgramTypeResponse.cs | 7 - .../ResumedReadProgramTypeResponse.cs | 7 - .../ProgramType/UpdateProgramTypeRequest.cs | 7 - .../Project/DetailedReadProjectResponse.cs | 7 - .../Gateways/Project/OpenProjectRequest.cs | 42 ---- .../Project/ResumedReadProjectResponse.cs | 7 - .../Gateways/Project/UpdateProjectRequest.cs | 38 --- .../ProjectActivity/BaseProjectActivity.cs | 10 - .../CreateProjectActivityRequest.cs | 2 - .../DetailedReadProjectActivityResponse.cs | 8 - .../EvaluateProjectActivityRequest.cs | 10 - .../ResumedReadProjectActivityResponse.cs | 7 - .../UpdateProjectActivityRequest.cs | 8 - .../DetailedReadProjectEvaluationResponse.cs | 7 - .../EvaluateAppealProjectRequest.cs | 7 - .../EvaluateSubmissionProjectRequest.cs | 33 --- .../Gateways/Student/CreateStudentRequest.cs | 7 - .../Student/DetailedReadStudentResponse.cs | 40 ---- .../Student/ResumedReadStudentResponse.cs | 7 - .../Gateways/Student/UpdateStudentRequest.cs | 7 - .../CreateStudentDocumentsRequest.cs | 7 - .../DetailedReadStudentDocumentsResponse.cs | 7 - .../ResumedReadStudentDocumentsResponse.cs | 7 - .../UpdateStudentDocumentsRequest.cs | 7 - .../Gateways/SubArea/CreateSubAreaRequest.cs | 7 - .../SubArea/DetailedReadSubAreaResponse.cs | 14 -- .../SubArea/ResumedReadSubAreaResponse.cs | 7 - .../Gateways/SubArea/UpdateSubAreaRequest.cs | 7 - .../Gateways/User/UserReadResponse.cs | 7 - .../Gateways/User/UserUpdateRequest.cs | 7 - .../Base/IGenericCRUDPresenterController.cs | 42 ---- .../IActivityPresenterController.cs | 10 - .../Interfaces/IAreaPresenterController.cs | 8 - .../Interfaces/IAuthPresenterController.cs | 10 - .../Interfaces/ICampusPresenterController.cs | 4 - .../Interfaces/ICoursePresenterController.cs | 4 - .../IMainAreaPresenterController.cs | 4 - .../Interfaces/INoticePresenterController.cs | 4 - .../IProfessorPresenterController.cs | 4 - .../IProgramTypePresenterController.cs | 4 - .../IProjectEvaluationPresenterController.cs | 12 - .../Interfaces/IProjectPresenterController.cs | 14 -- .../IStudentDocumentsPresenterController.cs | 11 - .../Interfaces/IStudentPresenterController.cs | 9 - .../Interfaces/ISubAreaPresenterController.cs | 8 - .../ITypeAssistancePresenterController.cs | 4 - .../Interfaces/IUserPresenterController.cs | 14 -- src/Adapters/Mappings/ActivityMappings.cs | 26 --- src/Adapters/Mappings/AreaMappings.cs | 19 -- src/Adapters/Mappings/AuthMappings.cs | 16 -- src/Adapters/Mappings/CampusMappings.cs | 17 -- src/Adapters/Mappings/CourseMappings.cs | 18 -- src/Adapters/Mappings/MainAreaMappings.cs | 17 -- src/Adapters/Mappings/NoticeMappings.cs | 21 -- src/Adapters/Mappings/ProfessorMappings.cs | 20 -- src/Adapters/Mappings/ProgramTypeMappings.cs | 17 -- .../Mappings/ProjectActivityMappings.cs | 18 -- .../Mappings/ProjectEvaluationMapping.cs | 20 -- src/Adapters/Mappings/ProjectMappings.cs | 21 -- .../Mappings/StudentDocumentsMappings.cs | 18 -- src/Adapters/Mappings/StudentMappings.cs | 24 -- src/Adapters/Mappings/SubAreaMappings.cs | 20 -- .../Mappings/TypeAssistanceMappings.cs | 17 -- src/Adapters/Mappings/UserMappings.cs | 15 -- .../ActivityPresenterController.cs | 35 --- .../AreaPresenterController.cs | 70 ------ .../AuthPresenterController.cs | 51 ---- .../CampusPresenterController.cs | 65 ------ .../CoursePresenterController.cs | 66 ------ .../MainAreaPresenterController.cs | 65 ------ .../NoticePresenterController.cs | 69 ------ .../ProfessorPresenterController.cs | 70 ------ .../ProgramTypePresenterController.cs | 65 ------ .../ProjectEvaluationPresenterController.cs | 51 ---- .../ProjectPresenterController.cs | 95 -------- .../StudentDocumentsPresenterController.cs | 67 ------ .../StudentPresenterController.cs | 80 ------- .../SubAreaPresenterController.cs | 71 ------ .../TypeAssistancePresenterController.cs | 70 ------ .../UserPresenterController.cs | 74 ------ src/Application/Application.csproj | 19 ++ .../Interfaces/Services/IEmailService.cs | 2 +- .../Interfaces/Services/IHashService.cs | 2 +- .../Services/IStorageFileService.cs | 2 +- .../Services/ITokenAuthenticationService.cs | 4 +- .../ActivityType/IGetActivitiesByNoticeId.cs | 4 +- .../ActivityType/IGetLastNoticeActivities.cs | 4 +- .../Interfaces/UseCases}/Area/ICreateArea.cs | 4 +- .../Interfaces/UseCases}/Area/IDeleteArea.cs | 4 +- .../Interfaces/UseCases}/Area/IGetAreaById.cs | 4 +- .../UseCases}/Area/IGetAreasByMainArea.cs | 4 +- .../Interfaces/UseCases}/Area/IUpdateArea.cs | 4 +- .../AssistanceType/ICreateAssistanceType.cs | 4 +- .../AssistanceType/IDeleteAssistanceType.cs | 4 +- .../AssistanceType/IGetAssistanceTypeById.cs | 4 +- .../AssistanceType/IGetAssistanceTypes.cs | 4 +- .../AssistanceType/IUpdateAssistanceType.cs | 4 +- .../UseCases}/Auth/IConfirmEmail.cs | 2 +- .../UseCases}/Auth/IForgotPassword.cs | 2 +- .../Interfaces/UseCases}/Auth/ILogin.cs | 4 +- .../UseCases}/Auth/IResetPassword.cs | 4 +- .../UseCases}/Campus/ICreateCampus.cs | 4 +- .../UseCases}/Campus/IDeleteCampus.cs | 4 +- .../UseCases}/Campus/IGetCampusById.cs | 4 +- .../UseCases}/Campus/IGetCampuses.cs | 4 +- .../UseCases}/Campus/IUpdateCampus.cs | 4 +- .../UseCases}/Course/ICreateCourse.cs | 5 +- .../UseCases}/Course/IDeleteCourse.cs | 4 +- .../UseCases}/Course/IGetCourseById.cs | 4 +- .../UseCases}/Course/IGetCourses.cs | 4 +- .../UseCases}/Course/IUpdateCourse.cs | 4 +- .../UseCases}/MainArea/ICreateMainArea.cs | 4 +- .../UseCases}/MainArea/IDeleteMainArea.cs | 4 +- .../UseCases}/MainArea/IGetMainAreaById.cs | 4 +- .../UseCases}/MainArea/IGetMainAreas.cs | 4 +- .../UseCases}/MainArea/IUpdateMainArea.cs | 4 +- .../UseCases}/Notice/ICreateNotice.cs | 4 +- .../UseCases}/Notice/IDeleteNotice.cs | 4 +- .../UseCases}/Notice/IGetNoticeById.cs | 4 +- .../UseCases}/Notice/IGetNotices.cs | 4 +- .../UseCases}/Notice/IUpdateNotice.cs | 4 +- .../UseCases}/Professor/ICreateProfessor.cs | 4 +- .../UseCases}/Professor/IDeleteProfessor.cs | 4 +- .../UseCases}/Professor/IGetProfessorById.cs | 4 +- .../UseCases}/Professor/IGetProfessors.cs | 4 +- .../UseCases}/Professor/IUpdateProfessor.cs | 4 +- .../ProgramType/ICreateProgramType.cs | 4 +- .../ProgramType/IDeleteProgramType.cs | 4 +- .../ProgramType/IGetProgramTypeById.cs | 4 +- .../UseCases}/ProgramType/IGetProgramTypes.cs | 4 +- .../ProgramType/IUpdateProgramType.cs | 4 +- .../UseCases}/Project/IAppealProject.cs | 4 +- .../UseCases}/Project/ICancelProject.cs | 4 +- .../UseCases}/Project/IGetClosedProjects.cs | 4 +- .../UseCases}/Project/IGetOpenProjects.cs | 4 +- .../UseCases}/Project/IGetProjectById.cs | 4 +- .../UseCases}/Project/IOpenProject.cs | 4 +- .../UseCases}/Project/ISubmitProject.cs | 4 +- .../UseCases}/Project/IUpdateProject.cs | 4 +- .../IEvaluateAppealProject.cs | 6 +- .../IEvaluateSubmissionProject.cs | 6 +- .../IGetEvaluationByProjectId.cs | 4 +- .../ProjectReport/ICreateProjectReport.cs | 5 +- .../ProjectReport/IDeleteProjectReport.cs | 4 +- .../ProjectReport/IGetProjectReportById.cs | 4 +- .../ProjectReport/IUpdateProjectReport.cs | 4 +- .../UseCases}/Student/ICreateStudent.cs | 4 +- .../UseCases}/Student/IDeleteStudent.cs | 4 +- .../UseCases}/Student/IGetStudentById.cs | 4 +- .../Student/IGetStudentByRegistrationCode.cs | 4 +- .../UseCases}/Student/IGetStudents.cs | 4 +- .../Student/IRequestStudentRegister.cs | 2 +- .../UseCases}/Student/IUpdateStudent.cs | 4 +- .../ICreateStudentDocuments.cs | 4 +- .../IDeleteStudentDocuments.cs | 4 +- .../IGetStudentDocumentsByProjectId.cs | 4 +- .../IGetStudentDocumentsByStudentId.cs | 4 +- .../IUpdateStudentDocuments.cs | 4 +- .../UseCases}/SubArea/ICreateSubArea.cs | 4 +- .../UseCases}/SubArea/IDeleteSubArea.cs | 4 +- .../UseCases}/SubArea/IGetSubAreaById.cs | 4 +- .../UseCases}/SubArea/IGetSubAreasByArea.cs | 4 +- .../UseCases}/SubArea/IUpdateSubArea.cs | 4 +- .../UseCases}/User/IActivateUser.cs | 4 +- .../UseCases}/User/IDeactivateUser.cs | 4 +- .../UseCases}/User/IGetActiveUsers.cs | 4 +- .../UseCases}/User/IGetInactiveUsers.cs | 4 +- .../Interfaces/UseCases}/User/IGetUserById.cs | 4 +- .../Interfaces/UseCases}/User/IUpdateUser.cs | 4 +- .../Mappings/ActivityMappings.cs | 3 +- .../Mappings/AreaMappings.cs | 2 +- .../Mappings/AssistanceTypeMappings.cs | 2 +- .../Mappings/CampusMappings.cs | 2 +- .../Mappings/CourseMappings.cs | 3 +- .../Mappings/MainAreaMappings.cs | 2 +- .../Mappings/NoticeMappings.cs | 2 +- .../Mappings/ProfessorMappings.cs | 2 +- .../Mappings/ProgramTypeMappings.cs | 2 +- .../Mappings/ProjectEvaluationMappings.cs | 2 +- .../Mappings/ProjectMappings.cs | 2 +- .../Mappings/StudentDocumentsMappings.cs | 2 +- .../Mappings/StudentMappings.cs | 2 +- .../Mappings/SubAreaMappings.cs | 2 +- .../Mappings/UserMappings.cs | 2 +- .../Ports/Activity/ActivityOutput.cs | 4 +- .../Ports/Activity/ActivityTypeOutput.cs | 4 +- .../Ports/Activity/BaseActivity.cs | 2 +- .../Ports/Activity/BaseActivityType.cs | 2 +- .../Ports/Activity/CreateActivityInput.cs | 2 +- .../Ports/Activity/CreateActivityTypeInput.cs | 2 +- .../Ports/Activity/UpdateActivityInput.cs | 4 +- .../Ports/Activity/UpdateActivityTypeInput.cs | 3 +- .../Ports/Area/BaseAreaContract.cs | 2 +- .../Ports/Area/CreateAreaInput.cs | 2 +- .../Ports/Area/DetailedReadAreaOutput.cs | 4 +- .../Ports/Area/ResumedReadAreaOutput.cs | 2 +- .../Ports/Area/UpdateAreaInput.cs | 2 +- .../BaseAssistanceTypeContract.cs | 2 +- .../CreateAssistanceTypeInput.cs | 2 +- .../DetailedReadAssistanceTypeOutput.cs | 2 +- .../ResumedReadAssistanceTypeOutput.cs | 2 +- .../UpdateAssistanceTypeInput.cs | 2 +- .../Ports/Auth/UserClaimsOutput.cs | 2 +- .../Ports/Auth/UserLoginInput.cs | 2 +- .../Ports/Auth/UserLoginOutput.cs | 2 +- .../Ports/Auth/UserResetPasswordInput.cs | 2 +- .../Ports/Campus/BaseCampusContract.cs | 2 +- .../Ports/Campus/CreateCampusInput.cs | 2 +- .../Ports/Campus/DetailedReadCampusOutput.cs | 2 +- .../Ports/Campus/ResumedReadCampusOutput.cs | 2 +- .../Ports/Campus/UpdateCampusInput.cs | 2 +- .../Ports/Course/BaseCourseContract.cs | 2 +- .../Ports/Course/CreateCourseInput.cs | 4 +- .../Ports/Course/DetailedReadCourseOutput.cs | 2 +- .../Ports/Course/ResumedReadCourseOutput.cs | 2 +- .../Ports/Course/UpdateCourseInput.cs | 2 +- .../Ports/MainArea/BaseMainAreaContract.cs | 2 +- .../Ports/MainArea/CreateMainAreaInput.cs | 2 +- .../Ports/MainArea/DetailedMainAreaOutput.cs | 2 +- .../MainArea/ResumedReadMainAreaOutput.cs | 2 +- .../Ports/MainArea/UpdateMainAreaInput.cs | 2 +- .../Ports/Notice/BaseNoticeContract.cs | 2 +- .../Ports/Notice/CreateNoticeInput.cs | 4 +- .../Ports/Notice/DetailedReadNoticeOutput.cs | 2 +- .../Ports/Notice/ResumedReadNoticeOutput.cs | 2 +- .../Ports/Notice/UpdateNoticeInput.cs | 4 +- .../Ports/Professor/BaseProfessorContract.cs | 2 +- .../Ports/Professor/CreateProfessorInput.cs | 2 +- .../Professor/DetailedReadStudentOutput.cs | 4 +- .../Professor/ResumedReadStudentOutput.cs | 2 +- .../Ports/Professor/UpdateStudentInput.cs | 2 +- .../ProgramType/BaseProgramTypeContract.cs | 2 +- .../ProgramType/CreateProgramTypeInput.cs | 2 +- .../DetailedReadProgramTypeOutput.cs | 2 +- .../ResumedReadProgramTypeOutput.cs | 2 +- .../ProgramType/UpdateProgramTypeInput.cs | 2 +- .../Ports/Project/BaseProjectContract.cs | 2 +- .../Project/DetailedReadProjectOutput.cs | 2 +- .../Ports/Project/OpenProjectInput.cs | 4 +- .../Ports/Project/ProjectReportInput.cs | 2 +- .../Ports/Project/ProjectReportOutput.cs | 2 +- .../Ports/Project/ResumedReadProjectOutput.cs | 2 +- .../Ports/Project/UpdateProjectInput.cs | 4 +- .../BaseProjectActivityContract.cs | 2 +- .../CreateProjectActivityInput.cs | 2 +- .../DetailedReadProjectActivityOutput.cs | 2 +- .../EvaluateProjectActivityInput.cs | 2 +- .../ResumedReadProjectActivityOutput.cs | 2 +- .../UpdateProjectActivityInput.cs | 2 +- .../DetailedReadProjectEvaluationOutput.cs | 2 +- .../EvaluateAppealProjectInput.cs | 2 +- .../EvaluateSubmissionProjectInput.cs | 4 +- .../BaseProjectReportContract.cs | 2 +- .../ProjectReport/CreateProjectReportInput.cs | 4 +- .../DetailedReadProjectReportOutput.cs | 2 +- .../ProjectReport/UpdateProjectReportInput.cs | 2 +- .../Ports/Student/BaseStudentContract.cs | 2 +- .../Ports/Student/CreateStudentInput.cs | 2 +- .../Student/DetailedReadStudentOutput.cs | 8 +- .../Ports/Student/ResumedReadStudentOutput.cs | 2 +- .../Ports/Student/UpdateStudentInput.cs | 2 +- .../BaseStudentDocumentsOutput.cs | 2 +- .../CreateStudentDocumentsInput.cs | 2 +- .../DetailedReadStudentDocumentsOutput.cs | 2 +- .../ResumedReadStudentDocumentsOutput.cs | 2 +- .../UpdateStudentDocumentsInput.cs | 2 +- .../Ports/SubArea/BaseSubAreaContract.cs | 2 +- .../Ports/SubArea/CreateSubAreaInput.cs | 2 +- .../SubArea/DetailedReadSubAreaOutput.cs | 4 +- .../Ports/SubArea/ResumedReadSubAreaOutput.cs | 2 +- .../Ports/SubArea/UpdateSubAreaInput.cs | 2 +- .../Ports/User/UserReadOutput.cs | 2 +- .../Ports/User/UserUpdateInput.cs | 2 +- .../ActivityType/GetActivitiesByNoticeId.cs | 15 +- .../ActivityType/GetLastNoticeActivities.cs | 15 +- .../UseCases}/Area/CreateArea.cs | 10 +- .../UseCases}/Area/DeleteArea.cs | 10 +- .../UseCases}/Area/GetAreaById.cs | 10 +- .../UseCases}/Area/GetAreasByMainArea.cs | 10 +- .../UseCases}/Area/UpdateArea.cs | 14 +- .../AssistanceType/CreateAssistanceType.cs | 12 +- .../AssistanceType/DeleteAssistanceType.cs | 10 +- .../AssistanceType/GetAssistanceTypeById.cs | 10 +- .../AssistanceType/GetAssistanceTypes.cs | 8 +- .../AssistanceType/UpdateAssistanceType.cs | 14 +- .../UseCases}/Auth/ConfirmEmail.cs | 8 +- .../UseCases}/Auth/ForgotPassword.cs | 10 +- .../UseCases}/Auth/Login.cs | 14 +- .../UseCases}/Auth/ResetPassword.cs | 14 +- .../UseCases}/Campus/CreateCampus.cs | 10 +- .../UseCases}/Campus/DeleteCampus.cs | 10 +- .../UseCases}/Campus/GetCampusById.cs | 11 +- .../UseCases}/Campus/GetCampuses.cs | 8 +- .../UseCases}/Campus/UpdateCampus.cs | 12 +- .../UseCases}/Course/CreateCourse.cs | 18 +- .../UseCases}/Course/DeleteCourse.cs | 10 +- .../UseCases}/Course/GetCourseById.cs | 11 +- .../UseCases}/Course/GetCourses.cs | 8 +- .../UseCases}/Course/UpdateCourse.cs | 14 +- .../UseCases}/MainArea/CreateMainArea.cs | 17 +- .../UseCases}/MainArea/DeleteMainArea.cs | 10 +- .../UseCases}/MainArea/GetMainAreaById.cs | 11 +- .../UseCases}/MainArea/GetMainAreas.cs | 8 +- .../UseCases}/MainArea/UpdateMainArea.cs | 15 +- .../UseCases}/Notice/CreateNotice.cs | 20 +- .../UseCases}/Notice/DeleteNotice.cs | 12 +- .../UseCases}/Notice/GetNoticeById.cs | 11 +- .../UseCases}/Notice/GetNotices.cs | 8 +- .../UseCases}/Notice/UpdateNotice.cs | 43 ++-- .../UseCases}/Professor/CreateProfessor.cs | 18 +- .../UseCases}/Professor/DeleteProfessor.cs | 14 +- .../UseCases}/Professor/GetProfessorById.cs | 10 +- .../UseCases}/Professor/GetProfessors.cs | 8 +- .../UseCases}/Professor/UpdateProfessor.cs | 12 +- .../ProgramType/CreateProgramType.cs | 17 +- .../ProgramType/DeleteProgramType.cs | 10 +- .../ProgramType/GetProgramTypeById.cs | 10 +- .../UseCases}/ProgramType/GetProgramTypes.cs | 8 +- .../ProgramType/UpdateProgramType.cs | 14 +- .../UseCases}/Project/AppealProject.cs | 12 +- .../UseCases}/Project/CancelProject.cs | 12 +- .../UseCases}/Project/GetClosedProjects.cs | 22 +- .../UseCases}/Project/GetOpenProjects.cs | 22 +- .../UseCases}/Project/GetProjectById.cs | 12 +- .../UseCases}/Project/OpenProject.cs | 40 ++-- .../UseCases}/Project/SubmitProject.cs | 12 +- .../UseCases}/Project/UpdateProject.cs | 38 +-- .../EvaluateAppealProject.cs | 24 +- .../EvaluateSubmissionProject.cs | 38 +-- .../GetEvaluationByProjectId.cs | 10 +- .../ProjectReport/CreateProjectReport.cs | 25 +- .../ProjectReport/DeleteProjectReport.cs | 10 +- .../ProjectReport/GetProjectReportById.cs | 11 +- .../ProjectReport/UpdateProjectReport.cs | 24 +- .../UseCases}/Student/CreateStudent.cs | 24 +- .../UseCases}/Student/DeleteStudent.cs | 14 +- .../UseCases}/Student/GetStudentById.cs | 10 +- .../Student/GetStudentByRegistrationCode.cs | 10 +- .../UseCases}/Student/GetStudents.cs | 8 +- .../Student/RequestStudentRegister.cs | 8 +- .../UseCases}/Student/UpdateStudent.cs | 14 +- .../CreateStudentDocuments.cs | 16 +- .../DeleteStudentDocuments.cs | 10 +- .../GetStudentDocumentsByProjectId.cs | 10 +- .../GetStudentDocumentsByStudentId.cs | 10 +- .../UpdateStudentDocuments.cs | 22 +- .../UseCases}/SubArea/CreateSubArea.cs | 10 +- .../UseCases}/SubArea/DeleteSubArea.cs | 10 +- .../UseCases}/SubArea/GetSubAreaById.cs | 8 +- .../UseCases}/SubArea/GetSubAreasByArea.cs | 10 +- .../UseCases}/SubArea/UpdateSubArea.cs | 13 +- .../UseCases}/User/ActivateUser.cs | 14 +- .../UseCases}/User/DeactivateUser.cs | 14 +- .../UseCases}/User/GetActiveUsers.cs | 8 +- .../UseCases}/User/GetInactiveUsers.cs | 8 +- .../UseCases}/User/GetUserById.cs | 12 +- .../UseCases}/User/UpdateUser.cs | 18 +- .../Validation/UseCaseException.cs | 2 +- src/CopetSystem.API.sln | 6 + src/Domain/Entities/User.cs | 31 ++- src/Infrastructure/IoC/ApplicationDI.cs | 195 ++++++++++++++++ .../IoC/DependencyAdaptersInjection.cs | 54 ----- .../IoC/DependencyDomainInjection.cs | 206 ---------------- src/Infrastructure/IoC/DependencyInjection.cs | 105 --------- src/Infrastructure/IoC/ExternalServicesDI.cs | 44 ++++ src/Infrastructure/IoC/InfrastructureDI.cs | 62 +++++ src/Infrastructure/IoC/IoC.csproj | 2 +- .../{DependencyInjectionJWT.cs => JwtDI.cs} | 12 +- src/Infrastructure/IoC/PersistenceDI.cs | 46 ++++ ...ndencyInjectionSwagger.cs => SwaggerDI.cs} | 4 +- src/Infrastructure/IoC/Utils/DotEnvSecrets.cs | 2 +- .../IoC/Utils/SettingsConfiguration.cs | 2 +- .../Services/AzureStorageService.cs | 2 +- .../Services/Email/EmailService.cs | 2 +- .../Email/Factories/EmailServiceFactory.cs | 2 +- .../Email/Factories/IEmailServiceFactory.cs | 2 +- src/Infrastructure/Services/HashService.cs | 2 +- src/Infrastructure/Services/Services.csproj | 2 +- .../Services/StorageFileService.cs | 2 +- .../Services/TokenAuthenticationService.cs | 4 +- .../WebAPI/Controllers/ActivityController.cs | 38 ++- .../WebAPI/Controllers/AreaController.cs | 123 ++++++---- .../Controllers/AssistanceTypeController.cs | 124 +++++++--- .../WebAPI/Controllers/AuthController.cs | 51 ++-- .../WebAPI/Controllers/CampusController.cs | 167 +++++++++---- .../WebAPI/Controllers/CourseController.cs | 150 ++++++++---- .../WebAPI/Controllers/MainAreaController.cs | 150 ++++++++---- .../WebAPI/Controllers/NoticeController.cs | 150 ++++++++---- .../WebAPI/Controllers/ProfessorController.cs | 149 ++++++++---- .../Controllers/ProgramTypeController.cs | 151 ++++++++---- .../WebAPI/Controllers/ProjectController.cs | 221 ++++++++++++------ .../ProjectEvaluationController.cs | 81 ++++--- .../WebAPI/Controllers/StudentController.cs | 199 +++++++++++----- .../Controllers/StudentDocumentsController.cs | 136 ++++++++--- .../WebAPI/Controllers/SubAreaController.cs | 180 +++++++++----- .../WebAPI/Controllers/UserController.cs | 196 ++++++++++------ src/Infrastructure/WebAPI/Startup.cs | 7 +- src/Infrastructure/WebAPI/WebAPI.csproj | 2 +- 441 files changed, 2867 insertions(+), 4258 deletions(-) delete mode 100644 src/Adapters/Adapters.csproj delete mode 100644 src/Adapters/Gateways/Activity/ActivityResponse.cs delete mode 100644 src/Adapters/Gateways/Activity/ActivityTypeResponse.cs delete mode 100644 src/Adapters/Gateways/Activity/BaseActivity.cs delete mode 100644 src/Adapters/Gateways/Activity/BaseActivityType.cs delete mode 100644 src/Adapters/Gateways/Activity/CreateActivityRequest.cs delete mode 100644 src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs delete mode 100644 src/Adapters/Gateways/Activity/UpdateActivityRequest.cs delete mode 100644 src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs delete mode 100644 src/Adapters/Gateways/Area/CreateAreaRequest.cs delete mode 100644 src/Adapters/Gateways/Area/DetailedReadAreaResponse.cs delete mode 100644 src/Adapters/Gateways/Area/ResumedReadAreaResponse.cs delete mode 100644 src/Adapters/Gateways/Area/UpdateAreaRequest.cs delete mode 100644 src/Adapters/Gateways/AssistanceType/CreateTypeAssistanceRequest.cs delete mode 100644 src/Adapters/Gateways/AssistanceType/DetailedReadTypeAssistanceResponse.cs delete mode 100644 src/Adapters/Gateways/AssistanceType/ResumedReadTypeAssistanceResponse.cs delete mode 100644 src/Adapters/Gateways/AssistanceType/UpdateTypeAssistanceRequest.cs delete mode 100644 src/Adapters/Gateways/Auth/UserLoginRequest.cs delete mode 100644 src/Adapters/Gateways/Auth/UserLoginResponse.cs delete mode 100644 src/Adapters/Gateways/Auth/UserResetPasswordRequest.cs delete mode 100644 src/Adapters/Gateways/Base/IRequest.cs delete mode 100644 src/Adapters/Gateways/Base/IResponse.cs delete mode 100644 src/Adapters/Gateways/Campus/CreateCampusRequest.cs delete mode 100644 src/Adapters/Gateways/Campus/DetailedReadCampusResponse.cs delete mode 100644 src/Adapters/Gateways/Campus/ResumedReadCampusResponse.cs delete mode 100644 src/Adapters/Gateways/Campus/UpdateCampusRequest.cs delete mode 100644 src/Adapters/Gateways/Course/CreateCourseRequest.cs delete mode 100644 src/Adapters/Gateways/Course/DetailedReadCourseResponse.cs delete mode 100644 src/Adapters/Gateways/Course/ResumedReadCourseResponse.cs delete mode 100644 src/Adapters/Gateways/Course/UpdateCourseRequest.cs delete mode 100644 src/Adapters/Gateways/MainArea/CreateMainAreaRequest.cs delete mode 100644 src/Adapters/Gateways/MainArea/DetailedReadMainAreaResponse.cs delete mode 100644 src/Adapters/Gateways/MainArea/ResumedReadMainAreaResponse.cs delete mode 100644 src/Adapters/Gateways/MainArea/UpdateMainAreaRequest.cs delete mode 100644 src/Adapters/Gateways/Notice/CreateNoticeRequest.cs delete mode 100644 src/Adapters/Gateways/Notice/DetailedReadNoticeResponse.cs delete mode 100644 src/Adapters/Gateways/Notice/ResumedReadNoticeResponse.cs delete mode 100644 src/Adapters/Gateways/Notice/UpdateNoticeRequest.cs delete mode 100644 src/Adapters/Gateways/Professor/CreateProfessorRequest.cs delete mode 100644 src/Adapters/Gateways/Professor/DetailedReadProfessorResponse.cs delete mode 100644 src/Adapters/Gateways/Professor/ResumedReadProfessorResponse.cs delete mode 100644 src/Adapters/Gateways/Professor/UpdateProfessorRequest.cs delete mode 100644 src/Adapters/Gateways/ProgramType/CreateProgramTypeRequest.cs delete mode 100644 src/Adapters/Gateways/ProgramType/DetailedReadProgramTypeResponse.cs delete mode 100644 src/Adapters/Gateways/ProgramType/ResumedReadProgramTypeResponse.cs delete mode 100644 src/Adapters/Gateways/ProgramType/UpdateProgramTypeRequest.cs delete mode 100644 src/Adapters/Gateways/Project/DetailedReadProjectResponse.cs delete mode 100644 src/Adapters/Gateways/Project/OpenProjectRequest.cs delete mode 100644 src/Adapters/Gateways/Project/ResumedReadProjectResponse.cs delete mode 100644 src/Adapters/Gateways/Project/UpdateProjectRequest.cs delete mode 100644 src/Adapters/Gateways/ProjectActivity/BaseProjectActivity.cs delete mode 100644 src/Adapters/Gateways/ProjectActivity/CreateProjectActivityRequest.cs delete mode 100644 src/Adapters/Gateways/ProjectActivity/DetailedReadProjectActivityResponse.cs delete mode 100644 src/Adapters/Gateways/ProjectActivity/EvaluateProjectActivityRequest.cs delete mode 100644 src/Adapters/Gateways/ProjectActivity/ResumedReadProjectActivityResponse.cs delete mode 100644 src/Adapters/Gateways/ProjectActivity/UpdateProjectActivityRequest.cs delete mode 100644 src/Adapters/Gateways/ProjectEvaluation/DetailedReadProjectEvaluationResponse.cs delete mode 100644 src/Adapters/Gateways/ProjectEvaluation/EvaluateAppealProjectRequest.cs delete mode 100644 src/Adapters/Gateways/ProjectEvaluation/EvaluateSubmissionProjectRequest.cs delete mode 100644 src/Adapters/Gateways/Student/CreateStudentRequest.cs delete mode 100644 src/Adapters/Gateways/Student/DetailedReadStudentResponse.cs delete mode 100644 src/Adapters/Gateways/Student/ResumedReadStudentResponse.cs delete mode 100644 src/Adapters/Gateways/Student/UpdateStudentRequest.cs delete mode 100644 src/Adapters/Gateways/StudentDocuments/CreateStudentDocumentsRequest.cs delete mode 100644 src/Adapters/Gateways/StudentDocuments/DetailedReadStudentDocumentsResponse.cs delete mode 100644 src/Adapters/Gateways/StudentDocuments/ResumedReadStudentDocumentsResponse.cs delete mode 100644 src/Adapters/Gateways/StudentDocuments/UpdateStudentDocumentsRequest.cs delete mode 100644 src/Adapters/Gateways/SubArea/CreateSubAreaRequest.cs delete mode 100644 src/Adapters/Gateways/SubArea/DetailedReadSubAreaResponse.cs delete mode 100644 src/Adapters/Gateways/SubArea/ResumedReadSubAreaResponse.cs delete mode 100644 src/Adapters/Gateways/SubArea/UpdateSubAreaRequest.cs delete mode 100644 src/Adapters/Gateways/User/UserReadResponse.cs delete mode 100644 src/Adapters/Gateways/User/UserUpdateRequest.cs delete mode 100644 src/Adapters/Interfaces/Base/IGenericCRUDPresenterController.cs delete mode 100644 src/Adapters/Interfaces/IActivityPresenterController.cs delete mode 100644 src/Adapters/Interfaces/IAreaPresenterController.cs delete mode 100644 src/Adapters/Interfaces/IAuthPresenterController.cs delete mode 100644 src/Adapters/Interfaces/ICampusPresenterController.cs delete mode 100644 src/Adapters/Interfaces/ICoursePresenterController.cs delete mode 100644 src/Adapters/Interfaces/IMainAreaPresenterController.cs delete mode 100644 src/Adapters/Interfaces/INoticePresenterController.cs delete mode 100644 src/Adapters/Interfaces/IProfessorPresenterController.cs delete mode 100644 src/Adapters/Interfaces/IProgramTypePresenterController.cs delete mode 100644 src/Adapters/Interfaces/IProjectEvaluationPresenterController.cs delete mode 100644 src/Adapters/Interfaces/IProjectPresenterController.cs delete mode 100644 src/Adapters/Interfaces/IStudentDocumentsPresenterController.cs delete mode 100644 src/Adapters/Interfaces/IStudentPresenterController.cs delete mode 100644 src/Adapters/Interfaces/ISubAreaPresenterController.cs delete mode 100644 src/Adapters/Interfaces/ITypeAssistancePresenterController.cs delete mode 100644 src/Adapters/Interfaces/IUserPresenterController.cs delete mode 100644 src/Adapters/Mappings/ActivityMappings.cs delete mode 100755 src/Adapters/Mappings/AreaMappings.cs delete mode 100755 src/Adapters/Mappings/AuthMappings.cs delete mode 100755 src/Adapters/Mappings/CampusMappings.cs delete mode 100755 src/Adapters/Mappings/CourseMappings.cs delete mode 100755 src/Adapters/Mappings/MainAreaMappings.cs delete mode 100755 src/Adapters/Mappings/NoticeMappings.cs delete mode 100755 src/Adapters/Mappings/ProfessorMappings.cs delete mode 100755 src/Adapters/Mappings/ProgramTypeMappings.cs delete mode 100755 src/Adapters/Mappings/ProjectActivityMappings.cs delete mode 100644 src/Adapters/Mappings/ProjectEvaluationMapping.cs delete mode 100755 src/Adapters/Mappings/ProjectMappings.cs delete mode 100755 src/Adapters/Mappings/StudentDocumentsMappings.cs delete mode 100755 src/Adapters/Mappings/StudentMappings.cs delete mode 100755 src/Adapters/Mappings/SubAreaMappings.cs delete mode 100755 src/Adapters/Mappings/TypeAssistanceMappings.cs delete mode 100755 src/Adapters/Mappings/UserMappings.cs delete mode 100644 src/Adapters/PresenterController/ActivityPresenterController.cs delete mode 100755 src/Adapters/PresenterController/AreaPresenterController.cs delete mode 100755 src/Adapters/PresenterController/AuthPresenterController.cs delete mode 100755 src/Adapters/PresenterController/CampusPresenterController.cs delete mode 100755 src/Adapters/PresenterController/CoursePresenterController.cs delete mode 100755 src/Adapters/PresenterController/MainAreaPresenterController.cs delete mode 100755 src/Adapters/PresenterController/NoticePresenterController.cs delete mode 100755 src/Adapters/PresenterController/ProfessorPresenterController.cs delete mode 100755 src/Adapters/PresenterController/ProgramTypePresenterController.cs delete mode 100644 src/Adapters/PresenterController/ProjectEvaluationPresenterController.cs delete mode 100644 src/Adapters/PresenterController/ProjectPresenterController.cs delete mode 100644 src/Adapters/PresenterController/StudentDocumentsPresenterController.cs delete mode 100755 src/Adapters/PresenterController/StudentPresenterController.cs delete mode 100755 src/Adapters/PresenterController/SubAreaPresenterController.cs delete mode 100755 src/Adapters/PresenterController/TypeAssistancePresenterController.cs delete mode 100755 src/Adapters/PresenterController/UserPresenterController.cs create mode 100644 src/Application/Application.csproj rename src/{Domain => Application}/Interfaces/Services/IEmailService.cs (93%) rename src/{Domain => Application}/Interfaces/Services/IHashService.cs (79%) rename src/{Domain => Application}/Interfaces/Services/IStorageFileService.cs (93%) rename src/{Domain => Application}/Interfaces/Services/ITokenAuthenticationService.cs (90%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ActivityType/IGetActivitiesByNoticeId.cs (59%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ActivityType/IGetLastNoticeActivities.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Area/ICreateArea.cs (61%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Area/IDeleteArea.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Area/IGetAreaById.cs (59%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Area/IGetAreasByMainArea.cs (67%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Area/IUpdateArea.cs (63%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/AssistanceType/ICreateAssistanceType.cs (61%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/AssistanceType/IDeleteAssistanceType.cs (57%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/AssistanceType/IGetAssistanceTypeById.cs (57%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/AssistanceType/IGetAssistanceTypes.cs (60%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/AssistanceType/IUpdateAssistanceType.cs (62%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Auth/IConfirmEmail.cs (70%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Auth/IForgotPassword.cs (68%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Auth/ILogin.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Auth/IResetPassword.cs (60%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Campus/ICreateCampus.cs (61%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Campus/IDeleteCampus.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Campus/IGetCampusById.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Campus/IGetCampuses.cs (62%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Campus/IUpdateCampus.cs (63%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Course/ICreateCourse.cs (54%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Course/IDeleteCourse.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Course/IGetCourseById.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Course/IGetCourses.cs (62%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Course/IUpdateCourse.cs (63%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/MainArea/ICreateMainArea.cs (60%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/MainArea/IDeleteMainArea.cs (57%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/MainArea/IGetMainAreaById.cs (57%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/MainArea/IGetMainAreas.cs (61%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/MainArea/IUpdateMainArea.cs (62%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Notice/ICreateNotice.cs (61%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Notice/IDeleteNotice.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Notice/IGetNoticeById.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Notice/IGetNotices.cs (62%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Notice/IUpdateNotice.cs (63%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Professor/ICreateProfessor.cs (61%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Professor/IDeleteProfessor.cs (57%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Professor/IGetProfessorById.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Professor/IGetProfessors.cs (61%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Professor/IUpdateProfessor.cs (62%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ProgramType/ICreateProgramType.cs (61%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ProgramType/IDeleteProgramType.cs (57%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ProgramType/IGetProgramTypeById.cs (57%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ProgramType/IGetProgramTypes.cs (61%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ProgramType/IUpdateProgramType.cs (62%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Project/IAppealProject.cs (64%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Project/ICancelProject.cs (62%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Project/IGetClosedProjects.cs (66%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Project/IGetOpenProjects.cs (66%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Project/IGetProjectById.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Project/IOpenProject.cs (60%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Project/ISubmitProject.cs (59%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Project/IUpdateProject.cs (62%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ProjectEvaluation/IEvaluateAppealProject.cs (51%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ProjectEvaluation/IEvaluateSubmissionProject.cs (52%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ProjectEvaluation/IGetEvaluationByProjectId.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ProjectReport/ICreateProjectReport.cs (53%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ProjectReport/IDeleteProjectReport.cs (57%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ProjectReport/IGetProjectReportById.cs (57%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/ProjectReport/IUpdateProjectReport.cs (62%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Student/ICreateStudent.cs (61%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Student/IDeleteStudent.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Student/IGetStudentById.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Student/IGetStudentByRegistrationCode.cs (63%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Student/IGetStudents.cs (61%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Student/IRequestStudentRegister.cs (68%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/Student/IUpdateStudent.cs (63%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/StudentDocuments/ICreateStudentDocuments.cs (61%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/StudentDocuments/IDeleteStudentDocuments.cs (57%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/StudentDocuments/IGetStudentDocumentsByProjectId.cs (59%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/StudentDocuments/IGetStudentDocumentsByStudentId.cs (59%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/StudentDocuments/IUpdateStudentDocuments.cs (62%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/SubArea/ICreateSubArea.cs (61%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/SubArea/IDeleteSubArea.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/SubArea/IGetSubAreaById.cs (58%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/SubArea/IGetSubAreasByArea.cs (65%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/SubArea/IUpdateSubArea.cs (63%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/User/IActivateUser.cs (57%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/User/IDeactivateUser.cs (57%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/User/IGetActiveUsers.cs (62%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/User/IGetInactiveUsers.cs (62%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/User/IGetUserById.cs (57%) rename src/{Domain/UseCases/Interfaces => Application/Interfaces/UseCases}/User/IUpdateUser.cs (59%) rename src/{Domain => Application}/Mappings/ActivityMappings.cs (92%) rename src/{Domain => Application}/Mappings/AreaMappings.cs (94%) rename src/{Domain => Application}/Mappings/AssistanceTypeMappings.cs (92%) rename src/{Domain => Application}/Mappings/CampusMappings.cs (92%) rename src/{Domain => Application}/Mappings/CourseMappings.cs (88%) rename src/{Domain => Application}/Mappings/MainAreaMappings.cs (92%) rename src/{Domain => Application}/Mappings/NoticeMappings.cs (92%) rename src/{Domain => Application}/Mappings/ProfessorMappings.cs (95%) rename src/{Domain => Application}/Mappings/ProgramTypeMappings.cs (92%) rename src/{Domain => Application}/Mappings/ProjectEvaluationMappings.cs (89%) rename src/{Domain => Application}/Mappings/ProjectMappings.cs (92%) rename src/{Domain => Application}/Mappings/StudentDocumentsMappings.cs (89%) rename src/{Domain => Application}/Mappings/StudentMappings.cs (96%) rename src/{Domain => Application}/Mappings/SubAreaMappings.cs (94%) rename src/{Domain => Application}/Mappings/UserMappings.cs (89%) rename src/{Domain/UseCases => Application}/Ports/Activity/ActivityOutput.cs (63%) rename src/{Domain/UseCases => Application}/Ports/Activity/ActivityTypeOutput.cs (75%) rename src/{Domain/UseCases => Application}/Ports/Activity/BaseActivity.cs (86%) rename src/{Domain/UseCases => Application}/Ports/Activity/BaseActivityType.cs (88%) rename src/{Domain/UseCases => Application}/Ports/Activity/CreateActivityInput.cs (59%) rename src/{Domain/UseCases => Application}/Ports/Activity/CreateActivityTypeInput.cs (88%) rename src/{Domain/UseCases => Application}/Ports/Activity/UpdateActivityInput.cs (64%) rename src/{Domain/UseCases => Application}/Ports/Activity/UpdateActivityTypeInput.cs (85%) rename src/{Domain/UseCases => Application}/Ports/Area/BaseAreaContract.cs (86%) rename src/{Domain/UseCases => Application}/Ports/Area/CreateAreaInput.cs (83%) rename src/{Domain/UseCases => Application}/Ports/Area/DetailedReadAreaOutput.cs (74%) rename src/{Domain/UseCases => Application}/Ports/Area/ResumedReadAreaOutput.cs (73%) rename src/{Domain/UseCases => Application}/Ports/Area/UpdateAreaInput.cs (85%) rename src/{Domain/UseCases => Application}/Ports/AssistanceType/BaseAssistanceTypeContract.cs (82%) rename src/{Domain/UseCases => Application}/Ports/AssistanceType/CreateAssistanceTypeInput.cs (63%) rename src/{Domain/UseCases => Application}/Ports/AssistanceType/DetailedReadAssistanceTypeOutput.cs (78%) rename src/{Domain/UseCases => Application}/Ports/AssistanceType/ResumedReadAssistanceTypeOutput.cs (72%) rename src/{Domain/UseCases => Application}/Ports/AssistanceType/UpdateAssistanceTypeInput.cs (71%) rename src/{Domain/UseCases => Application}/Ports/Auth/UserClaimsOutput.cs (82%) rename src/{Domain/UseCases => Application}/Ports/Auth/UserLoginInput.cs (85%) rename src/{Domain/UseCases => Application}/Ports/Auth/UserLoginOutput.cs (69%) rename src/{Domain/UseCases => Application}/Ports/Auth/UserResetPasswordInput.cs (88%) rename src/{Domain/UseCases => Application}/Ports/Campus/BaseCampusContract.cs (81%) rename src/{Domain/UseCases => Application}/Ports/Campus/CreateCampusInput.cs (62%) rename src/{Domain/UseCases => Application}/Ports/Campus/DetailedReadCampusOutput.cs (79%) rename src/{Domain/UseCases => Application}/Ports/Campus/ResumedReadCampusOutput.cs (73%) rename src/{Domain/UseCases => Application}/Ports/Campus/UpdateCampusInput.cs (72%) rename src/{Domain/UseCases => Application}/Ports/Course/BaseCourseContract.cs (81%) rename src/{Domain/UseCases => Application}/Ports/Course/CreateCourseInput.cs (50%) rename src/{Domain/UseCases => Application}/Ports/Course/DetailedReadCourseOutput.cs (79%) rename src/{Domain/UseCases => Application}/Ports/Course/ResumedReadCourseOutput.cs (73%) rename src/{Domain/UseCases => Application}/Ports/Course/UpdateCourseInput.cs (72%) rename src/{Domain/UseCases => Application}/Ports/MainArea/BaseMainAreaContract.cs (85%) rename src/{Domain/UseCases => Application}/Ports/MainArea/CreateMainAreaInput.cs (60%) rename src/{Domain/UseCases => Application}/Ports/MainArea/DetailedMainAreaOutput.cs (78%) rename src/{Domain/UseCases => Application}/Ports/MainArea/ResumedReadMainAreaOutput.cs (74%) rename src/{Domain/UseCases => Application}/Ports/MainArea/UpdateMainAreaInput.cs (71%) rename src/{Domain/UseCases => Application}/Ports/Notice/BaseNoticeContract.cs (96%) rename src/{Domain/UseCases => Application}/Ports/Notice/CreateNoticeInput.cs (73%) rename src/{Domain/UseCases => Application}/Ports/Notice/DetailedReadNoticeOutput.cs (83%) rename src/{Domain/UseCases => Application}/Ports/Notice/ResumedReadNoticeOutput.cs (79%) rename src/{Domain/UseCases => Application}/Ports/Notice/UpdateNoticeInput.cs (76%) rename src/{Domain/UseCases => Application}/Ports/Professor/BaseProfessorContract.cs (85%) rename src/{Domain/UseCases => Application}/Ports/Professor/CreateProfessorInput.cs (91%) rename src/{Domain/UseCases => Application}/Ports/Professor/DetailedReadStudentOutput.cs (74%) rename src/{Domain/UseCases => Application}/Ports/Professor/ResumedReadStudentOutput.cs (82%) rename src/{Domain/UseCases => Application}/Ports/Professor/UpdateStudentInput.cs (73%) rename src/{Domain/UseCases => Application}/Ports/ProgramType/BaseProgramTypeContract.cs (83%) rename src/{Domain/UseCases => Application}/Ports/ProgramType/CreateProgramTypeInput.cs (63%) rename src/{Domain/UseCases => Application}/Ports/ProgramType/DetailedReadProgramTypeOutput.cs (78%) rename src/{Domain/UseCases => Application}/Ports/ProgramType/ResumedReadProgramTypeOutput.cs (72%) rename src/{Domain/UseCases => Application}/Ports/ProgramType/UpdateProgramTypeInput.cs (71%) rename src/{Domain/UseCases => Application}/Ports/Project/BaseProjectContract.cs (97%) rename src/{Domain/UseCases => Application}/Ports/Project/DetailedReadProjectOutput.cs (80%) rename src/{Domain/UseCases => Application}/Ports/Project/OpenProjectInput.cs (93%) rename src/{Domain/UseCases => Application}/Ports/Project/ProjectReportInput.cs (56%) rename src/{Domain/UseCases => Application}/Ports/Project/ProjectReportOutput.cs (56%) rename src/{Domain/UseCases => Application}/Ports/Project/ResumedReadProjectOutput.cs (74%) rename src/{Domain/UseCases => Application}/Ports/Project/UpdateProjectInput.cs (93%) rename src/{Domain/UseCases => Application}/Ports/ProjectActivity/BaseProjectActivityContract.cs (84%) rename src/{Domain/UseCases => Application}/Ports/ProjectActivity/CreateProjectActivityInput.cs (61%) rename src/{Domain/UseCases => Application}/Ports/ProjectActivity/DetailedReadProjectActivityOutput.cs (84%) rename src/{Domain/UseCases => Application}/Ports/ProjectActivity/EvaluateProjectActivityInput.cs (85%) rename src/{Domain/UseCases => Application}/Ports/ProjectActivity/ResumedReadProjectActivityOutput.cs (81%) rename src/{Domain/UseCases => Application}/Ports/ProjectActivity/UpdateProjectActivityInput.cs (80%) rename src/{Domain/UseCases => Application}/Ports/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs (96%) rename src/{Domain/UseCases => Application}/Ports/ProjectEvaluation/EvaluateAppealProjectInput.cs (86%) rename src/{Domain/UseCases => Application}/Ports/ProjectEvaluation/EvaluateSubmissionProjectInput.cs (92%) rename src/{Domain/UseCases => Application}/Ports/ProjectReport/BaseProjectReportContract.cs (84%) rename src/{Domain/UseCases => Application}/Ports/ProjectReport/CreateProjectReportInput.cs (74%) rename src/{Domain/UseCases => Application}/Ports/ProjectReport/DetailedReadProjectReportOutput.cs (86%) rename src/{Domain/UseCases => Application}/Ports/ProjectReport/UpdateProjectReportInput.cs (81%) rename src/{Domain/UseCases => Application}/Ports/Student/BaseStudentContract.cs (97%) rename src/{Domain/UseCases => Application}/Ports/Student/CreateStudentInput.cs (91%) rename src/{Domain/UseCases => Application}/Ports/Student/DetailedReadStudentOutput.cs (70%) rename src/{Domain/UseCases => Application}/Ports/Student/ResumedReadStudentOutput.cs (83%) rename src/{Domain/UseCases => Application}/Ports/Student/UpdateStudentInput.cs (73%) rename src/{Domain/UseCases => Application}/Ports/StudentDocuments/BaseStudentDocumentsOutput.cs (97%) rename src/{Domain/UseCases => Application}/Ports/StudentDocuments/CreateStudentDocumentsInput.cs (97%) rename src/{Domain/UseCases => Application}/Ports/StudentDocuments/DetailedReadStudentDocumentsOutput.cs (73%) rename src/{Domain/UseCases => Application}/Ports/StudentDocuments/ResumedReadStudentDocumentsOutput.cs (62%) rename src/{Domain/UseCases => Application}/Ports/StudentDocuments/UpdateStudentDocumentsInput.cs (96%) rename src/{Domain/UseCases => Application}/Ports/SubArea/BaseSubAreaContract.cs (85%) rename src/{Domain/UseCases => Application}/Ports/SubArea/CreateSubAreaInput.cs (82%) rename src/{Domain/UseCases => Application}/Ports/SubArea/DetailedReadSubAreaOutput.cs (75%) rename src/{Domain/UseCases => Application}/Ports/SubArea/ResumedReadSubAreaOutput.cs (73%) rename src/{Domain/UseCases => Application}/Ports/SubArea/UpdateSubAreaInput.cs (84%) rename src/{Domain/UseCases => Application}/Ports/User/UserReadOutput.cs (88%) rename src/{Domain/UseCases => Application}/Ports/User/UserUpdateInput.cs (85%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ActivityType/GetActivitiesByNoticeId.cs (79%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ActivityType/GetLastNoticeActivities.cs (79%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Area/CreateArea.cs (86%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Area/DeleteArea.cs (78%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Area/GetAreaById.cs (76%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Area/GetAreasByMainArea.cs (72%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Area/UpdateArea.cs (77%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/AssistanceType/CreateAssistanceType.cs (74%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/AssistanceType/DeleteAssistanceType.cs (77%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/AssistanceType/GetAssistanceTypeById.cs (74%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/AssistanceType/GetAssistanceTypes.cs (70%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/AssistanceType/UpdateAssistanceType.cs (83%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Auth/ConfirmEmail.cs (89%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Auth/ForgotPassword.cs (89%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Auth/Login.cs (84%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Auth/ResetPassword.cs (87%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Campus/CreateCampus.cs (84%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Campus/DeleteCampus.cs (78%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Campus/GetCampusById.cs (75%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Campus/GetCampuses.cs (72%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Campus/UpdateCampus.cs (82%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Course/CreateCourse.cs (66%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Course/DeleteCourse.cs (78%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Course/GetCourseById.cs (75%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Course/GetCourses.cs (74%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Course/UpdateCourse.cs (84%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/MainArea/CreateMainArea.cs (56%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/MainArea/DeleteMainArea.cs (77%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/MainArea/GetMainAreaById.cs (74%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/MainArea/GetMainAreas.cs (71%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/MainArea/UpdateMainArea.cs (63%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Notice/CreateNotice.cs (85%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Notice/DeleteNotice.cs (82%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Notice/GetNoticeById.cs (75%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Notice/GetNotices.cs (71%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Notice/UpdateNotice.cs (83%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Professor/CreateProfessor.cs (82%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Professor/DeleteProfessor.cs (85%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Professor/GetProfessorById.cs (74%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Professor/GetProfessors.cs (71%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Professor/UpdateProfessor.cs (84%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ProgramType/CreateProgramType.cs (63%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ProgramType/DeleteProgramType.cs (77%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ProgramType/GetProgramTypeById.cs (74%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ProgramType/GetProgramTypes.cs (71%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ProgramType/UpdateProgramType.cs (83%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Project/AppealProject.cs (89%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Project/CancelProject.cs (85%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Project/GetClosedProjects.cs (70%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Project/GetOpenProjects.cs (71%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Project/GetProjectById.cs (76%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Project/OpenProject.cs (81%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Project/SubmitProject.cs (88%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Project/UpdateProject.cs (80%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ProjectEvaluation/EvaluateAppealProject.cs (86%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ProjectEvaluation/EvaluateSubmissionProject.cs (81%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ProjectEvaluation/GetEvaluationByProjectId.cs (77%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ProjectReport/CreateProjectReport.cs (83%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ProjectReport/DeleteProjectReport.cs (76%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ProjectReport/GetProjectReportById.cs (73%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/ProjectReport/UpdateProjectReport.cs (82%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Student/CreateStudent.cs (84%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Student/DeleteStudent.cs (84%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Student/GetStudentById.cs (74%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Student/GetStudentByRegistrationCode.cs (85%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Student/GetStudents.cs (72%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Student/RequestStudentRegister.cs (93%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/Student/UpdateStudent.cs (89%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/StudentDocuments/CreateStudentDocuments.cs (90%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/StudentDocuments/DeleteStudentDocuments.cs (79%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/StudentDocuments/GetStudentDocumentsByProjectId.cs (77%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/StudentDocuments/GetStudentDocumentsByStudentId.cs (77%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/StudentDocuments/UpdateStudentDocuments.cs (81%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/SubArea/CreateSubArea.cs (89%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/SubArea/DeleteSubArea.cs (78%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/SubArea/GetSubAreaById.cs (75%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/SubArea/GetSubAreasByArea.cs (72%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/SubArea/UpdateSubArea.cs (68%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/User/ActivateUser.cs (73%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/User/DeactivateUser.cs (73%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/User/GetActiveUsers.cs (72%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/User/GetInactiveUsers.cs (72%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/User/GetUserById.cs (77%) rename src/{Domain/UseCases/Interactors => Application/UseCases}/User/UpdateUser.cs (73%) rename src/{Domain => Application}/Validation/UseCaseException.cs (97%) create mode 100644 src/Infrastructure/IoC/ApplicationDI.cs delete mode 100644 src/Infrastructure/IoC/DependencyAdaptersInjection.cs delete mode 100644 src/Infrastructure/IoC/DependencyDomainInjection.cs delete mode 100644 src/Infrastructure/IoC/DependencyInjection.cs create mode 100644 src/Infrastructure/IoC/ExternalServicesDI.cs create mode 100644 src/Infrastructure/IoC/InfrastructureDI.cs rename src/Infrastructure/IoC/{DependencyInjectionJWT.cs => JwtDI.cs} (89%) create mode 100644 src/Infrastructure/IoC/PersistenceDI.cs rename src/Infrastructure/IoC/{DependencyInjectionSwagger.cs => SwaggerDI.cs} (97%) diff --git a/src/Adapters/Adapters.csproj b/src/Adapters/Adapters.csproj deleted file mode 100644 index 3f4de6a2..00000000 --- a/src/Adapters/Adapters.csproj +++ /dev/null @@ -1,39 +0,0 @@ - - - - net7.0 - enable - enable - 0.0.1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/ActivityResponse.cs b/src/Adapters/Gateways/Activity/ActivityResponse.cs deleted file mode 100644 index 6f06f044..00000000 --- a/src/Adapters/Gateways/Activity/ActivityResponse.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Adapters.Gateways.Activity; -public class ActivityResponse : BaseActivity -{ - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/ActivityTypeResponse.cs b/src/Adapters/Gateways/Activity/ActivityTypeResponse.cs deleted file mode 100644 index 9fc68f9d..00000000 --- a/src/Adapters/Gateways/Activity/ActivityTypeResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Adapters.Gateways.Activity; -public class ActivityTypeResponse : BaseActivityType -{ - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } - new public IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/BaseActivity.cs b/src/Adapters/Gateways/Activity/BaseActivity.cs deleted file mode 100644 index 00b864d4..00000000 --- a/src/Adapters/Gateways/Activity/BaseActivity.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.Activity; -public class BaseActivity -{ - [Required] - public string? Name { get; set; } - [Required] - public double? Points { get; set; } - public double? Limits { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/BaseActivityType.cs b/src/Adapters/Gateways/Activity/BaseActivityType.cs deleted file mode 100644 index 34331f24..00000000 --- a/src/Adapters/Gateways/Activity/BaseActivityType.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.Activity; -public class BaseActivityType -{ - [Required] - public string? Name { get; set; } - [Required] - public string? Unity { get; set; } - [Required] - public virtual IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/CreateActivityRequest.cs b/src/Adapters/Gateways/Activity/CreateActivityRequest.cs deleted file mode 100644 index 333157a8..00000000 --- a/src/Adapters/Gateways/Activity/CreateActivityRequest.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.Activity; -public class CreateActivityRequest -{ - [Required] - public string? Name { get; set; } - [Required] - public double? Points { get; set; } - [Required] - public double? Limits { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs b/src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs deleted file mode 100644 index e6c6c4cd..00000000 --- a/src/Adapters/Gateways/Activity/CreateActivityTypeRequest.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.Activity; -public class CreateActivityTypeRequest -{ - [Required] - public string? Name { get; set; } - [Required] - public string? Unity { get; set; } - [Required] - public virtual IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/UpdateActivityRequest.cs b/src/Adapters/Gateways/Activity/UpdateActivityRequest.cs deleted file mode 100644 index 0b374b00..00000000 --- a/src/Adapters/Gateways/Activity/UpdateActivityRequest.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.Activity; -public class UpdateActivityRequest -{ - public Guid? Id { get; set; } - [Required] - public string? Name { get; set; } - [Required] - public double? Points { get; set; } - [Required] - public double? Limits { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs b/src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs deleted file mode 100644 index 3af3bfb2..00000000 --- a/src/Adapters/Gateways/Activity/UpdateActivityTypeRequest.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.Activity; -public class UpdateActivityTypeRequest -{ - public Guid? Id { get; set; } - [Required] - public string? Name { get; set; } - [Required] - public string? Unity { get; set; } - [Required] - public virtual IList? Activities { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Area/CreateAreaRequest.cs b/src/Adapters/Gateways/Area/CreateAreaRequest.cs deleted file mode 100644 index c59b9542..00000000 --- a/src/Adapters/Gateways/Area/CreateAreaRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Area; - -namespace Adapters.Gateways.Area -{ - public class CreateAreaRequest : CreateAreaInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Area/DetailedReadAreaResponse.cs b/src/Adapters/Gateways/Area/DetailedReadAreaResponse.cs deleted file mode 100644 index d0f959c4..00000000 --- a/src/Adapters/Gateways/Area/DetailedReadAreaResponse.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Adapters.Gateways.Base; -using Adapters.Gateways.MainArea; - -namespace Adapters.Gateways.Area -{ - public class DetailedReadAreaResponse : IResponse - { - public Guid? Id { get; set; } - public string? Name { get; set; } - public string? Code { get; set; } - public DateTime? DeletedAt { get; set; } - public virtual DetailedReadMainAreaResponse? MainArea { get; set; } - } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Area/ResumedReadAreaResponse.cs b/src/Adapters/Gateways/Area/ResumedReadAreaResponse.cs deleted file mode 100644 index 51c46b34..00000000 --- a/src/Adapters/Gateways/Area/ResumedReadAreaResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Area; - -namespace Adapters.Gateways.Area -{ - public class ResumedReadAreaResponse : ResumedReadAreaOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Area/UpdateAreaRequest.cs b/src/Adapters/Gateways/Area/UpdateAreaRequest.cs deleted file mode 100644 index 448c3a9f..00000000 --- a/src/Adapters/Gateways/Area/UpdateAreaRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Area; - -namespace Adapters.Gateways.Area -{ - public class UpdateAreaRequest : UpdateAreaInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/AssistanceType/CreateTypeAssistanceRequest.cs b/src/Adapters/Gateways/AssistanceType/CreateTypeAssistanceRequest.cs deleted file mode 100644 index 8ad3ae7b..00000000 --- a/src/Adapters/Gateways/AssistanceType/CreateTypeAssistanceRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.AssistanceType; - -namespace Adapters.Gateways.AssistanceType -{ - public class CreateAssistanceTypeRequest : CreateAssistanceTypeInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/AssistanceType/DetailedReadTypeAssistanceResponse.cs b/src/Adapters/Gateways/AssistanceType/DetailedReadTypeAssistanceResponse.cs deleted file mode 100644 index 709d81f4..00000000 --- a/src/Adapters/Gateways/AssistanceType/DetailedReadTypeAssistanceResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.AssistanceType; - -namespace Adapters.Gateways.AssistanceType -{ - public class DetailedReadAssistanceTypeResponse : DetailedReadAssistanceTypeOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/AssistanceType/ResumedReadTypeAssistanceResponse.cs b/src/Adapters/Gateways/AssistanceType/ResumedReadTypeAssistanceResponse.cs deleted file mode 100644 index 278a2ba3..00000000 --- a/src/Adapters/Gateways/AssistanceType/ResumedReadTypeAssistanceResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.AssistanceType; - -namespace Adapters.Gateways.AssistanceType -{ - public class ResumedReadAssistanceTypeResponse : ResumedReadAssistanceTypeOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/AssistanceType/UpdateTypeAssistanceRequest.cs b/src/Adapters/Gateways/AssistanceType/UpdateTypeAssistanceRequest.cs deleted file mode 100644 index 1ecfa08b..00000000 --- a/src/Adapters/Gateways/AssistanceType/UpdateTypeAssistanceRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.AssistanceType; - -namespace Adapters.Gateways.AssistanceType -{ - public class UpdateAssistanceTypeRequest : UpdateAssistanceTypeInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Auth/UserLoginRequest.cs b/src/Adapters/Gateways/Auth/UserLoginRequest.cs deleted file mode 100644 index 0129a7ae..00000000 --- a/src/Adapters/Gateways/Auth/UserLoginRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Auth; - -namespace Adapters.Gateways.Auth -{ - public class UserLoginRequest : UserLoginInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Auth/UserLoginResponse.cs b/src/Adapters/Gateways/Auth/UserLoginResponse.cs deleted file mode 100644 index d1079fae..00000000 --- a/src/Adapters/Gateways/Auth/UserLoginResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Auth; - -namespace Adapters.Gateways.Auth -{ - public class UserLoginResponse : UserLoginOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Auth/UserResetPasswordRequest.cs b/src/Adapters/Gateways/Auth/UserResetPasswordRequest.cs deleted file mode 100644 index a3b15c85..00000000 --- a/src/Adapters/Gateways/Auth/UserResetPasswordRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Auth; - -namespace Adapters.Gateways.Auth -{ - public class UserResetPasswordRequest : UserResetPasswordInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Base/IRequest.cs b/src/Adapters/Gateways/Base/IRequest.cs deleted file mode 100644 index ad64201d..00000000 --- a/src/Adapters/Gateways/Base/IRequest.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Adapters.Gateways.Base -{ - public interface IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Base/IResponse.cs b/src/Adapters/Gateways/Base/IResponse.cs deleted file mode 100644 index efce3e0f..00000000 --- a/src/Adapters/Gateways/Base/IResponse.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Adapters.Gateways.Base -{ - public interface IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Campus/CreateCampusRequest.cs b/src/Adapters/Gateways/Campus/CreateCampusRequest.cs deleted file mode 100644 index b1959790..00000000 --- a/src/Adapters/Gateways/Campus/CreateCampusRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Campus; - -namespace Adapters.Gateways.Campus -{ - public class CreateCampusRequest : CreateCampusInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Campus/DetailedReadCampusResponse.cs b/src/Adapters/Gateways/Campus/DetailedReadCampusResponse.cs deleted file mode 100644 index f421b987..00000000 --- a/src/Adapters/Gateways/Campus/DetailedReadCampusResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Campus; - -namespace Adapters.Gateways.Campus -{ - public class DetailedReadCampusResponse : DetailedReadCampusOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Campus/ResumedReadCampusResponse.cs b/src/Adapters/Gateways/Campus/ResumedReadCampusResponse.cs deleted file mode 100644 index 40f00fdc..00000000 --- a/src/Adapters/Gateways/Campus/ResumedReadCampusResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Campus; - -namespace Adapters.Gateways.Campus -{ - public class ResumedReadCampusResponse : ResumedReadCampusOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Campus/UpdateCampusRequest.cs b/src/Adapters/Gateways/Campus/UpdateCampusRequest.cs deleted file mode 100644 index 89dac53f..00000000 --- a/src/Adapters/Gateways/Campus/UpdateCampusRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Campus; - -namespace Adapters.Gateways.Campus -{ - public class UpdateCampusRequest : UpdateCampusInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Course/CreateCourseRequest.cs b/src/Adapters/Gateways/Course/CreateCourseRequest.cs deleted file mode 100644 index 3d49b07e..00000000 --- a/src/Adapters/Gateways/Course/CreateCourseRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.Ports.Course; - -namespace Adapters.Gateways.Course -{ - public class CreateCourseRequest : CreateCourseInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Course/DetailedReadCourseResponse.cs b/src/Adapters/Gateways/Course/DetailedReadCourseResponse.cs deleted file mode 100644 index a3817bc7..00000000 --- a/src/Adapters/Gateways/Course/DetailedReadCourseResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Course; - -namespace Adapters.Gateways.Course -{ - public class DetailedReadCourseResponse : DetailedReadCourseOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Course/ResumedReadCourseResponse.cs b/src/Adapters/Gateways/Course/ResumedReadCourseResponse.cs deleted file mode 100644 index 08aa4cb9..00000000 --- a/src/Adapters/Gateways/Course/ResumedReadCourseResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Course; - -namespace Adapters.Gateways.Course -{ - public class ResumedReadCourseResponse : ResumedReadCourseOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Course/UpdateCourseRequest.cs b/src/Adapters/Gateways/Course/UpdateCourseRequest.cs deleted file mode 100644 index 8cc9d8e2..00000000 --- a/src/Adapters/Gateways/Course/UpdateCourseRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Course; - -namespace Adapters.Gateways.Course -{ - public class UpdateCourseRequest : UpdateCourseInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/MainArea/CreateMainAreaRequest.cs b/src/Adapters/Gateways/MainArea/CreateMainAreaRequest.cs deleted file mode 100644 index b581ec22..00000000 --- a/src/Adapters/Gateways/MainArea/CreateMainAreaRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.MainArea; - -namespace Adapters.Gateways.MainArea -{ - public class CreateMainAreaRequest : CreateMainAreaInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/MainArea/DetailedReadMainAreaResponse.cs b/src/Adapters/Gateways/MainArea/DetailedReadMainAreaResponse.cs deleted file mode 100644 index fcb76451..00000000 --- a/src/Adapters/Gateways/MainArea/DetailedReadMainAreaResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.MainArea; - -namespace Adapters.Gateways.MainArea -{ - public class DetailedReadMainAreaResponse : DetailedMainAreaOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/MainArea/ResumedReadMainAreaResponse.cs b/src/Adapters/Gateways/MainArea/ResumedReadMainAreaResponse.cs deleted file mode 100644 index 6c8d9dc3..00000000 --- a/src/Adapters/Gateways/MainArea/ResumedReadMainAreaResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.MainArea; - -namespace Adapters.Gateways.MainArea -{ - public class ResumedReadMainAreaResponse : ResumedReadMainAreaOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/MainArea/UpdateMainAreaRequest.cs b/src/Adapters/Gateways/MainArea/UpdateMainAreaRequest.cs deleted file mode 100644 index 3b7a8e27..00000000 --- a/src/Adapters/Gateways/MainArea/UpdateMainAreaRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.MainArea; - -namespace Adapters.Gateways.MainArea -{ - public class UpdateMainAreaRequest : UpdateMainAreaInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs b/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs deleted file mode 100644 index 05f42fdd..00000000 --- a/src/Adapters/Gateways/Notice/CreateNoticeRequest.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Adapters.Gateways.Activity; -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Notice; -using Microsoft.AspNetCore.Http; - -namespace Adapters.Gateways.Notice -{ - public class CreateNoticeRequest : BaseNoticeContract, IRequest - { - public IFormFile? File { get; set; } - public IList? Activities { get; set; } - } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Notice/DetailedReadNoticeResponse.cs b/src/Adapters/Gateways/Notice/DetailedReadNoticeResponse.cs deleted file mode 100644 index 9ed9cb6f..00000000 --- a/src/Adapters/Gateways/Notice/DetailedReadNoticeResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Notice; - -namespace Adapters.Gateways.Notice -{ - public class DetailedReadNoticeResponse : DetailedReadNoticeOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Notice/ResumedReadNoticeResponse.cs b/src/Adapters/Gateways/Notice/ResumedReadNoticeResponse.cs deleted file mode 100644 index fbd2a7c9..00000000 --- a/src/Adapters/Gateways/Notice/ResumedReadNoticeResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Notice; - -namespace Adapters.Gateways.Notice -{ - public class ResumedReadNoticeResponse : ResumedReadNoticeOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Notice/UpdateNoticeRequest.cs b/src/Adapters/Gateways/Notice/UpdateNoticeRequest.cs deleted file mode 100644 index 9c8f48e4..00000000 --- a/src/Adapters/Gateways/Notice/UpdateNoticeRequest.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Adapters.Gateways.Activity; -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Notice; -using Microsoft.AspNetCore.Http; - -namespace Adapters.Gateways.Notice -{ - public class UpdateNoticeRequest : BaseNoticeContract, IRequest - { - public Guid? Id { get; set; } - public IFormFile? File { get; set; } - public IList? Activities { get; set; } - } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Professor/CreateProfessorRequest.cs b/src/Adapters/Gateways/Professor/CreateProfessorRequest.cs deleted file mode 100644 index 7dbbc2c7..00000000 --- a/src/Adapters/Gateways/Professor/CreateProfessorRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Professor; - -namespace Adapters.Gateways.Professor -{ - public class CreateProfessorRequest : CreateProfessorInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Professor/DetailedReadProfessorResponse.cs b/src/Adapters/Gateways/Professor/DetailedReadProfessorResponse.cs deleted file mode 100644 index 4788898d..00000000 --- a/src/Adapters/Gateways/Professor/DetailedReadProfessorResponse.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Adapters.Gateways.Base; -using Adapters.Gateways.User; - -namespace Adapters.Gateways.Professor -{ - public class DetailedReadProfessorResponse : IResponse - { - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } - public UserReadResponse? User { get; set; } - - #region Required Properties - public string? SIAPEEnrollment { get; set; } - public long IdentifyLattes { get; set; } - #endregion Required Properties - } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Professor/ResumedReadProfessorResponse.cs b/src/Adapters/Gateways/Professor/ResumedReadProfessorResponse.cs deleted file mode 100644 index fc14091f..00000000 --- a/src/Adapters/Gateways/Professor/ResumedReadProfessorResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Professor; - -namespace Adapters.Gateways.Professor -{ - public class ResumedReadProfessorResponse : ResumedReadProfessorOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Professor/UpdateProfessorRequest.cs b/src/Adapters/Gateways/Professor/UpdateProfessorRequest.cs deleted file mode 100644 index 1f6bae69..00000000 --- a/src/Adapters/Gateways/Professor/UpdateProfessorRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Professor; - -namespace Adapters.Gateways.Professor -{ - public class UpdateProfessorRequest : UpdateProfessorInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProgramType/CreateProgramTypeRequest.cs b/src/Adapters/Gateways/ProgramType/CreateProgramTypeRequest.cs deleted file mode 100644 index 844f2319..00000000 --- a/src/Adapters/Gateways/ProgramType/CreateProgramTypeRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.ProgramType; - -namespace Adapters.Gateways.ProgramType -{ - public class CreateProgramTypeRequest : CreateProgramTypeInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProgramType/DetailedReadProgramTypeResponse.cs b/src/Adapters/Gateways/ProgramType/DetailedReadProgramTypeResponse.cs deleted file mode 100644 index 35594977..00000000 --- a/src/Adapters/Gateways/ProgramType/DetailedReadProgramTypeResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.ProgramType; - -namespace Adapters.Gateways.ProgramType -{ - public class DetailedReadProgramTypeResponse : DetailedReadProgramTypeOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProgramType/ResumedReadProgramTypeResponse.cs b/src/Adapters/Gateways/ProgramType/ResumedReadProgramTypeResponse.cs deleted file mode 100644 index 86d538c8..00000000 --- a/src/Adapters/Gateways/ProgramType/ResumedReadProgramTypeResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.ProgramType; - -namespace Adapters.Gateways.ProgramType -{ - public class ResumedReadProgramTypeResponse : ResumedReadProgramTypeOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProgramType/UpdateProgramTypeRequest.cs b/src/Adapters/Gateways/ProgramType/UpdateProgramTypeRequest.cs deleted file mode 100644 index 744505df..00000000 --- a/src/Adapters/Gateways/ProgramType/UpdateProgramTypeRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.ProgramType; - -namespace Adapters.Gateways.ProgramType -{ - public class UpdateProgramTypeRequest : UpdateProgramTypeInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Project/DetailedReadProjectResponse.cs b/src/Adapters/Gateways/Project/DetailedReadProjectResponse.cs deleted file mode 100644 index a4758ffc..00000000 --- a/src/Adapters/Gateways/Project/DetailedReadProjectResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Project; - -namespace Adapters.Gateways.Project -{ - public class DetailedReadProjectResponse : DetailedReadProjectOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Project/OpenProjectRequest.cs b/src/Adapters/Gateways/Project/OpenProjectRequest.cs deleted file mode 100644 index 8e02584d..00000000 --- a/src/Adapters/Gateways/Project/OpenProjectRequest.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using Adapters.Gateways.Base; -using Adapters.Gateways.ProjectActivity; - -namespace Adapters.Gateways.Project; -public class OpenProjectRequest : IRequest -{ - #region Informações do Projeto - [Required] - public string? Title { get; set; } - [Required] - public string? KeyWord1 { get; set; } - [Required] - public string? KeyWord2 { get; set; } - [Required] - public string? KeyWord3 { get; set; } - [Required] - public bool IsScholarshipCandidate { get; set; } - [Required] - public string? Objective { get; set; } - [Required] - public string? Methodology { get; set; } - [Required] - public string? ExpectedResults { get; set; } - [Required] - public string? ActivitiesExecutionSchedule { get; set; } - [Required] - public virtual IList? Activities { get; set; } - #endregion - - #region Relacionamentos - [Required] - public Guid? ProgramTypeId { get; set; } - [Required] - public Guid? ProfessorId { get; set; } - [Required] - public Guid? SubAreaId { get; set; } - [Required] - public Guid? NoticeId { get; set; } - public Guid? StudentId { get; set; } - #endregion -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Project/ResumedReadProjectResponse.cs b/src/Adapters/Gateways/Project/ResumedReadProjectResponse.cs deleted file mode 100644 index 2939055c..00000000 --- a/src/Adapters/Gateways/Project/ResumedReadProjectResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Project; - -namespace Adapters.Gateways.Project -{ - public class ResumedReadProjectResponse : ResumedReadProjectOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Project/UpdateProjectRequest.cs b/src/Adapters/Gateways/Project/UpdateProjectRequest.cs deleted file mode 100644 index 44bcba42..00000000 --- a/src/Adapters/Gateways/Project/UpdateProjectRequest.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using Adapters.Gateways.Base; -using Adapters.Gateways.ProjectActivity; - -namespace Adapters.Gateways.Project; -public class UpdateProjectRequest : IRequest -{ - #region Informações do Projeto - [Required] - public string? Title { get; set; } - [Required] - public string? KeyWord1 { get; set; } - [Required] - public string? KeyWord2 { get; set; } - [Required] - public string? KeyWord3 { get; set; } - [Required] - public bool IsScholarshipCandidate { get; set; } - [Required] - public string? Objective { get; set; } - [Required] - public string? Methodology { get; set; } - [Required] - public string? ExpectedResults { get; set; } - [Required] - public string? ActivitiesExecutionSchedule { get; set; } - [Required] - public IList? Activities { get; set; } - #endregion - - #region Relacionamentos - [Required] - public Guid? ProgramTypeId { get; set; } - [Required] - public Guid? SubAreaId { get; set; } - public Guid? StudentId { get; set; } - #endregion -} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectActivity/BaseProjectActivity.cs b/src/Adapters/Gateways/ProjectActivity/BaseProjectActivity.cs deleted file mode 100644 index 1519b144..00000000 --- a/src/Adapters/Gateways/ProjectActivity/BaseProjectActivity.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.ProjectActivity; -public abstract class BaseProjectActivity -{ - [Required] - public Guid? ActivityId { get; set; } - [Required] - public int? InformedActivities { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectActivity/CreateProjectActivityRequest.cs b/src/Adapters/Gateways/ProjectActivity/CreateProjectActivityRequest.cs deleted file mode 100644 index 95f738f7..00000000 --- a/src/Adapters/Gateways/ProjectActivity/CreateProjectActivityRequest.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace Adapters.Gateways.ProjectActivity; -public class CreateProjectActivityRequest : BaseProjectActivity { } \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectActivity/DetailedReadProjectActivityResponse.cs b/src/Adapters/Gateways/ProjectActivity/DetailedReadProjectActivityResponse.cs deleted file mode 100644 index 89cb1607..00000000 --- a/src/Adapters/Gateways/ProjectActivity/DetailedReadProjectActivityResponse.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Adapters.Gateways.ProjectActivity; -public class DetailedReadProjectActivityResponse : BaseProjectActivity -{ - public Guid? Id { get; set; } - public Guid? ProjectId { get; set; } - public int? FoundActivities { get; set; } - public DateTime? DeletedAt { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectActivity/EvaluateProjectActivityRequest.cs b/src/Adapters/Gateways/ProjectActivity/EvaluateProjectActivityRequest.cs deleted file mode 100644 index 68e53d2c..00000000 --- a/src/Adapters/Gateways/ProjectActivity/EvaluateProjectActivityRequest.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.ProjectActivity; -public class EvaluateProjectActivityRequest : BaseProjectActivity -{ - [Required] - public Guid? ProjectId { get; set; } - [Required] - public int? FoundActivities { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectActivity/ResumedReadProjectActivityResponse.cs b/src/Adapters/Gateways/ProjectActivity/ResumedReadProjectActivityResponse.cs deleted file mode 100644 index ccf6011b..00000000 --- a/src/Adapters/Gateways/ProjectActivity/ResumedReadProjectActivityResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Adapters.Gateways.ProjectActivity; -public class ResumedReadProjectActivityResponse : BaseProjectActivity -{ - public Guid? Id { get; set; } - public Guid? ProjectId { get; set; } - public int? FoundActivities { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectActivity/UpdateProjectActivityRequest.cs b/src/Adapters/Gateways/ProjectActivity/UpdateProjectActivityRequest.cs deleted file mode 100644 index 7b0d4ade..00000000 --- a/src/Adapters/Gateways/ProjectActivity/UpdateProjectActivityRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Adapters.Gateways.ProjectActivity; -public class UpdateProjectActivityRequest : BaseProjectActivity -{ - [Required] - public Guid? ProjectId { get; set; } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectEvaluation/DetailedReadProjectEvaluationResponse.cs b/src/Adapters/Gateways/ProjectEvaluation/DetailedReadProjectEvaluationResponse.cs deleted file mode 100644 index a97fde4f..00000000 --- a/src/Adapters/Gateways/ProjectEvaluation/DetailedReadProjectEvaluationResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.ProjectEvaluation; - -namespace Adapters.Gateways.ProjectEvaluation -{ - public class DetailedReadProjectEvaluationResponse : DetailedReadProjectEvaluationOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectEvaluation/EvaluateAppealProjectRequest.cs b/src/Adapters/Gateways/ProjectEvaluation/EvaluateAppealProjectRequest.cs deleted file mode 100644 index 6f6a5d15..00000000 --- a/src/Adapters/Gateways/ProjectEvaluation/EvaluateAppealProjectRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.ProjectEvaluation; - -namespace Adapters.Gateways.ProjectEvaluation -{ - public class EvaluateAppealProjectRequest : EvaluateAppealProjectInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/ProjectEvaluation/EvaluateSubmissionProjectRequest.cs b/src/Adapters/Gateways/ProjectEvaluation/EvaluateSubmissionProjectRequest.cs deleted file mode 100644 index e79c980a..00000000 --- a/src/Adapters/Gateways/ProjectEvaluation/EvaluateSubmissionProjectRequest.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using Adapters.Gateways.Base; -using Adapters.Gateways.ProjectActivity; - -namespace Adapters.Gateways.ProjectEvaluation; -public class EvaluateSubmissionProjectRequest : IRequest -{ - #region Informações Gerais da Avaliação - [Required] - public Guid? ProjectId { get; set; } - [Required] - public bool IsProductivityFellow { get; set; } - [Required] - public int? SubmissionEvaluationStatus { get; set; } - [Required] - public string? SubmissionEvaluationDescription { get; set; } - [Required] - public IList? Activities { get; set; } - #endregion - - #region Critérios de Avaliação - [Required] - public int? Qualification { get; set; } - [Required] - public int? ProjectProposalObjectives { get; set; } - [Required] - public int? AcademicScientificProductionCoherence { get; set; } - [Required] - public int? ProposalMethodologyAdaptation { get; set; } - [Required] - public int? EffectiveContributionToResearch { get; set; } - #endregion -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Student/CreateStudentRequest.cs b/src/Adapters/Gateways/Student/CreateStudentRequest.cs deleted file mode 100644 index 834d0e87..00000000 --- a/src/Adapters/Gateways/Student/CreateStudentRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Student; - -namespace Adapters.Gateways.Student -{ - public class CreateStudentRequest : CreateStudentInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Student/DetailedReadStudentResponse.cs b/src/Adapters/Gateways/Student/DetailedReadStudentResponse.cs deleted file mode 100644 index 20a9d01f..00000000 --- a/src/Adapters/Gateways/Student/DetailedReadStudentResponse.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Adapters.Gateways.Base; -using Adapters.Gateways.Campus; -using Adapters.Gateways.Course; -using Adapters.Gateways.User; - -namespace Adapters.Gateways.Student -{ - public class DetailedReadStudentResponse : IResponse - { - public Guid? Id { get; set; } - public DateTime? DeletedAt { get; set; } - public UserReadResponse? User { get; set; } - public DetailedReadCampusResponse? Campus { get; set; } - public DetailedReadCourseResponse? Course { get; set; } - - #region Required Properties - public DateTime BirthDate { get; set; } - public long RG { get; set; } - public string? IssuingAgency { get; set; } - public DateTime DispatchDate { get; set; } - public int Gender { get; set; } - public int Race { get; set; } - public string? HomeAddress { get; set; } - public string? City { get; set; } - public string? UF { get; set; } - public long CEP { get; set; } - public Guid? CampusId { get; set; } - public Guid? CourseId { get; set; } - public string? StartYear { get; set; } - public Guid? AssistanceTypeId { get; set; } - #endregion - - #region Optional Properties - public int? PhoneDDD { get; set; } - public long? Phone { get; set; } - public int? CellPhoneDDD { get; set; } - public long? CellPhone { get; set; } - #endregion - } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Student/ResumedReadStudentResponse.cs b/src/Adapters/Gateways/Student/ResumedReadStudentResponse.cs deleted file mode 100644 index bd9d47f5..00000000 --- a/src/Adapters/Gateways/Student/ResumedReadStudentResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Student; - -namespace Adapters.Gateways.Student -{ - public class ResumedReadStudentResponse : ResumedReadStudentOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/Student/UpdateStudentRequest.cs b/src/Adapters/Gateways/Student/UpdateStudentRequest.cs deleted file mode 100644 index fb736af8..00000000 --- a/src/Adapters/Gateways/Student/UpdateStudentRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.Student; - -namespace Adapters.Gateways.Student -{ - public class UpdateStudentRequest : UpdateStudentInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/StudentDocuments/CreateStudentDocumentsRequest.cs b/src/Adapters/Gateways/StudentDocuments/CreateStudentDocumentsRequest.cs deleted file mode 100644 index 7c56c42f..00000000 --- a/src/Adapters/Gateways/StudentDocuments/CreateStudentDocumentsRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.StudentDocuments; - -namespace Adapters.Gateways.StudentDocuments -{ - public class CreateStudentDocumentsRequest : CreateStudentDocumentsInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/StudentDocuments/DetailedReadStudentDocumentsResponse.cs b/src/Adapters/Gateways/StudentDocuments/DetailedReadStudentDocumentsResponse.cs deleted file mode 100644 index 7cedff9e..00000000 --- a/src/Adapters/Gateways/StudentDocuments/DetailedReadStudentDocumentsResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.StudentDocuments; - -namespace Adapters.Gateways.StudentDocuments -{ - public class DetailedReadStudentDocumentsResponse : DetailedReadStudentDocumentsOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/StudentDocuments/ResumedReadStudentDocumentsResponse.cs b/src/Adapters/Gateways/StudentDocuments/ResumedReadStudentDocumentsResponse.cs deleted file mode 100644 index 10081c30..00000000 --- a/src/Adapters/Gateways/StudentDocuments/ResumedReadStudentDocumentsResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.StudentDocuments; - -namespace Adapters.Gateways.StudentDocuments -{ - public class ResumedReadStudentDocumentsResponse : ResumedReadStudentDocumentsOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/StudentDocuments/UpdateStudentDocumentsRequest.cs b/src/Adapters/Gateways/StudentDocuments/UpdateStudentDocumentsRequest.cs deleted file mode 100644 index 73452cea..00000000 --- a/src/Adapters/Gateways/StudentDocuments/UpdateStudentDocumentsRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.StudentDocuments; - -namespace Adapters.Gateways.StudentDocuments -{ - public class UpdateStudentDocumentsRequest : UpdateStudentDocumentsInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/SubArea/CreateSubAreaRequest.cs b/src/Adapters/Gateways/SubArea/CreateSubAreaRequest.cs deleted file mode 100644 index 9bef8dab..00000000 --- a/src/Adapters/Gateways/SubArea/CreateSubAreaRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.SubArea; - -namespace Adapters.Gateways.SubArea -{ - public class CreateSubAreaRequest : CreateSubAreaInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/SubArea/DetailedReadSubAreaResponse.cs b/src/Adapters/Gateways/SubArea/DetailedReadSubAreaResponse.cs deleted file mode 100644 index 3bba32a0..00000000 --- a/src/Adapters/Gateways/SubArea/DetailedReadSubAreaResponse.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Adapters.Gateways.Area; -using Adapters.Gateways.Base; - -namespace Adapters.Gateways.SubArea -{ - public class DetailedReadSubAreaResponse : IResponse - { - public Guid? Id { get; set; } - public string? Name { get; set; } - public string? Code { get; set; } - public DateTime? DeletedAt { get; set; } - public virtual DetailedReadAreaResponse? Area { get; set; } - } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/SubArea/ResumedReadSubAreaResponse.cs b/src/Adapters/Gateways/SubArea/ResumedReadSubAreaResponse.cs deleted file mode 100644 index c142ea96..00000000 --- a/src/Adapters/Gateways/SubArea/ResumedReadSubAreaResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.SubArea; - -namespace Adapters.Gateways.SubArea -{ - public class ResumedReadSubAreaResponse : ResumedReadSubAreaOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/SubArea/UpdateSubAreaRequest.cs b/src/Adapters/Gateways/SubArea/UpdateSubAreaRequest.cs deleted file mode 100644 index 25f436eb..00000000 --- a/src/Adapters/Gateways/SubArea/UpdateSubAreaRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.SubArea; - -namespace Adapters.Gateways.SubArea -{ - public class UpdateSubAreaRequest : UpdateSubAreaInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/User/UserReadResponse.cs b/src/Adapters/Gateways/User/UserReadResponse.cs deleted file mode 100644 index b1eaee1c..00000000 --- a/src/Adapters/Gateways/User/UserReadResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.User; - -namespace Adapters.Gateways.User -{ - public class UserReadResponse : UserReadOutput, IResponse { } -} \ No newline at end of file diff --git a/src/Adapters/Gateways/User/UserUpdateRequest.cs b/src/Adapters/Gateways/User/UserUpdateRequest.cs deleted file mode 100644 index aa5d5610..00000000 --- a/src/Adapters/Gateways/User/UserUpdateRequest.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Adapters.Gateways.Base; -using Domain.UseCases.Ports.User; - -namespace Adapters.Gateways.User -{ - public class UserUpdateRequest : UserUpdateInput, IRequest { } -} \ No newline at end of file diff --git a/src/Adapters/Interfaces/Base/IGenericCRUDPresenterController.cs b/src/Adapters/Interfaces/Base/IGenericCRUDPresenterController.cs deleted file mode 100644 index 55d12e7d..00000000 --- a/src/Adapters/Interfaces/Base/IGenericCRUDPresenterController.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Adapters.Gateways.Base; - -namespace Adapters.Interfaces.Base -{ - public interface IGenericCRUDPresenterController - { - /// - /// Busca entidade pelo Id informado. - /// Lança uma exceção quando a entidade não é encontrada. - /// - /// Id da entidade. - /// Entidade encontrada. - Task GetById(Guid? id); - - /// - /// Busca todas as entidades ativas. - /// - /// Lista de entidades ativas. - Task> GetAll(int skip, int take); - - /// - /// Cria entidade conforme parâmetros fornecidos. - /// - /// Parâmetros de criação. - /// Entidade criada. - Task Create(IRequest request); - - /// - /// Remove entidade através do Id informado. - /// - /// Id da entidade a ser removida. - /// Entidade removida. - Task Delete(Guid? id); - - /// - /// Atualiza entidade conforme parâmetros fornecidos. - /// - /// Parâmetros de atualização. - /// Entidade atualizada. - Task Update(Guid? id, IRequest request); - } -} \ No newline at end of file diff --git a/src/Adapters/Interfaces/IActivityPresenterController.cs b/src/Adapters/Interfaces/IActivityPresenterController.cs deleted file mode 100644 index 5e9f3c46..00000000 --- a/src/Adapters/Interfaces/IActivityPresenterController.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Adapters.Gateways.Activity; - -namespace Adapters.Interfaces -{ - public interface IActivityPresenterController - { - Task> GetActivitiesByNoticeId(Guid? noticeId); - Task> GetLastNoticeActivities(); - } -} \ No newline at end of file diff --git a/src/Adapters/Interfaces/IAreaPresenterController.cs b/src/Adapters/Interfaces/IAreaPresenterController.cs deleted file mode 100644 index 4696f8b2..00000000 --- a/src/Adapters/Interfaces/IAreaPresenterController.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Adapters.Gateways.Base; -using Adapters.Interfaces.Base; - -namespace Adapters.Interfaces; -public interface IAreaPresenterController : IGenericCRUDPresenterController -{ - Task> GetAreasByMainArea(Guid? mainAreaId, int skip, int take); -} \ No newline at end of file diff --git a/src/Adapters/Interfaces/IAuthPresenterController.cs b/src/Adapters/Interfaces/IAuthPresenterController.cs deleted file mode 100644 index 608a8f00..00000000 --- a/src/Adapters/Interfaces/IAuthPresenterController.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Adapters.Gateways.Auth; - -namespace Adapters.Interfaces; -public interface IAuthPresenterController -{ - Task ConfirmEmail(string? email, string? token); - Task ForgotPassword(string? email); - Task Login(UserLoginRequest request); - Task ResetPassword(UserResetPasswordRequest request); -} \ No newline at end of file diff --git a/src/Adapters/Interfaces/ICampusPresenterController.cs b/src/Adapters/Interfaces/ICampusPresenterController.cs deleted file mode 100644 index e8068a91..00000000 --- a/src/Adapters/Interfaces/ICampusPresenterController.cs +++ /dev/null @@ -1,4 +0,0 @@ -using Adapters.Interfaces.Base; - -namespace Adapters.Interfaces; -public interface ICampusPresenterController : IGenericCRUDPresenterController { } \ No newline at end of file diff --git a/src/Adapters/Interfaces/ICoursePresenterController.cs b/src/Adapters/Interfaces/ICoursePresenterController.cs deleted file mode 100644 index c031fa60..00000000 --- a/src/Adapters/Interfaces/ICoursePresenterController.cs +++ /dev/null @@ -1,4 +0,0 @@ -using Adapters.Interfaces.Base; - -namespace Adapters.Interfaces; -public interface ICoursePresenterController : IGenericCRUDPresenterController { } \ No newline at end of file diff --git a/src/Adapters/Interfaces/IMainAreaPresenterController.cs b/src/Adapters/Interfaces/IMainAreaPresenterController.cs deleted file mode 100644 index fd38bcc9..00000000 --- a/src/Adapters/Interfaces/IMainAreaPresenterController.cs +++ /dev/null @@ -1,4 +0,0 @@ -using Adapters.Interfaces.Base; - -namespace Adapters.Interfaces; -public interface IMainAreaPresenterController : IGenericCRUDPresenterController { } \ No newline at end of file diff --git a/src/Adapters/Interfaces/INoticePresenterController.cs b/src/Adapters/Interfaces/INoticePresenterController.cs deleted file mode 100644 index e5a0346d..00000000 --- a/src/Adapters/Interfaces/INoticePresenterController.cs +++ /dev/null @@ -1,4 +0,0 @@ -using Adapters.Interfaces.Base; - -namespace Adapters.Interfaces; -public interface INoticePresenterController : IGenericCRUDPresenterController { } \ No newline at end of file diff --git a/src/Adapters/Interfaces/IProfessorPresenterController.cs b/src/Adapters/Interfaces/IProfessorPresenterController.cs deleted file mode 100644 index d80895f1..00000000 --- a/src/Adapters/Interfaces/IProfessorPresenterController.cs +++ /dev/null @@ -1,4 +0,0 @@ -using Adapters.Interfaces.Base; - -namespace Adapters.Interfaces; -public interface IProfessorPresenterController : IGenericCRUDPresenterController { } \ No newline at end of file diff --git a/src/Adapters/Interfaces/IProgramTypePresenterController.cs b/src/Adapters/Interfaces/IProgramTypePresenterController.cs deleted file mode 100644 index 559ac319..00000000 --- a/src/Adapters/Interfaces/IProgramTypePresenterController.cs +++ /dev/null @@ -1,4 +0,0 @@ -using Adapters.Interfaces.Base; - -namespace Adapters.Interfaces; -public interface IProgramTypePresenterController : IGenericCRUDPresenterController { } \ No newline at end of file diff --git a/src/Adapters/Interfaces/IProjectEvaluationPresenterController.cs b/src/Adapters/Interfaces/IProjectEvaluationPresenterController.cs deleted file mode 100644 index 760f3838..00000000 --- a/src/Adapters/Interfaces/IProjectEvaluationPresenterController.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Adapters.Gateways.Project; -using Adapters.Gateways.ProjectEvaluation; - -namespace Adapters.Interfaces -{ - public interface IProjectEvaluationPresenterController - { - Task EvaluateAppealProject(EvaluateAppealProjectRequest request); - Task EvaluateSubmissionProject(EvaluateSubmissionProjectRequest request); - Task GetEvaluationByProjectId(Guid? projectId); - } -} \ No newline at end of file diff --git a/src/Adapters/Interfaces/IProjectPresenterController.cs b/src/Adapters/Interfaces/IProjectPresenterController.cs deleted file mode 100644 index 63a737e8..00000000 --- a/src/Adapters/Interfaces/IProjectPresenterController.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Adapters.Gateways.Project; - -namespace Adapters.Interfaces; -public interface IProjectPresenterController -{ - Task> GetClosedProjects(int skip, int take, bool onlyMyProjects = true); - Task> GetOpenProjects(int skip, int take, bool onlyMyProjects = true); - Task GetProjectById(Guid? id); - Task OpenProject(OpenProjectRequest input); - Task UpdateProject(Guid? id, UpdateProjectRequest input); - Task CancelProject(Guid? id, string? observation); - Task AppealProject(Guid? projectId, string? appealDescription); - Task SubmitProject(Guid? projectId); -} \ No newline at end of file diff --git a/src/Adapters/Interfaces/IStudentDocumentsPresenterController.cs b/src/Adapters/Interfaces/IStudentDocumentsPresenterController.cs deleted file mode 100644 index 3b2eec0e..00000000 --- a/src/Adapters/Interfaces/IStudentDocumentsPresenterController.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Adapters.Gateways.StudentDocuments; - -namespace Adapters.Interfaces; -public interface IStudentDocumentsPresenterController -{ - Task Create(CreateStudentDocumentsRequest model); - Task Delete(Guid? id); - Task GetByProjectId(Guid? projectId); - Task GetByStudentId(Guid? studentId); - Task Update(Guid? id, UpdateStudentDocumentsRequest model); -} \ No newline at end of file diff --git a/src/Adapters/Interfaces/IStudentPresenterController.cs b/src/Adapters/Interfaces/IStudentPresenterController.cs deleted file mode 100644 index 185683e0..00000000 --- a/src/Adapters/Interfaces/IStudentPresenterController.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Adapters.Gateways.Student; -using Adapters.Interfaces.Base; - -namespace Adapters.Interfaces; -public interface IStudentPresenterController : IGenericCRUDPresenterController -{ - Task GetByRegistrationCode(string? registrationCode); - Task RequestStudentRegister(string? email); -} \ No newline at end of file diff --git a/src/Adapters/Interfaces/ISubAreaPresenterController.cs b/src/Adapters/Interfaces/ISubAreaPresenterController.cs deleted file mode 100644 index e6f1ab6f..00000000 --- a/src/Adapters/Interfaces/ISubAreaPresenterController.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Adapters.Gateways.Base; -using Adapters.Interfaces.Base; - -namespace Adapters.Interfaces; -public interface ISubAreaPresenterController : IGenericCRUDPresenterController -{ - Task> GetSubAreasByArea(Guid? areaId, int skip, int take); -} diff --git a/src/Adapters/Interfaces/ITypeAssistancePresenterController.cs b/src/Adapters/Interfaces/ITypeAssistancePresenterController.cs deleted file mode 100644 index cc0b4c97..00000000 --- a/src/Adapters/Interfaces/ITypeAssistancePresenterController.cs +++ /dev/null @@ -1,4 +0,0 @@ -using Adapters.Interfaces.Base; - -namespace Adapters.Interfaces; -public interface IAssistanceTypePresenterController : IGenericCRUDPresenterController { } \ No newline at end of file diff --git a/src/Adapters/Interfaces/IUserPresenterController.cs b/src/Adapters/Interfaces/IUserPresenterController.cs deleted file mode 100644 index 96cd62e1..00000000 --- a/src/Adapters/Interfaces/IUserPresenterController.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Adapters.Gateways.User; - -namespace Adapters.Interfaces -{ - public interface IUserPresenterController - { - Task ActivateUser(Guid? id); - Task DeactivateUser(Guid? id); - Task> GetActiveUsers(int skip, int take); - Task> GetInactiveUsers(int skip, int take); - Task GetUserById(Guid? id); - Task UpdateUser(UserUpdateRequest request); - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/ActivityMappings.cs b/src/Adapters/Mappings/ActivityMappings.cs deleted file mode 100644 index 8925bb17..00000000 --- a/src/Adapters/Mappings/ActivityMappings.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Adapters.Gateways.Activity; -using AutoMapper; -using Domain.Ports.Activity; -using Domain.UseCases.Ports.Activity; -namespace Adapters.Mappings -{ - public class ActivityMappings : Profile - { - public ActivityMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) - .ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) - .ForPath(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) - .ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) - .ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/AreaMappings.cs b/src/Adapters/Mappings/AreaMappings.cs deleted file mode 100755 index caa3a6fb..00000000 --- a/src/Adapters/Mappings/AreaMappings.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Adapters.Gateways.Area; -using AutoMapper; -using Domain.UseCases.Ports.Area; - -namespace Adapters.Mappings -{ - public class AreaMappings : Profile - { - public AreaMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap() - .ForMember(dest => dest.MainArea, opt => opt.MapFrom(src => src.MainArea)) - .ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/AuthMappings.cs b/src/Adapters/Mappings/AuthMappings.cs deleted file mode 100755 index 1062fc7b..00000000 --- a/src/Adapters/Mappings/AuthMappings.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Adapters.Gateways.Auth; -using AutoMapper; -using Domain.UseCases.Ports.Auth; - -namespace Adapters.Mappings -{ - public class AuthMappings : Profile - { - public AuthMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/CampusMappings.cs b/src/Adapters/Mappings/CampusMappings.cs deleted file mode 100755 index 5c380808..00000000 --- a/src/Adapters/Mappings/CampusMappings.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Adapters.Gateways.Campus; -using AutoMapper; -using Domain.UseCases.Ports.Campus; - -namespace Adapters.Mappings -{ - public class CampusMappings : Profile - { - public CampusMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/CourseMappings.cs b/src/Adapters/Mappings/CourseMappings.cs deleted file mode 100755 index 52ada4ff..00000000 --- a/src/Adapters/Mappings/CourseMappings.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Adapters.Gateways.Course; -using AutoMapper; -using Domain.Ports.Course; -using Domain.UseCases.Ports.Course; - -namespace Adapters.Mappings -{ - public class CourseMappings : Profile - { - public CourseMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/MainAreaMappings.cs b/src/Adapters/Mappings/MainAreaMappings.cs deleted file mode 100755 index 874f1677..00000000 --- a/src/Adapters/Mappings/MainAreaMappings.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Adapters.Gateways.MainArea; -using AutoMapper; -using Domain.UseCases.Ports.MainArea; - -namespace Adapters.Mappings -{ - public class MainAreaMappings : Profile - { - public MainAreaMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/NoticeMappings.cs b/src/Adapters/Mappings/NoticeMappings.cs deleted file mode 100755 index 4de7cf9c..00000000 --- a/src/Adapters/Mappings/NoticeMappings.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Adapters.Gateways.Notice; -using AutoMapper; -using Domain.UseCases.Ports.Notice; - -namespace Adapters.Mappings -{ - public class NoticeMappings : Profile - { - public NoticeMappings() - { - _ = CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) - .ReverseMap(); - _ = CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) - .ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/ProfessorMappings.cs b/src/Adapters/Mappings/ProfessorMappings.cs deleted file mode 100755 index 5c41c732..00000000 --- a/src/Adapters/Mappings/ProfessorMappings.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Adapters.Gateways.Professor; -using AutoMapper; -using Domain.UseCases.Ports.Professor; - -namespace Adapters.Mappings -{ - public class ProfessorMappings : Profile - { - public ProfessorMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap() - .ForMember(dest => dest.User, - opt => opt.MapFrom(src => src.User)) - .ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/ProgramTypeMappings.cs b/src/Adapters/Mappings/ProgramTypeMappings.cs deleted file mode 100755 index 5f0cf2dd..00000000 --- a/src/Adapters/Mappings/ProgramTypeMappings.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Adapters.Gateways.ProgramType; -using AutoMapper; -using Domain.UseCases.Ports.ProgramType; - -namespace Adapters.Mappings -{ - public class ProgramTypeMappings : Profile - { - public ProgramTypeMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/ProjectActivityMappings.cs b/src/Adapters/Mappings/ProjectActivityMappings.cs deleted file mode 100755 index cb85ec1b..00000000 --- a/src/Adapters/Mappings/ProjectActivityMappings.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Adapters.Gateways.ProjectActivity; -using AutoMapper; -using Domain.UseCases.Ports.ProjectActivity; - -namespace Adapters.Mappings -{ - public class ProjectActivityMappings : Profile - { - public ProjectActivityMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/ProjectEvaluationMapping.cs b/src/Adapters/Mappings/ProjectEvaluationMapping.cs deleted file mode 100644 index a854e36c..00000000 --- a/src/Adapters/Mappings/ProjectEvaluationMapping.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Adapters.Gateways.ProjectEvaluation; -using AutoMapper; -using Domain.UseCases.Ports.ProjectEvaluation; - -namespace Adapters.Mappings -{ - public class ProjectEvaluationMapping : Profile - { - public ProjectEvaluationMapping() - { - _ = CreateMap() - .ReverseMap(); - _ = CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) - .ReverseMap(); - _ = CreateMap() - .ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/ProjectMappings.cs b/src/Adapters/Mappings/ProjectMappings.cs deleted file mode 100755 index 0cbdc7be..00000000 --- a/src/Adapters/Mappings/ProjectMappings.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Adapters.Gateways.Project; -using AutoMapper; -using Domain.UseCases.Ports.Project; - -namespace Adapters.Mappings -{ - public class ProjectMappings : Profile - { - public ProjectMappings() - { - _ = CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) - .ReverseMap(); - _ = CreateMap() - .ForMember(dest => dest.Activities, opt => opt.MapFrom(src => src.Activities)) - .ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/StudentDocumentsMappings.cs b/src/Adapters/Mappings/StudentDocumentsMappings.cs deleted file mode 100755 index b6f9a1e0..00000000 --- a/src/Adapters/Mappings/StudentDocumentsMappings.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Adapters.Gateways.StudentDocuments; -using AutoMapper; -using Domain.UseCases.Ports.StudentDocuments; - -namespace Adapters.Mappings -{ - public class StudentDocumentsMappings : Profile - { - public StudentDocumentsMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/StudentMappings.cs b/src/Adapters/Mappings/StudentMappings.cs deleted file mode 100755 index be5a1045..00000000 --- a/src/Adapters/Mappings/StudentMappings.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Adapters.Gateways.Student; -using AutoMapper; -using Domain.UseCases.Ports.Student; - -namespace Adapters.Mappings -{ - public class StudentMappings : Profile - { - public StudentMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap() - .ForMember(dest => dest.User, - opt => opt.MapFrom(src => src.User)) - .ForMember(dest => dest.Campus, - opt => opt.MapFrom(src => src.Campus)) - .ForMember(dest => dest.Course, - opt => opt.MapFrom(src => src.Course)) - .ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/SubAreaMappings.cs b/src/Adapters/Mappings/SubAreaMappings.cs deleted file mode 100755 index 43d76bfc..00000000 --- a/src/Adapters/Mappings/SubAreaMappings.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Adapters.Gateways.SubArea; -using AutoMapper; -using Domain.UseCases.Ports.SubArea; - -namespace Adapters.Mappings -{ - public class SubAreaMappings : Profile - { - public SubAreaMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap() - .ForMember(dest => dest.Area, opt => opt.MapFrom(src => src.Area)) - .ForPath(dest => dest.Area!.MainArea, opt => opt.MapFrom(src => src.Area!.MainArea)) - .ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/TypeAssistanceMappings.cs b/src/Adapters/Mappings/TypeAssistanceMappings.cs deleted file mode 100755 index 104c53cd..00000000 --- a/src/Adapters/Mappings/TypeAssistanceMappings.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Adapters.Gateways.AssistanceType; -using AutoMapper; -using Domain.UseCases.Ports.AssistanceType; - -namespace Adapters.Mappings -{ - public class AssistanceTypeMappings : Profile - { - public AssistanceTypeMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/Mappings/UserMappings.cs b/src/Adapters/Mappings/UserMappings.cs deleted file mode 100755 index fe25179b..00000000 --- a/src/Adapters/Mappings/UserMappings.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Adapters.Gateways.User; -using AutoMapper; -using Domain.UseCases.Ports.User; - -namespace Adapters.Mappings -{ - public class UserMappings : Profile - { - public UserMappings() - { - _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/ActivityPresenterController.cs b/src/Adapters/PresenterController/ActivityPresenterController.cs deleted file mode 100644 index 356f8c7b..00000000 --- a/src/Adapters/PresenterController/ActivityPresenterController.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Adapters.Gateways.Activity; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.ActivityType; - -namespace Adapters.PresenterController -{ - public class ActivityPresenterController : IActivityPresenterController - { - private readonly IGetActivitiesByNoticeId _getActivitiesByNoticeId; - private readonly IGetLastNoticeActivities _getLastNoticeActivities; - private readonly IMapper _mapper; - public ActivityPresenterController( - IGetActivitiesByNoticeId getActivitiesByNoticeId, - IGetLastNoticeActivities getLastNoticeActivities, - IMapper mapper) - { - _getActivitiesByNoticeId = getActivitiesByNoticeId; - _getLastNoticeActivities = getLastNoticeActivities; - _mapper = mapper; - } - - public async Task> GetActivitiesByNoticeId(Guid? noticeId) - { - IEnumerable activityTypes = await _getActivitiesByNoticeId.ExecuteAsync(noticeId); - return _mapper.Map>(activityTypes); - } - - public async Task> GetLastNoticeActivities() - { - IEnumerable activityTypes = await _getLastNoticeActivities.ExecuteAsync(); - return _mapper.Map>(activityTypes); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/AreaPresenterController.cs b/src/Adapters/PresenterController/AreaPresenterController.cs deleted file mode 100755 index 49a53a68..00000000 --- a/src/Adapters/PresenterController/AreaPresenterController.cs +++ /dev/null @@ -1,70 +0,0 @@ -using Adapters.Gateways.Area; -using Adapters.Gateways.Base; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.Area; -using Domain.UseCases.Ports.Area; - -namespace Adapters.PresenterController -{ - public class AreaPresenterController : IAreaPresenterController - { - #region Global Scope - private readonly ICreateArea _createArea; - private readonly IUpdateArea _updateArea; - private readonly IDeleteArea _deleteArea; - private readonly IGetAreasByMainArea _getAreasByMainArea; - private readonly IGetAreaById _getAreaById; - private readonly IMapper _mapper; - - public AreaPresenterController(ICreateArea createArea, IUpdateArea updateArea, IDeleteArea deleteArea, IGetAreasByMainArea getAreasByMainArea, IGetAreaById getAreaById, IMapper mapper) - { - _createArea = createArea; - _updateArea = updateArea; - _deleteArea = deleteArea; - _getAreasByMainArea = getAreasByMainArea; - _getAreaById = getAreaById; - _mapper = mapper; - } - #endregion Global Scope - - public async Task Create(IRequest request) - { - CreateAreaRequest? dto = request as CreateAreaRequest; - CreateAreaInput input = _mapper.Map(dto); - DetailedReadAreaOutput result = await _createArea.ExecuteAsync(input); - return _mapper.Map(result); - } - - public async Task Delete(Guid? id) - { - DetailedReadAreaOutput result = await _deleteArea.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task> GetAreasByMainArea(Guid? mainAreaId, int skip, int take) - { - IQueryable result = await _getAreasByMainArea.ExecuteAsync(mainAreaId, skip, take); - return _mapper.Map>(result); - } - - public Task> GetAll(int skip, int take) - { - throw new NotImplementedException(); - } - - public async Task GetById(Guid? id) - { - DetailedReadAreaOutput result = await _getAreaById.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task Update(Guid? id, IRequest request) - { - UpdateAreaRequest? dto = request as UpdateAreaRequest; - UpdateAreaInput input = _mapper.Map(dto); - DetailedReadAreaOutput result = await _updateArea.ExecuteAsync(id, input); - return _mapper.Map(result); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/AuthPresenterController.cs b/src/Adapters/PresenterController/AuthPresenterController.cs deleted file mode 100755 index badb5c70..00000000 --- a/src/Adapters/PresenterController/AuthPresenterController.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Adapters.Gateways.Auth; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.Auth; -using Domain.UseCases.Ports.Auth; - -namespace Adapters.PresenterController -{ - public class AuthPresenterController : IAuthPresenterController - { - #region Global Scope - private readonly IMapper _mapper; - private readonly IConfirmEmail _confirmUserEmail; - private readonly IForgotPassword _forgotPassword; - private readonly ILogin _login; - private readonly IResetPassword _resetPassword; - - public AuthPresenterController(IMapper mapper, IConfirmEmail confirmUserEmail, IForgotPassword forgotPassword, ILogin login, IResetPassword resetPassword) - { - _mapper = mapper; - _confirmUserEmail = confirmUserEmail; - _forgotPassword = forgotPassword; - _login = login; - _resetPassword = resetPassword; - } - #endregion Global Scope - - public async Task ConfirmEmail(string? email, string? token) - { - return await _confirmUserEmail.ExecuteAsync(email, token); - } - - public async Task ForgotPassword(string? email) - { - return await _forgotPassword.ExecuteAsync(email); - } - - public async Task Login(UserLoginRequest request) - { - return _mapper - .Map(await _login - .ExecuteAsync(_mapper - .Map(request))); - } - - public async Task ResetPassword(UserResetPasswordRequest request) - { - return await _resetPassword.ExecuteAsync(_mapper.Map(request)); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/CampusPresenterController.cs b/src/Adapters/PresenterController/CampusPresenterController.cs deleted file mode 100755 index 080a3441..00000000 --- a/src/Adapters/PresenterController/CampusPresenterController.cs +++ /dev/null @@ -1,65 +0,0 @@ -using Adapters.Gateways.Base; -using Adapters.Gateways.Campus; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.Campus; -using Domain.UseCases.Ports.Campus; - -namespace Adapters.PresenterController -{ - public class CampusPresenterController : ICampusPresenterController - { - #region Global Scope - private readonly ICreateCampus _createCampus; - private readonly IUpdateCampus _updateCampus; - private readonly IDeleteCampus _deleteCampus; - private readonly IGetCampuses _getCampuses; - private readonly IGetCampusById _getCampusById; - private readonly IMapper _mapper; - - public CampusPresenterController(ICreateCampus createCampus, IUpdateCampus updateCampus, IDeleteCampus deleteCampus, IGetCampuses getCampuses, IGetCampusById getCampusById, IMapper mapper) - { - _createCampus = createCampus; - _updateCampus = updateCampus; - _deleteCampus = deleteCampus; - _getCampuses = getCampuses; - _getCampusById = getCampusById; - _mapper = mapper; - } - #endregion Global Scope - - public async Task Create(IRequest request) - { - CreateCampusRequest? dto = request as CreateCampusRequest; - CreateCampusInput input = _mapper.Map(dto); - DetailedReadCampusOutput result = await _createCampus.ExecuteAsync(input); - return _mapper.Map(result); - } - - public async Task Delete(Guid? id) - { - DetailedReadCampusOutput result = await _deleteCampus.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task> GetAll(int skip, int take) - { - IQueryable result = await _getCampuses.ExecuteAsync(skip, take); - return _mapper.Map>(result); - } - - public async Task GetById(Guid? id) - { - DetailedReadCampusOutput result = await _getCampusById.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task Update(Guid? id, IRequest request) - { - UpdateCampusRequest? dto = request as UpdateCampusRequest; - UpdateCampusInput input = _mapper.Map(dto); - DetailedReadCampusOutput result = await _updateCampus.ExecuteAsync(id, input); - return _mapper.Map(result); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/CoursePresenterController.cs b/src/Adapters/PresenterController/CoursePresenterController.cs deleted file mode 100755 index 44dc0dab..00000000 --- a/src/Adapters/PresenterController/CoursePresenterController.cs +++ /dev/null @@ -1,66 +0,0 @@ -using Adapters.Gateways.Base; -using Adapters.Gateways.Course; -using Adapters.Interfaces; -using AutoMapper; -using Domain.Ports.Course; -using Domain.UseCases.Interfaces.Course; -using Domain.UseCases.Ports.Course; - -namespace Adapters.PresenterController -{ - public class CoursePresenterController : ICoursePresenterController - { - #region Global Scope - private readonly ICreateCourse _createCourse; - private readonly IUpdateCourse _updateCourse; - private readonly IDeleteCourse _deleteCourse; - private readonly IGetCourses _getCourses; - private readonly IGetCourseById _getCourseById; - private readonly IMapper _mapper; - - public CoursePresenterController(ICreateCourse createCourse, IUpdateCourse updateCourse, IDeleteCourse deleteCourse, IGetCourses getCourses, IGetCourseById getCourseById, IMapper mapper) - { - _createCourse = createCourse; - _updateCourse = updateCourse; - _deleteCourse = deleteCourse; - _getCourses = getCourses; - _getCourseById = getCourseById; - _mapper = mapper; - } - #endregion Global Scope - - public async Task Create(IRequest request) - { - CreateCourseRequest? dto = request as CreateCourseRequest; - CreateCourseInput input = _mapper.Map(dto); - DetailedReadCourseOutput result = await _createCourse.ExecuteAsync(input); - return _mapper.Map(result); - } - - public async Task Delete(Guid? id) - { - DetailedReadCourseOutput result = await _deleteCourse.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task> GetAll(int skip, int take) - { - IQueryable result = await _getCourses.ExecuteAsync(skip, take); - return _mapper.Map>(result); - } - - public async Task GetById(Guid? id) - { - DetailedReadCourseOutput result = await _getCourseById.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task Update(Guid? id, IRequest request) - { - UpdateCourseRequest? dto = request as UpdateCourseRequest; - UpdateCourseInput input = _mapper.Map(dto); - DetailedReadCourseOutput result = await _updateCourse.ExecuteAsync(id, input); - return _mapper.Map(result); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/MainAreaPresenterController.cs b/src/Adapters/PresenterController/MainAreaPresenterController.cs deleted file mode 100755 index f11fe4cd..00000000 --- a/src/Adapters/PresenterController/MainAreaPresenterController.cs +++ /dev/null @@ -1,65 +0,0 @@ -using Adapters.Gateways.Base; -using Adapters.Gateways.MainArea; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.MainArea; -using Domain.UseCases.Ports.MainArea; - -namespace Adapters.PresenterController -{ - public class MainAreaPresenterController : IMainAreaPresenterController - { - #region Global Scope - private readonly ICreateMainArea _createMainArea; - private readonly IUpdateMainArea _updateMainArea; - private readonly IDeleteMainArea _deleteMainArea; - private readonly IGetMainAreas _getMainAreas; - private readonly IGetMainAreaById _getMainAreaById; - private readonly IMapper _mapper; - - public MainAreaPresenterController(ICreateMainArea createMainArea, IUpdateMainArea updateMainArea, IDeleteMainArea deleteMainArea, IGetMainAreas getMainAreas, IGetMainAreaById getMainAreaById, IMapper mapper) - { - _createMainArea = createMainArea; - _updateMainArea = updateMainArea; - _deleteMainArea = deleteMainArea; - _getMainAreas = getMainAreas; - _getMainAreaById = getMainAreaById; - _mapper = mapper; - } - #endregion Global Scope - - public async Task Create(IRequest request) - { - CreateMainAreaRequest? dto = request as CreateMainAreaRequest; - CreateMainAreaInput input = _mapper.Map(dto); - DetailedMainAreaOutput result = await _createMainArea.ExecuteAsync(input); - return _mapper.Map(result); - } - - public async Task Delete(Guid? id) - { - DetailedMainAreaOutput result = await _deleteMainArea.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task> GetAll(int skip, int take) - { - IQueryable result = await _getMainAreas.ExecuteAsync(skip, take); - return _mapper.Map>(result); - } - - public async Task GetById(Guid? id) - { - DetailedMainAreaOutput result = await _getMainAreaById.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task Update(Guid? id, IRequest request) - { - UpdateMainAreaRequest? dto = request as UpdateMainAreaRequest; - UpdateMainAreaInput input = _mapper.Map(dto); - DetailedMainAreaOutput result = await _updateMainArea.ExecuteAsync(id, input); - return _mapper.Map(result); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/NoticePresenterController.cs b/src/Adapters/PresenterController/NoticePresenterController.cs deleted file mode 100755 index 3b3ef872..00000000 --- a/src/Adapters/PresenterController/NoticePresenterController.cs +++ /dev/null @@ -1,69 +0,0 @@ -using Adapters.Gateways.Base; -using Adapters.Gateways.Notice; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.Notice; -using Domain.UseCases.Ports.Notice; - -namespace Adapters.PresenterController -{ - public class NoticePresenterController : INoticePresenterController - { - #region Global Scope - private readonly ICreateNotice _createNotice; - private readonly IUpdateNotice _updateNotice; - private readonly IDeleteNotice _deleteNotice; - private readonly IGetNotices _getNotices; - private readonly IGetNoticeById _getNoticeById; - private readonly IMapper _mapper; - - public NoticePresenterController( - ICreateNotice createNotice, - IUpdateNotice updateNotice, - IDeleteNotice deleteNotice, - IGetNotices getNotices, - IGetNoticeById getNoticeById, - IMapper mapper) - { - _createNotice = createNotice; - _updateNotice = updateNotice; - _deleteNotice = deleteNotice; - _getNotices = getNotices; - _getNoticeById = getNoticeById; - _mapper = mapper; - } - #endregion Global Scope - - public async Task Create(IRequest request) - { - CreateNoticeInput input = _mapper.Map(request as CreateNoticeRequest); - DetailedReadNoticeOutput result = await _createNotice.ExecuteAsync(input); - return _mapper.Map(result); - } - - public async Task Delete(Guid? id) - { - DetailedReadNoticeOutput result = await _deleteNotice.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task> GetAll(int skip, int take) - { - IEnumerable result = await _getNotices.ExecuteAsync(skip, take); - return _mapper.Map>(result); - } - - public async Task GetById(Guid? id) - { - DetailedReadNoticeOutput result = await _getNoticeById.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task Update(Guid? id, IRequest request) - { - UpdateNoticeInput input = _mapper.Map(request as UpdateNoticeRequest); - DetailedReadNoticeOutput result = await _updateNotice.ExecuteAsync(id, input); - return _mapper.Map(result); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/ProfessorPresenterController.cs b/src/Adapters/PresenterController/ProfessorPresenterController.cs deleted file mode 100755 index 3b709c19..00000000 --- a/src/Adapters/PresenterController/ProfessorPresenterController.cs +++ /dev/null @@ -1,70 +0,0 @@ -using Adapters.Gateways.Base; -using Adapters.Gateways.Professor; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.Professor; -using Domain.UseCases.Ports.Professor; - -namespace Adapters.PresenterController -{ - public class ProfessorPresenterController : IProfessorPresenterController - { - #region Global Scope - private readonly ICreateProfessor _createProfessor; - private readonly IUpdateProfessor _updateProfessor; - private readonly IDeleteProfessor _deleteProfessor; - private readonly IGetProfessors _getProfessors; - private readonly IGetProfessorById _getProfessorById; - private readonly IMapper _mapper; - - public ProfessorPresenterController(ICreateProfessor createProfessor, - IUpdateProfessor updateProfessor, - IDeleteProfessor deleteProfessor, - IGetProfessors getProfessors, - IGetProfessorById getProfessorById, - IMapper mapper) - { - _createProfessor = createProfessor; - _updateProfessor = updateProfessor; - _deleteProfessor = deleteProfessor; - _getProfessors = getProfessors; - _getProfessorById = getProfessorById; - _mapper = mapper; - } - #endregion Global Scope - - public async Task Create(IRequest request) - { - CreateProfessorRequest? dto = request as CreateProfessorRequest; - CreateProfessorInput input = _mapper.Map(dto); - DetailedReadProfessorOutput result = await _createProfessor.ExecuteAsync(input); - return _mapper.Map(result); - } - - public async Task Delete(Guid? id) - { - DetailedReadProfessorOutput result = await _deleteProfessor.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task> GetAll(int skip, int take) - { - IQueryable result = await _getProfessors.ExecuteAsync(skip, take); - return _mapper.Map>(result); - } - - public async Task GetById(Guid? id) - { - DetailedReadProfessorOutput result = await _getProfessorById.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task Update(Guid? id, IRequest request) - { - UpdateProfessorRequest? dto = request as UpdateProfessorRequest; - UpdateProfessorInput input = _mapper.Map(dto); - DetailedReadProfessorOutput result = await _updateProfessor.ExecuteAsync(id, input); - return _mapper.Map(result); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/ProgramTypePresenterController.cs b/src/Adapters/PresenterController/ProgramTypePresenterController.cs deleted file mode 100755 index dd341e11..00000000 --- a/src/Adapters/PresenterController/ProgramTypePresenterController.cs +++ /dev/null @@ -1,65 +0,0 @@ -using Adapters.Gateways.Base; -using Adapters.Gateways.ProgramType; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.ProgramType; -using Domain.UseCases.Ports.ProgramType; - -namespace Adapters.PresenterController -{ - public class ProgramTypePresenterController : IProgramTypePresenterController - { - #region Global Scope - private readonly ICreateProgramType _createProgramType; - private readonly IUpdateProgramType _updateProgramType; - private readonly IDeleteProgramType _deleteProgramType; - private readonly IGetProgramTypes _getProgramTypes; - private readonly IGetProgramTypeById _getProgramTypeById; - private readonly IMapper _mapper; - - public ProgramTypePresenterController(ICreateProgramType createProgramType, IUpdateProgramType updateProgramType, IDeleteProgramType deleteProgramType, IGetProgramTypes getProgramTypes, IGetProgramTypeById getProgramTypeById, IMapper mapper) - { - _createProgramType = createProgramType; - _updateProgramType = updateProgramType; - _deleteProgramType = deleteProgramType; - _getProgramTypes = getProgramTypes; - _getProgramTypeById = getProgramTypeById; - _mapper = mapper; - } - #endregion Global Scope - - public async Task Create(IRequest request) - { - CreateProgramTypeRequest? dto = request as CreateProgramTypeRequest; - CreateProgramTypeInput input = _mapper.Map(dto); - DetailedReadProgramTypeOutput result = await _createProgramType.ExecuteAsync(input); - return _mapper.Map(result); - } - - public async Task Delete(Guid? id) - { - DetailedReadProgramTypeOutput result = await _deleteProgramType.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task> GetAll(int skip, int take) - { - IQueryable result = await _getProgramTypes.ExecuteAsync(skip, take); - return _mapper.Map>(result); - } - - public async Task GetById(Guid? id) - { - DetailedReadProgramTypeOutput result = await _getProgramTypeById.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task Update(Guid? id, IRequest request) - { - UpdateProgramTypeRequest? dto = request as UpdateProgramTypeRequest; - UpdateProgramTypeInput input = _mapper.Map(dto); - DetailedReadProgramTypeOutput result = await _updateProgramType.ExecuteAsync(id, input); - return _mapper.Map(result); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/ProjectEvaluationPresenterController.cs b/src/Adapters/PresenterController/ProjectEvaluationPresenterController.cs deleted file mode 100644 index afcb20aa..00000000 --- a/src/Adapters/PresenterController/ProjectEvaluationPresenterController.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Adapters.Gateways.Project; -using Adapters.Gateways.ProjectEvaluation; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.ProjectEvaluation; -using Domain.UseCases.Ports.ProjectEvaluation; - -namespace Adapters.PresenterController -{ - public class ProjectEvaluationPresenterController : IProjectEvaluationPresenterController - { - #region Global Scope - private readonly IEvaluateAppealProject _evaluateAppealProject; - private readonly IEvaluateSubmissionProject _evaluateSubmissionProject; - private readonly IGetEvaluationByProjectId _getEvaluationByProjectId; - private readonly IMapper _mapper; - - public ProjectEvaluationPresenterController( - IEvaluateAppealProject evaluateAppealProject, - IEvaluateSubmissionProject evaluateSubmissionProject, - IGetEvaluationByProjectId getEvaluationByProjectId, - IMapper mapper) - { - _evaluateAppealProject = evaluateAppealProject; - _evaluateSubmissionProject = evaluateSubmissionProject; - _getEvaluationByProjectId = getEvaluationByProjectId; - _mapper = mapper; - } - #endregion Global Scope - - public async Task EvaluateAppealProject(EvaluateAppealProjectRequest request) - { - EvaluateAppealProjectInput input = _mapper.Map(request); - Domain.UseCases.Ports.Project.DetailedReadProjectOutput output = await _evaluateAppealProject.ExecuteAsync(input); - return _mapper.Map(output); - } - - public async Task EvaluateSubmissionProject(EvaluateSubmissionProjectRequest request) - { - EvaluateSubmissionProjectInput input = _mapper.Map(request); - Domain.UseCases.Ports.Project.DetailedReadProjectOutput output = await _evaluateSubmissionProject.ExecuteAsync(input); - return _mapper.Map(output); - } - - public async Task GetEvaluationByProjectId(Guid? projectId) - { - DetailedReadProjectEvaluationOutput output = await _getEvaluationByProjectId.ExecuteAsync(projectId); - return _mapper.Map(output); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/ProjectPresenterController.cs b/src/Adapters/PresenterController/ProjectPresenterController.cs deleted file mode 100644 index 9f296edd..00000000 --- a/src/Adapters/PresenterController/ProjectPresenterController.cs +++ /dev/null @@ -1,95 +0,0 @@ -using Adapters.Gateways.Project; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.Project; -using Domain.UseCases.Ports.Project; - -namespace Adapters.PresenterController -{ - public class ProjectPresenterController : IProjectPresenterController - { - #region Global Scope - private readonly ICancelProject _cancelProject; - private readonly IGetClosedProjects _getClosedProjects; - private readonly IGetOpenProjects _getOpenProjects; - private readonly IGetProjectById _getProjectById; - private readonly IOpenProject _openProject; - private readonly IUpdateProject _updateProject; - private readonly IAppealProject _appealProject; - private readonly ISubmitProject _submitProject; - private readonly IMapper _mapper; - - public ProjectPresenterController( - ICancelProject cancelProject, - IGetClosedProjects getClosedProjects, - IGetOpenProjects getOpenProjects, - IGetProjectById getProjectById, - IOpenProject openProject, - IUpdateProject updateProject, - IAppealProject appealProject, - ISubmitProject submitProject, - IMapper mapper) - { - _cancelProject = cancelProject; - _getClosedProjects = getClosedProjects; - _getOpenProjects = getOpenProjects; - _getProjectById = getProjectById; - _openProject = openProject; - _updateProject = updateProject; - _appealProject = appealProject; - _submitProject = submitProject; - _mapper = mapper; - } - #endregion Global Scope - - public async Task AppealProject(Guid? projectId, string? appealDescription) - { - ResumedReadProjectOutput output = await _appealProject.ExecuteAsync(projectId, appealDescription); - return _mapper.Map(output); - } - - public async Task CancelProject(Guid? id, string? observation) - { - ResumedReadProjectOutput output = await _cancelProject.ExecuteAsync(id, observation); - return _mapper.Map(output); - } - - public async Task> GetClosedProjects(int skip, int take, bool onlyMyProjects = true) - { - IList output = await _getClosedProjects.ExecuteAsync(skip, take, onlyMyProjects); - return _mapper.Map>(output); - } - - public async Task> GetOpenProjects(int skip, int take, bool onlyMyProjects = true) - { - IList output = await _getOpenProjects.ExecuteAsync(skip, take, onlyMyProjects); - return _mapper.Map>(output); - } - - public async Task GetProjectById(Guid? id) - { - DetailedReadProjectOutput output = await _getProjectById.ExecuteAsync(id); - return _mapper.Map(output); - } - - public async Task OpenProject(OpenProjectRequest request) - { - OpenProjectInput input = _mapper.Map(request); - ResumedReadProjectOutput output = await _openProject.ExecuteAsync(input); - return _mapper.Map(output); - } - - public async Task SubmitProject(Guid? projectId) - { - ResumedReadProjectOutput output = await _submitProject.ExecuteAsync(projectId); - return _mapper.Map(output); - } - - public async Task UpdateProject(Guid? id, UpdateProjectRequest request) - { - UpdateProjectInput input = _mapper.Map(request); - ResumedReadProjectOutput output = await _updateProject.ExecuteAsync(id, input); - return _mapper.Map(output); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/StudentDocumentsPresenterController.cs b/src/Adapters/PresenterController/StudentDocumentsPresenterController.cs deleted file mode 100644 index cedbf4a4..00000000 --- a/src/Adapters/PresenterController/StudentDocumentsPresenterController.cs +++ /dev/null @@ -1,67 +0,0 @@ -using Adapters.Gateways.StudentDocuments; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.StudentDocuments; -using Domain.UseCases.Ports.StudentDocuments; - -namespace Adapters.PresenterController -{ - public class StudentDocumentsPresenterController : IStudentDocumentsPresenterController - { - #region Global Scope - private readonly ICreateStudentDocuments _createStudentDocuments; - private readonly IUpdateStudentDocuments _updateStudentDocuments; - private readonly IDeleteStudentDocuments _deleteStudentDocuments; - private readonly IGetStudentDocumentsByProjectId _getStudentDocumentsByProject; - private readonly IGetStudentDocumentsByStudentId _getStudentDocumentsByStudent; - private readonly IMapper _mapper; - public StudentDocumentsPresenterController( - ICreateStudentDocuments createStudentDocuments, - IUpdateStudentDocuments updateStudentDocuments, - IDeleteStudentDocuments deleteStudentDocuments, - IGetStudentDocumentsByProjectId getStudentDocumentsByProject, - IGetStudentDocumentsByStudentId getStudentDocumentsByStudent, - IMapper mapper) - { - _createStudentDocuments = createStudentDocuments; - _updateStudentDocuments = updateStudentDocuments; - _deleteStudentDocuments = deleteStudentDocuments; - _getStudentDocumentsByProject = getStudentDocumentsByProject; - _getStudentDocumentsByStudent = getStudentDocumentsByStudent; - _mapper = mapper; - } - #endregion Global Scope - - public async Task Create(CreateStudentDocumentsRequest model) - { - CreateStudentDocumentsInput input = _mapper.Map(model); - DetailedReadStudentDocumentsOutput result = await _createStudentDocuments.ExecuteAsync(input); - return _mapper.Map(result); - } - - public async Task Delete(Guid? id) - { - DetailedReadStudentDocumentsOutput result = await _deleteStudentDocuments.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task GetByProjectId(Guid? projectId) - { - ResumedReadStudentDocumentsOutput result = await _getStudentDocumentsByProject.ExecuteAsync(projectId); - return _mapper.Map(result); - } - - public async Task GetByStudentId(Guid? studentId) - { - ResumedReadStudentDocumentsOutput result = await _getStudentDocumentsByStudent.ExecuteAsync(studentId); - return _mapper.Map(result); - } - - public async Task Update(Guid? id, UpdateStudentDocumentsRequest model) - { - UpdateStudentDocumentsInput input = _mapper.Map(model); - DetailedReadStudentDocumentsOutput result = await _updateStudentDocuments.ExecuteAsync(id, input); - return _mapper.Map(result); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/StudentPresenterController.cs b/src/Adapters/PresenterController/StudentPresenterController.cs deleted file mode 100755 index fe0bfbf4..00000000 --- a/src/Adapters/PresenterController/StudentPresenterController.cs +++ /dev/null @@ -1,80 +0,0 @@ -using Adapters.Gateways.Base; -using Adapters.Gateways.Student; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.Student; -using Domain.UseCases.Ports.Student; - -namespace Adapters.PresenterController -{ - public class StudentPresenterController : IStudentPresenterController - { - #region Global Scope - private readonly ICreateStudent _createStudent; - private readonly IUpdateStudent _updateStudent; - private readonly IDeleteStudent _deleteStudent; - private readonly IGetStudents _getStudents; - private readonly IGetStudentById _getStudentById; - private readonly IGetStudentByRegistrationCode _getStudentByRegistrationCode; - private readonly IRequestStudentRegister _requestStudentRegister; - private readonly IMapper _mapper; - - public StudentPresenterController(ICreateStudent createStudent, IUpdateStudent updateStudent, IDeleteStudent deleteStudent, IGetStudents getStudents, IGetStudentById getStudentById, IGetStudentByRegistrationCode getStudentByRegistrationCode, IRequestStudentRegister requestStudentRegister, IMapper mapper) - { - _createStudent = createStudent; - _updateStudent = updateStudent; - _deleteStudent = deleteStudent; - _getStudents = getStudents; - _getStudentById = getStudentById; - _getStudentByRegistrationCode = getStudentByRegistrationCode; - _requestStudentRegister = requestStudentRegister; - _mapper = mapper; - } - #endregion Global Scope - - public async Task Create(IRequest request) - { - CreateStudentRequest? dto = request as CreateStudentRequest; - CreateStudentInput input = _mapper.Map(dto); - DetailedReadStudentOutput result = await _createStudent.ExecuteAsync(input); - return _mapper.Map(result); - } - - public async Task Delete(Guid? id) - { - DetailedReadStudentOutput result = await _deleteStudent.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task> GetAll(int skip, int take) - { - IQueryable result = await _getStudents.ExecuteAsync(skip, take); - return _mapper.Map>(result); - } - - public async Task GetById(Guid? id) - { - DetailedReadStudentOutput result = await _getStudentById.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task GetByRegistrationCode(string? registrationCode) - { - DetailedReadStudentOutput result = await _getStudentByRegistrationCode.ExecuteAsync(registrationCode); - return _mapper.Map(result); - } - - public async Task Update(Guid? id, IRequest request) - { - UpdateStudentRequest? dto = request as UpdateStudentRequest; - UpdateStudentInput input = _mapper.Map(dto); - DetailedReadStudentOutput result = await _updateStudent.ExecuteAsync(id, input); - return _mapper.Map(result); - } - - public async Task RequestStudentRegister(string? email) - { - return await _requestStudentRegister.ExecuteAsync(email); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/SubAreaPresenterController.cs b/src/Adapters/PresenterController/SubAreaPresenterController.cs deleted file mode 100755 index 85b5c683..00000000 --- a/src/Adapters/PresenterController/SubAreaPresenterController.cs +++ /dev/null @@ -1,71 +0,0 @@ -using Adapters.Gateways.Base; -using Adapters.Gateways.SubArea; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.SubArea; -using Domain.UseCases.Ports.SubArea; - -namespace Adapters.PresenterController -{ - public class SubAreaPresenterController : ISubAreaPresenterController - { - #region Global Scope - private readonly ICreateSubArea _createSubArea; - private readonly IUpdateSubArea _updateSubArea; - private readonly IDeleteSubArea _deleteSubArea; - private readonly IGetSubAreasByArea _getSubAreasByArea; - private readonly IGetSubAreaById _getSubAreaById; - private readonly IMapper _mapper; - - public SubAreaPresenterController(ICreateSubArea createSubArea, IUpdateSubArea updateSubArea, IDeleteSubArea deleteSubArea, - IGetSubAreasByArea getSubAreasByArea, IGetSubAreaById getSubAreaById, IMapper mapper) - { - _createSubArea = createSubArea; - _updateSubArea = updateSubArea; - _deleteSubArea = deleteSubArea; - _getSubAreasByArea = getSubAreasByArea; - _getSubAreaById = getSubAreaById; - _mapper = mapper; - } - #endregion Global Scope - - public async Task Create(IRequest request) - { - CreateSubAreaRequest? dto = request as CreateSubAreaRequest; - CreateSubAreaInput input = _mapper.Map(dto); - DetailedReadSubAreaOutput result = await _createSubArea.ExecuteAsync(input); - return _mapper.Map(result); - } - - public async Task Delete(Guid? id) - { - DetailedReadSubAreaOutput result = await _deleteSubArea.ExecuteAsync(id); - return _mapper.Map(result); - } - - public Task> GetAll(int skip, int take) - { - throw new NotImplementedException(); - } - - public async Task GetById(Guid? id) - { - DetailedReadSubAreaOutput result = await _getSubAreaById.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task> GetSubAreasByArea(Guid? areaId, int skip, int take) - { - IQueryable result = await _getSubAreasByArea.ExecuteAsync(areaId, skip, take); - return _mapper.Map>(result); - } - - public async Task Update(Guid? id, IRequest request) - { - UpdateSubAreaRequest? dto = request as UpdateSubAreaRequest; - UpdateSubAreaInput input = _mapper.Map(dto); - DetailedReadSubAreaOutput result = await _updateSubArea.ExecuteAsync(id, input); - return _mapper.Map(result); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/TypeAssistancePresenterController.cs b/src/Adapters/PresenterController/TypeAssistancePresenterController.cs deleted file mode 100755 index 3dcfe967..00000000 --- a/src/Adapters/PresenterController/TypeAssistancePresenterController.cs +++ /dev/null @@ -1,70 +0,0 @@ -using Adapters.Gateways.AssistanceType; -using Adapters.Gateways.Base; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.AssistanceType; -using Domain.UseCases.Ports.AssistanceType; - -namespace Adapters.PresenterController -{ - public class AssistanceTypePresenterController : IAssistanceTypePresenterController - { - #region Global Scope - private readonly ICreateAssistanceType _createAssistanceType; - private readonly IUpdateAssistanceType _updateAssistanceType; - private readonly IDeleteAssistanceType _deleteAssistanceType; - private readonly IGetAssistanceTypes _getAssistanceTypes; - private readonly IGetAssistanceTypeById _getAssistanceTypeById; - private readonly IMapper _mapper; - - public AssistanceTypePresenterController(ICreateAssistanceType createAssistanceType, - IUpdateAssistanceType updateAssistanceType, - IDeleteAssistanceType deleteAssistanceType, - IGetAssistanceTypes getAssistanceTypes, - IGetAssistanceTypeById getAssistanceTypeById, - IMapper mapper) - { - _createAssistanceType = createAssistanceType; - _updateAssistanceType = updateAssistanceType; - _deleteAssistanceType = deleteAssistanceType; - _getAssistanceTypes = getAssistanceTypes; - _getAssistanceTypeById = getAssistanceTypeById; - _mapper = mapper; - } - #endregion Global Scope - - public async Task Create(IRequest request) - { - CreateAssistanceTypeRequest? dto = request as CreateAssistanceTypeRequest; - CreateAssistanceTypeInput input = _mapper.Map(dto); - DetailedReadAssistanceTypeOutput result = await _createAssistanceType.ExecuteAsync(input); - return _mapper.Map(result); - } - - public async Task Delete(Guid? id) - { - DetailedReadAssistanceTypeOutput result = await _deleteAssistanceType.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task> GetAll(int skip, int take) - { - IQueryable result = await _getAssistanceTypes.ExecuteAsync(skip, take); - return _mapper.Map>(result); - } - - public async Task GetById(Guid? id) - { - DetailedReadAssistanceTypeOutput result = await _getAssistanceTypeById.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task Update(Guid? id, IRequest request) - { - UpdateAssistanceTypeRequest? dto = request as UpdateAssistanceTypeRequest; - UpdateAssistanceTypeInput input = _mapper.Map(dto); - DetailedReadAssistanceTypeOutput result = await _updateAssistanceType.ExecuteAsync(id, input); - return _mapper.Map(result); - } - } -} \ No newline at end of file diff --git a/src/Adapters/PresenterController/UserPresenterController.cs b/src/Adapters/PresenterController/UserPresenterController.cs deleted file mode 100755 index 31597858..00000000 --- a/src/Adapters/PresenterController/UserPresenterController.cs +++ /dev/null @@ -1,74 +0,0 @@ -using Adapters.Gateways.User; -using Adapters.Interfaces; -using AutoMapper; -using Domain.UseCases.Interfaces.User; -using Domain.UseCases.Ports.User; - -namespace Adapters.PresenterController -{ - public class UserPresenterController : IUserPresenterController - { - #region Global Scope - private readonly IActivateUser _activateUser; - private readonly IDeactivateUser _deactivateUser; - private readonly IGetActiveUsers _getActiveUsers; - private readonly IGetInactiveUsers _getInactiveUsers; - private readonly IGetUserById _getUserById; - private readonly IUpdateUser _updateUser; - private readonly IMapper _mapper; - public UserPresenterController(IActivateUser activateUser, - IDeactivateUser deactivateUser, - IGetActiveUsers getActiveUsers, - IGetInactiveUsers getInactiveUsers, - IGetUserById getUserById, - IUpdateUser updateUser, - IMapper mapper) - { - _activateUser = activateUser; - _deactivateUser = deactivateUser; - _getActiveUsers = getActiveUsers; - _getInactiveUsers = getInactiveUsers; - _getUserById = getUserById; - _updateUser = updateUser; - _mapper = mapper; - } - #endregion Global Scope - - public async Task ActivateUser(Guid? id) - { - UserReadOutput result = await _activateUser.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task DeactivateUser(Guid? id) - { - UserReadOutput result = await _deactivateUser.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task> GetActiveUsers(int skip, int take) - { - IEnumerable result = await _getActiveUsers.ExecuteAsync(skip, take); - return _mapper.Map>(result); - } - - public async Task> GetInactiveUsers(int skip, int take) - { - IEnumerable result = await _getInactiveUsers.ExecuteAsync(skip, take); - return _mapper.Map>(result); - } - - public async Task GetUserById(Guid? id) - { - UserReadOutput result = await _getUserById.ExecuteAsync(id); - return _mapper.Map(result); - } - - public async Task UpdateUser(UserUpdateRequest request) - { - UserUpdateInput input = _mapper.Map(request); - UserReadOutput result = await _updateUser.ExecuteAsync(input); - return _mapper.Map(result); - } - } -} \ No newline at end of file diff --git a/src/Application/Application.csproj b/src/Application/Application.csproj new file mode 100644 index 00000000..b2734e62 --- /dev/null +++ b/src/Application/Application.csproj @@ -0,0 +1,19 @@ + + + + net7.0 + enable + enable + 0.0.1 + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Domain/Interfaces/Services/IEmailService.cs b/src/Application/Interfaces/Services/IEmailService.cs similarity index 93% rename from src/Domain/Interfaces/Services/IEmailService.cs rename to src/Application/Interfaces/Services/IEmailService.cs index c7a58bbc..78824c13 100644 --- a/src/Domain/Interfaces/Services/IEmailService.cs +++ b/src/Application/Interfaces/Services/IEmailService.cs @@ -1,4 +1,4 @@ -namespace Domain.Interfaces.Services +namespace Application.Interfaces.Services { public interface IEmailService { diff --git a/src/Domain/Interfaces/Services/IHashService.cs b/src/Application/Interfaces/Services/IHashService.cs similarity index 79% rename from src/Domain/Interfaces/Services/IHashService.cs rename to src/Application/Interfaces/Services/IHashService.cs index e60474bc..73887f83 100644 --- a/src/Domain/Interfaces/Services/IHashService.cs +++ b/src/Application/Interfaces/Services/IHashService.cs @@ -1,4 +1,4 @@ -namespace Domain.Interfaces.Services +namespace Application.Interfaces.Services { public interface IHashService { diff --git a/src/Domain/Interfaces/Services/IStorageFileService.cs b/src/Application/Interfaces/Services/IStorageFileService.cs similarity index 93% rename from src/Domain/Interfaces/Services/IStorageFileService.cs rename to src/Application/Interfaces/Services/IStorageFileService.cs index 56a50d53..ee3d3182 100644 --- a/src/Domain/Interfaces/Services/IStorageFileService.cs +++ b/src/Application/Interfaces/Services/IStorageFileService.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Http; -namespace Domain.Interfaces.Services +namespace Application.Interfaces.Services { public interface IStorageFileService { diff --git a/src/Domain/Interfaces/Services/ITokenAuthenticationService.cs b/src/Application/Interfaces/Services/ITokenAuthenticationService.cs similarity index 90% rename from src/Domain/Interfaces/Services/ITokenAuthenticationService.cs rename to src/Application/Interfaces/Services/ITokenAuthenticationService.cs index 8cc38f4c..0652893f 100644 --- a/src/Domain/Interfaces/Services/ITokenAuthenticationService.cs +++ b/src/Application/Interfaces/Services/ITokenAuthenticationService.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Auth; +using Application.Ports.Auth; -namespace Domain.Interfaces.Services +namespace Application.Interfaces.Services { public interface ITokenAuthenticationService { diff --git a/src/Domain/UseCases/Interfaces/ActivityType/IGetActivitiesByNoticeId.cs b/src/Application/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs similarity index 59% rename from src/Domain/UseCases/Interfaces/ActivityType/IGetActivitiesByNoticeId.cs rename to src/Application/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs index f0b8c1e7..2ffc6097 100644 --- a/src/Domain/UseCases/Interfaces/ActivityType/IGetActivitiesByNoticeId.cs +++ b/src/Application/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Activity; +using Application.Ports.Activity; -namespace Domain.UseCases.Interfaces.ActivityType +namespace Application.Interfaces.UseCases.ActivityType { public interface IGetActivitiesByNoticeId { diff --git a/src/Domain/UseCases/Interfaces/ActivityType/IGetLastNoticeActivities.cs b/src/Application/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/ActivityType/IGetLastNoticeActivities.cs rename to src/Application/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs index 955558bd..c54b81c6 100644 --- a/src/Domain/UseCases/Interfaces/ActivityType/IGetLastNoticeActivities.cs +++ b/src/Application/Interfaces/UseCases/ActivityType/IGetLastNoticeActivities.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Activity; +using Application.Ports.Activity; -namespace Domain.UseCases.Interfaces.ActivityType +namespace Application.Interfaces.UseCases.ActivityType { public interface IGetLastNoticeActivities { diff --git a/src/Domain/UseCases/Interfaces/Area/ICreateArea.cs b/src/Application/Interfaces/UseCases/Area/ICreateArea.cs similarity index 61% rename from src/Domain/UseCases/Interfaces/Area/ICreateArea.cs rename to src/Application/Interfaces/UseCases/Area/ICreateArea.cs index 2e6e204e..201fa759 100644 --- a/src/Domain/UseCases/Interfaces/Area/ICreateArea.cs +++ b/src/Application/Interfaces/UseCases/Area/ICreateArea.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Area; +using Application.Ports.Area; -namespace Domain.UseCases.Interfaces.Area +namespace Application.Interfaces.UseCases.Area { public interface ICreateArea { diff --git a/src/Domain/UseCases/Interfaces/Area/IDeleteArea.cs b/src/Application/Interfaces/UseCases/Area/IDeleteArea.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/Area/IDeleteArea.cs rename to src/Application/Interfaces/UseCases/Area/IDeleteArea.cs index e4785eb0..e6392cbf 100644 --- a/src/Domain/UseCases/Interfaces/Area/IDeleteArea.cs +++ b/src/Application/Interfaces/UseCases/Area/IDeleteArea.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Area; +using Application.Ports.Area; -namespace Domain.UseCases.Interfaces.Area +namespace Application.Interfaces.UseCases.Area { public interface IDeleteArea { diff --git a/src/Domain/UseCases/Interfaces/Area/IGetAreaById.cs b/src/Application/Interfaces/UseCases/Area/IGetAreaById.cs similarity index 59% rename from src/Domain/UseCases/Interfaces/Area/IGetAreaById.cs rename to src/Application/Interfaces/UseCases/Area/IGetAreaById.cs index fef38c94..ea2a8f46 100644 --- a/src/Domain/UseCases/Interfaces/Area/IGetAreaById.cs +++ b/src/Application/Interfaces/UseCases/Area/IGetAreaById.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Area; +using Application.Ports.Area; -namespace Domain.UseCases.Interfaces.Area +namespace Application.Interfaces.UseCases.Area { public interface IGetAreaById { diff --git a/src/Domain/UseCases/Interfaces/Area/IGetAreasByMainArea.cs b/src/Application/Interfaces/UseCases/Area/IGetAreasByMainArea.cs similarity index 67% rename from src/Domain/UseCases/Interfaces/Area/IGetAreasByMainArea.cs rename to src/Application/Interfaces/UseCases/Area/IGetAreasByMainArea.cs index 6c801339..766bf42c 100644 --- a/src/Domain/UseCases/Interfaces/Area/IGetAreasByMainArea.cs +++ b/src/Application/Interfaces/UseCases/Area/IGetAreasByMainArea.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Area; +using Application.Ports.Area; -namespace Domain.UseCases.Interfaces.Area +namespace Application.Interfaces.UseCases.Area { public interface IGetAreasByMainArea { diff --git a/src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs b/src/Application/Interfaces/UseCases/Area/IUpdateArea.cs similarity index 63% rename from src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs rename to src/Application/Interfaces/UseCases/Area/IUpdateArea.cs index 372469c9..d3105999 100644 --- a/src/Domain/UseCases/Interfaces/Area/IUpdateArea.cs +++ b/src/Application/Interfaces/UseCases/Area/IUpdateArea.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Area; +using Application.Ports.Area; -namespace Domain.UseCases.Interfaces.Area +namespace Application.Interfaces.UseCases.Area { public interface IUpdateArea { diff --git a/src/Domain/UseCases/Interfaces/AssistanceType/ICreateAssistanceType.cs b/src/Application/Interfaces/UseCases/AssistanceType/ICreateAssistanceType.cs similarity index 61% rename from src/Domain/UseCases/Interfaces/AssistanceType/ICreateAssistanceType.cs rename to src/Application/Interfaces/UseCases/AssistanceType/ICreateAssistanceType.cs index aff6bffb..6702eba1 100644 --- a/src/Domain/UseCases/Interfaces/AssistanceType/ICreateAssistanceType.cs +++ b/src/Application/Interfaces/UseCases/AssistanceType/ICreateAssistanceType.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.AssistanceType; +using Application.Ports.AssistanceType; -namespace Domain.UseCases.Interfaces.AssistanceType +namespace Application.Interfaces.UseCases.AssistanceType { public interface ICreateAssistanceType { diff --git a/src/Domain/UseCases/Interfaces/AssistanceType/IDeleteAssistanceType.cs b/src/Application/Interfaces/UseCases/AssistanceType/IDeleteAssistanceType.cs similarity index 57% rename from src/Domain/UseCases/Interfaces/AssistanceType/IDeleteAssistanceType.cs rename to src/Application/Interfaces/UseCases/AssistanceType/IDeleteAssistanceType.cs index dce5b6a8..6ad9571b 100644 --- a/src/Domain/UseCases/Interfaces/AssistanceType/IDeleteAssistanceType.cs +++ b/src/Application/Interfaces/UseCases/AssistanceType/IDeleteAssistanceType.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.AssistanceType; +using Application.Ports.AssistanceType; -namespace Domain.UseCases.Interfaces.AssistanceType +namespace Application.Interfaces.UseCases.AssistanceType { public interface IDeleteAssistanceType { diff --git a/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypeById.cs b/src/Application/Interfaces/UseCases/AssistanceType/IGetAssistanceTypeById.cs similarity index 57% rename from src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypeById.cs rename to src/Application/Interfaces/UseCases/AssistanceType/IGetAssistanceTypeById.cs index 5d5aa090..c92686e6 100644 --- a/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypeById.cs +++ b/src/Application/Interfaces/UseCases/AssistanceType/IGetAssistanceTypeById.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.AssistanceType; +using Application.Ports.AssistanceType; -namespace Domain.UseCases.Interfaces.AssistanceType +namespace Application.Interfaces.UseCases.AssistanceType { public interface IGetAssistanceTypeById { diff --git a/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypes.cs b/src/Application/Interfaces/UseCases/AssistanceType/IGetAssistanceTypes.cs similarity index 60% rename from src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypes.cs rename to src/Application/Interfaces/UseCases/AssistanceType/IGetAssistanceTypes.cs index 6d35ab5e..758c9a75 100644 --- a/src/Domain/UseCases/Interfaces/AssistanceType/IGetAssistanceTypes.cs +++ b/src/Application/Interfaces/UseCases/AssistanceType/IGetAssistanceTypes.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.AssistanceType; +using Application.Ports.AssistanceType; -namespace Domain.UseCases.Interfaces.AssistanceType +namespace Application.Interfaces.UseCases.AssistanceType { public interface IGetAssistanceTypes { diff --git a/src/Domain/UseCases/Interfaces/AssistanceType/IUpdateAssistanceType.cs b/src/Application/Interfaces/UseCases/AssistanceType/IUpdateAssistanceType.cs similarity index 62% rename from src/Domain/UseCases/Interfaces/AssistanceType/IUpdateAssistanceType.cs rename to src/Application/Interfaces/UseCases/AssistanceType/IUpdateAssistanceType.cs index 5577984c..eec2308d 100644 --- a/src/Domain/UseCases/Interfaces/AssistanceType/IUpdateAssistanceType.cs +++ b/src/Application/Interfaces/UseCases/AssistanceType/IUpdateAssistanceType.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.AssistanceType; +using Application.Ports.AssistanceType; -namespace Domain.UseCases.Interfaces.AssistanceType +namespace Application.Interfaces.UseCases.AssistanceType { public interface IUpdateAssistanceType { diff --git a/src/Domain/UseCases/Interfaces/Auth/IConfirmEmail.cs b/src/Application/Interfaces/UseCases/Auth/IConfirmEmail.cs similarity index 70% rename from src/Domain/UseCases/Interfaces/Auth/IConfirmEmail.cs rename to src/Application/Interfaces/UseCases/Auth/IConfirmEmail.cs index e9e110c2..0d049361 100644 --- a/src/Domain/UseCases/Interfaces/Auth/IConfirmEmail.cs +++ b/src/Application/Interfaces/UseCases/Auth/IConfirmEmail.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Interfaces.Auth +namespace Application.Interfaces.UseCases.Auth { public interface IConfirmEmail { diff --git a/src/Domain/UseCases/Interfaces/Auth/IForgotPassword.cs b/src/Application/Interfaces/UseCases/Auth/IForgotPassword.cs similarity index 68% rename from src/Domain/UseCases/Interfaces/Auth/IForgotPassword.cs rename to src/Application/Interfaces/UseCases/Auth/IForgotPassword.cs index dec64fcf..023788b2 100644 --- a/src/Domain/UseCases/Interfaces/Auth/IForgotPassword.cs +++ b/src/Application/Interfaces/UseCases/Auth/IForgotPassword.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Interfaces.Auth +namespace Application.Interfaces.UseCases.Auth { public interface IForgotPassword { diff --git a/src/Domain/UseCases/Interfaces/Auth/ILogin.cs b/src/Application/Interfaces/UseCases/Auth/ILogin.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/Auth/ILogin.cs rename to src/Application/Interfaces/UseCases/Auth/ILogin.cs index 8f381259..aaf80378 100644 --- a/src/Domain/UseCases/Interfaces/Auth/ILogin.cs +++ b/src/Application/Interfaces/UseCases/Auth/ILogin.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Auth; +using Application.Ports.Auth; -namespace Domain.UseCases.Interfaces.Auth +namespace Application.Interfaces.UseCases.Auth { public interface ILogin { diff --git a/src/Domain/UseCases/Interfaces/Auth/IResetPassword.cs b/src/Application/Interfaces/UseCases/Auth/IResetPassword.cs similarity index 60% rename from src/Domain/UseCases/Interfaces/Auth/IResetPassword.cs rename to src/Application/Interfaces/UseCases/Auth/IResetPassword.cs index 644231b1..538ef471 100644 --- a/src/Domain/UseCases/Interfaces/Auth/IResetPassword.cs +++ b/src/Application/Interfaces/UseCases/Auth/IResetPassword.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Auth; +using Application.Ports.Auth; -namespace Domain.UseCases.Interfaces.Auth +namespace Application.Interfaces.UseCases.Auth { public interface IResetPassword { diff --git a/src/Domain/UseCases/Interfaces/Campus/ICreateCampus.cs b/src/Application/Interfaces/UseCases/Campus/ICreateCampus.cs similarity index 61% rename from src/Domain/UseCases/Interfaces/Campus/ICreateCampus.cs rename to src/Application/Interfaces/UseCases/Campus/ICreateCampus.cs index b3a289b4..818d6980 100644 --- a/src/Domain/UseCases/Interfaces/Campus/ICreateCampus.cs +++ b/src/Application/Interfaces/UseCases/Campus/ICreateCampus.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Campus; +using Application.Ports.Campus; -namespace Domain.UseCases.Interfaces.Campus +namespace Application.Interfaces.UseCases.Campus { public interface ICreateCampus { diff --git a/src/Domain/UseCases/Interfaces/Campus/IDeleteCampus.cs b/src/Application/Interfaces/UseCases/Campus/IDeleteCampus.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/Campus/IDeleteCampus.cs rename to src/Application/Interfaces/UseCases/Campus/IDeleteCampus.cs index e6c85101..3d38dbfb 100644 --- a/src/Domain/UseCases/Interfaces/Campus/IDeleteCampus.cs +++ b/src/Application/Interfaces/UseCases/Campus/IDeleteCampus.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Campus; +using Application.Ports.Campus; -namespace Domain.UseCases.Interfaces.Campus +namespace Application.Interfaces.UseCases.Campus { public interface IDeleteCampus { diff --git a/src/Domain/UseCases/Interfaces/Campus/IGetCampusById.cs b/src/Application/Interfaces/UseCases/Campus/IGetCampusById.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/Campus/IGetCampusById.cs rename to src/Application/Interfaces/UseCases/Campus/IGetCampusById.cs index fac263f5..c091fcfd 100644 --- a/src/Domain/UseCases/Interfaces/Campus/IGetCampusById.cs +++ b/src/Application/Interfaces/UseCases/Campus/IGetCampusById.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Campus; +using Application.Ports.Campus; -namespace Domain.UseCases.Interfaces.Campus +namespace Application.Interfaces.UseCases.Campus { public interface IGetCampusById { diff --git a/src/Domain/UseCases/Interfaces/Campus/IGetCampuses.cs b/src/Application/Interfaces/UseCases/Campus/IGetCampuses.cs similarity index 62% rename from src/Domain/UseCases/Interfaces/Campus/IGetCampuses.cs rename to src/Application/Interfaces/UseCases/Campus/IGetCampuses.cs index 1b1037e2..056edeee 100644 --- a/src/Domain/UseCases/Interfaces/Campus/IGetCampuses.cs +++ b/src/Application/Interfaces/UseCases/Campus/IGetCampuses.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Campus; +using Application.Ports.Campus; -namespace Domain.UseCases.Interfaces.Campus +namespace Application.Interfaces.UseCases.Campus { public interface IGetCampuses { diff --git a/src/Domain/UseCases/Interfaces/Campus/IUpdateCampus.cs b/src/Application/Interfaces/UseCases/Campus/IUpdateCampus.cs similarity index 63% rename from src/Domain/UseCases/Interfaces/Campus/IUpdateCampus.cs rename to src/Application/Interfaces/UseCases/Campus/IUpdateCampus.cs index d7a93c77..216ca10d 100644 --- a/src/Domain/UseCases/Interfaces/Campus/IUpdateCampus.cs +++ b/src/Application/Interfaces/UseCases/Campus/IUpdateCampus.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Campus; +using Application.Ports.Campus; -namespace Domain.UseCases.Interfaces.Campus +namespace Application.Interfaces.UseCases.Campus { public interface IUpdateCampus { diff --git a/src/Domain/UseCases/Interfaces/Course/ICreateCourse.cs b/src/Application/Interfaces/UseCases/Course/ICreateCourse.cs similarity index 54% rename from src/Domain/UseCases/Interfaces/Course/ICreateCourse.cs rename to src/Application/Interfaces/UseCases/Course/ICreateCourse.cs index 8ec1cab0..c48a8ee6 100644 --- a/src/Domain/UseCases/Interfaces/Course/ICreateCourse.cs +++ b/src/Application/Interfaces/UseCases/Course/ICreateCourse.cs @@ -1,7 +1,6 @@ -using Domain.Ports.Course; -using Domain.UseCases.Ports.Course; +using Application.Ports.Course; -namespace Domain.UseCases.Interfaces.Course +namespace Application.Interfaces.UseCases.Course { public interface ICreateCourse { diff --git a/src/Domain/UseCases/Interfaces/Course/IDeleteCourse.cs b/src/Application/Interfaces/UseCases/Course/IDeleteCourse.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/Course/IDeleteCourse.cs rename to src/Application/Interfaces/UseCases/Course/IDeleteCourse.cs index e2333b62..4fa291b9 100644 --- a/src/Domain/UseCases/Interfaces/Course/IDeleteCourse.cs +++ b/src/Application/Interfaces/UseCases/Course/IDeleteCourse.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Course; +using Application.Ports.Course; -namespace Domain.UseCases.Interfaces.Course +namespace Application.Interfaces.UseCases.Course { public interface IDeleteCourse { diff --git a/src/Domain/UseCases/Interfaces/Course/IGetCourseById.cs b/src/Application/Interfaces/UseCases/Course/IGetCourseById.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/Course/IGetCourseById.cs rename to src/Application/Interfaces/UseCases/Course/IGetCourseById.cs index 2b12d7af..c2128b84 100644 --- a/src/Domain/UseCases/Interfaces/Course/IGetCourseById.cs +++ b/src/Application/Interfaces/UseCases/Course/IGetCourseById.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Course; +using Application.Ports.Course; -namespace Domain.UseCases.Interfaces.Course +namespace Application.Interfaces.UseCases.Course { public interface IGetCourseById { diff --git a/src/Domain/UseCases/Interfaces/Course/IGetCourses.cs b/src/Application/Interfaces/UseCases/Course/IGetCourses.cs similarity index 62% rename from src/Domain/UseCases/Interfaces/Course/IGetCourses.cs rename to src/Application/Interfaces/UseCases/Course/IGetCourses.cs index 8e3e7dda..f47a03a6 100644 --- a/src/Domain/UseCases/Interfaces/Course/IGetCourses.cs +++ b/src/Application/Interfaces/UseCases/Course/IGetCourses.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Course; +using Application.Ports.Course; -namespace Domain.UseCases.Interfaces.Course +namespace Application.Interfaces.UseCases.Course { public interface IGetCourses { diff --git a/src/Domain/UseCases/Interfaces/Course/IUpdateCourse.cs b/src/Application/Interfaces/UseCases/Course/IUpdateCourse.cs similarity index 63% rename from src/Domain/UseCases/Interfaces/Course/IUpdateCourse.cs rename to src/Application/Interfaces/UseCases/Course/IUpdateCourse.cs index 2e93a3a2..d63213fb 100644 --- a/src/Domain/UseCases/Interfaces/Course/IUpdateCourse.cs +++ b/src/Application/Interfaces/UseCases/Course/IUpdateCourse.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Course; +using Application.Ports.Course; -namespace Domain.UseCases.Interfaces.Course +namespace Application.Interfaces.UseCases.Course { public interface IUpdateCourse { diff --git a/src/Domain/UseCases/Interfaces/MainArea/ICreateMainArea.cs b/src/Application/Interfaces/UseCases/MainArea/ICreateMainArea.cs similarity index 60% rename from src/Domain/UseCases/Interfaces/MainArea/ICreateMainArea.cs rename to src/Application/Interfaces/UseCases/MainArea/ICreateMainArea.cs index 194fd97f..ec074cf9 100644 --- a/src/Domain/UseCases/Interfaces/MainArea/ICreateMainArea.cs +++ b/src/Application/Interfaces/UseCases/MainArea/ICreateMainArea.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.MainArea; +using Application.Ports.MainArea; -namespace Domain.UseCases.Interfaces.MainArea +namespace Application.Interfaces.UseCases.MainArea { public interface ICreateMainArea { diff --git a/src/Domain/UseCases/Interfaces/MainArea/IDeleteMainArea.cs b/src/Application/Interfaces/UseCases/MainArea/IDeleteMainArea.cs similarity index 57% rename from src/Domain/UseCases/Interfaces/MainArea/IDeleteMainArea.cs rename to src/Application/Interfaces/UseCases/MainArea/IDeleteMainArea.cs index aab75e6e..fa7aa805 100644 --- a/src/Domain/UseCases/Interfaces/MainArea/IDeleteMainArea.cs +++ b/src/Application/Interfaces/UseCases/MainArea/IDeleteMainArea.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.MainArea; +using Application.Ports.MainArea; -namespace Domain.UseCases.Interfaces.MainArea +namespace Application.Interfaces.UseCases.MainArea { public interface IDeleteMainArea { diff --git a/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreaById.cs b/src/Application/Interfaces/UseCases/MainArea/IGetMainAreaById.cs similarity index 57% rename from src/Domain/UseCases/Interfaces/MainArea/IGetMainAreaById.cs rename to src/Application/Interfaces/UseCases/MainArea/IGetMainAreaById.cs index 111d275e..24e6a2a1 100644 --- a/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreaById.cs +++ b/src/Application/Interfaces/UseCases/MainArea/IGetMainAreaById.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.MainArea; +using Application.Ports.MainArea; -namespace Domain.UseCases.Interfaces.MainArea +namespace Application.Interfaces.UseCases.MainArea { public interface IGetMainAreaById { diff --git a/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreas.cs b/src/Application/Interfaces/UseCases/MainArea/IGetMainAreas.cs similarity index 61% rename from src/Domain/UseCases/Interfaces/MainArea/IGetMainAreas.cs rename to src/Application/Interfaces/UseCases/MainArea/IGetMainAreas.cs index 7cc8604c..0d49c3e8 100644 --- a/src/Domain/UseCases/Interfaces/MainArea/IGetMainAreas.cs +++ b/src/Application/Interfaces/UseCases/MainArea/IGetMainAreas.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.MainArea; +using Application.Ports.MainArea; -namespace Domain.UseCases.Interfaces.MainArea +namespace Application.Interfaces.UseCases.MainArea { public interface IGetMainAreas { diff --git a/src/Domain/UseCases/Interfaces/MainArea/IUpdateMainArea.cs b/src/Application/Interfaces/UseCases/MainArea/IUpdateMainArea.cs similarity index 62% rename from src/Domain/UseCases/Interfaces/MainArea/IUpdateMainArea.cs rename to src/Application/Interfaces/UseCases/MainArea/IUpdateMainArea.cs index 5ab223da..24e7592f 100644 --- a/src/Domain/UseCases/Interfaces/MainArea/IUpdateMainArea.cs +++ b/src/Application/Interfaces/UseCases/MainArea/IUpdateMainArea.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.MainArea; +using Application.Ports.MainArea; -namespace Domain.UseCases.Interfaces.MainArea +namespace Application.Interfaces.UseCases.MainArea { public interface IUpdateMainArea { diff --git a/src/Domain/UseCases/Interfaces/Notice/ICreateNotice.cs b/src/Application/Interfaces/UseCases/Notice/ICreateNotice.cs similarity index 61% rename from src/Domain/UseCases/Interfaces/Notice/ICreateNotice.cs rename to src/Application/Interfaces/UseCases/Notice/ICreateNotice.cs index 57041783..dc5dbe25 100644 --- a/src/Domain/UseCases/Interfaces/Notice/ICreateNotice.cs +++ b/src/Application/Interfaces/UseCases/Notice/ICreateNotice.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Notice; +using Application.Ports.Notice; -namespace Domain.UseCases.Interfaces.Notice +namespace Application.Interfaces.UseCases.Notice { public interface ICreateNotice { diff --git a/src/Domain/UseCases/Interfaces/Notice/IDeleteNotice.cs b/src/Application/Interfaces/UseCases/Notice/IDeleteNotice.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/Notice/IDeleteNotice.cs rename to src/Application/Interfaces/UseCases/Notice/IDeleteNotice.cs index afe14ac8..8473eb71 100644 --- a/src/Domain/UseCases/Interfaces/Notice/IDeleteNotice.cs +++ b/src/Application/Interfaces/UseCases/Notice/IDeleteNotice.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Notice; +using Application.Ports.Notice; -namespace Domain.UseCases.Interfaces.Notice +namespace Application.Interfaces.UseCases.Notice { public interface IDeleteNotice { diff --git a/src/Domain/UseCases/Interfaces/Notice/IGetNoticeById.cs b/src/Application/Interfaces/UseCases/Notice/IGetNoticeById.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/Notice/IGetNoticeById.cs rename to src/Application/Interfaces/UseCases/Notice/IGetNoticeById.cs index 4fc54e73..56af3191 100644 --- a/src/Domain/UseCases/Interfaces/Notice/IGetNoticeById.cs +++ b/src/Application/Interfaces/UseCases/Notice/IGetNoticeById.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Notice; +using Application.Ports.Notice; -namespace Domain.UseCases.Interfaces.Notice +namespace Application.Interfaces.UseCases.Notice { public interface IGetNoticeById { diff --git a/src/Domain/UseCases/Interfaces/Notice/IGetNotices.cs b/src/Application/Interfaces/UseCases/Notice/IGetNotices.cs similarity index 62% rename from src/Domain/UseCases/Interfaces/Notice/IGetNotices.cs rename to src/Application/Interfaces/UseCases/Notice/IGetNotices.cs index 3ed411bd..03dccdbe 100644 --- a/src/Domain/UseCases/Interfaces/Notice/IGetNotices.cs +++ b/src/Application/Interfaces/UseCases/Notice/IGetNotices.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Notice; +using Application.Ports.Notice; -namespace Domain.UseCases.Interfaces.Notice +namespace Application.Interfaces.UseCases.Notice { public interface IGetNotices { diff --git a/src/Domain/UseCases/Interfaces/Notice/IUpdateNotice.cs b/src/Application/Interfaces/UseCases/Notice/IUpdateNotice.cs similarity index 63% rename from src/Domain/UseCases/Interfaces/Notice/IUpdateNotice.cs rename to src/Application/Interfaces/UseCases/Notice/IUpdateNotice.cs index 79b3fee1..7589999f 100644 --- a/src/Domain/UseCases/Interfaces/Notice/IUpdateNotice.cs +++ b/src/Application/Interfaces/UseCases/Notice/IUpdateNotice.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Notice; +using Application.Ports.Notice; -namespace Domain.UseCases.Interfaces.Notice +namespace Application.Interfaces.UseCases.Notice { public interface IUpdateNotice { diff --git a/src/Domain/UseCases/Interfaces/Professor/ICreateProfessor.cs b/src/Application/Interfaces/UseCases/Professor/ICreateProfessor.cs similarity index 61% rename from src/Domain/UseCases/Interfaces/Professor/ICreateProfessor.cs rename to src/Application/Interfaces/UseCases/Professor/ICreateProfessor.cs index aa677b6c..7b30b278 100644 --- a/src/Domain/UseCases/Interfaces/Professor/ICreateProfessor.cs +++ b/src/Application/Interfaces/UseCases/Professor/ICreateProfessor.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Professor; +using Application.Ports.Professor; -namespace Domain.UseCases.Interfaces.Professor +namespace Application.Interfaces.UseCases.Professor { public interface ICreateProfessor { diff --git a/src/Domain/UseCases/Interfaces/Professor/IDeleteProfessor.cs b/src/Application/Interfaces/UseCases/Professor/IDeleteProfessor.cs similarity index 57% rename from src/Domain/UseCases/Interfaces/Professor/IDeleteProfessor.cs rename to src/Application/Interfaces/UseCases/Professor/IDeleteProfessor.cs index c8edd9c4..85a1108e 100644 --- a/src/Domain/UseCases/Interfaces/Professor/IDeleteProfessor.cs +++ b/src/Application/Interfaces/UseCases/Professor/IDeleteProfessor.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Professor; +using Application.Ports.Professor; -namespace Domain.UseCases.Interfaces.Professor +namespace Application.Interfaces.UseCases.Professor { public interface IDeleteProfessor { diff --git a/src/Domain/UseCases/Interfaces/Professor/IGetProfessorById.cs b/src/Application/Interfaces/UseCases/Professor/IGetProfessorById.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/Professor/IGetProfessorById.cs rename to src/Application/Interfaces/UseCases/Professor/IGetProfessorById.cs index 41533bbd..c11532e6 100644 --- a/src/Domain/UseCases/Interfaces/Professor/IGetProfessorById.cs +++ b/src/Application/Interfaces/UseCases/Professor/IGetProfessorById.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Professor; +using Application.Ports.Professor; -namespace Domain.UseCases.Interfaces.Professor +namespace Application.Interfaces.UseCases.Professor { public interface IGetProfessorById { diff --git a/src/Domain/UseCases/Interfaces/Professor/IGetProfessors.cs b/src/Application/Interfaces/UseCases/Professor/IGetProfessors.cs similarity index 61% rename from src/Domain/UseCases/Interfaces/Professor/IGetProfessors.cs rename to src/Application/Interfaces/UseCases/Professor/IGetProfessors.cs index 32769cc3..4c330042 100644 --- a/src/Domain/UseCases/Interfaces/Professor/IGetProfessors.cs +++ b/src/Application/Interfaces/UseCases/Professor/IGetProfessors.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Professor; +using Application.Ports.Professor; -namespace Domain.UseCases.Interfaces.Professor +namespace Application.Interfaces.UseCases.Professor { public interface IGetProfessors { diff --git a/src/Domain/UseCases/Interfaces/Professor/IUpdateProfessor.cs b/src/Application/Interfaces/UseCases/Professor/IUpdateProfessor.cs similarity index 62% rename from src/Domain/UseCases/Interfaces/Professor/IUpdateProfessor.cs rename to src/Application/Interfaces/UseCases/Professor/IUpdateProfessor.cs index b39e0054..200d5774 100644 --- a/src/Domain/UseCases/Interfaces/Professor/IUpdateProfessor.cs +++ b/src/Application/Interfaces/UseCases/Professor/IUpdateProfessor.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Professor; +using Application.Ports.Professor; -namespace Domain.UseCases.Interfaces.Professor +namespace Application.Interfaces.UseCases.Professor { public interface IUpdateProfessor { diff --git a/src/Domain/UseCases/Interfaces/ProgramType/ICreateProgramType.cs b/src/Application/Interfaces/UseCases/ProgramType/ICreateProgramType.cs similarity index 61% rename from src/Domain/UseCases/Interfaces/ProgramType/ICreateProgramType.cs rename to src/Application/Interfaces/UseCases/ProgramType/ICreateProgramType.cs index 2471f7fb..e02b804a 100644 --- a/src/Domain/UseCases/Interfaces/ProgramType/ICreateProgramType.cs +++ b/src/Application/Interfaces/UseCases/ProgramType/ICreateProgramType.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.ProgramType; +using Application.Ports.ProgramType; -namespace Domain.UseCases.Interfaces.ProgramType +namespace Application.Interfaces.UseCases.ProgramType { public interface ICreateProgramType { diff --git a/src/Domain/UseCases/Interfaces/ProgramType/IDeleteProgramType.cs b/src/Application/Interfaces/UseCases/ProgramType/IDeleteProgramType.cs similarity index 57% rename from src/Domain/UseCases/Interfaces/ProgramType/IDeleteProgramType.cs rename to src/Application/Interfaces/UseCases/ProgramType/IDeleteProgramType.cs index 32870a1c..242c34f4 100644 --- a/src/Domain/UseCases/Interfaces/ProgramType/IDeleteProgramType.cs +++ b/src/Application/Interfaces/UseCases/ProgramType/IDeleteProgramType.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.ProgramType; +using Application.Ports.ProgramType; -namespace Domain.UseCases.Interfaces.ProgramType +namespace Application.Interfaces.UseCases.ProgramType { public interface IDeleteProgramType { diff --git a/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypeById.cs b/src/Application/Interfaces/UseCases/ProgramType/IGetProgramTypeById.cs similarity index 57% rename from src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypeById.cs rename to src/Application/Interfaces/UseCases/ProgramType/IGetProgramTypeById.cs index 07b05e03..29feeda2 100644 --- a/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypeById.cs +++ b/src/Application/Interfaces/UseCases/ProgramType/IGetProgramTypeById.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.ProgramType; +using Application.Ports.ProgramType; -namespace Domain.UseCases.Interfaces.ProgramType +namespace Application.Interfaces.UseCases.ProgramType { public interface IGetProgramTypeById { diff --git a/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypes.cs b/src/Application/Interfaces/UseCases/ProgramType/IGetProgramTypes.cs similarity index 61% rename from src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypes.cs rename to src/Application/Interfaces/UseCases/ProgramType/IGetProgramTypes.cs index 29fa9ae5..74cc7f7d 100644 --- a/src/Domain/UseCases/Interfaces/ProgramType/IGetProgramTypes.cs +++ b/src/Application/Interfaces/UseCases/ProgramType/IGetProgramTypes.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.ProgramType; +using Application.Ports.ProgramType; -namespace Domain.UseCases.Interfaces.ProgramType +namespace Application.Interfaces.UseCases.ProgramType { public interface IGetProgramTypes { diff --git a/src/Domain/UseCases/Interfaces/ProgramType/IUpdateProgramType.cs b/src/Application/Interfaces/UseCases/ProgramType/IUpdateProgramType.cs similarity index 62% rename from src/Domain/UseCases/Interfaces/ProgramType/IUpdateProgramType.cs rename to src/Application/Interfaces/UseCases/ProgramType/IUpdateProgramType.cs index c092cec2..545b55d2 100644 --- a/src/Domain/UseCases/Interfaces/ProgramType/IUpdateProgramType.cs +++ b/src/Application/Interfaces/UseCases/ProgramType/IUpdateProgramType.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.ProgramType; +using Application.Ports.ProgramType; -namespace Domain.UseCases.Interfaces.ProgramType +namespace Application.Interfaces.UseCases.ProgramType { public interface IUpdateProgramType { diff --git a/src/Domain/UseCases/Interfaces/Project/IAppealProject.cs b/src/Application/Interfaces/UseCases/Project/IAppealProject.cs similarity index 64% rename from src/Domain/UseCases/Interfaces/Project/IAppealProject.cs rename to src/Application/Interfaces/UseCases/Project/IAppealProject.cs index 301683b8..57b0eb6a 100644 --- a/src/Domain/UseCases/Interfaces/Project/IAppealProject.cs +++ b/src/Application/Interfaces/UseCases/Project/IAppealProject.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Project; +using Application.Ports.Project; -namespace Domain.UseCases.Interfaces.Project +namespace Application.Interfaces.UseCases.Project { public interface IAppealProject { diff --git a/src/Domain/UseCases/Interfaces/Project/ICancelProject.cs b/src/Application/Interfaces/UseCases/Project/ICancelProject.cs similarity index 62% rename from src/Domain/UseCases/Interfaces/Project/ICancelProject.cs rename to src/Application/Interfaces/UseCases/Project/ICancelProject.cs index ece15ee7..5802fe1c 100644 --- a/src/Domain/UseCases/Interfaces/Project/ICancelProject.cs +++ b/src/Application/Interfaces/UseCases/Project/ICancelProject.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Project; +using Application.Ports.Project; -namespace Domain.UseCases.Interfaces.Project +namespace Application.Interfaces.UseCases.Project { public interface ICancelProject { diff --git a/src/Domain/UseCases/Interfaces/Project/IGetClosedProjects.cs b/src/Application/Interfaces/UseCases/Project/IGetClosedProjects.cs similarity index 66% rename from src/Domain/UseCases/Interfaces/Project/IGetClosedProjects.cs rename to src/Application/Interfaces/UseCases/Project/IGetClosedProjects.cs index bc30c9f0..aaf0f3eb 100644 --- a/src/Domain/UseCases/Interfaces/Project/IGetClosedProjects.cs +++ b/src/Application/Interfaces/UseCases/Project/IGetClosedProjects.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Project; +using Application.Ports.Project; -namespace Domain.UseCases.Interfaces.Project +namespace Application.Interfaces.UseCases.Project { public interface IGetClosedProjects { diff --git a/src/Domain/UseCases/Interfaces/Project/IGetOpenProjects.cs b/src/Application/Interfaces/UseCases/Project/IGetOpenProjects.cs similarity index 66% rename from src/Domain/UseCases/Interfaces/Project/IGetOpenProjects.cs rename to src/Application/Interfaces/UseCases/Project/IGetOpenProjects.cs index 027a6341..fea26580 100644 --- a/src/Domain/UseCases/Interfaces/Project/IGetOpenProjects.cs +++ b/src/Application/Interfaces/UseCases/Project/IGetOpenProjects.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Project; +using Application.Ports.Project; -namespace Domain.UseCases.Interfaces.Project +namespace Application.Interfaces.UseCases.Project { public interface IGetOpenProjects { diff --git a/src/Domain/UseCases/Interfaces/Project/IGetProjectById.cs b/src/Application/Interfaces/UseCases/Project/IGetProjectById.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/Project/IGetProjectById.cs rename to src/Application/Interfaces/UseCases/Project/IGetProjectById.cs index 01baf78b..74118d8d 100644 --- a/src/Domain/UseCases/Interfaces/Project/IGetProjectById.cs +++ b/src/Application/Interfaces/UseCases/Project/IGetProjectById.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Project; +using Application.Ports.Project; -namespace Domain.UseCases.Interfaces.Project +namespace Application.Interfaces.UseCases.Project { public interface IGetProjectById { diff --git a/src/Domain/UseCases/Interfaces/Project/IOpenProject.cs b/src/Application/Interfaces/UseCases/Project/IOpenProject.cs similarity index 60% rename from src/Domain/UseCases/Interfaces/Project/IOpenProject.cs rename to src/Application/Interfaces/UseCases/Project/IOpenProject.cs index 7e92cc72..910a038d 100644 --- a/src/Domain/UseCases/Interfaces/Project/IOpenProject.cs +++ b/src/Application/Interfaces/UseCases/Project/IOpenProject.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Project; +using Application.Ports.Project; -namespace Domain.UseCases.Interfaces.Project +namespace Application.Interfaces.UseCases.Project { public interface IOpenProject { diff --git a/src/Domain/UseCases/Interfaces/Project/ISubmitProject.cs b/src/Application/Interfaces/UseCases/Project/ISubmitProject.cs similarity index 59% rename from src/Domain/UseCases/Interfaces/Project/ISubmitProject.cs rename to src/Application/Interfaces/UseCases/Project/ISubmitProject.cs index fea387f7..ca1e13d9 100644 --- a/src/Domain/UseCases/Interfaces/Project/ISubmitProject.cs +++ b/src/Application/Interfaces/UseCases/Project/ISubmitProject.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Project; +using Application.Ports.Project; -namespace Domain.UseCases.Interfaces.Project +namespace Application.Interfaces.UseCases.Project { public interface ISubmitProject { diff --git a/src/Domain/UseCases/Interfaces/Project/IUpdateProject.cs b/src/Application/Interfaces/UseCases/Project/IUpdateProject.cs similarity index 62% rename from src/Domain/UseCases/Interfaces/Project/IUpdateProject.cs rename to src/Application/Interfaces/UseCases/Project/IUpdateProject.cs index f056a822..ac90a048 100644 --- a/src/Domain/UseCases/Interfaces/Project/IUpdateProject.cs +++ b/src/Application/Interfaces/UseCases/Project/IUpdateProject.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Project; +using Application.Ports.Project; -namespace Domain.UseCases.Interfaces.Project +namespace Application.Interfaces.UseCases.Project { public interface IUpdateProject { diff --git a/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateAppealProject.cs b/src/Application/Interfaces/UseCases/ProjectEvaluation/IEvaluateAppealProject.cs similarity index 51% rename from src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateAppealProject.cs rename to src/Application/Interfaces/UseCases/ProjectEvaluation/IEvaluateAppealProject.cs index a3cedd81..03e1700b 100644 --- a/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateAppealProject.cs +++ b/src/Application/Interfaces/UseCases/ProjectEvaluation/IEvaluateAppealProject.cs @@ -1,7 +1,7 @@ -using Domain.UseCases.Ports.Project; -using Domain.UseCases.Ports.ProjectEvaluation; +using Application.Ports.Project; +using Application.Ports.ProjectEvaluation; -namespace Domain.UseCases.Interfaces.ProjectEvaluation +namespace Application.Interfaces.UseCases.ProjectEvaluation { public interface IEvaluateAppealProject { diff --git a/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateSubmissionProject.cs b/src/Application/Interfaces/UseCases/ProjectEvaluation/IEvaluateSubmissionProject.cs similarity index 52% rename from src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateSubmissionProject.cs rename to src/Application/Interfaces/UseCases/ProjectEvaluation/IEvaluateSubmissionProject.cs index 96b09f2b..61c8e5d1 100644 --- a/src/Domain/UseCases/Interfaces/ProjectEvaluation/IEvaluateSubmissionProject.cs +++ b/src/Application/Interfaces/UseCases/ProjectEvaluation/IEvaluateSubmissionProject.cs @@ -1,7 +1,7 @@ -using Domain.UseCases.Ports.Project; -using Domain.UseCases.Ports.ProjectEvaluation; +using Application.Ports.Project; +using Application.Ports.ProjectEvaluation; -namespace Domain.UseCases.Interfaces.ProjectEvaluation +namespace Application.Interfaces.UseCases.ProjectEvaluation { public interface IEvaluateSubmissionProject { diff --git a/src/Domain/UseCases/Interfaces/ProjectEvaluation/IGetEvaluationByProjectId.cs b/src/Application/Interfaces/UseCases/ProjectEvaluation/IGetEvaluationByProjectId.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/ProjectEvaluation/IGetEvaluationByProjectId.cs rename to src/Application/Interfaces/UseCases/ProjectEvaluation/IGetEvaluationByProjectId.cs index 58db5670..353687ba 100644 --- a/src/Domain/UseCases/Interfaces/ProjectEvaluation/IGetEvaluationByProjectId.cs +++ b/src/Application/Interfaces/UseCases/ProjectEvaluation/IGetEvaluationByProjectId.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.ProjectEvaluation; +using Application.Ports.ProjectEvaluation; -namespace Domain.UseCases.Interfaces.ProjectEvaluation +namespace Application.Interfaces.UseCases.ProjectEvaluation { public interface IGetEvaluationByProjectId { diff --git a/src/Domain/UseCases/Interfaces/ProjectReport/ICreateProjectReport.cs b/src/Application/Interfaces/UseCases/ProjectReport/ICreateProjectReport.cs similarity index 53% rename from src/Domain/UseCases/Interfaces/ProjectReport/ICreateProjectReport.cs rename to src/Application/Interfaces/UseCases/ProjectReport/ICreateProjectReport.cs index b7d8465c..b06635b5 100644 --- a/src/Domain/UseCases/Interfaces/ProjectReport/ICreateProjectReport.cs +++ b/src/Application/Interfaces/UseCases/ProjectReport/ICreateProjectReport.cs @@ -1,7 +1,6 @@ -using Domain.Ports.ProjectReport; -using Domain.UseCases.Ports.ProjectReport; +using Application.Ports.ProjectReport; -namespace Domain.UseCases.Interfaces.ProjectReport +namespace Application.Interfaces.UseCases.ProjectReport { public interface ICreateProjectReport { diff --git a/src/Domain/UseCases/Interfaces/ProjectReport/IDeleteProjectReport.cs b/src/Application/Interfaces/UseCases/ProjectReport/IDeleteProjectReport.cs similarity index 57% rename from src/Domain/UseCases/Interfaces/ProjectReport/IDeleteProjectReport.cs rename to src/Application/Interfaces/UseCases/ProjectReport/IDeleteProjectReport.cs index c42bd689..48bbb7c2 100644 --- a/src/Domain/UseCases/Interfaces/ProjectReport/IDeleteProjectReport.cs +++ b/src/Application/Interfaces/UseCases/ProjectReport/IDeleteProjectReport.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.ProjectReport; +using Application.Ports.ProjectReport; -namespace Domain.UseCases.Interfaces.ProjectReport +namespace Application.Interfaces.UseCases.ProjectReport { public interface IDeleteProjectReport { diff --git a/src/Domain/UseCases/Interfaces/ProjectReport/IGetProjectReportById.cs b/src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportById.cs similarity index 57% rename from src/Domain/UseCases/Interfaces/ProjectReport/IGetProjectReportById.cs rename to src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportById.cs index 7527b159..0f5e6bae 100644 --- a/src/Domain/UseCases/Interfaces/ProjectReport/IGetProjectReportById.cs +++ b/src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportById.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.ProjectReport; +using Application.Ports.ProjectReport; -namespace Domain.UseCases.Interfaces.ProjectReport +namespace Application.Interfaces.UseCases.ProjectReport { public interface IGetProjectReportById { diff --git a/src/Domain/UseCases/Interfaces/ProjectReport/IUpdateProjectReport.cs b/src/Application/Interfaces/UseCases/ProjectReport/IUpdateProjectReport.cs similarity index 62% rename from src/Domain/UseCases/Interfaces/ProjectReport/IUpdateProjectReport.cs rename to src/Application/Interfaces/UseCases/ProjectReport/IUpdateProjectReport.cs index b4acd8b0..2e64342e 100644 --- a/src/Domain/UseCases/Interfaces/ProjectReport/IUpdateProjectReport.cs +++ b/src/Application/Interfaces/UseCases/ProjectReport/IUpdateProjectReport.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.ProjectReport; +using Application.Ports.ProjectReport; -namespace Domain.UseCases.Interfaces.ProjectReport +namespace Application.Interfaces.UseCases.ProjectReport { public interface IUpdateProjectReport { diff --git a/src/Domain/UseCases/Interfaces/Student/ICreateStudent.cs b/src/Application/Interfaces/UseCases/Student/ICreateStudent.cs similarity index 61% rename from src/Domain/UseCases/Interfaces/Student/ICreateStudent.cs rename to src/Application/Interfaces/UseCases/Student/ICreateStudent.cs index d0de61cc..9cff403d 100644 --- a/src/Domain/UseCases/Interfaces/Student/ICreateStudent.cs +++ b/src/Application/Interfaces/UseCases/Student/ICreateStudent.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Student; +using Application.Ports.Student; -namespace Domain.UseCases.Interfaces.Student +namespace Application.Interfaces.UseCases.Student { public interface ICreateStudent { diff --git a/src/Domain/UseCases/Interfaces/Student/IDeleteStudent.cs b/src/Application/Interfaces/UseCases/Student/IDeleteStudent.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/Student/IDeleteStudent.cs rename to src/Application/Interfaces/UseCases/Student/IDeleteStudent.cs index 56553e8d..68d312b5 100644 --- a/src/Domain/UseCases/Interfaces/Student/IDeleteStudent.cs +++ b/src/Application/Interfaces/UseCases/Student/IDeleteStudent.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Student; +using Application.Ports.Student; -namespace Domain.UseCases.Interfaces.Student +namespace Application.Interfaces.UseCases.Student { public interface IDeleteStudent { diff --git a/src/Domain/UseCases/Interfaces/Student/IGetStudentById.cs b/src/Application/Interfaces/UseCases/Student/IGetStudentById.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/Student/IGetStudentById.cs rename to src/Application/Interfaces/UseCases/Student/IGetStudentById.cs index 90e11d53..5779e002 100644 --- a/src/Domain/UseCases/Interfaces/Student/IGetStudentById.cs +++ b/src/Application/Interfaces/UseCases/Student/IGetStudentById.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Student; +using Application.Ports.Student; -namespace Domain.UseCases.Interfaces.Student +namespace Application.Interfaces.UseCases.Student { public interface IGetStudentById { diff --git a/src/Domain/UseCases/Interfaces/Student/IGetStudentByRegistrationCode.cs b/src/Application/Interfaces/UseCases/Student/IGetStudentByRegistrationCode.cs similarity index 63% rename from src/Domain/UseCases/Interfaces/Student/IGetStudentByRegistrationCode.cs rename to src/Application/Interfaces/UseCases/Student/IGetStudentByRegistrationCode.cs index 3fa5d36c..b91f13df 100644 --- a/src/Domain/UseCases/Interfaces/Student/IGetStudentByRegistrationCode.cs +++ b/src/Application/Interfaces/UseCases/Student/IGetStudentByRegistrationCode.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Student; +using Application.Ports.Student; -namespace Domain.UseCases.Interfaces.Student +namespace Application.Interfaces.UseCases.Student { public interface IGetStudentByRegistrationCode { diff --git a/src/Domain/UseCases/Interfaces/Student/IGetStudents.cs b/src/Application/Interfaces/UseCases/Student/IGetStudents.cs similarity index 61% rename from src/Domain/UseCases/Interfaces/Student/IGetStudents.cs rename to src/Application/Interfaces/UseCases/Student/IGetStudents.cs index b352ca4d..00dc7d7c 100644 --- a/src/Domain/UseCases/Interfaces/Student/IGetStudents.cs +++ b/src/Application/Interfaces/UseCases/Student/IGetStudents.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Student; +using Application.Ports.Student; -namespace Domain.UseCases.Interfaces.Student +namespace Application.Interfaces.UseCases.Student { public interface IGetStudents { diff --git a/src/Domain/UseCases/Interfaces/Student/IRequestStudentRegister.cs b/src/Application/Interfaces/UseCases/Student/IRequestStudentRegister.cs similarity index 68% rename from src/Domain/UseCases/Interfaces/Student/IRequestStudentRegister.cs rename to src/Application/Interfaces/UseCases/Student/IRequestStudentRegister.cs index 2432653b..63385866 100644 --- a/src/Domain/UseCases/Interfaces/Student/IRequestStudentRegister.cs +++ b/src/Application/Interfaces/UseCases/Student/IRequestStudentRegister.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Interfaces.Student +namespace Application.Interfaces.UseCases.Student { public interface IRequestStudentRegister { diff --git a/src/Domain/UseCases/Interfaces/Student/IUpdateStudent.cs b/src/Application/Interfaces/UseCases/Student/IUpdateStudent.cs similarity index 63% rename from src/Domain/UseCases/Interfaces/Student/IUpdateStudent.cs rename to src/Application/Interfaces/UseCases/Student/IUpdateStudent.cs index dbd9fc1a..450e0126 100644 --- a/src/Domain/UseCases/Interfaces/Student/IUpdateStudent.cs +++ b/src/Application/Interfaces/UseCases/Student/IUpdateStudent.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Student; +using Application.Ports.Student; -namespace Domain.UseCases.Interfaces.Student +namespace Application.Interfaces.UseCases.Student { public interface IUpdateStudent { diff --git a/src/Domain/UseCases/Interfaces/StudentDocuments/ICreateStudentDocuments.cs b/src/Application/Interfaces/UseCases/StudentDocuments/ICreateStudentDocuments.cs similarity index 61% rename from src/Domain/UseCases/Interfaces/StudentDocuments/ICreateStudentDocuments.cs rename to src/Application/Interfaces/UseCases/StudentDocuments/ICreateStudentDocuments.cs index dbefe4bf..72581ff9 100644 --- a/src/Domain/UseCases/Interfaces/StudentDocuments/ICreateStudentDocuments.cs +++ b/src/Application/Interfaces/UseCases/StudentDocuments/ICreateStudentDocuments.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.StudentDocuments; +using Application.Ports.StudentDocuments; -namespace Domain.UseCases.Interfaces.StudentDocuments +namespace Application.Interfaces.UseCases.StudentDocuments { public interface ICreateStudentDocuments { diff --git a/src/Domain/UseCases/Interfaces/StudentDocuments/IDeleteStudentDocuments.cs b/src/Application/Interfaces/UseCases/StudentDocuments/IDeleteStudentDocuments.cs similarity index 57% rename from src/Domain/UseCases/Interfaces/StudentDocuments/IDeleteStudentDocuments.cs rename to src/Application/Interfaces/UseCases/StudentDocuments/IDeleteStudentDocuments.cs index 44ea5a2b..5456fa24 100644 --- a/src/Domain/UseCases/Interfaces/StudentDocuments/IDeleteStudentDocuments.cs +++ b/src/Application/Interfaces/UseCases/StudentDocuments/IDeleteStudentDocuments.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.StudentDocuments; +using Application.Ports.StudentDocuments; -namespace Domain.UseCases.Interfaces.StudentDocuments +namespace Application.Interfaces.UseCases.StudentDocuments { public interface IDeleteStudentDocuments { diff --git a/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByProjectId.cs b/src/Application/Interfaces/UseCases/StudentDocuments/IGetStudentDocumentsByProjectId.cs similarity index 59% rename from src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByProjectId.cs rename to src/Application/Interfaces/UseCases/StudentDocuments/IGetStudentDocumentsByProjectId.cs index 5dcfa315..5e2a1fe6 100644 --- a/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByProjectId.cs +++ b/src/Application/Interfaces/UseCases/StudentDocuments/IGetStudentDocumentsByProjectId.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.StudentDocuments; +using Application.Ports.StudentDocuments; -namespace Domain.UseCases.Interfaces.StudentDocuments +namespace Application.Interfaces.UseCases.StudentDocuments { public interface IGetStudentDocumentsByProjectId { diff --git a/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByStudentId.cs b/src/Application/Interfaces/UseCases/StudentDocuments/IGetStudentDocumentsByStudentId.cs similarity index 59% rename from src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByStudentId.cs rename to src/Application/Interfaces/UseCases/StudentDocuments/IGetStudentDocumentsByStudentId.cs index e539b8e4..1b9eae36 100644 --- a/src/Domain/UseCases/Interfaces/StudentDocuments/IGetStudentDocumentsByStudentId.cs +++ b/src/Application/Interfaces/UseCases/StudentDocuments/IGetStudentDocumentsByStudentId.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.StudentDocuments; +using Application.Ports.StudentDocuments; -namespace Domain.UseCases.Interfaces.StudentDocuments +namespace Application.Interfaces.UseCases.StudentDocuments { public interface IGetStudentDocumentsByStudentId { diff --git a/src/Domain/UseCases/Interfaces/StudentDocuments/IUpdateStudentDocuments.cs b/src/Application/Interfaces/UseCases/StudentDocuments/IUpdateStudentDocuments.cs similarity index 62% rename from src/Domain/UseCases/Interfaces/StudentDocuments/IUpdateStudentDocuments.cs rename to src/Application/Interfaces/UseCases/StudentDocuments/IUpdateStudentDocuments.cs index 58ebb94a..c064f307 100644 --- a/src/Domain/UseCases/Interfaces/StudentDocuments/IUpdateStudentDocuments.cs +++ b/src/Application/Interfaces/UseCases/StudentDocuments/IUpdateStudentDocuments.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.StudentDocuments; +using Application.Ports.StudentDocuments; -namespace Domain.UseCases.Interfaces.StudentDocuments +namespace Application.Interfaces.UseCases.StudentDocuments { public interface IUpdateStudentDocuments { diff --git a/src/Domain/UseCases/Interfaces/SubArea/ICreateSubArea.cs b/src/Application/Interfaces/UseCases/SubArea/ICreateSubArea.cs similarity index 61% rename from src/Domain/UseCases/Interfaces/SubArea/ICreateSubArea.cs rename to src/Application/Interfaces/UseCases/SubArea/ICreateSubArea.cs index 2278b22f..1dd9a203 100644 --- a/src/Domain/UseCases/Interfaces/SubArea/ICreateSubArea.cs +++ b/src/Application/Interfaces/UseCases/SubArea/ICreateSubArea.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.SubArea; +using Application.Ports.SubArea; -namespace Domain.UseCases.Interfaces.SubArea +namespace Application.Interfaces.UseCases.SubArea { public interface ICreateSubArea { diff --git a/src/Domain/UseCases/Interfaces/SubArea/IDeleteSubArea.cs b/src/Application/Interfaces/UseCases/SubArea/IDeleteSubArea.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/SubArea/IDeleteSubArea.cs rename to src/Application/Interfaces/UseCases/SubArea/IDeleteSubArea.cs index c3d83686..520ad262 100644 --- a/src/Domain/UseCases/Interfaces/SubArea/IDeleteSubArea.cs +++ b/src/Application/Interfaces/UseCases/SubArea/IDeleteSubArea.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.SubArea; +using Application.Ports.SubArea; -namespace Domain.UseCases.Interfaces.SubArea +namespace Application.Interfaces.UseCases.SubArea { public interface IDeleteSubArea { diff --git a/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreaById.cs b/src/Application/Interfaces/UseCases/SubArea/IGetSubAreaById.cs similarity index 58% rename from src/Domain/UseCases/Interfaces/SubArea/IGetSubAreaById.cs rename to src/Application/Interfaces/UseCases/SubArea/IGetSubAreaById.cs index c928abfd..5e061d7b 100644 --- a/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreaById.cs +++ b/src/Application/Interfaces/UseCases/SubArea/IGetSubAreaById.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.SubArea; +using Application.Ports.SubArea; -namespace Domain.UseCases.Interfaces.SubArea +namespace Application.Interfaces.UseCases.SubArea { public interface IGetSubAreaById { diff --git a/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreasByArea.cs b/src/Application/Interfaces/UseCases/SubArea/IGetSubAreasByArea.cs similarity index 65% rename from src/Domain/UseCases/Interfaces/SubArea/IGetSubAreasByArea.cs rename to src/Application/Interfaces/UseCases/SubArea/IGetSubAreasByArea.cs index 4792e5f1..703a0f86 100644 --- a/src/Domain/UseCases/Interfaces/SubArea/IGetSubAreasByArea.cs +++ b/src/Application/Interfaces/UseCases/SubArea/IGetSubAreasByArea.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.SubArea; +using Application.Ports.SubArea; -namespace Domain.UseCases.Interfaces.SubArea +namespace Application.Interfaces.UseCases.SubArea { public interface IGetSubAreasByArea { diff --git a/src/Domain/UseCases/Interfaces/SubArea/IUpdateSubArea.cs b/src/Application/Interfaces/UseCases/SubArea/IUpdateSubArea.cs similarity index 63% rename from src/Domain/UseCases/Interfaces/SubArea/IUpdateSubArea.cs rename to src/Application/Interfaces/UseCases/SubArea/IUpdateSubArea.cs index ceb1dd06..f7446578 100644 --- a/src/Domain/UseCases/Interfaces/SubArea/IUpdateSubArea.cs +++ b/src/Application/Interfaces/UseCases/SubArea/IUpdateSubArea.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.SubArea; +using Application.Ports.SubArea; -namespace Domain.UseCases.Interfaces.SubArea +namespace Application.Interfaces.UseCases.SubArea { public interface IUpdateSubArea { diff --git a/src/Domain/UseCases/Interfaces/User/IActivateUser.cs b/src/Application/Interfaces/UseCases/User/IActivateUser.cs similarity index 57% rename from src/Domain/UseCases/Interfaces/User/IActivateUser.cs rename to src/Application/Interfaces/UseCases/User/IActivateUser.cs index 4b0527ef..18c8401e 100644 --- a/src/Domain/UseCases/Interfaces/User/IActivateUser.cs +++ b/src/Application/Interfaces/UseCases/User/IActivateUser.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.User; +using Application.Ports.User; -namespace Domain.UseCases.Interfaces.User +namespace Application.Interfaces.UseCases.User { public interface IActivateUser { diff --git a/src/Domain/UseCases/Interfaces/User/IDeactivateUser.cs b/src/Application/Interfaces/UseCases/User/IDeactivateUser.cs similarity index 57% rename from src/Domain/UseCases/Interfaces/User/IDeactivateUser.cs rename to src/Application/Interfaces/UseCases/User/IDeactivateUser.cs index 509d6b83..6d7aecbe 100644 --- a/src/Domain/UseCases/Interfaces/User/IDeactivateUser.cs +++ b/src/Application/Interfaces/UseCases/User/IDeactivateUser.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.User; +using Application.Ports.User; -namespace Domain.UseCases.Interfaces.User +namespace Application.Interfaces.UseCases.User { public interface IDeactivateUser { diff --git a/src/Domain/UseCases/Interfaces/User/IGetActiveUsers.cs b/src/Application/Interfaces/UseCases/User/IGetActiveUsers.cs similarity index 62% rename from src/Domain/UseCases/Interfaces/User/IGetActiveUsers.cs rename to src/Application/Interfaces/UseCases/User/IGetActiveUsers.cs index d24e3a81..a8a152cf 100644 --- a/src/Domain/UseCases/Interfaces/User/IGetActiveUsers.cs +++ b/src/Application/Interfaces/UseCases/User/IGetActiveUsers.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.User; +using Application.Ports.User; -namespace Domain.UseCases.Interfaces.User +namespace Application.Interfaces.UseCases.User { public interface IGetActiveUsers { diff --git a/src/Domain/UseCases/Interfaces/User/IGetInactiveUsers.cs b/src/Application/Interfaces/UseCases/User/IGetInactiveUsers.cs similarity index 62% rename from src/Domain/UseCases/Interfaces/User/IGetInactiveUsers.cs rename to src/Application/Interfaces/UseCases/User/IGetInactiveUsers.cs index 6915679c..055cb3eb 100644 --- a/src/Domain/UseCases/Interfaces/User/IGetInactiveUsers.cs +++ b/src/Application/Interfaces/UseCases/User/IGetInactiveUsers.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.User; +using Application.Ports.User; -namespace Domain.UseCases.Interfaces.User +namespace Application.Interfaces.UseCases.User { public interface IGetInactiveUsers { diff --git a/src/Domain/UseCases/Interfaces/User/IGetUserById.cs b/src/Application/Interfaces/UseCases/User/IGetUserById.cs similarity index 57% rename from src/Domain/UseCases/Interfaces/User/IGetUserById.cs rename to src/Application/Interfaces/UseCases/User/IGetUserById.cs index 6d20a298..bb2c58ae 100644 --- a/src/Domain/UseCases/Interfaces/User/IGetUserById.cs +++ b/src/Application/Interfaces/UseCases/User/IGetUserById.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.User; +using Application.Ports.User; -namespace Domain.UseCases.Interfaces.User +namespace Application.Interfaces.UseCases.User { public interface IGetUserById { diff --git a/src/Domain/UseCases/Interfaces/User/IUpdateUser.cs b/src/Application/Interfaces/UseCases/User/IUpdateUser.cs similarity index 59% rename from src/Domain/UseCases/Interfaces/User/IUpdateUser.cs rename to src/Application/Interfaces/UseCases/User/IUpdateUser.cs index 77e174d8..4163c3c0 100644 --- a/src/Domain/UseCases/Interfaces/User/IUpdateUser.cs +++ b/src/Application/Interfaces/UseCases/User/IUpdateUser.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.User; +using Application.Ports.User; -namespace Domain.UseCases.Interfaces.User +namespace Application.Interfaces.UseCases.User { public interface IUpdateUser { diff --git a/src/Domain/Mappings/ActivityMappings.cs b/src/Application/Mappings/ActivityMappings.cs similarity index 92% rename from src/Domain/Mappings/ActivityMappings.cs rename to src/Application/Mappings/ActivityMappings.cs index e3323646..c0022061 100644 --- a/src/Domain/Mappings/ActivityMappings.cs +++ b/src/Application/Mappings/ActivityMappings.cs @@ -1,7 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.Ports.Activity; -using Domain.UseCases.Ports.Activity; +using Application.Ports.Activity; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/AreaMappings.cs b/src/Application/Mappings/AreaMappings.cs similarity index 94% rename from src/Domain/Mappings/AreaMappings.cs rename to src/Application/Mappings/AreaMappings.cs index bad0d88f..1c4b1148 100644 --- a/src/Domain/Mappings/AreaMappings.cs +++ b/src/Application/Mappings/AreaMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.UseCases.Ports.Area; +using Application.Ports.Area; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/AssistanceTypeMappings.cs b/src/Application/Mappings/AssistanceTypeMappings.cs similarity index 92% rename from src/Domain/Mappings/AssistanceTypeMappings.cs rename to src/Application/Mappings/AssistanceTypeMappings.cs index 800059fd..c43ba436 100644 --- a/src/Domain/Mappings/AssistanceTypeMappings.cs +++ b/src/Application/Mappings/AssistanceTypeMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.UseCases.Ports.AssistanceType; +using Application.Ports.AssistanceType; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/CampusMappings.cs b/src/Application/Mappings/CampusMappings.cs similarity index 92% rename from src/Domain/Mappings/CampusMappings.cs rename to src/Application/Mappings/CampusMappings.cs index 611e4ef2..08ea17b3 100644 --- a/src/Domain/Mappings/CampusMappings.cs +++ b/src/Application/Mappings/CampusMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.UseCases.Ports.Campus; +using Application.Ports.Campus; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/CourseMappings.cs b/src/Application/Mappings/CourseMappings.cs similarity index 88% rename from src/Domain/Mappings/CourseMappings.cs rename to src/Application/Mappings/CourseMappings.cs index 9a6e9b82..e428840b 100644 --- a/src/Domain/Mappings/CourseMappings.cs +++ b/src/Application/Mappings/CourseMappings.cs @@ -1,7 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.Ports.Course; -using Domain.UseCases.Ports.Course; +using Application.Ports.Course; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/MainAreaMappings.cs b/src/Application/Mappings/MainAreaMappings.cs similarity index 92% rename from src/Domain/Mappings/MainAreaMappings.cs rename to src/Application/Mappings/MainAreaMappings.cs index 09ca82c5..cacc66f6 100644 --- a/src/Domain/Mappings/MainAreaMappings.cs +++ b/src/Application/Mappings/MainAreaMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.UseCases.Ports.MainArea; +using Application.Ports.MainArea; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/NoticeMappings.cs b/src/Application/Mappings/NoticeMappings.cs similarity index 92% rename from src/Domain/Mappings/NoticeMappings.cs rename to src/Application/Mappings/NoticeMappings.cs index 8400a57d..fa5f9737 100644 --- a/src/Domain/Mappings/NoticeMappings.cs +++ b/src/Application/Mappings/NoticeMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.UseCases.Ports.Notice; +using Application.Ports.Notice; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/ProfessorMappings.cs b/src/Application/Mappings/ProfessorMappings.cs similarity index 95% rename from src/Domain/Mappings/ProfessorMappings.cs rename to src/Application/Mappings/ProfessorMappings.cs index 104be91d..5c3002b7 100644 --- a/src/Domain/Mappings/ProfessorMappings.cs +++ b/src/Application/Mappings/ProfessorMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.UseCases.Ports.Professor; +using Application.Ports.Professor; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/ProgramTypeMappings.cs b/src/Application/Mappings/ProgramTypeMappings.cs similarity index 92% rename from src/Domain/Mappings/ProgramTypeMappings.cs rename to src/Application/Mappings/ProgramTypeMappings.cs index a03ca51f..4ab76f8d 100644 --- a/src/Domain/Mappings/ProgramTypeMappings.cs +++ b/src/Application/Mappings/ProgramTypeMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.UseCases.Ports.ProgramType; +using Application.Ports.ProgramType; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/ProjectEvaluationMappings.cs b/src/Application/Mappings/ProjectEvaluationMappings.cs similarity index 89% rename from src/Domain/Mappings/ProjectEvaluationMappings.cs rename to src/Application/Mappings/ProjectEvaluationMappings.cs index fc0ce472..538d31b1 100644 --- a/src/Domain/Mappings/ProjectEvaluationMappings.cs +++ b/src/Application/Mappings/ProjectEvaluationMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.UseCases.Ports.ProjectEvaluation; +using Application.Ports.ProjectEvaluation; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/ProjectMappings.cs b/src/Application/Mappings/ProjectMappings.cs similarity index 92% rename from src/Domain/Mappings/ProjectMappings.cs rename to src/Application/Mappings/ProjectMappings.cs index 9c3d6855..a6c0074d 100644 --- a/src/Domain/Mappings/ProjectMappings.cs +++ b/src/Application/Mappings/ProjectMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.UseCases.Ports.Project; +using Application.Ports.Project; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/StudentDocumentsMappings.cs b/src/Application/Mappings/StudentDocumentsMappings.cs similarity index 89% rename from src/Domain/Mappings/StudentDocumentsMappings.cs rename to src/Application/Mappings/StudentDocumentsMappings.cs index 6d256d46..7fda8144 100644 --- a/src/Domain/Mappings/StudentDocumentsMappings.cs +++ b/src/Application/Mappings/StudentDocumentsMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.UseCases.Ports.StudentDocuments; +using Application.Ports.StudentDocuments; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/StudentMappings.cs b/src/Application/Mappings/StudentMappings.cs similarity index 96% rename from src/Domain/Mappings/StudentMappings.cs rename to src/Application/Mappings/StudentMappings.cs index d3183657..a54e21ae 100644 --- a/src/Domain/Mappings/StudentMappings.cs +++ b/src/Application/Mappings/StudentMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.UseCases.Ports.Student; +using Application.Ports.Student; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/SubAreaMappings.cs b/src/Application/Mappings/SubAreaMappings.cs similarity index 94% rename from src/Domain/Mappings/SubAreaMappings.cs rename to src/Application/Mappings/SubAreaMappings.cs index f974bd65..1ea92615 100644 --- a/src/Domain/Mappings/SubAreaMappings.cs +++ b/src/Application/Mappings/SubAreaMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.UseCases.Ports.SubArea; +using Application.Ports.SubArea; namespace Domain.Mappings { diff --git a/src/Domain/Mappings/UserMappings.cs b/src/Application/Mappings/UserMappings.cs similarity index 89% rename from src/Domain/Mappings/UserMappings.cs rename to src/Application/Mappings/UserMappings.cs index d2db5d4a..aaa8892d 100644 --- a/src/Domain/Mappings/UserMappings.cs +++ b/src/Application/Mappings/UserMappings.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Entities; -using Domain.UseCases.Ports.User; +using Application.Ports.User; namespace Domain.Mappings { diff --git a/src/Domain/UseCases/Ports/Activity/ActivityOutput.cs b/src/Application/Ports/Activity/ActivityOutput.cs similarity index 63% rename from src/Domain/UseCases/Ports/Activity/ActivityOutput.cs rename to src/Application/Ports/Activity/ActivityOutput.cs index afd7b3c6..7370f78c 100644 --- a/src/Domain/UseCases/Ports/Activity/ActivityOutput.cs +++ b/src/Application/Ports/Activity/ActivityOutput.cs @@ -1,6 +1,4 @@ -using Domain.UseCases.Ports.Activity; - -namespace Domain.Ports.Activity; +namespace Application.Ports.Activity; public class ActivityOutput : BaseActivity { public Guid? Id { get; set; } diff --git a/src/Domain/UseCases/Ports/Activity/ActivityTypeOutput.cs b/src/Application/Ports/Activity/ActivityTypeOutput.cs similarity index 75% rename from src/Domain/UseCases/Ports/Activity/ActivityTypeOutput.cs rename to src/Application/Ports/Activity/ActivityTypeOutput.cs index 8aba2e18..547f3e47 100644 --- a/src/Domain/UseCases/Ports/Activity/ActivityTypeOutput.cs +++ b/src/Application/Ports/Activity/ActivityTypeOutput.cs @@ -1,6 +1,4 @@ -using Domain.Ports.Activity; - -namespace Domain.UseCases.Ports.Activity +namespace Application.Ports.Activity { public class ActivityTypeOutput : BaseActivityType { diff --git a/src/Domain/UseCases/Ports/Activity/BaseActivity.cs b/src/Application/Ports/Activity/BaseActivity.cs similarity index 86% rename from src/Domain/UseCases/Ports/Activity/BaseActivity.cs rename to src/Application/Ports/Activity/BaseActivity.cs index fd771b42..391d17ff 100644 --- a/src/Domain/UseCases/Ports/Activity/BaseActivity.cs +++ b/src/Application/Ports/Activity/BaseActivity.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Activity +namespace Application.Ports.Activity { public class BaseActivity { diff --git a/src/Domain/UseCases/Ports/Activity/BaseActivityType.cs b/src/Application/Ports/Activity/BaseActivityType.cs similarity index 88% rename from src/Domain/UseCases/Ports/Activity/BaseActivityType.cs rename to src/Application/Ports/Activity/BaseActivityType.cs index 177602be..8e89129a 100644 --- a/src/Domain/UseCases/Ports/Activity/BaseActivityType.cs +++ b/src/Application/Ports/Activity/BaseActivityType.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Activity +namespace Application.Ports.Activity { public class BaseActivityType { diff --git a/src/Domain/UseCases/Ports/Activity/CreateActivityInput.cs b/src/Application/Ports/Activity/CreateActivityInput.cs similarity index 59% rename from src/Domain/UseCases/Ports/Activity/CreateActivityInput.cs rename to src/Application/Ports/Activity/CreateActivityInput.cs index eecc3c41..dbe9ea8b 100644 --- a/src/Domain/UseCases/Ports/Activity/CreateActivityInput.cs +++ b/src/Application/Ports/Activity/CreateActivityInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Activity +namespace Application.Ports.Activity { public class CreateActivityInput : BaseActivity { } } \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/Activity/CreateActivityTypeInput.cs b/src/Application/Ports/Activity/CreateActivityTypeInput.cs similarity index 88% rename from src/Domain/UseCases/Ports/Activity/CreateActivityTypeInput.cs rename to src/Application/Ports/Activity/CreateActivityTypeInput.cs index 178d8595..83c6386c 100644 --- a/src/Domain/UseCases/Ports/Activity/CreateActivityTypeInput.cs +++ b/src/Application/Ports/Activity/CreateActivityTypeInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Activity +namespace Application.Ports.Activity { public class CreateActivityTypeInput { diff --git a/src/Domain/UseCases/Ports/Activity/UpdateActivityInput.cs b/src/Application/Ports/Activity/UpdateActivityInput.cs similarity index 64% rename from src/Domain/UseCases/Ports/Activity/UpdateActivityInput.cs rename to src/Application/Ports/Activity/UpdateActivityInput.cs index cefb2187..3c6a48de 100644 --- a/src/Domain/UseCases/Ports/Activity/UpdateActivityInput.cs +++ b/src/Application/Ports/Activity/UpdateActivityInput.cs @@ -1,6 +1,4 @@ -using Domain.UseCases.Ports.Activity; - -namespace Domain.Ports.Activity; +namespace Application.Ports.Activity; public class UpdateActivityInput : BaseActivity { public Guid? Id { get; set; } diff --git a/src/Domain/UseCases/Ports/Activity/UpdateActivityTypeInput.cs b/src/Application/Ports/Activity/UpdateActivityTypeInput.cs similarity index 85% rename from src/Domain/UseCases/Ports/Activity/UpdateActivityTypeInput.cs rename to src/Application/Ports/Activity/UpdateActivityTypeInput.cs index bb4003a4..0daa4a02 100644 --- a/src/Domain/UseCases/Ports/Activity/UpdateActivityTypeInput.cs +++ b/src/Application/Ports/Activity/UpdateActivityTypeInput.cs @@ -1,7 +1,6 @@ using System.ComponentModel.DataAnnotations; -using Domain.Ports.Activity; -namespace Domain.UseCases.Ports.Activity +namespace Application.Ports.Activity { public class UpdateActivityTypeInput { diff --git a/src/Domain/UseCases/Ports/Area/BaseAreaContract.cs b/src/Application/Ports/Area/BaseAreaContract.cs similarity index 86% rename from src/Domain/UseCases/Ports/Area/BaseAreaContract.cs rename to src/Application/Ports/Area/BaseAreaContract.cs index 368b0f75..bc05760a 100644 --- a/src/Domain/UseCases/Ports/Area/BaseAreaContract.cs +++ b/src/Application/Ports/Area/BaseAreaContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Area +namespace Application.Ports.Area { public abstract class BaseAreaContract { diff --git a/src/Domain/UseCases/Ports/Area/CreateAreaInput.cs b/src/Application/Ports/Area/CreateAreaInput.cs similarity index 83% rename from src/Domain/UseCases/Ports/Area/CreateAreaInput.cs rename to src/Application/Ports/Area/CreateAreaInput.cs index b49bafb3..9d402fd2 100644 --- a/src/Domain/UseCases/Ports/Area/CreateAreaInput.cs +++ b/src/Application/Ports/Area/CreateAreaInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Area +namespace Application.Ports.Area { public class CreateAreaInput : BaseAreaContract { diff --git a/src/Domain/UseCases/Ports/Area/DetailedReadAreaOutput.cs b/src/Application/Ports/Area/DetailedReadAreaOutput.cs similarity index 74% rename from src/Domain/UseCases/Ports/Area/DetailedReadAreaOutput.cs rename to src/Application/Ports/Area/DetailedReadAreaOutput.cs index 459156c3..7ef4f72f 100644 --- a/src/Domain/UseCases/Ports/Area/DetailedReadAreaOutput.cs +++ b/src/Application/Ports/Area/DetailedReadAreaOutput.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.MainArea; +using Application.Ports.MainArea; -namespace Domain.UseCases.Ports.Area +namespace Application.Ports.Area { public class DetailedReadAreaOutput : BaseAreaContract { diff --git a/src/Domain/UseCases/Ports/Area/ResumedReadAreaOutput.cs b/src/Application/Ports/Area/ResumedReadAreaOutput.cs similarity index 73% rename from src/Domain/UseCases/Ports/Area/ResumedReadAreaOutput.cs rename to src/Application/Ports/Area/ResumedReadAreaOutput.cs index 3715ab84..8137828f 100644 --- a/src/Domain/UseCases/Ports/Area/ResumedReadAreaOutput.cs +++ b/src/Application/Ports/Area/ResumedReadAreaOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Area +namespace Application.Ports.Area { public class ResumedReadAreaOutput : BaseAreaContract { diff --git a/src/Domain/UseCases/Ports/Area/UpdateAreaInput.cs b/src/Application/Ports/Area/UpdateAreaInput.cs similarity index 85% rename from src/Domain/UseCases/Ports/Area/UpdateAreaInput.cs rename to src/Application/Ports/Area/UpdateAreaInput.cs index 2eff62a1..9d6f7a38 100644 --- a/src/Domain/UseCases/Ports/Area/UpdateAreaInput.cs +++ b/src/Application/Ports/Area/UpdateAreaInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Area +namespace Application.Ports.Area { public class UpdateAreaInput : BaseAreaContract { diff --git a/src/Domain/UseCases/Ports/AssistanceType/BaseAssistanceTypeContract.cs b/src/Application/Ports/AssistanceType/BaseAssistanceTypeContract.cs similarity index 82% rename from src/Domain/UseCases/Ports/AssistanceType/BaseAssistanceTypeContract.cs rename to src/Application/Ports/AssistanceType/BaseAssistanceTypeContract.cs index 8556d516..4fc39f1f 100644 --- a/src/Domain/UseCases/Ports/AssistanceType/BaseAssistanceTypeContract.cs +++ b/src/Application/Ports/AssistanceType/BaseAssistanceTypeContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.AssistanceType +namespace Application.Ports.AssistanceType { public abstract class BaseAssistanceTypeContract { diff --git a/src/Domain/UseCases/Ports/AssistanceType/CreateAssistanceTypeInput.cs b/src/Application/Ports/AssistanceType/CreateAssistanceTypeInput.cs similarity index 63% rename from src/Domain/UseCases/Ports/AssistanceType/CreateAssistanceTypeInput.cs rename to src/Application/Ports/AssistanceType/CreateAssistanceTypeInput.cs index df4a28d1..7ed6c4b5 100644 --- a/src/Domain/UseCases/Ports/AssistanceType/CreateAssistanceTypeInput.cs +++ b/src/Application/Ports/AssistanceType/CreateAssistanceTypeInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.AssistanceType +namespace Application.Ports.AssistanceType { public class CreateAssistanceTypeInput : BaseAssistanceTypeContract { diff --git a/src/Domain/UseCases/Ports/AssistanceType/DetailedReadAssistanceTypeOutput.cs b/src/Application/Ports/AssistanceType/DetailedReadAssistanceTypeOutput.cs similarity index 78% rename from src/Domain/UseCases/Ports/AssistanceType/DetailedReadAssistanceTypeOutput.cs rename to src/Application/Ports/AssistanceType/DetailedReadAssistanceTypeOutput.cs index 528c8281..242d72be 100644 --- a/src/Domain/UseCases/Ports/AssistanceType/DetailedReadAssistanceTypeOutput.cs +++ b/src/Application/Ports/AssistanceType/DetailedReadAssistanceTypeOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.AssistanceType +namespace Application.Ports.AssistanceType { public class DetailedReadAssistanceTypeOutput : BaseAssistanceTypeContract { diff --git a/src/Domain/UseCases/Ports/AssistanceType/ResumedReadAssistanceTypeOutput.cs b/src/Application/Ports/AssistanceType/ResumedReadAssistanceTypeOutput.cs similarity index 72% rename from src/Domain/UseCases/Ports/AssistanceType/ResumedReadAssistanceTypeOutput.cs rename to src/Application/Ports/AssistanceType/ResumedReadAssistanceTypeOutput.cs index 8e7d98e1..e056570e 100644 --- a/src/Domain/UseCases/Ports/AssistanceType/ResumedReadAssistanceTypeOutput.cs +++ b/src/Application/Ports/AssistanceType/ResumedReadAssistanceTypeOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.AssistanceType +namespace Application.Ports.AssistanceType { public class ResumedReadAssistanceTypeOutput : BaseAssistanceTypeContract { diff --git a/src/Domain/UseCases/Ports/AssistanceType/UpdateAssistanceTypeInput.cs b/src/Application/Ports/AssistanceType/UpdateAssistanceTypeInput.cs similarity index 71% rename from src/Domain/UseCases/Ports/AssistanceType/UpdateAssistanceTypeInput.cs rename to src/Application/Ports/AssistanceType/UpdateAssistanceTypeInput.cs index de4dcaac..d3e279c3 100644 --- a/src/Domain/UseCases/Ports/AssistanceType/UpdateAssistanceTypeInput.cs +++ b/src/Application/Ports/AssistanceType/UpdateAssistanceTypeInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.AssistanceType +namespace Application.Ports.AssistanceType { public class UpdateAssistanceTypeInput : BaseAssistanceTypeContract { diff --git a/src/Domain/UseCases/Ports/Auth/UserClaimsOutput.cs b/src/Application/Ports/Auth/UserClaimsOutput.cs similarity index 82% rename from src/Domain/UseCases/Ports/Auth/UserClaimsOutput.cs rename to src/Application/Ports/Auth/UserClaimsOutput.cs index 5e8717df..30cf391b 100644 --- a/src/Domain/UseCases/Ports/Auth/UserClaimsOutput.cs +++ b/src/Application/Ports/Auth/UserClaimsOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Auth +namespace Application.Ports.Auth { public class UserClaimsOutput { diff --git a/src/Domain/UseCases/Ports/Auth/UserLoginInput.cs b/src/Application/Ports/Auth/UserLoginInput.cs similarity index 85% rename from src/Domain/UseCases/Ports/Auth/UserLoginInput.cs rename to src/Application/Ports/Auth/UserLoginInput.cs index 44cd1c76..23bf67b9 100644 --- a/src/Domain/UseCases/Ports/Auth/UserLoginInput.cs +++ b/src/Application/Ports/Auth/UserLoginInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Auth +namespace Application.Ports.Auth { public class UserLoginInput { diff --git a/src/Domain/UseCases/Ports/Auth/UserLoginOutput.cs b/src/Application/Ports/Auth/UserLoginOutput.cs similarity index 69% rename from src/Domain/UseCases/Ports/Auth/UserLoginOutput.cs rename to src/Application/Ports/Auth/UserLoginOutput.cs index 876c2c42..766652a6 100644 --- a/src/Domain/UseCases/Ports/Auth/UserLoginOutput.cs +++ b/src/Application/Ports/Auth/UserLoginOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Auth +namespace Application.Ports.Auth { public class UserLoginOutput { diff --git a/src/Domain/UseCases/Ports/Auth/UserResetPasswordInput.cs b/src/Application/Ports/Auth/UserResetPasswordInput.cs similarity index 88% rename from src/Domain/UseCases/Ports/Auth/UserResetPasswordInput.cs rename to src/Application/Ports/Auth/UserResetPasswordInput.cs index 3891d3b4..a2b80c93 100644 --- a/src/Domain/UseCases/Ports/Auth/UserResetPasswordInput.cs +++ b/src/Application/Ports/Auth/UserResetPasswordInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Auth +namespace Application.Ports.Auth { public class UserResetPasswordInput { diff --git a/src/Domain/UseCases/Ports/Campus/BaseCampusContract.cs b/src/Application/Ports/Campus/BaseCampusContract.cs similarity index 81% rename from src/Domain/UseCases/Ports/Campus/BaseCampusContract.cs rename to src/Application/Ports/Campus/BaseCampusContract.cs index 5e2ba666..524a1904 100644 --- a/src/Domain/UseCases/Ports/Campus/BaseCampusContract.cs +++ b/src/Application/Ports/Campus/BaseCampusContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Campus +namespace Application.Ports.Campus { public abstract class BaseCampusContract { diff --git a/src/Domain/UseCases/Ports/Campus/CreateCampusInput.cs b/src/Application/Ports/Campus/CreateCampusInput.cs similarity index 62% rename from src/Domain/UseCases/Ports/Campus/CreateCampusInput.cs rename to src/Application/Ports/Campus/CreateCampusInput.cs index b111eec0..d98480ad 100644 --- a/src/Domain/UseCases/Ports/Campus/CreateCampusInput.cs +++ b/src/Application/Ports/Campus/CreateCampusInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Campus +namespace Application.Ports.Campus { public class CreateCampusInput : BaseCampusContract { diff --git a/src/Domain/UseCases/Ports/Campus/DetailedReadCampusOutput.cs b/src/Application/Ports/Campus/DetailedReadCampusOutput.cs similarity index 79% rename from src/Domain/UseCases/Ports/Campus/DetailedReadCampusOutput.cs rename to src/Application/Ports/Campus/DetailedReadCampusOutput.cs index ccdba065..61884d53 100644 --- a/src/Domain/UseCases/Ports/Campus/DetailedReadCampusOutput.cs +++ b/src/Application/Ports/Campus/DetailedReadCampusOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Campus +namespace Application.Ports.Campus { public class DetailedReadCampusOutput : BaseCampusContract { diff --git a/src/Domain/UseCases/Ports/Campus/ResumedReadCampusOutput.cs b/src/Application/Ports/Campus/ResumedReadCampusOutput.cs similarity index 73% rename from src/Domain/UseCases/Ports/Campus/ResumedReadCampusOutput.cs rename to src/Application/Ports/Campus/ResumedReadCampusOutput.cs index 289d5fd0..d40f496a 100644 --- a/src/Domain/UseCases/Ports/Campus/ResumedReadCampusOutput.cs +++ b/src/Application/Ports/Campus/ResumedReadCampusOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Campus +namespace Application.Ports.Campus { public class ResumedReadCampusOutput : BaseCampusContract { diff --git a/src/Domain/UseCases/Ports/Campus/UpdateCampusInput.cs b/src/Application/Ports/Campus/UpdateCampusInput.cs similarity index 72% rename from src/Domain/UseCases/Ports/Campus/UpdateCampusInput.cs rename to src/Application/Ports/Campus/UpdateCampusInput.cs index a2b7219f..e1c6c9f1 100644 --- a/src/Domain/UseCases/Ports/Campus/UpdateCampusInput.cs +++ b/src/Application/Ports/Campus/UpdateCampusInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Campus +namespace Application.Ports.Campus { public class UpdateCampusInput : BaseCampusContract { diff --git a/src/Domain/UseCases/Ports/Course/BaseCourseContract.cs b/src/Application/Ports/Course/BaseCourseContract.cs similarity index 81% rename from src/Domain/UseCases/Ports/Course/BaseCourseContract.cs rename to src/Application/Ports/Course/BaseCourseContract.cs index f9507f4b..6ad1e371 100644 --- a/src/Domain/UseCases/Ports/Course/BaseCourseContract.cs +++ b/src/Application/Ports/Course/BaseCourseContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Course +namespace Application.Ports.Course { public abstract class BaseCourseContract { diff --git a/src/Domain/UseCases/Ports/Course/CreateCourseInput.cs b/src/Application/Ports/Course/CreateCourseInput.cs similarity index 50% rename from src/Domain/UseCases/Ports/Course/CreateCourseInput.cs rename to src/Application/Ports/Course/CreateCourseInput.cs index e8109ab7..7515809f 100644 --- a/src/Domain/UseCases/Ports/Course/CreateCourseInput.cs +++ b/src/Application/Ports/Course/CreateCourseInput.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Course; +using Application.Ports.Course; -namespace Domain.Ports.Course +namespace Application.Ports.Course { public class CreateCourseInput : BaseCourseContract { diff --git a/src/Domain/UseCases/Ports/Course/DetailedReadCourseOutput.cs b/src/Application/Ports/Course/DetailedReadCourseOutput.cs similarity index 79% rename from src/Domain/UseCases/Ports/Course/DetailedReadCourseOutput.cs rename to src/Application/Ports/Course/DetailedReadCourseOutput.cs index 81a41a3f..cbecbdb9 100644 --- a/src/Domain/UseCases/Ports/Course/DetailedReadCourseOutput.cs +++ b/src/Application/Ports/Course/DetailedReadCourseOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Course +namespace Application.Ports.Course { public class DetailedReadCourseOutput : BaseCourseContract { diff --git a/src/Domain/UseCases/Ports/Course/ResumedReadCourseOutput.cs b/src/Application/Ports/Course/ResumedReadCourseOutput.cs similarity index 73% rename from src/Domain/UseCases/Ports/Course/ResumedReadCourseOutput.cs rename to src/Application/Ports/Course/ResumedReadCourseOutput.cs index 88b65db5..b3cd14b2 100644 --- a/src/Domain/UseCases/Ports/Course/ResumedReadCourseOutput.cs +++ b/src/Application/Ports/Course/ResumedReadCourseOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Course +namespace Application.Ports.Course { public class ResumedReadCourseOutput : BaseCourseContract { diff --git a/src/Domain/UseCases/Ports/Course/UpdateCourseInput.cs b/src/Application/Ports/Course/UpdateCourseInput.cs similarity index 72% rename from src/Domain/UseCases/Ports/Course/UpdateCourseInput.cs rename to src/Application/Ports/Course/UpdateCourseInput.cs index a9957f41..d5d96f0e 100644 --- a/src/Domain/UseCases/Ports/Course/UpdateCourseInput.cs +++ b/src/Application/Ports/Course/UpdateCourseInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Course +namespace Application.Ports.Course { public class UpdateCourseInput : BaseCourseContract { diff --git a/src/Domain/UseCases/Ports/MainArea/BaseMainAreaContract.cs b/src/Application/Ports/MainArea/BaseMainAreaContract.cs similarity index 85% rename from src/Domain/UseCases/Ports/MainArea/BaseMainAreaContract.cs rename to src/Application/Ports/MainArea/BaseMainAreaContract.cs index f17e6dbb..2cf2e4dc 100644 --- a/src/Domain/UseCases/Ports/MainArea/BaseMainAreaContract.cs +++ b/src/Application/Ports/MainArea/BaseMainAreaContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.MainArea +namespace Application.Ports.MainArea { public abstract class BaseMainAreaContract { diff --git a/src/Domain/UseCases/Ports/MainArea/CreateMainAreaInput.cs b/src/Application/Ports/MainArea/CreateMainAreaInput.cs similarity index 60% rename from src/Domain/UseCases/Ports/MainArea/CreateMainAreaInput.cs rename to src/Application/Ports/MainArea/CreateMainAreaInput.cs index 55de730a..77314192 100644 --- a/src/Domain/UseCases/Ports/MainArea/CreateMainAreaInput.cs +++ b/src/Application/Ports/MainArea/CreateMainAreaInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.MainArea +namespace Application.Ports.MainArea { public class CreateMainAreaInput : BaseMainAreaContract { } } \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/MainArea/DetailedMainAreaOutput.cs b/src/Application/Ports/MainArea/DetailedMainAreaOutput.cs similarity index 78% rename from src/Domain/UseCases/Ports/MainArea/DetailedMainAreaOutput.cs rename to src/Application/Ports/MainArea/DetailedMainAreaOutput.cs index 08ceee78..720f7804 100644 --- a/src/Domain/UseCases/Ports/MainArea/DetailedMainAreaOutput.cs +++ b/src/Application/Ports/MainArea/DetailedMainAreaOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.MainArea +namespace Application.Ports.MainArea { public class DetailedMainAreaOutput : BaseMainAreaContract { diff --git a/src/Domain/UseCases/Ports/MainArea/ResumedReadMainAreaOutput.cs b/src/Application/Ports/MainArea/ResumedReadMainAreaOutput.cs similarity index 74% rename from src/Domain/UseCases/Ports/MainArea/ResumedReadMainAreaOutput.cs rename to src/Application/Ports/MainArea/ResumedReadMainAreaOutput.cs index 631e8c4d..e726bac9 100644 --- a/src/Domain/UseCases/Ports/MainArea/ResumedReadMainAreaOutput.cs +++ b/src/Application/Ports/MainArea/ResumedReadMainAreaOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.MainArea +namespace Application.Ports.MainArea { public class ResumedReadMainAreaOutput : BaseMainAreaContract { diff --git a/src/Domain/UseCases/Ports/MainArea/UpdateMainAreaInput.cs b/src/Application/Ports/MainArea/UpdateMainAreaInput.cs similarity index 71% rename from src/Domain/UseCases/Ports/MainArea/UpdateMainAreaInput.cs rename to src/Application/Ports/MainArea/UpdateMainAreaInput.cs index 193d9d56..da1a072c 100644 --- a/src/Domain/UseCases/Ports/MainArea/UpdateMainAreaInput.cs +++ b/src/Application/Ports/MainArea/UpdateMainAreaInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.MainArea +namespace Application.Ports.MainArea { public class UpdateMainAreaInput : BaseMainAreaContract { diff --git a/src/Domain/UseCases/Ports/Notice/BaseNoticeContract.cs b/src/Application/Ports/Notice/BaseNoticeContract.cs similarity index 96% rename from src/Domain/UseCases/Ports/Notice/BaseNoticeContract.cs rename to src/Application/Ports/Notice/BaseNoticeContract.cs index 9f2a3b34..123057bf 100644 --- a/src/Domain/UseCases/Ports/Notice/BaseNoticeContract.cs +++ b/src/Application/Ports/Notice/BaseNoticeContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Notice +namespace Application.Ports.Notice { public abstract class BaseNoticeContract { diff --git a/src/Domain/UseCases/Ports/Notice/CreateNoticeInput.cs b/src/Application/Ports/Notice/CreateNoticeInput.cs similarity index 73% rename from src/Domain/UseCases/Ports/Notice/CreateNoticeInput.cs rename to src/Application/Ports/Notice/CreateNoticeInput.cs index 3a0314c8..f2b166c7 100644 --- a/src/Domain/UseCases/Ports/Notice/CreateNoticeInput.cs +++ b/src/Application/Ports/Notice/CreateNoticeInput.cs @@ -1,7 +1,7 @@ -using Domain.UseCases.Ports.Activity; +using Application.Ports.Activity; using Microsoft.AspNetCore.Http; -namespace Domain.UseCases.Ports.Notice +namespace Application.Ports.Notice { public class CreateNoticeInput : BaseNoticeContract { diff --git a/src/Domain/UseCases/Ports/Notice/DetailedReadNoticeOutput.cs b/src/Application/Ports/Notice/DetailedReadNoticeOutput.cs similarity index 83% rename from src/Domain/UseCases/Ports/Notice/DetailedReadNoticeOutput.cs rename to src/Application/Ports/Notice/DetailedReadNoticeOutput.cs index 7171f2c7..572b3ad7 100644 --- a/src/Domain/UseCases/Ports/Notice/DetailedReadNoticeOutput.cs +++ b/src/Application/Ports/Notice/DetailedReadNoticeOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Notice +namespace Application.Ports.Notice { public class DetailedReadNoticeOutput : BaseNoticeContract { diff --git a/src/Domain/UseCases/Ports/Notice/ResumedReadNoticeOutput.cs b/src/Application/Ports/Notice/ResumedReadNoticeOutput.cs similarity index 79% rename from src/Domain/UseCases/Ports/Notice/ResumedReadNoticeOutput.cs rename to src/Application/Ports/Notice/ResumedReadNoticeOutput.cs index 6bbebf26..9b9c42f2 100644 --- a/src/Domain/UseCases/Ports/Notice/ResumedReadNoticeOutput.cs +++ b/src/Application/Ports/Notice/ResumedReadNoticeOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Notice +namespace Application.Ports.Notice { public class ResumedReadNoticeOutput : BaseNoticeContract { diff --git a/src/Domain/UseCases/Ports/Notice/UpdateNoticeInput.cs b/src/Application/Ports/Notice/UpdateNoticeInput.cs similarity index 76% rename from src/Domain/UseCases/Ports/Notice/UpdateNoticeInput.cs rename to src/Application/Ports/Notice/UpdateNoticeInput.cs index 23204c8a..32fc9b42 100644 --- a/src/Domain/UseCases/Ports/Notice/UpdateNoticeInput.cs +++ b/src/Application/Ports/Notice/UpdateNoticeInput.cs @@ -1,7 +1,7 @@ -using Domain.UseCases.Ports.Activity; +using Application.Ports.Activity; using Microsoft.AspNetCore.Http; -namespace Domain.UseCases.Ports.Notice +namespace Application.Ports.Notice { public class UpdateNoticeInput : BaseNoticeContract { diff --git a/src/Domain/UseCases/Ports/Professor/BaseProfessorContract.cs b/src/Application/Ports/Professor/BaseProfessorContract.cs similarity index 85% rename from src/Domain/UseCases/Ports/Professor/BaseProfessorContract.cs rename to src/Application/Ports/Professor/BaseProfessorContract.cs index 9bced2f7..0b75309f 100644 --- a/src/Domain/UseCases/Ports/Professor/BaseProfessorContract.cs +++ b/src/Application/Ports/Professor/BaseProfessorContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Professor +namespace Application.Ports.Professor { public abstract class BaseProfessorContract { diff --git a/src/Domain/UseCases/Ports/Professor/CreateProfessorInput.cs b/src/Application/Ports/Professor/CreateProfessorInput.cs similarity index 91% rename from src/Domain/UseCases/Ports/Professor/CreateProfessorInput.cs rename to src/Application/Ports/Professor/CreateProfessorInput.cs index 8cb5043b..2ac386b5 100644 --- a/src/Domain/UseCases/Ports/Professor/CreateProfessorInput.cs +++ b/src/Application/Ports/Professor/CreateProfessorInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Professor +namespace Application.Ports.Professor { public class CreateProfessorInput : BaseProfessorContract { diff --git a/src/Domain/UseCases/Ports/Professor/DetailedReadStudentOutput.cs b/src/Application/Ports/Professor/DetailedReadStudentOutput.cs similarity index 74% rename from src/Domain/UseCases/Ports/Professor/DetailedReadStudentOutput.cs rename to src/Application/Ports/Professor/DetailedReadStudentOutput.cs index 90aecb09..20937ae6 100644 --- a/src/Domain/UseCases/Ports/Professor/DetailedReadStudentOutput.cs +++ b/src/Application/Ports/Professor/DetailedReadStudentOutput.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.User; +using Application.Ports.User; -namespace Domain.UseCases.Ports.Professor +namespace Application.Ports.Professor { public class DetailedReadProfessorOutput : BaseProfessorContract { diff --git a/src/Domain/UseCases/Ports/Professor/ResumedReadStudentOutput.cs b/src/Application/Ports/Professor/ResumedReadStudentOutput.cs similarity index 82% rename from src/Domain/UseCases/Ports/Professor/ResumedReadStudentOutput.cs rename to src/Application/Ports/Professor/ResumedReadStudentOutput.cs index 53508870..0348ab43 100644 --- a/src/Domain/UseCases/Ports/Professor/ResumedReadStudentOutput.cs +++ b/src/Application/Ports/Professor/ResumedReadStudentOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Professor +namespace Application.Ports.Professor { public class ResumedReadProfessorOutput : BaseProfessorContract { diff --git a/src/Domain/UseCases/Ports/Professor/UpdateStudentInput.cs b/src/Application/Ports/Professor/UpdateStudentInput.cs similarity index 73% rename from src/Domain/UseCases/Ports/Professor/UpdateStudentInput.cs rename to src/Application/Ports/Professor/UpdateStudentInput.cs index 8f185c03..b09ec418 100644 --- a/src/Domain/UseCases/Ports/Professor/UpdateStudentInput.cs +++ b/src/Application/Ports/Professor/UpdateStudentInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Professor +namespace Application.Ports.Professor { public class UpdateProfessorInput : BaseProfessorContract { diff --git a/src/Domain/UseCases/Ports/ProgramType/BaseProgramTypeContract.cs b/src/Application/Ports/ProgramType/BaseProgramTypeContract.cs similarity index 83% rename from src/Domain/UseCases/Ports/ProgramType/BaseProgramTypeContract.cs rename to src/Application/Ports/ProgramType/BaseProgramTypeContract.cs index 8e9d3ad4..27c9aa28 100644 --- a/src/Domain/UseCases/Ports/ProgramType/BaseProgramTypeContract.cs +++ b/src/Application/Ports/ProgramType/BaseProgramTypeContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.ProgramType +namespace Application.Ports.ProgramType { public abstract class BaseProgramTypeContract { diff --git a/src/Domain/UseCases/Ports/ProgramType/CreateProgramTypeInput.cs b/src/Application/Ports/ProgramType/CreateProgramTypeInput.cs similarity index 63% rename from src/Domain/UseCases/Ports/ProgramType/CreateProgramTypeInput.cs rename to src/Application/Ports/ProgramType/CreateProgramTypeInput.cs index 5311d40e..88dc092d 100644 --- a/src/Domain/UseCases/Ports/ProgramType/CreateProgramTypeInput.cs +++ b/src/Application/Ports/ProgramType/CreateProgramTypeInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.ProgramType +namespace Application.Ports.ProgramType { public class CreateProgramTypeInput : BaseProgramTypeContract { diff --git a/src/Domain/UseCases/Ports/ProgramType/DetailedReadProgramTypeOutput.cs b/src/Application/Ports/ProgramType/DetailedReadProgramTypeOutput.cs similarity index 78% rename from src/Domain/UseCases/Ports/ProgramType/DetailedReadProgramTypeOutput.cs rename to src/Application/Ports/ProgramType/DetailedReadProgramTypeOutput.cs index 82c2f546..ed73361a 100644 --- a/src/Domain/UseCases/Ports/ProgramType/DetailedReadProgramTypeOutput.cs +++ b/src/Application/Ports/ProgramType/DetailedReadProgramTypeOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.ProgramType +namespace Application.Ports.ProgramType { public class DetailedReadProgramTypeOutput : BaseProgramTypeContract { diff --git a/src/Domain/UseCases/Ports/ProgramType/ResumedReadProgramTypeOutput.cs b/src/Application/Ports/ProgramType/ResumedReadProgramTypeOutput.cs similarity index 72% rename from src/Domain/UseCases/Ports/ProgramType/ResumedReadProgramTypeOutput.cs rename to src/Application/Ports/ProgramType/ResumedReadProgramTypeOutput.cs index 83915d7f..dc877ce6 100644 --- a/src/Domain/UseCases/Ports/ProgramType/ResumedReadProgramTypeOutput.cs +++ b/src/Application/Ports/ProgramType/ResumedReadProgramTypeOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.ProgramType +namespace Application.Ports.ProgramType { public class ResumedReadProgramTypeOutput : BaseProgramTypeContract { diff --git a/src/Domain/UseCases/Ports/ProgramType/UpdateProgramTypeInput.cs b/src/Application/Ports/ProgramType/UpdateProgramTypeInput.cs similarity index 71% rename from src/Domain/UseCases/Ports/ProgramType/UpdateProgramTypeInput.cs rename to src/Application/Ports/ProgramType/UpdateProgramTypeInput.cs index 0f9d81ba..5c7f7f64 100644 --- a/src/Domain/UseCases/Ports/ProgramType/UpdateProgramTypeInput.cs +++ b/src/Application/Ports/ProgramType/UpdateProgramTypeInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.ProgramType +namespace Application.Ports.ProgramType { public class UpdateProgramTypeInput : BaseProgramTypeContract { diff --git a/src/Domain/UseCases/Ports/Project/BaseProjectContract.cs b/src/Application/Ports/Project/BaseProjectContract.cs similarity index 97% rename from src/Domain/UseCases/Ports/Project/BaseProjectContract.cs rename to src/Application/Ports/Project/BaseProjectContract.cs index 9789550c..a8185a72 100644 --- a/src/Domain/UseCases/Ports/Project/BaseProjectContract.cs +++ b/src/Application/Ports/Project/BaseProjectContract.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Project +namespace Application.Ports.Project { public abstract class BaseProjectContract { diff --git a/src/Domain/UseCases/Ports/Project/DetailedReadProjectOutput.cs b/src/Application/Ports/Project/DetailedReadProjectOutput.cs similarity index 80% rename from src/Domain/UseCases/Ports/Project/DetailedReadProjectOutput.cs rename to src/Application/Ports/Project/DetailedReadProjectOutput.cs index a35626ba..c4e399bb 100644 --- a/src/Domain/UseCases/Ports/Project/DetailedReadProjectOutput.cs +++ b/src/Application/Ports/Project/DetailedReadProjectOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Project +namespace Application.Ports.Project { public class DetailedReadProjectOutput : BaseProjectContract { diff --git a/src/Domain/UseCases/Ports/Project/OpenProjectInput.cs b/src/Application/Ports/Project/OpenProjectInput.cs similarity index 93% rename from src/Domain/UseCases/Ports/Project/OpenProjectInput.cs rename to src/Application/Ports/Project/OpenProjectInput.cs index 05a1ef27..2faa3f23 100644 --- a/src/Domain/UseCases/Ports/Project/OpenProjectInput.cs +++ b/src/Application/Ports/Project/OpenProjectInput.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; -using Domain.UseCases.Ports.ProjectActivity; +using Application.Ports.ProjectActivity; -namespace Domain.UseCases.Ports.Project +namespace Application.Ports.Project { public class OpenProjectInput { diff --git a/src/Domain/UseCases/Ports/Project/ProjectReportInput.cs b/src/Application/Ports/Project/ProjectReportInput.cs similarity index 56% rename from src/Domain/UseCases/Ports/Project/ProjectReportInput.cs rename to src/Application/Ports/Project/ProjectReportInput.cs index 00f7be4d..a3b63a7d 100644 --- a/src/Domain/UseCases/Ports/Project/ProjectReportInput.cs +++ b/src/Application/Ports/Project/ProjectReportInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Project +namespace Application.Ports.Project { public class ProjectReportInput { diff --git a/src/Domain/UseCases/Ports/Project/ProjectReportOutput.cs b/src/Application/Ports/Project/ProjectReportOutput.cs similarity index 56% rename from src/Domain/UseCases/Ports/Project/ProjectReportOutput.cs rename to src/Application/Ports/Project/ProjectReportOutput.cs index c218b3e2..85311707 100644 --- a/src/Domain/UseCases/Ports/Project/ProjectReportOutput.cs +++ b/src/Application/Ports/Project/ProjectReportOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Project +namespace Application.Ports.Project { public class ProjectReportOutput { diff --git a/src/Domain/UseCases/Ports/Project/ResumedReadProjectOutput.cs b/src/Application/Ports/Project/ResumedReadProjectOutput.cs similarity index 74% rename from src/Domain/UseCases/Ports/Project/ResumedReadProjectOutput.cs rename to src/Application/Ports/Project/ResumedReadProjectOutput.cs index 368b59eb..23ae0782 100644 --- a/src/Domain/UseCases/Ports/Project/ResumedReadProjectOutput.cs +++ b/src/Application/Ports/Project/ResumedReadProjectOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Project +namespace Application.Ports.Project { public class ResumedReadProjectOutput : BaseProjectContract { diff --git a/src/Domain/UseCases/Ports/Project/UpdateProjectInput.cs b/src/Application/Ports/Project/UpdateProjectInput.cs similarity index 93% rename from src/Domain/UseCases/Ports/Project/UpdateProjectInput.cs rename to src/Application/Ports/Project/UpdateProjectInput.cs index 964741a6..57237316 100644 --- a/src/Domain/UseCases/Ports/Project/UpdateProjectInput.cs +++ b/src/Application/Ports/Project/UpdateProjectInput.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; -using Domain.UseCases.Ports.ProjectActivity; +using Application.Ports.ProjectActivity; -namespace Domain.UseCases.Ports.Project +namespace Application.Ports.Project { public class UpdateProjectInput { diff --git a/src/Domain/UseCases/Ports/ProjectActivity/BaseProjectActivityContract.cs b/src/Application/Ports/ProjectActivity/BaseProjectActivityContract.cs similarity index 84% rename from src/Domain/UseCases/Ports/ProjectActivity/BaseProjectActivityContract.cs rename to src/Application/Ports/ProjectActivity/BaseProjectActivityContract.cs index 754d1023..8927e354 100644 --- a/src/Domain/UseCases/Ports/ProjectActivity/BaseProjectActivityContract.cs +++ b/src/Application/Ports/ProjectActivity/BaseProjectActivityContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.ProjectActivity +namespace Application.Ports.ProjectActivity { public abstract class BaseProjectActivityContract { diff --git a/src/Domain/UseCases/Ports/ProjectActivity/CreateProjectActivityInput.cs b/src/Application/Ports/ProjectActivity/CreateProjectActivityInput.cs similarity index 61% rename from src/Domain/UseCases/Ports/ProjectActivity/CreateProjectActivityInput.cs rename to src/Application/Ports/ProjectActivity/CreateProjectActivityInput.cs index 29709c24..e264f907 100644 --- a/src/Domain/UseCases/Ports/ProjectActivity/CreateProjectActivityInput.cs +++ b/src/Application/Ports/ProjectActivity/CreateProjectActivityInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.ProjectActivity +namespace Application.Ports.ProjectActivity { public class CreateProjectActivityInput : BaseProjectActivityContract { } } \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/ProjectActivity/DetailedReadProjectActivityOutput.cs b/src/Application/Ports/ProjectActivity/DetailedReadProjectActivityOutput.cs similarity index 84% rename from src/Domain/UseCases/Ports/ProjectActivity/DetailedReadProjectActivityOutput.cs rename to src/Application/Ports/ProjectActivity/DetailedReadProjectActivityOutput.cs index 33b99667..6778d926 100644 --- a/src/Domain/UseCases/Ports/ProjectActivity/DetailedReadProjectActivityOutput.cs +++ b/src/Application/Ports/ProjectActivity/DetailedReadProjectActivityOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.ProjectActivity +namespace Application.Ports.ProjectActivity { public class DetailedReadProjectActivityOutput : BaseProjectActivityContract { diff --git a/src/Domain/UseCases/Ports/ProjectActivity/EvaluateProjectActivityInput.cs b/src/Application/Ports/ProjectActivity/EvaluateProjectActivityInput.cs similarity index 85% rename from src/Domain/UseCases/Ports/ProjectActivity/EvaluateProjectActivityInput.cs rename to src/Application/Ports/ProjectActivity/EvaluateProjectActivityInput.cs index ed49bab9..ec711b0d 100644 --- a/src/Domain/UseCases/Ports/ProjectActivity/EvaluateProjectActivityInput.cs +++ b/src/Application/Ports/ProjectActivity/EvaluateProjectActivityInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.ProjectActivity +namespace Application.Ports.ProjectActivity { public class EvaluateProjectActivityInput : BaseProjectActivityContract { diff --git a/src/Domain/UseCases/Ports/ProjectActivity/ResumedReadProjectActivityOutput.cs b/src/Application/Ports/ProjectActivity/ResumedReadProjectActivityOutput.cs similarity index 81% rename from src/Domain/UseCases/Ports/ProjectActivity/ResumedReadProjectActivityOutput.cs rename to src/Application/Ports/ProjectActivity/ResumedReadProjectActivityOutput.cs index 8cab9afa..6bf17d0d 100644 --- a/src/Domain/UseCases/Ports/ProjectActivity/ResumedReadProjectActivityOutput.cs +++ b/src/Application/Ports/ProjectActivity/ResumedReadProjectActivityOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.ProjectActivity +namespace Application.Ports.ProjectActivity { public class ResumedReadProjectActivityOutput : BaseProjectActivityContract { diff --git a/src/Domain/UseCases/Ports/ProjectActivity/UpdateProjectActivityInput.cs b/src/Application/Ports/ProjectActivity/UpdateProjectActivityInput.cs similarity index 80% rename from src/Domain/UseCases/Ports/ProjectActivity/UpdateProjectActivityInput.cs rename to src/Application/Ports/ProjectActivity/UpdateProjectActivityInput.cs index 26b1922c..850da312 100644 --- a/src/Domain/UseCases/Ports/ProjectActivity/UpdateProjectActivityInput.cs +++ b/src/Application/Ports/ProjectActivity/UpdateProjectActivityInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.ProjectActivity +namespace Application.Ports.ProjectActivity { public class UpdateProjectActivityInput : BaseProjectActivityContract { diff --git a/src/Domain/UseCases/Ports/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs b/src/Application/Ports/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs similarity index 96% rename from src/Domain/UseCases/Ports/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs rename to src/Application/Ports/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs index d670a179..d0542e9c 100644 --- a/src/Domain/UseCases/Ports/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs +++ b/src/Application/Ports/ProjectEvaluation/DetailedReadProjectEvaluationOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.ProjectEvaluation +namespace Application.Ports.ProjectEvaluation { public class DetailedReadProjectEvaluationOutput { diff --git a/src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateAppealProjectInput.cs b/src/Application/Ports/ProjectEvaluation/EvaluateAppealProjectInput.cs similarity index 86% rename from src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateAppealProjectInput.cs rename to src/Application/Ports/ProjectEvaluation/EvaluateAppealProjectInput.cs index 64d0692d..eecca21e 100644 --- a/src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateAppealProjectInput.cs +++ b/src/Application/Ports/ProjectEvaluation/EvaluateAppealProjectInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.ProjectEvaluation +namespace Application.Ports.ProjectEvaluation { public class EvaluateAppealProjectInput { diff --git a/src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateSubmissionProjectInput.cs b/src/Application/Ports/ProjectEvaluation/EvaluateSubmissionProjectInput.cs similarity index 92% rename from src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateSubmissionProjectInput.cs rename to src/Application/Ports/ProjectEvaluation/EvaluateSubmissionProjectInput.cs index afe2eda7..601048d4 100644 --- a/src/Domain/UseCases/Ports/ProjectEvaluation/EvaluateSubmissionProjectInput.cs +++ b/src/Application/Ports/ProjectEvaluation/EvaluateSubmissionProjectInput.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; -using Domain.UseCases.Ports.ProjectActivity; +using Application.Ports.ProjectActivity; -namespace Domain.UseCases.Ports.ProjectEvaluation +namespace Application.Ports.ProjectEvaluation { public class EvaluateSubmissionProjectInput { diff --git a/src/Domain/UseCases/Ports/ProjectReport/BaseProjectReportContract.cs b/src/Application/Ports/ProjectReport/BaseProjectReportContract.cs similarity index 84% rename from src/Domain/UseCases/Ports/ProjectReport/BaseProjectReportContract.cs rename to src/Application/Ports/ProjectReport/BaseProjectReportContract.cs index c04a2fbd..1db75a3b 100644 --- a/src/Domain/UseCases/Ports/ProjectReport/BaseProjectReportContract.cs +++ b/src/Application/Ports/ProjectReport/BaseProjectReportContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.ProjectReport +namespace Application.Ports.ProjectReport { public abstract class BaseProjectReportContract { diff --git a/src/Domain/UseCases/Ports/ProjectReport/CreateProjectReportInput.cs b/src/Application/Ports/ProjectReport/CreateProjectReportInput.cs similarity index 74% rename from src/Domain/UseCases/Ports/ProjectReport/CreateProjectReportInput.cs rename to src/Application/Ports/ProjectReport/CreateProjectReportInput.cs index dee1cc6b..dba802bc 100644 --- a/src/Domain/UseCases/Ports/ProjectReport/CreateProjectReportInput.cs +++ b/src/Application/Ports/ProjectReport/CreateProjectReportInput.cs @@ -1,8 +1,8 @@ using System.ComponentModel.DataAnnotations; -using Domain.UseCases.Ports.ProjectReport; +using Application.Ports.ProjectReport; using Microsoft.AspNetCore.Http; -namespace Domain.Ports.ProjectReport +namespace Application.Ports.ProjectReport { public class CreateProjectReportInput : BaseProjectReportContract { diff --git a/src/Domain/UseCases/Ports/ProjectReport/DetailedReadProjectReportOutput.cs b/src/Application/Ports/ProjectReport/DetailedReadProjectReportOutput.cs similarity index 86% rename from src/Domain/UseCases/Ports/ProjectReport/DetailedReadProjectReportOutput.cs rename to src/Application/Ports/ProjectReport/DetailedReadProjectReportOutput.cs index a44778fa..3ea6d873 100644 --- a/src/Domain/UseCases/Ports/ProjectReport/DetailedReadProjectReportOutput.cs +++ b/src/Application/Ports/ProjectReport/DetailedReadProjectReportOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.ProjectReport +namespace Application.Ports.ProjectReport { public class DetailedReadProjectReportOutput : BaseProjectReportContract { diff --git a/src/Domain/UseCases/Ports/ProjectReport/UpdateProjectReportInput.cs b/src/Application/Ports/ProjectReport/UpdateProjectReportInput.cs similarity index 81% rename from src/Domain/UseCases/Ports/ProjectReport/UpdateProjectReportInput.cs rename to src/Application/Ports/ProjectReport/UpdateProjectReportInput.cs index 9745fdcd..3dd3f356 100644 --- a/src/Domain/UseCases/Ports/ProjectReport/UpdateProjectReportInput.cs +++ b/src/Application/Ports/ProjectReport/UpdateProjectReportInput.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Http; -namespace Domain.UseCases.Ports.ProjectReport +namespace Application.Ports.ProjectReport { public class UpdateProjectReportInput { diff --git a/src/Domain/UseCases/Ports/Student/BaseStudentContract.cs b/src/Application/Ports/Student/BaseStudentContract.cs similarity index 97% rename from src/Domain/UseCases/Ports/Student/BaseStudentContract.cs rename to src/Application/Ports/Student/BaseStudentContract.cs index 15e23c08..d0a21c3e 100644 --- a/src/Domain/UseCases/Ports/Student/BaseStudentContract.cs +++ b/src/Application/Ports/Student/BaseStudentContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Student +namespace Application.Ports.Student { public abstract class BaseStudentContract { diff --git a/src/Domain/UseCases/Ports/Student/CreateStudentInput.cs b/src/Application/Ports/Student/CreateStudentInput.cs similarity index 91% rename from src/Domain/UseCases/Ports/Student/CreateStudentInput.cs rename to src/Application/Ports/Student/CreateStudentInput.cs index 9d8067f3..4dfd32f8 100644 --- a/src/Domain/UseCases/Ports/Student/CreateStudentInput.cs +++ b/src/Application/Ports/Student/CreateStudentInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.Student +namespace Application.Ports.Student { public class CreateStudentInput : BaseStudentContract { diff --git a/src/Domain/UseCases/Ports/Student/DetailedReadStudentOutput.cs b/src/Application/Ports/Student/DetailedReadStudentOutput.cs similarity index 70% rename from src/Domain/UseCases/Ports/Student/DetailedReadStudentOutput.cs rename to src/Application/Ports/Student/DetailedReadStudentOutput.cs index 12fb83f0..12f5913b 100644 --- a/src/Domain/UseCases/Ports/Student/DetailedReadStudentOutput.cs +++ b/src/Application/Ports/Student/DetailedReadStudentOutput.cs @@ -1,8 +1,8 @@ -using Domain.UseCases.Ports.Campus; -using Domain.UseCases.Ports.Course; -using Domain.UseCases.Ports.User; +using Application.Ports.Campus; +using Application.Ports.Course; +using Application.Ports.User; -namespace Domain.UseCases.Ports.Student +namespace Application.Ports.Student { public class DetailedReadStudentOutput : BaseStudentContract { diff --git a/src/Domain/UseCases/Ports/Student/ResumedReadStudentOutput.cs b/src/Application/Ports/Student/ResumedReadStudentOutput.cs similarity index 83% rename from src/Domain/UseCases/Ports/Student/ResumedReadStudentOutput.cs rename to src/Application/Ports/Student/ResumedReadStudentOutput.cs index d460d3f4..05c408b8 100644 --- a/src/Domain/UseCases/Ports/Student/ResumedReadStudentOutput.cs +++ b/src/Application/Ports/Student/ResumedReadStudentOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Student +namespace Application.Ports.Student { public class ResumedReadStudentOutput : BaseStudentContract { diff --git a/src/Domain/UseCases/Ports/Student/UpdateStudentInput.cs b/src/Application/Ports/Student/UpdateStudentInput.cs similarity index 73% rename from src/Domain/UseCases/Ports/Student/UpdateStudentInput.cs rename to src/Application/Ports/Student/UpdateStudentInput.cs index bec8b6ca..6234b0ef 100644 --- a/src/Domain/UseCases/Ports/Student/UpdateStudentInput.cs +++ b/src/Application/Ports/Student/UpdateStudentInput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.Student +namespace Application.Ports.Student { public class UpdateStudentInput : BaseStudentContract { diff --git a/src/Domain/UseCases/Ports/StudentDocuments/BaseStudentDocumentsOutput.cs b/src/Application/Ports/StudentDocuments/BaseStudentDocumentsOutput.cs similarity index 97% rename from src/Domain/UseCases/Ports/StudentDocuments/BaseStudentDocumentsOutput.cs rename to src/Application/Ports/StudentDocuments/BaseStudentDocumentsOutput.cs index 6eab71b6..eb7b65e9 100644 --- a/src/Domain/UseCases/Ports/StudentDocuments/BaseStudentDocumentsOutput.cs +++ b/src/Application/Ports/StudentDocuments/BaseStudentDocumentsOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.StudentDocuments +namespace Application.Ports.StudentDocuments { public abstract class BaseStudentDocumentsOutput { diff --git a/src/Domain/UseCases/Ports/StudentDocuments/CreateStudentDocumentsInput.cs b/src/Application/Ports/StudentDocuments/CreateStudentDocumentsInput.cs similarity index 97% rename from src/Domain/UseCases/Ports/StudentDocuments/CreateStudentDocumentsInput.cs rename to src/Application/Ports/StudentDocuments/CreateStudentDocumentsInput.cs index 5792ab57..be63978b 100644 --- a/src/Domain/UseCases/Ports/StudentDocuments/CreateStudentDocumentsInput.cs +++ b/src/Application/Ports/StudentDocuments/CreateStudentDocumentsInput.cs @@ -1,7 +1,7 @@ using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Http; -namespace Domain.UseCases.Ports.StudentDocuments +namespace Application.Ports.StudentDocuments { public class CreateStudentDocumentsInput { diff --git a/src/Domain/UseCases/Ports/StudentDocuments/DetailedReadStudentDocumentsOutput.cs b/src/Application/Ports/StudentDocuments/DetailedReadStudentDocumentsOutput.cs similarity index 73% rename from src/Domain/UseCases/Ports/StudentDocuments/DetailedReadStudentDocumentsOutput.cs rename to src/Application/Ports/StudentDocuments/DetailedReadStudentDocumentsOutput.cs index 96f18d3f..bbbc630e 100644 --- a/src/Domain/UseCases/Ports/StudentDocuments/DetailedReadStudentDocumentsOutput.cs +++ b/src/Application/Ports/StudentDocuments/DetailedReadStudentDocumentsOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.StudentDocuments +namespace Application.Ports.StudentDocuments { public class DetailedReadStudentDocumentsOutput : BaseStudentDocumentsOutput { diff --git a/src/Domain/UseCases/Ports/StudentDocuments/ResumedReadStudentDocumentsOutput.cs b/src/Application/Ports/StudentDocuments/ResumedReadStudentDocumentsOutput.cs similarity index 62% rename from src/Domain/UseCases/Ports/StudentDocuments/ResumedReadStudentDocumentsOutput.cs rename to src/Application/Ports/StudentDocuments/ResumedReadStudentDocumentsOutput.cs index 4637205a..b36f2897 100644 --- a/src/Domain/UseCases/Ports/StudentDocuments/ResumedReadStudentDocumentsOutput.cs +++ b/src/Application/Ports/StudentDocuments/ResumedReadStudentDocumentsOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.StudentDocuments +namespace Application.Ports.StudentDocuments { public class ResumedReadStudentDocumentsOutput : BaseStudentDocumentsOutput { } } \ No newline at end of file diff --git a/src/Domain/UseCases/Ports/StudentDocuments/UpdateStudentDocumentsInput.cs b/src/Application/Ports/StudentDocuments/UpdateStudentDocumentsInput.cs similarity index 96% rename from src/Domain/UseCases/Ports/StudentDocuments/UpdateStudentDocumentsInput.cs rename to src/Application/Ports/StudentDocuments/UpdateStudentDocumentsInput.cs index dc32e4e2..0978b9cf 100644 --- a/src/Domain/UseCases/Ports/StudentDocuments/UpdateStudentDocumentsInput.cs +++ b/src/Application/Ports/StudentDocuments/UpdateStudentDocumentsInput.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Http; -namespace Domain.UseCases.Ports.StudentDocuments +namespace Application.Ports.StudentDocuments { public class UpdateStudentDocumentsInput { diff --git a/src/Domain/UseCases/Ports/SubArea/BaseSubAreaContract.cs b/src/Application/Ports/SubArea/BaseSubAreaContract.cs similarity index 85% rename from src/Domain/UseCases/Ports/SubArea/BaseSubAreaContract.cs rename to src/Application/Ports/SubArea/BaseSubAreaContract.cs index 52e7c7d9..39aa9bba 100644 --- a/src/Domain/UseCases/Ports/SubArea/BaseSubAreaContract.cs +++ b/src/Application/Ports/SubArea/BaseSubAreaContract.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.SubArea +namespace Application.Ports.SubArea { public abstract class BaseSubAreaContract { diff --git a/src/Domain/UseCases/Ports/SubArea/CreateSubAreaInput.cs b/src/Application/Ports/SubArea/CreateSubAreaInput.cs similarity index 82% rename from src/Domain/UseCases/Ports/SubArea/CreateSubAreaInput.cs rename to src/Application/Ports/SubArea/CreateSubAreaInput.cs index bec2e3a6..f6ed8681 100644 --- a/src/Domain/UseCases/Ports/SubArea/CreateSubAreaInput.cs +++ b/src/Application/Ports/SubArea/CreateSubAreaInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.SubArea +namespace Application.Ports.SubArea { public class CreateSubAreaInput : BaseSubAreaContract { diff --git a/src/Domain/UseCases/Ports/SubArea/DetailedReadSubAreaOutput.cs b/src/Application/Ports/SubArea/DetailedReadSubAreaOutput.cs similarity index 75% rename from src/Domain/UseCases/Ports/SubArea/DetailedReadSubAreaOutput.cs rename to src/Application/Ports/SubArea/DetailedReadSubAreaOutput.cs index 9e98ade0..56fb3f22 100644 --- a/src/Domain/UseCases/Ports/SubArea/DetailedReadSubAreaOutput.cs +++ b/src/Application/Ports/SubArea/DetailedReadSubAreaOutput.cs @@ -1,6 +1,6 @@ -using Domain.UseCases.Ports.Area; +using Application.Ports.Area; -namespace Domain.UseCases.Ports.SubArea +namespace Application.Ports.SubArea { public class DetailedReadSubAreaOutput : BaseSubAreaContract { diff --git a/src/Domain/UseCases/Ports/SubArea/ResumedReadSubAreaOutput.cs b/src/Application/Ports/SubArea/ResumedReadSubAreaOutput.cs similarity index 73% rename from src/Domain/UseCases/Ports/SubArea/ResumedReadSubAreaOutput.cs rename to src/Application/Ports/SubArea/ResumedReadSubAreaOutput.cs index ad7a4a52..25151306 100644 --- a/src/Domain/UseCases/Ports/SubArea/ResumedReadSubAreaOutput.cs +++ b/src/Application/Ports/SubArea/ResumedReadSubAreaOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.SubArea +namespace Application.Ports.SubArea { public class ResumedReadSubAreaOutput : BaseSubAreaContract { diff --git a/src/Domain/UseCases/Ports/SubArea/UpdateSubAreaInput.cs b/src/Application/Ports/SubArea/UpdateSubAreaInput.cs similarity index 84% rename from src/Domain/UseCases/Ports/SubArea/UpdateSubAreaInput.cs rename to src/Application/Ports/SubArea/UpdateSubAreaInput.cs index 28c0d15c..1fdadbac 100644 --- a/src/Domain/UseCases/Ports/SubArea/UpdateSubAreaInput.cs +++ b/src/Application/Ports/SubArea/UpdateSubAreaInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.SubArea +namespace Application.Ports.SubArea { public class UpdateSubAreaInput : BaseSubAreaContract { diff --git a/src/Domain/UseCases/Ports/User/UserReadOutput.cs b/src/Application/Ports/User/UserReadOutput.cs similarity index 88% rename from src/Domain/UseCases/Ports/User/UserReadOutput.cs rename to src/Application/Ports/User/UserReadOutput.cs index 1ff55913..2c6099e5 100644 --- a/src/Domain/UseCases/Ports/User/UserReadOutput.cs +++ b/src/Application/Ports/User/UserReadOutput.cs @@ -1,4 +1,4 @@ -namespace Domain.UseCases.Ports.User +namespace Application.Ports.User { public class UserReadOutput { diff --git a/src/Domain/UseCases/Ports/User/UserUpdateInput.cs b/src/Application/Ports/User/UserUpdateInput.cs similarity index 85% rename from src/Domain/UseCases/Ports/User/UserUpdateInput.cs rename to src/Application/Ports/User/UserUpdateInput.cs index c0675543..1b2d77d3 100644 --- a/src/Domain/UseCases/Ports/User/UserUpdateInput.cs +++ b/src/Application/Ports/User/UserUpdateInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -namespace Domain.UseCases.Ports.User +namespace Application.Ports.User { public class UserUpdateInput { diff --git a/src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs b/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs similarity index 79% rename from src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs rename to src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs index c6936a44..74dd9b39 100644 --- a/src/Domain/UseCases/Interactors/ActivityType/GetActivitiesByNoticeId.cs +++ b/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs @@ -1,10 +1,9 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Ports.Activity; -using Domain.UseCases.Interfaces.ActivityType; -using Domain.UseCases.Ports.Activity; +using Application.Ports.Activity; +using Application.Interfaces.UseCases.ActivityType; -namespace Domain.UseCases.Interactors.ActivityType +namespace Application.UseCases.ActivityType { public class GetActivitiesByNoticeId : IGetActivitiesByNoticeId { @@ -19,20 +18,18 @@ public GetActivitiesByNoticeId(IActivityTypeRepository activityTypeRepository, I async Task> IGetActivitiesByNoticeId.ExecuteAsync(Guid? id) { // Obtém os tipos de atividades do edital - IList activityTypes = (IList)await _activityTypeRepository.GetByNoticeIdAsync(id); + var activityTypes = await _activityTypeRepository.GetByNoticeIdAsync(id); // Mapeia os tipos de atividades para o output _ = _mapper.Map>(activityTypes); - // return output; - // Mapeia os tipos de atividades para o output List activityTypesOutput = new(); - foreach (Entities.ActivityType activityType in activityTypes) + foreach (var activityType in activityTypes) { // Mapeia as atividades para o output List activitiesOutput = new(); - foreach (Entities.Activity activity in activityType.Activities!) + foreach (var activity in activityType.Activities!) { activitiesOutput.Add(new ActivityOutput { diff --git a/src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs b/src/Application/UseCases/ActivityType/GetLastNoticeActivities.cs similarity index 79% rename from src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs rename to src/Application/UseCases/ActivityType/GetLastNoticeActivities.cs index 9dcfe431..0198e9d8 100644 --- a/src/Domain/UseCases/Interactors/ActivityType/GetLastNoticeActivities.cs +++ b/src/Application/UseCases/ActivityType/GetLastNoticeActivities.cs @@ -1,10 +1,9 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Ports.Activity; -using Domain.UseCases.Interfaces.ActivityType; -using Domain.UseCases.Ports.Activity; +using Application.Ports.Activity; +using Application.Interfaces.UseCases.ActivityType; -namespace Domain.UseCases.Interactors.ActivityType +namespace Application.UseCases.ActivityType { public class GetLastNoticeActivities : IGetLastNoticeActivities { @@ -18,20 +17,18 @@ public GetLastNoticeActivities(IActivityTypeRepository activityTypeRepository, I async Task> IGetLastNoticeActivities.ExecuteAsync() { // Obtém os tipos de atividades do último edital - IList activityTypes = (IList)await _activityTypeRepository.GetLastNoticeActivitiesAsync(); + var activityTypes = await _activityTypeRepository.GetLastNoticeActivitiesAsync(); // Mapeia os tipos de atividades para o output _ = _mapper.Map>(activityTypes); - // return output; - // Mapeia os tipos de atividades para o output List activityTypesOutput = new(); - foreach (Entities.ActivityType type in activityTypes) + foreach (var type in activityTypes) { // Mapeia as atividades para o output List activitiesOutput = new(); - foreach (Entities.Activity activity in type.Activities!) + foreach (var activity in type.Activities!) { activitiesOutput.Add(new ActivityOutput { diff --git a/src/Domain/UseCases/Interactors/Area/CreateArea.cs b/src/Application/UseCases/Area/CreateArea.cs similarity index 86% rename from src/Domain/UseCases/Interactors/Area/CreateArea.cs rename to src/Application/UseCases/Area/CreateArea.cs index 546173d3..d74e44f3 100644 --- a/src/Domain/UseCases/Interactors/Area/CreateArea.cs +++ b/src/Application/UseCases/Area/CreateArea.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Area; -using Domain.UseCases.Ports.Area; -using Domain.Validation; +using Application.Interfaces.UseCases.Area; +using Application.Ports.Area; +using Application.Validation; -namespace Domain.UseCases +namespace Application.UseCases.Area { public class CreateArea : ICreateArea { @@ -33,7 +33,7 @@ public async Task ExecuteAsync(CreateAreaInput input) UseCaseException.BusinessRuleViolation(area?.DeletedAt != null, "A Área Principal informada está inativa."); // Mapeia input para entidade - var newEntity = new Entities.Area(input.MainAreaId, input.Code, input.Name); + var newEntity = new Domain.Entities.Area(input.MainAreaId, input.Code, input.Name); // Cria nova área entity = await _areaRepository.CreateAsync(newEntity); diff --git a/src/Domain/UseCases/Interactors/Area/DeleteArea.cs b/src/Application/UseCases/Area/DeleteArea.cs similarity index 78% rename from src/Domain/UseCases/Interactors/Area/DeleteArea.cs rename to src/Application/UseCases/Area/DeleteArea.cs index 35f5f45b..2baaf480 100644 --- a/src/Domain/UseCases/Interactors/Area/DeleteArea.cs +++ b/src/Application/UseCases/Area/DeleteArea.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Area; -using Domain.UseCases.Ports.Area; -using Domain.Validation; +using Application.Interfaces.UseCases.Area; +using Application.Ports.Area; +using Application.Validation; -namespace Domain.UseCases.Interactors.Area +namespace Application.UseCases.Area { public class DeleteArea : IDeleteArea { @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id == null, nameof(id)); // Remove a entidade - Entities.Area model = await _repository.DeleteAsync(id); + var model = await _repository.DeleteAsync(id); // Retorna a área removida return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/Area/GetAreaById.cs b/src/Application/UseCases/Area/GetAreaById.cs similarity index 76% rename from src/Domain/UseCases/Interactors/Area/GetAreaById.cs rename to src/Application/UseCases/Area/GetAreaById.cs index d01758f8..908b070f 100644 --- a/src/Domain/UseCases/Interactors/Area/GetAreaById.cs +++ b/src/Application/UseCases/Area/GetAreaById.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Area; -using Domain.UseCases.Ports.Area; -using Domain.Validation; +using Application.Interfaces.UseCases.Area; +using Application.Ports.Area; +using Application.Validation; -namespace Domain.UseCases.Interactors.Area +namespace Application.UseCases.Area { public class GetAreaById : IGetAreaById { @@ -23,7 +23,7 @@ public async Task ExecuteAsync(Guid? id) // Verifica se Id foi informado. UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.Area? entity = await _repository.GetByIdAsync(id); + var entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs b/src/Application/UseCases/Area/GetAreasByMainArea.cs similarity index 72% rename from src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs rename to src/Application/UseCases/Area/GetAreasByMainArea.cs index 0a825911..e1832d06 100644 --- a/src/Domain/UseCases/Interactors/Area/GetAreasByMainArea.cs +++ b/src/Application/UseCases/Area/GetAreasByMainArea.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Area; -using Domain.UseCases.Ports.Area; -using Domain.Validation; +using Application.Interfaces.UseCases.Area; +using Application.Ports.Area; +using Application.Validation; -namespace Domain.UseCases.Interactors.Area +namespace Application.UseCases.Area { public class GetAreasByMainArea : IGetAreasByMainArea { @@ -21,7 +21,7 @@ public GetAreasByMainArea(IAreaRepository repository, IMapper mapper) public async Task> ExecuteAsync(Guid? mainAreaId, int skip, int take) { UseCaseException.NotInformedParam(mainAreaId is null, nameof(mainAreaId)); - IEnumerable entities = (IEnumerable)await _repository.GetAreasByMainAreaAsync(mainAreaId, skip, take); + var entities = await _repository.GetAreasByMainAreaAsync(mainAreaId, skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/Area/UpdateArea.cs b/src/Application/UseCases/Area/UpdateArea.cs similarity index 77% rename from src/Domain/UseCases/Interactors/Area/UpdateArea.cs rename to src/Application/UseCases/Area/UpdateArea.cs index 310d82fa..943da93c 100644 --- a/src/Domain/UseCases/Interactors/Area/UpdateArea.cs +++ b/src/Application/UseCases/Area/UpdateArea.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Area; -using Domain.UseCases.Ports.Area; -using Domain.Validation; +using Application.Interfaces.UseCases.Area; +using Application.Ports.Area; +using Application.Validation; -namespace Domain.UseCases.Interactors.Area +namespace Application.UseCases.Area { public class UpdateArea : IUpdateArea { @@ -24,8 +24,8 @@ public async Task ExecuteAsync(Guid? id, UpdateAreaInput UseCaseException.NotInformedParam(id is null, nameof(id)); // Recupera entidade que será atualizada - Entities.Area entity = await _repository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.MainArea)); + var entity = await _repository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.MainArea)); // Atualiza atributos permitidos entity.Name = input.Name; @@ -33,7 +33,7 @@ public async Task ExecuteAsync(Guid? id, UpdateAreaInput entity.MainAreaId = input.MainAreaId; // Salva entidade atualizada no banco - Entities.Area model = await _repository.UpdateAsync(entity); + var model = await _repository.UpdateAsync(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs b/src/Application/UseCases/AssistanceType/CreateAssistanceType.cs similarity index 74% rename from src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs rename to src/Application/UseCases/AssistanceType/CreateAssistanceType.cs index 40fb306f..2264a879 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/CreateAssistanceType.cs +++ b/src/Application/UseCases/AssistanceType/CreateAssistanceType.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.AssistanceType; -using Domain.UseCases.Ports.AssistanceType; -using Domain.Validation; +using Application.Interfaces.UseCases.AssistanceType; +using Application.Ports.AssistanceType; +using Application.Validation; -namespace Domain.UseCases.Interactors.AssistanceType +namespace Application.UseCases.AssistanceType { public class CreateAssistanceType : ICreateAssistanceType { @@ -24,12 +24,12 @@ public async Task ExecuteAsync(CreateAssistanc UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Name), nameof(model.Name)); // Verifica se já existe um tipo de programa com o nome indicado - Entities.AssistanceType? entity = await _repository.GetAssistanceTypeByNameAsync(model.Name!); + var entity = await _repository.GetAssistanceTypeByNameAsync(model.Name!); UseCaseException.BusinessRuleViolation(entity != null, "Já existe um Tipo de Programa para o nome informado."); // Cria entidade - entity = await _repository.CreateAsync(_mapper.Map(model)); + entity = await _repository.CreateAsync(_mapper.Map(model)); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs b/src/Application/UseCases/AssistanceType/DeleteAssistanceType.cs similarity index 77% rename from src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs rename to src/Application/UseCases/AssistanceType/DeleteAssistanceType.cs index 4f580716..c1587f24 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/DeleteAssistanceType.cs +++ b/src/Application/UseCases/AssistanceType/DeleteAssistanceType.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.AssistanceType; -using Domain.UseCases.Ports.AssistanceType; -using Domain.Validation; +using Application.Interfaces.UseCases.AssistanceType; +using Application.Ports.AssistanceType; +using Application.Validation; -namespace Domain.UseCases.Interactors.AssistanceType +namespace Application.UseCases.AssistanceType { public class DeleteAssistanceType : IDeleteAssistanceType { @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.AssistanceType model = await _repository.DeleteAsync(id); + var model = await _repository.DeleteAsync(id); // Retorna o tipo de programa removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs b/src/Application/UseCases/AssistanceType/GetAssistanceTypeById.cs similarity index 74% rename from src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs rename to src/Application/UseCases/AssistanceType/GetAssistanceTypeById.cs index 6f662369..640947fe 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypeById.cs +++ b/src/Application/UseCases/AssistanceType/GetAssistanceTypeById.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.AssistanceType; -using Domain.UseCases.Ports.AssistanceType; -using Domain.Validation; +using Application.Interfaces.UseCases.AssistanceType; +using Application.Ports.AssistanceType; +using Application.Validation; -namespace Domain.UseCases.Interactors.AssistanceType +namespace Application.UseCases.AssistanceType { public class GetAssistanceTypeById : IGetAssistanceTypeById { @@ -21,7 +21,7 @@ public GetAssistanceTypeById(IAssistanceTypeRepository repository, IMapper mappe public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.AssistanceType? entity = await _repository.GetByIdAsync(id); + var entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs b/src/Application/UseCases/AssistanceType/GetAssistanceTypes.cs similarity index 70% rename from src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs rename to src/Application/UseCases/AssistanceType/GetAssistanceTypes.cs index c4235954..3cad4a67 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/GetAssistanceTypes.cs +++ b/src/Application/UseCases/AssistanceType/GetAssistanceTypes.cs @@ -1,9 +1,9 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.AssistanceType; -using Domain.UseCases.Ports.AssistanceType; +using Application.Interfaces.UseCases.AssistanceType; +using Application.Ports.AssistanceType; -namespace Domain.UseCases.Interactors.AssistanceType +namespace Application.UseCases.AssistanceType { public class GetAssistanceTypes : IGetAssistanceTypes { @@ -19,7 +19,7 @@ public GetAssistanceTypes(IAssistanceTypeRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs b/src/Application/UseCases/AssistanceType/UpdateAssistanceType.cs similarity index 83% rename from src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs rename to src/Application/UseCases/AssistanceType/UpdateAssistanceType.cs index 960573a8..d54020fa 100644 --- a/src/Domain/UseCases/Interactors/AssistanceType/UpdateAssistanceType.cs +++ b/src/Application/UseCases/AssistanceType/UpdateAssistanceType.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.AssistanceType; -using Domain.UseCases.Ports.AssistanceType; -using Domain.Validation; +using Application.Interfaces.UseCases.AssistanceType; +using Application.Ports.AssistanceType; +using Application.Validation; -namespace Domain.UseCases.Interactors.AssistanceType +namespace Application.UseCases.AssistanceType { public class UpdateAssistanceType : IUpdateAssistanceType { @@ -27,8 +27,8 @@ public async Task ExecuteAsync(Guid? id, Updat UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - Entities.AssistanceType entity = await _repository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.AssistanceType)); + var entity = await _repository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.AssistanceType)); // Verifica se a entidade foi excluída UseCaseException.BusinessRuleViolation(entity.DeletedAt != null, @@ -45,7 +45,7 @@ public async Task ExecuteAsync(Guid? id, Updat entity.Description = input.Description; // Salva entidade atualizada no banco - Entities.AssistanceType model = await _repository.UpdateAsync(entity); + var model = await _repository.UpdateAsync(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs b/src/Application/UseCases/Auth/ConfirmEmail.cs similarity index 89% rename from src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs rename to src/Application/UseCases/Auth/ConfirmEmail.cs index 1fe89b45..581cef1d 100644 --- a/src/Domain/UseCases/Interactors/Auth/ConfirmEmail.cs +++ b/src/Application/UseCases/Auth/ConfirmEmail.cs @@ -1,8 +1,8 @@ using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Auth; -using Domain.Validation; +using Application.Interfaces.UseCases.Auth; +using Application.Validation; -namespace Domain.UseCases.Interactors.Auth +namespace Application.UseCases.Auth { public class ConfirmEmail : IConfirmEmail { @@ -24,7 +24,7 @@ public async Task ExecuteAsync(string? email, string? token) // Busca usuário pelo email informado var user = await _userRepository.GetUserByEmailAsync(email) - ?? throw UseCaseException.NotFoundEntityByParams(nameof(Entities.User)); + ?? throw UseCaseException.NotFoundEntityByParams(nameof(Domain.Entities.User)); // Confirma usuário user.ConfirmUserEmail(token!); diff --git a/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs b/src/Application/UseCases/Auth/ForgotPassword.cs similarity index 89% rename from src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs rename to src/Application/UseCases/Auth/ForgotPassword.cs index fc3eafba..f2783f89 100644 --- a/src/Domain/UseCases/Interactors/Auth/ForgotPassword.cs +++ b/src/Application/UseCases/Auth/ForgotPassword.cs @@ -1,9 +1,9 @@ using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.Auth; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.Auth; +using Application.Validation; -namespace Domain.UseCases.Interactors.Auth +namespace Application.UseCases.Auth { public class ForgotPassword : IForgotPassword { @@ -24,7 +24,7 @@ public async Task ExecuteAsync(string? email) // Busca usuário pelo email var user = await _userRepository.GetUserByEmailAsync(email) - ?? throw UseCaseException.NotFoundEntityByParams(nameof(Entities.User)); + ?? throw UseCaseException.NotFoundEntityByParams(nameof(Domain.Entities.User)); // Gera token de recuperação de senha user.GenerateResetPasswordToken(); diff --git a/src/Domain/UseCases/Interactors/Auth/Login.cs b/src/Application/UseCases/Auth/Login.cs similarity index 84% rename from src/Domain/UseCases/Interactors/Auth/Login.cs rename to src/Application/UseCases/Auth/Login.cs index 32a80400..148fb5a0 100644 --- a/src/Domain/UseCases/Interactors/Auth/Login.cs +++ b/src/Application/UseCases/Auth/Login.cs @@ -1,10 +1,10 @@ using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.Auth; -using Domain.UseCases.Ports.Auth; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.Auth; +using Application.Ports.Auth; +using Application.Validation; -namespace Domain.UseCases.Interactors.Auth +namespace Application.UseCases.Auth { public class Login : ILogin { @@ -29,8 +29,8 @@ public async Task ExecuteAsync(UserLoginInput input) UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Password), nameof(input.Password)); // Busca usuário pelo email - Entities.User entity = await _userRepository.GetUserByEmailAsync(input.Email) - ?? throw UseCaseException.NotFoundEntityByParams(nameof(Entities.User)); + var entity = await _userRepository.GetUserByEmailAsync(input.Email) + ?? throw UseCaseException.NotFoundEntityByParams(nameof(Domain.Entities.User)); // Verifica se o usuário está confirmado UseCaseException.BusinessRuleViolation(!entity.IsConfirmed, "User's email has not yet been confirmed."); diff --git a/src/Domain/UseCases/Interactors/Auth/ResetPassword.cs b/src/Application/UseCases/Auth/ResetPassword.cs similarity index 87% rename from src/Domain/UseCases/Interactors/Auth/ResetPassword.cs rename to src/Application/UseCases/Auth/ResetPassword.cs index d132351e..5e76e26c 100644 --- a/src/Domain/UseCases/Interactors/Auth/ResetPassword.cs +++ b/src/Application/UseCases/Auth/ResetPassword.cs @@ -1,10 +1,10 @@ using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.Auth; -using Domain.UseCases.Ports.Auth; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.Auth; +using Application.Ports.Auth; +using Application.Validation; -namespace Domain.UseCases.Interactors.Auth +namespace Application.UseCases.Auth { public class ResetPassword : IResetPassword { @@ -30,8 +30,8 @@ public async Task ExecuteAsync(UserResetPasswordInput input) UseCaseException.NotInformedParam(input.Token == null, nameof(input.Token)); // Busca o usuário pelo id - Entities.User entity = await _userRepository.GetByIdAsync(input.Id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); + var entity = await _userRepository.GetByIdAsync(input.Id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.User)); // Verifica se o token de validação é nulo if (string.IsNullOrEmpty(entity.ResetPasswordToken)) diff --git a/src/Domain/UseCases/Interactors/Campus/CreateCampus.cs b/src/Application/UseCases/Campus/CreateCampus.cs similarity index 84% rename from src/Domain/UseCases/Interactors/Campus/CreateCampus.cs rename to src/Application/UseCases/Campus/CreateCampus.cs index 369ddc6e..e2413015 100644 --- a/src/Domain/UseCases/Interactors/Campus/CreateCampus.cs +++ b/src/Application/UseCases/Campus/CreateCampus.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Campus; -using Domain.UseCases.Ports.Campus; -using Domain.Validation; +using Application.Interfaces.UseCases.Campus; +using Application.Ports.Campus; +using Application.Validation; -namespace Domain.UseCases +namespace Application.UseCases.Campus { public class CreateCampus : ICreateCampus { @@ -29,7 +29,7 @@ public async Task ExecuteAsync(CreateCampusInput input throw UseCaseException.BusinessRuleViolation("Já existe um Campus para o nome informado."); // Cria entidade - var newEntity = new Entities.Campus(input.Name); + var newEntity = new Domain.Entities.Campus(input.Name); entity = await _repository.CreateAsync(newEntity); // Salva entidade no banco diff --git a/src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs b/src/Application/UseCases/Campus/DeleteCampus.cs similarity index 78% rename from src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs rename to src/Application/UseCases/Campus/DeleteCampus.cs index b3e6e622..67f85dc4 100644 --- a/src/Domain/UseCases/Interactors/Campus/DeleteCampus.cs +++ b/src/Application/UseCases/Campus/DeleteCampus.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Campus; -using Domain.UseCases.Ports.Campus; -using Domain.Validation; +using Application.Interfaces.UseCases.Campus; +using Application.Ports.Campus; +using Application.Validation; -namespace Domain.UseCases.Interactors.Campus +namespace Application.UseCases.Campus { public class DeleteCampus : IDeleteCampus { @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.Campus model = await _repository.DeleteAsync(id); + var model = await _repository.DeleteAsync(id); // Retorna o curso removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/Campus/GetCampusById.cs b/src/Application/UseCases/Campus/GetCampusById.cs similarity index 75% rename from src/Domain/UseCases/Interactors/Campus/GetCampusById.cs rename to src/Application/UseCases/Campus/GetCampusById.cs index b83fd580..5ba466c4 100644 --- a/src/Domain/UseCases/Interactors/Campus/GetCampusById.cs +++ b/src/Application/UseCases/Campus/GetCampusById.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Campus; -using Domain.UseCases.Ports.Campus; -using Domain.Validation; +using Application.Interfaces.UseCases.Campus; +using Application.Ports.Campus; +using Application.Validation; -namespace Domain.UseCases.Interactors.Campus +namespace Application.UseCases.Campus { public class GetCampusById : IGetCampusById { @@ -21,8 +21,7 @@ public GetCampusById(ICampusRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - - Entities.Campus? entity = await _repository.GetByIdAsync(id); + var entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/Campus/GetCampuses.cs b/src/Application/UseCases/Campus/GetCampuses.cs similarity index 72% rename from src/Domain/UseCases/Interactors/Campus/GetCampuses.cs rename to src/Application/UseCases/Campus/GetCampuses.cs index a590ad4f..0ed94989 100644 --- a/src/Domain/UseCases/Interactors/Campus/GetCampuses.cs +++ b/src/Application/UseCases/Campus/GetCampuses.cs @@ -1,9 +1,9 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Campus; -using Domain.UseCases.Ports.Campus; +using Application.Interfaces.UseCases.Campus; +using Application.Ports.Campus; -namespace Domain.UseCases.Interactors.Campus +namespace Application.UseCases.Campus { public class GetCampuses : IGetCampuses { @@ -19,7 +19,7 @@ public GetCampuses(ICampusRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs b/src/Application/UseCases/Campus/UpdateCampus.cs similarity index 82% rename from src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs rename to src/Application/UseCases/Campus/UpdateCampus.cs index 07d2de39..d5611eda 100644 --- a/src/Domain/UseCases/Interactors/Campus/UpdateCampus.cs +++ b/src/Application/UseCases/Campus/UpdateCampus.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Campus; -using Domain.UseCases.Ports.Campus; -using Domain.Validation; +using Application.Interfaces.UseCases.Campus; +using Application.Ports.Campus; +using Application.Validation; -namespace Domain.UseCases.Interactors.Campus +namespace Application.UseCases.Campus { public class UpdateCampus : IUpdateCampus { @@ -27,7 +27,7 @@ public async Task ExecuteAsync(Guid? id, UpdateCampusI UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - Entities.Campus entity = await _repository.GetByIdAsync(id) ?? throw new Exception("Campus não encontrado."); + var entity = await _repository.GetByIdAsync(id) ?? throw new Exception("Campus não encontrado."); // Verifica se a entidade foi excluída if (entity.DeletedAt != null) @@ -45,7 +45,7 @@ public async Task ExecuteAsync(Guid? id, UpdateCampusI entity.Name = input.Name; // Salva entidade atualizada no banco - Entities.Campus model = await _repository.UpdateAsync(entity); + var model = await _repository.UpdateAsync(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Interactors/Course/CreateCourse.cs b/src/Application/UseCases/Course/CreateCourse.cs similarity index 66% rename from src/Domain/UseCases/Interactors/Course/CreateCourse.cs rename to src/Application/UseCases/Course/CreateCourse.cs index df1b4dcb..4c14f57d 100644 --- a/src/Domain/UseCases/Interactors/Course/CreateCourse.cs +++ b/src/Application/UseCases/Course/CreateCourse.cs @@ -1,11 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Ports.Course; -using Domain.UseCases.Interfaces.Course; -using Domain.UseCases.Ports.Course; -using Domain.Validation; +using Application.Ports.Course; +using Application.Interfaces.UseCases.Course; +using Application.Validation; -namespace Domain.UseCases.Interactors.Course +namespace Application.UseCases.Course { public class CreateCourse : ICreateCourse { @@ -25,14 +24,11 @@ public async Task ExecuteAsync(CreateCourseInput model UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Name), nameof(model.Name)); // Verifica se já existe um edital para o período indicado - Entities.Course? entity = await _repository.GetCourseByNameAsync(model.Name!); - if (entity != null) - { - throw UseCaseException.BusinessRuleViolation("Já existe um Curso para o nome informado."); - } + var entity = await _repository.GetCourseByNameAsync(model.Name!); + UseCaseException.BusinessRuleViolation(entity != null, "Já existe um Curso para o nome informado."); // Cria entidade - Entities.Course newEntity = new(model.Name); + Domain.Entities.Course newEntity = new(model.Name); entity = await _repository.CreateAsync(newEntity); // Salva entidade no banco diff --git a/src/Domain/UseCases/Interactors/Course/DeleteCourse.cs b/src/Application/UseCases/Course/DeleteCourse.cs similarity index 78% rename from src/Domain/UseCases/Interactors/Course/DeleteCourse.cs rename to src/Application/UseCases/Course/DeleteCourse.cs index 6a7723c1..c00989eb 100644 --- a/src/Domain/UseCases/Interactors/Course/DeleteCourse.cs +++ b/src/Application/UseCases/Course/DeleteCourse.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Course; -using Domain.UseCases.Ports.Course; -using Domain.Validation; +using Application.Interfaces.UseCases.Course; +using Application.Ports.Course; +using Application.Validation; -namespace Domain.UseCases.Interactors.Course +namespace Application.UseCases.Course { public class DeleteCourse : IDeleteCourse { @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.Course model = await _repository.DeleteAsync(id); + var model = await _repository.DeleteAsync(id); // Retorna o curso removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/Course/GetCourseById.cs b/src/Application/UseCases/Course/GetCourseById.cs similarity index 75% rename from src/Domain/UseCases/Interactors/Course/GetCourseById.cs rename to src/Application/UseCases/Course/GetCourseById.cs index 6fb456ad..dd3b1f9a 100644 --- a/src/Domain/UseCases/Interactors/Course/GetCourseById.cs +++ b/src/Application/UseCases/Course/GetCourseById.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Course; -using Domain.UseCases.Ports.Course; -using Domain.Validation; +using Application.Interfaces.UseCases.Course; +using Application.Ports.Course; +using Application.Validation; -namespace Domain.UseCases.Interactors.Course +namespace Application.UseCases.Course { public class GetCourseById : IGetCourseById { @@ -21,8 +21,7 @@ public GetCourseById(ICourseRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - - Entities.Course? entity = await _repository.GetByIdAsync(id); + var entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/Course/GetCourses.cs b/src/Application/UseCases/Course/GetCourses.cs similarity index 74% rename from src/Domain/UseCases/Interactors/Course/GetCourses.cs rename to src/Application/UseCases/Course/GetCourses.cs index 8aa8727c..92f7bf27 100644 --- a/src/Domain/UseCases/Interactors/Course/GetCourses.cs +++ b/src/Application/UseCases/Course/GetCourses.cs @@ -1,9 +1,9 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Course; -using Domain.UseCases.Ports.Course; +using Application.Interfaces.UseCases.Course; +using Application.Ports.Course; -namespace Domain.UseCases.Interactors.Course +namespace Application.UseCases.Course { public class GetCourses : IGetCourses { @@ -19,7 +19,7 @@ public GetCourses(ICourseRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = await _repository.GetAllAsync(skip, take); + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/Course/UpdateCourse.cs b/src/Application/UseCases/Course/UpdateCourse.cs similarity index 84% rename from src/Domain/UseCases/Interactors/Course/UpdateCourse.cs rename to src/Application/UseCases/Course/UpdateCourse.cs index 3ff8999e..21ed5698 100644 --- a/src/Domain/UseCases/Interactors/Course/UpdateCourse.cs +++ b/src/Application/UseCases/Course/UpdateCourse.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Course; -using Domain.UseCases.Ports.Course; -using Domain.Validation; +using Application.Interfaces.UseCases.Course; +using Application.Ports.Course; +using Application.Validation; -namespace Domain.UseCases.Interactors.Course +namespace Application.UseCases.Course { public class UpdateCourse : IUpdateCourse { @@ -27,8 +27,8 @@ public async Task ExecuteAsync(Guid? id, UpdateCourseI UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - Entities.Course entity = await _repository.GetByIdAsync(id) ?? - throw UseCaseException.NotFoundEntityById(nameof(Entities.Course)); + var entity = await _repository.GetByIdAsync(id) ?? + throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Course)); // Verifica se a entidade foi excluída if (entity.DeletedAt != null) @@ -46,7 +46,7 @@ public async Task ExecuteAsync(Guid? id, UpdateCourseI entity.Name = input.Name; // Salva entidade atualizada no banco - Entities.Course model = await _repository.UpdateAsync(entity); + var model = await _repository.UpdateAsync(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs b/src/Application/UseCases/MainArea/CreateMainArea.cs similarity index 56% rename from src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs rename to src/Application/UseCases/MainArea/CreateMainArea.cs index af1ffb65..adefbb65 100644 --- a/src/Domain/UseCases/Interactors/MainArea/CreateMainArea.cs +++ b/src/Application/UseCases/MainArea/CreateMainArea.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.MainArea; -using Domain.UseCases.Ports.MainArea; -using Domain.Validation; +using Application.Interfaces.UseCases.MainArea; +using Application.Ports.MainArea; +using Application.Validation; -namespace Domain.UseCases.Interactors.MainArea +namespace Application.UseCases.MainArea { public class CreateMainArea : ICreateMainArea { @@ -21,13 +21,10 @@ public CreateMainArea(IMainAreaRepository repository, IMapper mapper) public async Task ExecuteAsync(CreateMainAreaInput model) { // Validação de código da Área - Entities.MainArea? entity = await _repository.GetByCodeAsync(model.Code); - if (entity != null) - { - throw UseCaseException.BusinessRuleViolation($"Já existe uma Área Principal para o código {model.Code}"); - } + var entity = await _repository.GetByCodeAsync(model.Code); + UseCaseException.BusinessRuleViolation(entity != null, $"Já existe uma Área Principal para o código {model.Code}"); - entity = await _repository.CreateAsync(_mapper.Map(model)); + entity = await _repository.CreateAsync(_mapper.Map(model)); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs b/src/Application/UseCases/MainArea/DeleteMainArea.cs similarity index 77% rename from src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs rename to src/Application/UseCases/MainArea/DeleteMainArea.cs index 351799d3..0b69fe87 100644 --- a/src/Domain/UseCases/Interactors/MainArea/DeleteMainArea.cs +++ b/src/Application/UseCases/MainArea/DeleteMainArea.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.MainArea; -using Domain.UseCases.Ports.MainArea; -using Domain.Validation; +using Application.Interfaces.UseCases.MainArea; +using Application.Ports.MainArea; +using Application.Validation; -namespace Domain.UseCases.Interactors.MainArea +namespace Application.UseCases.MainArea { public class DeleteMainArea : IDeleteMainArea { @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.MainArea model = await _repository.DeleteAsync(id); + var model = await _repository.DeleteAsync(id); // Retorna o edital removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs b/src/Application/UseCases/MainArea/GetMainAreaById.cs similarity index 74% rename from src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs rename to src/Application/UseCases/MainArea/GetMainAreaById.cs index d92bac85..3b585573 100644 --- a/src/Domain/UseCases/Interactors/MainArea/GetMainAreaById.cs +++ b/src/Application/UseCases/MainArea/GetMainAreaById.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.MainArea; -using Domain.UseCases.Ports.MainArea; -using Domain.Validation; +using Application.Interfaces.UseCases.MainArea; +using Application.Ports.MainArea; +using Application.Validation; -namespace Domain.UseCases.Interactors.MainArea +namespace Application.UseCases.MainArea { public class GetMainAreaById : IGetMainAreaById { @@ -21,8 +21,7 @@ public GetMainAreaById(IMainAreaRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - - Entities.MainArea? entity = await _repository.GetByIdAsync(id); + var entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs b/src/Application/UseCases/MainArea/GetMainAreas.cs similarity index 71% rename from src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs rename to src/Application/UseCases/MainArea/GetMainAreas.cs index f474dbde..1e1f3cac 100644 --- a/src/Domain/UseCases/Interactors/MainArea/GetMainAreas.cs +++ b/src/Application/UseCases/MainArea/GetMainAreas.cs @@ -1,9 +1,9 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.MainArea; -using Domain.UseCases.Ports.MainArea; +using Application.Interfaces.UseCases.MainArea; +using Application.Ports.MainArea; -namespace Domain.UseCases.Interactors.MainArea +namespace Application.UseCases.MainArea { public class GetMainAreas : IGetMainAreas { @@ -19,7 +19,7 @@ public GetMainAreas(IMainAreaRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs b/src/Application/UseCases/MainArea/UpdateMainArea.cs similarity index 63% rename from src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs rename to src/Application/UseCases/MainArea/UpdateMainArea.cs index fae8b0f3..ebe5c1ae 100644 --- a/src/Domain/UseCases/Interactors/MainArea/UpdateMainArea.cs +++ b/src/Application/UseCases/MainArea/UpdateMainArea.cs @@ -1,9 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.MainArea; -using Domain.UseCases.Ports.MainArea; +using Application.Interfaces.UseCases.MainArea; +using Application.Ports.MainArea; +using Application.Validation; -namespace Domain.UseCases.Interactors.MainArea +namespace Application.UseCases.MainArea { public class UpdateMainArea : IUpdateMainArea { @@ -20,16 +21,16 @@ public UpdateMainArea(IMainAreaRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id, UpdateMainAreaInput input) { // Recupera entidade que será atualizada - Entities.MainArea entity = await _repository.GetByIdAsync(id) - ?? throw Validation.UseCaseException.BusinessRuleViolation("Área Principal não encontrada."); + var entity = await _repository.GetByIdAsync(id) + ?? throw UseCaseException.BusinessRuleViolation("Área Principal não encontrada."); // Atualiza atributos permitidos entity.Name = input.Name; entity.Code = input.Code; // Salva entidade atualizada no banco - Entities.MainArea model = await _repository.UpdateAsync(entity); - return _mapper.Map(model); + await _repository.UpdateAsync(entity); + return _mapper.Map(entity); } } } \ No newline at end of file diff --git a/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs b/src/Application/UseCases/Notice/CreateNotice.cs similarity index 85% rename from src/Domain/UseCases/Interactors/Notice/CreateNotice.cs rename to src/Application/UseCases/Notice/CreateNotice.cs index 48eed628..3571d516 100644 --- a/src/Domain/UseCases/Interactors/Notice/CreateNotice.cs +++ b/src/Application/UseCases/Notice/CreateNotice.cs @@ -1,11 +1,11 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.Notice; -using Domain.UseCases.Ports.Notice; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.Notice; +using Application.Ports.Notice; +using Application.Validation; -namespace Domain.UseCases +namespace Application.UseCases.Notice { public class CreateNotice : ICreateNotice { @@ -43,7 +43,7 @@ public async Task ExecuteAsync(CreateNoticeInput input "As atividades devem ser informadas."); // Mapeia input para entidade - var notice = new Entities.Notice( + var notice = new Domain.Entities.Notice( input.RegistrationStartDate, input.RegistrationEndDate, input.EvaluationStartDate, @@ -71,10 +71,10 @@ public async Task ExecuteAsync(CreateNoticeInput input { // Converte atividades para entidades foreach (var activity in activityType.Activities!) - _ = new Entities.Activity(activity.Name, activity.Points, activity.Limits, Guid.Empty); + _ = new Domain.Entities.Activity(activity.Name, activity.Points, activity.Limits, Guid.Empty); // Converte tipo de atividade para entidade - _ = new Entities.ActivityType(activityType.Name, activityType.Unity, Guid.Empty); + _ = new Domain.Entities.ActivityType(activityType.Name, activityType.Unity, Guid.Empty); } // Cria edital no banco @@ -84,13 +84,13 @@ public async Task ExecuteAsync(CreateNoticeInput input foreach (var activityType in input.Activities!) { // Salva tipo de atividade no banco - var activityTypeEntity = new Entities.ActivityType(activityType.Name, activityType.Unity, notice.Id); + var activityTypeEntity = new Domain.Entities.ActivityType(activityType.Name, activityType.Unity, notice.Id); activityTypeEntity = await _activityTypeRepository.CreateAsync(activityTypeEntity); // Salva atividades no banco foreach (var activity in activityType.Activities!) { - var activityEntity = new Entities.Activity(activity.Name, activity.Points, activity.Limits, activityTypeEntity.Id); + var activityEntity = new Domain.Entities.Activity(activity.Name, activity.Points, activity.Limits, activityTypeEntity.Id); await _activityRepository.CreateAsync(activityEntity); } } diff --git a/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs b/src/Application/UseCases/Notice/DeleteNotice.cs similarity index 82% rename from src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs rename to src/Application/UseCases/Notice/DeleteNotice.cs index 588cb664..7e849b36 100644 --- a/src/Domain/UseCases/Interactors/Notice/DeleteNotice.cs +++ b/src/Application/UseCases/Notice/DeleteNotice.cs @@ -1,11 +1,11 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.Notice; -using Domain.UseCases.Ports.Notice; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.Notice; +using Application.Ports.Notice; +using Application.Validation; -namespace Domain.UseCases.Interactors.Notice +namespace Application.UseCases.Notice { public class DeleteNotice : IDeleteNotice { @@ -27,7 +27,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id == null, nameof(id)); // Remove a entidade - Entities.Notice entity = await _repository.DeleteAsync(id); + var entity = await _repository.DeleteAsync(id); // Deleta o arquivo do edital if (!string.IsNullOrEmpty(entity.DocUrl)) diff --git a/src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs b/src/Application/UseCases/Notice/GetNoticeById.cs similarity index 75% rename from src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs rename to src/Application/UseCases/Notice/GetNoticeById.cs index 38329994..84dc74fe 100644 --- a/src/Domain/UseCases/Interactors/Notice/GetNoticeById.cs +++ b/src/Application/UseCases/Notice/GetNoticeById.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Notice; -using Domain.UseCases.Ports.Notice; -using Domain.Validation; +using Application.Interfaces.UseCases.Notice; +using Application.Ports.Notice; +using Application.Validation; -namespace Domain.UseCases.Interactors.Notice +namespace Application.UseCases.Notice { public class GetNoticeById : IGetNoticeById { @@ -21,8 +21,7 @@ public GetNoticeById(INoticeRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - - Entities.Notice? entity = await _repository.GetByIdAsync(id); + var entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/Notice/GetNotices.cs b/src/Application/UseCases/Notice/GetNotices.cs similarity index 71% rename from src/Domain/UseCases/Interactors/Notice/GetNotices.cs rename to src/Application/UseCases/Notice/GetNotices.cs index 6399329f..0d4f9212 100644 --- a/src/Domain/UseCases/Interactors/Notice/GetNotices.cs +++ b/src/Application/UseCases/Notice/GetNotices.cs @@ -1,9 +1,9 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Notice; -using Domain.UseCases.Ports.Notice; +using Application.Interfaces.UseCases.Notice; +using Application.Ports.Notice; -namespace Domain.UseCases.Interactors.Notice +namespace Application.UseCases.Notice { public class GetNotices : IGetNotices { @@ -19,7 +19,7 @@ public GetNotices(INoticeRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities); } } diff --git a/src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs b/src/Application/UseCases/Notice/UpdateNotice.cs similarity index 83% rename from src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs rename to src/Application/UseCases/Notice/UpdateNotice.cs index 1be331f6..bd75e6bf 100644 --- a/src/Domain/UseCases/Interactors/Notice/UpdateNotice.cs +++ b/src/Application/UseCases/Notice/UpdateNotice.cs @@ -1,13 +1,12 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.Ports.Activity; -using Domain.UseCases.Interfaces.Notice; -using Domain.UseCases.Ports.Activity; -using Domain.UseCases.Ports.Notice; -using Domain.Validation; - -namespace Domain.UseCases.Interactors.Notice +using Application.Interfaces.Services; +using Application.Ports.Activity; +using Application.Interfaces.UseCases.Notice; +using Application.Ports.Notice; +using Application.Validation; + +namespace Application.UseCases.Notice { public class UpdateNotice : IUpdateNotice { @@ -42,8 +41,8 @@ public async Task ExecuteAsync(Guid? id, UpdateNoticeI "As atividades devem ser informadas."); // Recupera entidade que será atualizada - Entities.Notice notice = await _repository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Notice)); + var notice = await _repository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Notice)); // Verifica se a entidade foi excluída UseCaseException.BusinessRuleViolation(notice.DeletedAt != null, "O Edital inserido já foi excluído."); @@ -74,18 +73,18 @@ public async Task ExecuteAsync(Guid? id, UpdateNoticeI // Converte atividades para entidades foreach (UpdateActivityInput activity in activityType.Activities!) { - _ = new Entities.Activity(activity.Name, activity.Points, activity.Limits, Guid.Empty); + _ = new Domain.Entities.Activity(activity.Name, activity.Points, activity.Limits, Guid.Empty); } // Converte tipo de atividade para entidade - _ = new Entities.ActivityType(activityType.Name, activityType.Unity, Guid.Empty); + _ = new Domain.Entities.ActivityType(activityType.Name, activityType.Unity, Guid.Empty); } // Salva entidade atualizada no banco _ = await _repository.UpdateAsync(notice); // Recupera atividades do edital - IList noticeActivities = await _activityTypeRepository.GetByNoticeIdAsync(notice.Id); + var noticeActivities = await _activityTypeRepository.GetByNoticeIdAsync(notice.Id); // Atualiza atividades await HandleActivityType(model.Activities!, noticeActivities, notice.Id); @@ -100,24 +99,24 @@ public async Task ExecuteAsync(Guid? id, UpdateNoticeI /// Lista de tipos de atividades que serão atualizados. /// Lista de tipos de atividades que serão excluídos. /// Id do edital. - private async Task HandleActivityType(IList newActivityTypes, IList oldActivityTypes, Guid? noticeId) + private async Task HandleActivityType(IList newActivityTypes, IList oldActivityTypes, Guid? noticeId) { foreach (UpdateActivityTypeInput newActivityType in newActivityTypes) { // Verifica se o tipo de atividade já existe - Entities.ActivityType? activityType = oldActivityTypes.FirstOrDefault(x => x.Id == newActivityType.Id); + var activityType = oldActivityTypes.FirstOrDefault(x => x.Id == newActivityType.Id); // Se o tipo de atividade não existir, cria um novo if (activityType is null) { // Cria tipo de atividade - activityType = new Entities.ActivityType(newActivityType.Name, newActivityType.Unity, noticeId); + activityType = new Domain.Entities.ActivityType(newActivityType.Name, newActivityType.Unity, noticeId); // Salva tipo de atividade no banco _ = await _activityTypeRepository.CreateAsync(activityType); // Cria atividades - await HandleActivity(newActivityType.Activities!, new List(), activityType.Id); + await HandleActivity(newActivityType.Activities!, new List(), activityType.Id); } // Se o tipo de atividade existir, atualiza @@ -140,7 +139,7 @@ private async Task HandleActivityType(IList newActivity // TODO: Validar remoção de tipos de atividade. // Verifica se existem tipos de atividades que foram excluídos - foreach (Entities.ActivityType activityTypeToRemove in oldActivityTypes) + foreach (Domain.Entities.ActivityType activityTypeToRemove in oldActivityTypes) { // Remove tipo de atividade do banco _ = await _activityTypeRepository.DeleteAsync(activityTypeToRemove.Id); @@ -153,19 +152,19 @@ private async Task HandleActivityType(IList newActivity /// Lista de atividades que serão atualizadas. /// Lista de atividades que serão excluídas. /// Id do tipo de atividade. - private async Task HandleActivity(IList newActivities, IList oldActivities, Guid? activityTypeId) + private async Task HandleActivity(IList newActivities, IList oldActivities, Guid? activityTypeId) { // Verifica se existem atividades que foram criadas ou atualizadas foreach (UpdateActivityInput newActivity in newActivities) { // Verifica se o tipo de atividade já existe - Entities.Activity? activity = oldActivities.FirstOrDefault(x => x.Id == newActivity.Id); + var activity = oldActivities.FirstOrDefault(x => x.Id == newActivity.Id); // Se o tipo de atividade não existir, cria um novo if (activity is null) { // Cria atividade - activity = new Entities.Activity(newActivity.Name, newActivity.Points, newActivity.Limits, activityTypeId); + activity = new Domain.Entities.Activity(newActivity.Name, newActivity.Points, newActivity.Limits, activityTypeId); // Salva atividade no banco _ = await _activityRepository.CreateAsync(activity); @@ -189,7 +188,7 @@ private async Task HandleActivity(IList newActivities, ILis // TODO: Validar remoção de atividades. // Verifica se existem atividades que foram excluídas - foreach (Entities.Activity activityToRemove in oldActivities) + foreach (Domain.Entities.Activity activityToRemove in oldActivities) { // Remove atividade do banco _ = await _activityRepository.DeleteAsync(activityToRemove.Id); diff --git a/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs b/src/Application/UseCases/Professor/CreateProfessor.cs similarity index 82% rename from src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs rename to src/Application/UseCases/Professor/CreateProfessor.cs index 99cb5065..f711f0ad 100644 --- a/src/Domain/UseCases/Interactors/Professor/CreateProfessor.cs +++ b/src/Application/UseCases/Professor/CreateProfessor.cs @@ -1,11 +1,11 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.Professor; -using Domain.UseCases.Ports.Professor; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.Professor; +using Application.Ports.Professor; +using Application.Validation; -namespace Domain.UseCases +namespace Application.UseCases.Professor { public class CreateProfessor : ICreateProfessor { @@ -32,7 +32,7 @@ public CreateProfessor(IProfessorRepository professorRepository, public async Task ExecuteAsync(CreateProfessorInput input) { // Realiza o map da entidade e a validação dos campos informados - var entity = new Entities.Professor(input.SIAPEEnrollment, input.IdentifyLattes); + var entity = new Domain.Entities.Professor(input.SIAPEEnrollment, input.IdentifyLattes); // Verifica se a senha é nula UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Password), nameof(input.Password)); @@ -49,7 +49,11 @@ public async Task ExecuteAsync(CreateProfessorInput input.Password = _hashService.HashPassword(input.Password!); // Cria usuário - user = new Entities.User(input.Name, input.Email, input.Password, input.CPF, Entities.Enums.ERole.PROFESSOR); + user = new Domain.Entities.User(input.Name, + input.Email, + input.Password, + input.CPF, + Domain.Entities.Enums.ERole.PROFESSOR); // Adiciona usuário no banco user = await _userRepository.CreateAsync(user); diff --git a/src/Domain/UseCases/Interactors/Professor/DeleteProfessor.cs b/src/Application/UseCases/Professor/DeleteProfessor.cs similarity index 85% rename from src/Domain/UseCases/Interactors/Professor/DeleteProfessor.cs rename to src/Application/UseCases/Professor/DeleteProfessor.cs index 5619c422..b47bf9a8 100644 --- a/src/Domain/UseCases/Interactors/Professor/DeleteProfessor.cs +++ b/src/Application/UseCases/Professor/DeleteProfessor.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Professor; -using Domain.UseCases.Ports.Professor; -using Domain.Validation; +using Application.Interfaces.UseCases.Professor; +using Application.Ports.Professor; +using Application.Validation; -namespace Domain.UseCases.Interactors.Professor +namespace Application.UseCases.Professor { public class DeleteProfessor : IDeleteProfessor { @@ -26,12 +26,12 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se o professor existe - Entities.Professor? professor = await _professorRepository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Professor)); + var professor = await _professorRepository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Professor)); // Verifica se o usuário existe _ = await _userRepository.GetByIdAsync(professor.UserId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.User)); // Remove o professor professor = await _professorRepository.DeleteAsync(id); diff --git a/src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs b/src/Application/UseCases/Professor/GetProfessorById.cs similarity index 74% rename from src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs rename to src/Application/UseCases/Professor/GetProfessorById.cs index 177ddc46..619c7e0b 100644 --- a/src/Domain/UseCases/Interactors/Professor/GetProfessorById.cs +++ b/src/Application/UseCases/Professor/GetProfessorById.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Professor; -using Domain.UseCases.Ports.Professor; -using Domain.Validation; +using Application.Interfaces.UseCases.Professor; +using Application.Ports.Professor; +using Application.Validation; -namespace Domain.UseCases.Interactors.Professor +namespace Application.UseCases.Professor { public class GetProfessorById : IGetProfessorById { @@ -21,7 +21,7 @@ public GetProfessorById(IProfessorRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.Professor? entity = await _repository.GetByIdAsync(id); + var entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/Professor/GetProfessors.cs b/src/Application/UseCases/Professor/GetProfessors.cs similarity index 71% rename from src/Domain/UseCases/Interactors/Professor/GetProfessors.cs rename to src/Application/UseCases/Professor/GetProfessors.cs index 2f957b16..8c3b0a55 100644 --- a/src/Domain/UseCases/Interactors/Professor/GetProfessors.cs +++ b/src/Application/UseCases/Professor/GetProfessors.cs @@ -1,9 +1,9 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Professor; -using Domain.UseCases.Ports.Professor; +using Application.Interfaces.UseCases.Professor; +using Application.Ports.Professor; -namespace Domain.UseCases.Interactors.Professor +namespace Application.UseCases.Professor { public class GetProfessors : IGetProfessors { @@ -19,7 +19,7 @@ public GetProfessors(IProfessorRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs b/src/Application/UseCases/Professor/UpdateProfessor.cs similarity index 84% rename from src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs rename to src/Application/UseCases/Professor/UpdateProfessor.cs index ea67d456..f3b5697c 100644 --- a/src/Domain/UseCases/Interactors/Professor/UpdateProfessor.cs +++ b/src/Application/UseCases/Professor/UpdateProfessor.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Professor; -using Domain.UseCases.Ports.Professor; -using Domain.Validation; +using Application.Interfaces.UseCases.Professor; +using Application.Ports.Professor; +using Application.Validation; -namespace Domain.UseCases.Interactors.Professor +namespace Application.UseCases.Professor { public class UpdateProfessor : IUpdateProfessor { @@ -24,8 +24,8 @@ public async Task ExecuteAsync(Guid? id, UpdateProf UseCaseException.NotInformedParam(id is null, nameof(id)); // Recupera entidade que será atualizada - Entities.Professor professor = await _professorRepository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Professor)); + var professor = await _professorRepository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Professor)); // Verifica se a entidade foi excluída if (professor.DeletedAt != null) diff --git a/src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs b/src/Application/UseCases/ProgramType/CreateProgramType.cs similarity index 63% rename from src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs rename to src/Application/UseCases/ProgramType/CreateProgramType.cs index 36d36bed..73ae0669 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/CreateProgramType.cs +++ b/src/Application/UseCases/ProgramType/CreateProgramType.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.ProgramType; -using Domain.UseCases.Ports.ProgramType; -using Domain.Validation; +using Application.Interfaces.UseCases.ProgramType; +using Application.Ports.ProgramType; +using Application.Validation; -namespace Domain.UseCases.Interactors.ProgramType +namespace Application.UseCases.ProgramType { public class CreateProgramType : ICreateProgramType { @@ -24,14 +24,11 @@ public async Task ExecuteAsync(CreateProgramTypeI UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Name), nameof(model.Name)); // Verifica se já existe um tipo de programa com o nome indicado - Entities.ProgramType? entity = await _repository.GetProgramTypeByNameAsync(model.Name!); - if (entity != null) - { - throw UseCaseException.BusinessRuleViolation("Já existe um Tipo de Programa para o nome informado."); - } + var entity = await _repository.GetProgramTypeByNameAsync(model.Name!); + UseCaseException.BusinessRuleViolation(entity != null, "Já existe um Tipo de Programa para o nome informado."); // Cria entidade - entity = await _repository.CreateAsync(_mapper.Map(model)); + entity = await _repository.CreateAsync(_mapper.Map(model)); // Salva entidade no banco return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs b/src/Application/UseCases/ProgramType/DeleteProgramType.cs similarity index 77% rename from src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs rename to src/Application/UseCases/ProgramType/DeleteProgramType.cs index 58bf63b6..0cef52c0 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/DeleteProgramType.cs +++ b/src/Application/UseCases/ProgramType/DeleteProgramType.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.ProgramType; -using Domain.UseCases.Ports.ProgramType; -using Domain.Validation; +using Application.Interfaces.UseCases.ProgramType; +using Application.Ports.ProgramType; +using Application.Validation; -namespace Domain.UseCases.Interactors.ProgramType +namespace Application.UseCases.ProgramType { public class DeleteProgramType : IDeleteProgramType { @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.ProgramType model = await _repository.DeleteAsync(id); + var model = await _repository.DeleteAsync(id); // Retorna o tipo de programa removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs b/src/Application/UseCases/ProgramType/GetProgramTypeById.cs similarity index 74% rename from src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs rename to src/Application/UseCases/ProgramType/GetProgramTypeById.cs index 41194cac..1dc9091a 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypeById.cs +++ b/src/Application/UseCases/ProgramType/GetProgramTypeById.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.ProgramType; -using Domain.UseCases.Ports.ProgramType; -using Domain.Validation; +using Application.Interfaces.UseCases.ProgramType; +using Application.Ports.ProgramType; +using Application.Validation; -namespace Domain.UseCases.Interactors.ProgramType +namespace Application.UseCases.ProgramType { public class GetProgramTypeById : IGetProgramTypeById { @@ -21,7 +21,7 @@ public GetProgramTypeById(IProgramTypeRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.ProgramType? entity = await _repository.GetByIdAsync(id); + var entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs b/src/Application/UseCases/ProgramType/GetProgramTypes.cs similarity index 71% rename from src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs rename to src/Application/UseCases/ProgramType/GetProgramTypes.cs index bf8cecea..eab38a74 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/GetProgramTypes.cs +++ b/src/Application/UseCases/ProgramType/GetProgramTypes.cs @@ -1,9 +1,9 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.ProgramType; -using Domain.UseCases.Ports.ProgramType; +using Application.Interfaces.UseCases.ProgramType; +using Application.Ports.ProgramType; -namespace Domain.UseCases.Interactors.ProgramType +namespace Application.UseCases.ProgramType { public class GetProgramTypes : IGetProgramTypes { @@ -19,7 +19,7 @@ public GetProgramTypes(IProgramTypeRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs b/src/Application/UseCases/ProgramType/UpdateProgramType.cs similarity index 83% rename from src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs rename to src/Application/UseCases/ProgramType/UpdateProgramType.cs index 2d066b0e..b7debd04 100644 --- a/src/Domain/UseCases/Interactors/ProgramType/UpdateProgramType.cs +++ b/src/Application/UseCases/ProgramType/UpdateProgramType.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.ProgramType; -using Domain.UseCases.Ports.ProgramType; -using Domain.Validation; +using Application.Interfaces.UseCases.ProgramType; +using Application.Ports.ProgramType; +using Application.Validation; -namespace Domain.UseCases.Interactors.ProgramType +namespace Application.UseCases.ProgramType { public class UpdateProgramType : IUpdateProgramType { @@ -27,8 +27,8 @@ public async Task ExecuteAsync(Guid? id, UpdatePr UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Name), nameof(input.Name)); // Recupera entidade que será atualizada - Entities.ProgramType entity = await _repository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); + var entity = await _repository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.ProgramType)); // Verifica se a entidade foi excluída UseCaseException.BusinessRuleViolation(entity.DeletedAt != null, "O Tipo de Programa informado já foi excluído."); @@ -44,7 +44,7 @@ public async Task ExecuteAsync(Guid? id, UpdatePr entity.Description = input.Description; // Salva entidade atualizada no banco - Entities.ProgramType model = await _repository.UpdateAsync(entity); + var model = await _repository.UpdateAsync(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Interactors/Project/AppealProject.cs b/src/Application/UseCases/Project/AppealProject.cs similarity index 89% rename from src/Domain/UseCases/Interactors/Project/AppealProject.cs rename to src/Application/UseCases/Project/AppealProject.cs index 5749087a..2136d614 100644 --- a/src/Domain/UseCases/Interactors/Project/AppealProject.cs +++ b/src/Application/UseCases/Project/AppealProject.cs @@ -1,11 +1,11 @@ using AutoMapper; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Project; -using Domain.UseCases.Ports.Project; -using Domain.Validation; +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Validation; -namespace Domain.UseCases.Interactors.Project +namespace Application.UseCases.Project { public class AppealProject : IAppealProject { @@ -30,8 +30,8 @@ public async Task ExecuteAsync(Guid? projectId, string nameof(appealDescription)); // Verifica se o projeto existe - Entities.Project project = await _projectRepository.GetByIdAsync(projectId!.Value) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + var project = await _projectRepository.GetByIdAsync(projectId!.Value) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Project)); // Verifica se o projeto está em recurso if (project.Status == EProjectStatus.Rejected) diff --git a/src/Domain/UseCases/Interactors/Project/CancelProject.cs b/src/Application/UseCases/Project/CancelProject.cs similarity index 85% rename from src/Domain/UseCases/Interactors/Project/CancelProject.cs rename to src/Application/UseCases/Project/CancelProject.cs index 8b3b8d4b..5f1c2c5e 100644 --- a/src/Domain/UseCases/Interactors/Project/CancelProject.cs +++ b/src/Application/UseCases/Project/CancelProject.cs @@ -1,11 +1,11 @@ using AutoMapper; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Project; -using Domain.UseCases.Ports.Project; -using Domain.Validation; +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Validation; -namespace Domain.UseCases.Interactors.Project +namespace Application.UseCases.Project { public class CancelProject : ICancelProject { @@ -23,8 +23,8 @@ public CancelProject(IProjectRepository projectRepository, public async Task ExecuteAsync(Guid? id, string? observation) { // Verifica se o projeto existe - Entities.Project project = await _projectRepository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + var project = await _projectRepository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Project)); // Verifica se o projeto já não foi cancelado ou está encerrado UseCaseException.BusinessRuleViolation( diff --git a/src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs b/src/Application/UseCases/Project/GetClosedProjects.cs similarity index 70% rename from src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs rename to src/Application/UseCases/Project/GetClosedProjects.cs index e0685cc0..f7a61678 100644 --- a/src/Domain/UseCases/Interactors/Project/GetClosedProjects.cs +++ b/src/Application/UseCases/Project/GetClosedProjects.cs @@ -1,12 +1,12 @@ using AutoMapper; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.Project; -using Domain.UseCases.Ports.Project; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Validation; -namespace Domain.UseCases.Interactors.Project +namespace Application.UseCases.Project { public class GetClosedProjects : IGetClosedProjects { @@ -27,7 +27,7 @@ public GetClosedProjects(IProjectRepository projectRepository, public async Task> ExecuteAsync(int skip, int take, bool onlyMyProjects = true) { // Obtém as claims do usuário autenticado. - Ports.Auth.UserClaimsOutput? userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Se o usuário não estiver autenticado, lança uma exceção. UseCaseException.BusinessRuleViolation(userClaims == null || userClaims.Role == null, @@ -37,27 +37,27 @@ public async Task> ExecuteAsync(int skip, int ta ERole userRole = Enum.Parse(userClaims?.Role!); // Obtém a lista de projetos de acordo com o tipo de usuário. - IEnumerable projects; + IEnumerable projects; // Se o usuário for um professor, retorna apenas os seus projetos. if (userRole == ERole.PROFESSOR) { - projects = (IEnumerable)await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id, true); + projects = await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id, true); } // Se o usuário for um aluno, retorna apenas os seus projetos. else if (userRole == ERole.STUDENT) { - projects = (IEnumerable)await _projectRepository.GetStudentProjectsAsync(skip, take, userClaims?.Id, true); + projects = await _projectRepository.GetStudentProjectsAsync(skip, take, userClaims?.Id, true); } // Se o usuário for um administrador, permite a busca apenas pelo seu ID. else { projects = userRole == ERole.ADMIN && onlyMyProjects - ? (IEnumerable)await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id, true) + ? await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id, true) : userRole == ERole.ADMIN && !onlyMyProjects - ? (IEnumerable)await _projectRepository.GetProjectsAsync(skip, take, true) + ? await _projectRepository.GetProjectsAsync(skip, take, true) : throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); } diff --git a/src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs b/src/Application/UseCases/Project/GetOpenProjects.cs similarity index 71% rename from src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs rename to src/Application/UseCases/Project/GetOpenProjects.cs index 88dc029f..e352a9f1 100644 --- a/src/Domain/UseCases/Interactors/Project/GetOpenProjects.cs +++ b/src/Application/UseCases/Project/GetOpenProjects.cs @@ -1,12 +1,12 @@ using AutoMapper; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.Project; -using Domain.UseCases.Ports.Project; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Validation; -namespace Domain.UseCases.Interactors.Project +namespace Application.UseCases.Project { public class GetOpenProjects : IGetOpenProjects { @@ -27,7 +27,7 @@ public GetOpenProjects(IProjectRepository projectRepository, public async Task> ExecuteAsync(int skip, int take, bool onlyMyProjects = true) { // Obtém as claims do usuário autenticado. - Ports.Auth.UserClaimsOutput? userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Se o usuário não estiver autenticado, lança uma exceção. UseCaseException.BusinessRuleViolation(userClaims == null || userClaims.Role == null, @@ -37,27 +37,27 @@ public async Task> ExecuteAsync(int skip, int ta ERole userRole = Enum.Parse(userClaims?.Role!); // Obtém a lista de projetos de acordo com o tipo de usuário. - IEnumerable projects; + IEnumerable projects; // Se o usuário for um professor, retorna apenas os seus projetos. if (userRole == ERole.PROFESSOR) { - projects = (IEnumerable)await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id); + projects = await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id); } // Se o usuário for um aluno, retorna apenas os seus projetos. else if (userRole == ERole.STUDENT) { - projects = (IEnumerable)await _projectRepository.GetStudentProjectsAsync(skip, take, userClaims?.Id); + projects = await _projectRepository.GetStudentProjectsAsync(skip, take, userClaims?.Id); } // Se o usuário for um administrador, permite a busca apenas pelo seu ID. else { projects = userRole == ERole.ADMIN && onlyMyProjects - ? (IEnumerable)await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id) + ? await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id) : userRole == ERole.ADMIN && !onlyMyProjects - ? (IEnumerable)await _projectRepository.GetProjectsAsync(skip, take) + ? await _projectRepository.GetProjectsAsync(skip, take) : throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); } diff --git a/src/Domain/UseCases/Interactors/Project/GetProjectById.cs b/src/Application/UseCases/Project/GetProjectById.cs similarity index 76% rename from src/Domain/UseCases/Interactors/Project/GetProjectById.cs rename to src/Application/UseCases/Project/GetProjectById.cs index aa5d2ac3..da565974 100644 --- a/src/Domain/UseCases/Interactors/Project/GetProjectById.cs +++ b/src/Application/UseCases/Project/GetProjectById.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Project; -using Domain.UseCases.Ports.Project; -using Domain.Validation; +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Validation; -namespace Domain.UseCases.Interactors.Project +namespace Application.UseCases.Project { public class GetProjectById : IGetProjectById { @@ -22,8 +22,8 @@ public GetProjectById(IProjectRepository projectRepository, public async Task ExecuteAsync(Guid? id) { // Busca projeto pelo Id informado - Entities.Project project = await _projectRepository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + var project = await _projectRepository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Project)); // Mapeia entidade para output e retorna return _mapper.Map(project); diff --git a/src/Domain/UseCases/Interactors/Project/OpenProject.cs b/src/Application/UseCases/Project/OpenProject.cs similarity index 81% rename from src/Domain/UseCases/Interactors/Project/OpenProject.cs rename to src/Application/UseCases/Project/OpenProject.cs index 7fdb483d..81c29608 100644 --- a/src/Domain/UseCases/Interactors/Project/OpenProject.cs +++ b/src/Application/UseCases/Project/OpenProject.cs @@ -1,11 +1,11 @@ using AutoMapper; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Project; -using Domain.UseCases.Ports.Project; -using Domain.Validation; +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Validation; -namespace Domain.UseCases.Interactors.Project +namespace Application.UseCases.Project { public class OpenProject : IOpenProject { @@ -44,7 +44,7 @@ public OpenProject(IProjectRepository projectRepository, public async Task ExecuteAsync(OpenProjectInput input) { // Mapeia input para entidade e realiza validação dos campos informados - Entities.Project project = new( + Domain.Entities.Project project = new( input.Title, input.KeyWord1, input.KeyWord2, @@ -68,8 +68,8 @@ public async Task ExecuteAsync(OpenProjectInput input) null); // Verifica se Edital existe - Entities.Notice notice = await _noticeRepository.GetByIdAsync(project.NoticeId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Notice)); + var notice = await _noticeRepository.GetByIdAsync(project.NoticeId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Notice)); // Verifica se o período do edital é válido if (notice.RegistrationStartDate > DateTime.UtcNow || notice.RegistrationEndDate < DateTime.UtcNow) @@ -79,25 +79,25 @@ public async Task ExecuteAsync(OpenProjectInput input) // Verifica se a Subárea existe _ = await _subAreaRepository.GetByIdAsync(project.SubAreaId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.SubArea)); // Verifica se o Tipo de Programa existe _ = await _programTypeRepository.GetByIdAsync(project.ProgramTypeId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.ProgramType)); // Verifica se o Professor existe _ = await _professorRepository.GetByIdAsync(project.ProfessorId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Professor)); + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Professor)); // Caso tenha sido informado algum aluno no processo de abertura do projeto if (project.StudentId.HasValue) { // Verifica se o aluno existe - Entities.Student student = await _studentRepository.GetByIdAsync(project.StudentId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); + var student = await _studentRepository.GetByIdAsync(project.StudentId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Student)); // Verifica se o aluno já está em um projeto - IEnumerable studentProjects = await _projectRepository.GetStudentProjectsAsync(0, 1, student.Id); + var studentProjects = await _projectRepository.GetStudentProjectsAsync(0, 1, student.Id); if (studentProjects.Any()) { throw UseCaseException.BusinessRuleViolation("Aluno já está em um projeto."); @@ -111,22 +111,22 @@ public async Task ExecuteAsync(OpenProjectInput input) } // Obtém atividades do Edital - IList noticeActivities = await _activityTypeRepository.GetByNoticeIdAsync(notice.Id); + var noticeActivities = await _activityTypeRepository.GetByNoticeIdAsync(notice.Id); // Valida se todas as atividades do projeto foram informadas corretamente - List newProjectActivities = new(); - foreach (Entities.ActivityType activityType in noticeActivities) + List newProjectActivities = new(); + foreach (var activityType in noticeActivities) { // Verifica se as atividades que o professor informou existem no edital // e se todas as atividades do edital foram informadas. - foreach (Entities.Activity activity in activityType.Activities!) + foreach (var activity in activityType.Activities!) { // Verifica se professor informou valor para essa atividade do edital - Ports.ProjectActivity.CreateProjectActivityInput inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) + var inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) ?? throw UseCaseException.BusinessRuleViolation($"Não foi informado valor para a atividade {activity.Name}."); // Adiciona atividade do projeto na lista para ser criada posteriormente - newProjectActivities.Add(new Entities.ProjectActivity( + newProjectActivities.Add(new Domain.Entities.ProjectActivity( Guid.Empty, // Id do projeto será gerado na etapa seguinte inputActivity.ActivityId, inputActivity.InformedActivities, @@ -138,7 +138,7 @@ public async Task ExecuteAsync(OpenProjectInput input) project = await _projectRepository.CreateAsync(project); // Cria as atividades do projeto - foreach (Entities.ProjectActivity projectActivity in newProjectActivities) + foreach (var projectActivity in newProjectActivities) { projectActivity.ProjectId = project.Id; _ = await _projectActivityRepository.CreateAsync(projectActivity); diff --git a/src/Domain/UseCases/Interactors/Project/SubmitProject.cs b/src/Application/UseCases/Project/SubmitProject.cs similarity index 88% rename from src/Domain/UseCases/Interactors/Project/SubmitProject.cs rename to src/Application/UseCases/Project/SubmitProject.cs index 898807d7..8e96f992 100644 --- a/src/Domain/UseCases/Interactors/Project/SubmitProject.cs +++ b/src/Application/UseCases/Project/SubmitProject.cs @@ -1,11 +1,11 @@ using AutoMapper; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Project; -using Domain.UseCases.Ports.Project; -using Domain.Validation; +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Validation; -namespace Domain.UseCases.Interactors.Project +namespace Application.UseCases.Project { public class SubmitProject : ISubmitProject { @@ -26,8 +26,8 @@ public async Task ExecuteAsync(Guid? projectId) UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); // Verifica se o projeto existe - Entities.Project project = await _projectRepository.GetByIdAsync(projectId!.Value) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + var project = await _projectRepository.GetByIdAsync(projectId!.Value) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Project)); // Verifica se edital está em fase de inscrição UseCaseException.BusinessRuleViolation(project.Notice?.RegistrationStartDate > DateTime.UtcNow || project.Notice?.RegistrationEndDate < DateTime.UtcNow, diff --git a/src/Domain/UseCases/Interactors/Project/UpdateProject.cs b/src/Application/UseCases/Project/UpdateProject.cs similarity index 80% rename from src/Domain/UseCases/Interactors/Project/UpdateProject.cs rename to src/Application/UseCases/Project/UpdateProject.cs index 95577ae7..e68570c9 100644 --- a/src/Domain/UseCases/Interactors/Project/UpdateProject.cs +++ b/src/Application/UseCases/Project/UpdateProject.cs @@ -1,11 +1,11 @@ using AutoMapper; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Project; -using Domain.UseCases.Ports.Project; -using Domain.Validation; +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Validation; -namespace Domain.UseCases.Interactors.Project +namespace Application.UseCases.Project { public class UpdateProject : IUpdateProject { @@ -47,8 +47,8 @@ public async Task ExecuteAsync(Guid? id, UpdateProject UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se o projeto existe - Entities.Project project = await _projectRepository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + var project = await _projectRepository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Project)); // Verifica se o edital está no período de inscrições if (project.Notice!.RegistrationStartDate > DateTime.UtcNow || project.Notice?.RegistrationEndDate < DateTime.UtcNow) @@ -63,25 +63,25 @@ public async Task ExecuteAsync(Guid? id, UpdateProject if (input.SubAreaId != project.SubAreaId) { _ = await _subAreaRepository.GetByIdAsync(input.SubAreaId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.SubArea)); } // Verifica se o novo Tipo de Programa existe if (input.ProgramTypeId != project.ProgramTypeId) { _ = await _programTypeRepository.GetByIdAsync(input.ProgramTypeId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProgramType)); + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.ProgramType)); } // Caso tenha sido informado algum aluno no processo de abertura do projeto if (input.StudentId.HasValue && input.StudentId != project.StudentId) { // Verifica se o aluno existe - Entities.Student student = await _studentRepository.GetByIdAsync(input.StudentId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); + var student = await _studentRepository.GetByIdAsync(input.StudentId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Student)); // Verifica se o aluno já está em um projeto - IEnumerable studentProjects = await _projectRepository.GetStudentProjectsAsync(0, 1, student.Id); + var studentProjects = await _projectRepository.GetStudentProjectsAsync(0, 1, student.Id); UseCaseException.BusinessRuleViolation(studentProjects.Any(), "Student is already on a project."); } @@ -106,25 +106,25 @@ public async Task ExecuteAsync(Guid? id, UpdateProject } // Obtém atividades do Edital - IList noticeActivities = await _activityTypeRepository.GetByNoticeIdAsync(project.Notice!.Id); + var noticeActivities = await _activityTypeRepository.GetByNoticeIdAsync(project.Notice!.Id); // Obtém atividades do projeto - IList projectActivities = await _projectActivityRepository.GetByProjectIdAsync(project.Id); + var projectActivities = await _projectActivityRepository.GetByProjectIdAsync(project.Id); // Valida se todas as atividades do projeto foram informadas corretamente - List updateProjectActivities = new(); - foreach (Entities.ActivityType activityType in noticeActivities) + List updateProjectActivities = new(); + foreach (var activityType in noticeActivities) { // Verifica se as atividades que o professor informou existem no edital // e se todas as atividades do edital foram informadas. - foreach (Entities.Activity activity in activityType.Activities!) + foreach (var activity in activityType.Activities!) { // Verifica se professor informou valor para essa atividade do edital - Ports.ProjectActivity.UpdateProjectActivityInput inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) + var inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) ?? throw UseCaseException.BusinessRuleViolation($"Não foi informado valor para a atividade {activity.Name}."); // Obtém atividade do projeto - Entities.ProjectActivity? updateProjectActivity = projectActivities.FirstOrDefault(x => x.ActivityId == activity.Id); + var updateProjectActivity = projectActivities.FirstOrDefault(x => x.ActivityId == activity.Id); // Atualiza valores da entidade updateProjectActivity!.InformedActivities = inputActivity.InformedActivities; @@ -138,7 +138,7 @@ public async Task ExecuteAsync(Guid? id, UpdateProject _ = await _projectRepository.UpdateAsync(project); // Atualiza atividades do projeto no banco - foreach (Entities.ProjectActivity projectActivity in updateProjectActivities) + foreach (var projectActivity in updateProjectActivities) { _ = await _projectActivityRepository.UpdateAsync(projectActivity); } diff --git a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs b/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs similarity index 86% rename from src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs rename to src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs index edf05964..2e0060d4 100644 --- a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs @@ -1,13 +1,13 @@ using AutoMapper; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.ProjectEvaluation; -using Domain.UseCases.Ports.Project; -using Domain.UseCases.Ports.ProjectEvaluation; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.ProjectEvaluation; +using Application.Ports.Project; +using Application.Ports.ProjectEvaluation; +using Application.Validation; -namespace Domain.UseCases.Interactors.ProjectEvaluation +namespace Application.UseCases.ProjectEvaluation { public class EvaluateAppealProject : IEvaluateAppealProject { @@ -34,19 +34,19 @@ public EvaluateAppealProject(IMapper mapper, public async Task ExecuteAsync(EvaluateAppealProjectInput input) { // Obtém informações do usuário logado. - Ports.Auth.UserClaimsOutput user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Verifica se o usuário logado é um avaliador. UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN.GetDescription() || user.Role != ERole.PROFESSOR.GetDescription(), "O usuário não é um avaliador."); // Busca avaliação do projeto pelo Id. - Entities.ProjectEvaluation? projectEvaluation = await _projectEvaluationRepository.GetByProjectIdAsync(input.ProjectId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.ProjectEvaluation)); + var projectEvaluation = await _projectEvaluationRepository.GetByProjectIdAsync(input.ProjectId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.ProjectEvaluation)); // Recupera projeto pelo Id. - Entities.Project project = await _projectRepository.GetByIdAsync(input.ProjectId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + var project = await _projectRepository.GetByIdAsync(input.ProjectId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Project)); // Verifica se o avaliador é o professor orientador do projeto. UseCaseException.BusinessRuleViolation(projectEvaluation.Project?.ProfessorId == user.Id, @@ -100,7 +100,7 @@ await _emailService.SendProjectNotificationEmailAsync( projectEvaluation.SubmissionEvaluationDescription); // Atualiza projeto. - Entities.Project output = await _projectRepository.UpdateAsync(project); + var output = await _projectRepository.UpdateAsync(project); // Mapeia dados de saída e retorna. return _mapper.Map(output); diff --git a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs similarity index 81% rename from src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs rename to src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs index 65e1e293..4f0cc5a2 100644 --- a/src/Domain/UseCases/Interactors/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -1,13 +1,13 @@ using AutoMapper; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.ProjectEvaluation; -using Domain.UseCases.Ports.Project; -using Domain.UseCases.Ports.ProjectEvaluation; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.ProjectEvaluation; +using Application.Ports.Project; +using Application.Ports.ProjectEvaluation; +using Application.Validation; -namespace Domain.UseCases.Interactors.ProjectEvaluation +namespace Application.UseCases.ProjectEvaluation { public class EvaluateSubmissionProject : IEvaluateSubmissionProject { @@ -40,7 +40,7 @@ public EvaluateSubmissionProject(IMapper mapper, public async Task ExecuteAsync(EvaluateSubmissionProjectInput input) { // Obtém informações do usuário logado. - Ports.Auth.UserClaimsOutput user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Verifica se o usuário logado é um avaliador. UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN.GetDescription() @@ -48,13 +48,13 @@ public async Task ExecuteAsync(EvaluateSubmissionProj "O usuário não é um avaliador."); // Verifica se já existe alguma avaliação para o projeto. - Entities.ProjectEvaluation? projectEvaluation = await _projectEvaluationRepository.GetByProjectIdAsync(input.ProjectId); + var projectEvaluation = await _projectEvaluationRepository.GetByProjectIdAsync(input.ProjectId); UseCaseException.BusinessRuleViolation(projectEvaluation != null, "Projeto já avaliado."); // Busca projeto pelo Id. - Entities.Project project = await _projectRepository.GetByIdAsync(input.ProjectId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + var project = await _projectRepository.GetByIdAsync(input.ProjectId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Project)); // Verifica se o avaliador é o professor orientador do projeto. UseCaseException.BusinessRuleViolation(project.ProfessorId == user.Id, @@ -73,7 +73,7 @@ public async Task ExecuteAsync(EvaluateSubmissionProj nameof(input.SubmissionEvaluationStatus)); // Mapeia dados de entrada para entidade. - projectEvaluation = new Entities.ProjectEvaluation(input.ProjectId, + projectEvaluation = new Domain.Entities.ProjectEvaluation(input.ProjectId, input.IsProductivityFellow, user.Id, // Id do avaliador logado. TryCastEnum(input.SubmissionEvaluationStatus), @@ -87,25 +87,25 @@ public async Task ExecuteAsync(EvaluateSubmissionProj 0); // Obtém atividades do Edital - IList noticeActivities = (IList)await _activityTypeRepository.GetByNoticeIdAsync(project.Notice!.Id); + var noticeActivities = await _activityTypeRepository.GetByNoticeIdAsync(project.Notice!.Id); // Obtém atividades do projeto - IList projectActivities = await _projectActivityRepository.GetByProjectIdAsync(project.Id); + var projectActivities = await _projectActivityRepository.GetByProjectIdAsync(project.Id); // Valida se todas as atividades do projeto foram informadas corretamente - List updateProjectActivities = new(); - foreach (Entities.ActivityType activityType in noticeActivities) + List updateProjectActivities = new(); + foreach (var activityType in noticeActivities) { // Verifica se as atividades que o professor informou existem no edital // e se todas as atividades do edital foram informadas. - foreach (Entities.Activity activity in activityType.Activities!) + foreach (var activity in activityType.Activities!) { // Verifica se professor informou valor para essa atividade do edital - Ports.ProjectActivity.EvaluateProjectActivityInput inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) + var inputActivity = input.Activities!.FirstOrDefault(x => x.ActivityId == activity.Id) ?? throw UseCaseException.BusinessRuleViolation($"Não foi informado valor para a atividade {activity.Name}."); // Obtém atividade do projeto - Entities.ProjectActivity? updateProjectActivity = projectActivities.FirstOrDefault(x => x.ActivityId == activity.Id); + var updateProjectActivity = projectActivities.FirstOrDefault(x => x.ActivityId == activity.Id); // Atualiza valores da entidade updateProjectActivity!.FoundActivities = inputActivity.FoundActivities; @@ -145,7 +145,7 @@ await _emailService.SendProjectNotificationEmailAsync( projectEvaluation.SubmissionEvaluationDescription); // Atualiza projeto. - Entities.Project output = await _projectRepository.UpdateAsync(project); + var output = await _projectRepository.UpdateAsync(project); // Mapeia dados de saída e retorna. return _mapper.Map(output); diff --git a/src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs b/src/Application/UseCases/ProjectEvaluation/GetEvaluationByProjectId.cs similarity index 77% rename from src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs rename to src/Application/UseCases/ProjectEvaluation/GetEvaluationByProjectId.cs index 44a7ffbd..a04c84c3 100644 --- a/src/Domain/UseCases/Interactors/ProjectEvaluation/GetEvaluationByProjectId.cs +++ b/src/Application/UseCases/ProjectEvaluation/GetEvaluationByProjectId.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.ProjectEvaluation; -using Domain.UseCases.Ports.ProjectEvaluation; -using Domain.Validation; +using Application.Interfaces.UseCases.ProjectEvaluation; +using Application.Ports.ProjectEvaluation; +using Application.Validation; -namespace Domain.UseCases.Interactors.ProjectEvaluation +namespace Application.UseCases.ProjectEvaluation { public class GetEvaluationByProjectId : IGetEvaluationByProjectId { @@ -25,7 +25,7 @@ public async Task ExecuteAsync(Guid? projec UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); // Obtém a avaliação do projeto pelo Id do projeto. - Entities.ProjectEvaluation? entity = await _repository.GetByProjectIdAsync(projectId); + var entity = await _repository.GetByProjectIdAsync(projectId); // Converte e retorna o resultado. return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/ProjectReport/CreateProjectReport.cs b/src/Application/UseCases/ProjectReport/CreateProjectReport.cs similarity index 83% rename from src/Domain/UseCases/Interactors/ProjectReport/CreateProjectReport.cs rename to src/Application/UseCases/ProjectReport/CreateProjectReport.cs index 0b139a12..89a59178 100644 --- a/src/Domain/UseCases/Interactors/ProjectReport/CreateProjectReport.cs +++ b/src/Application/UseCases/ProjectReport/CreateProjectReport.cs @@ -1,12 +1,11 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.Ports.ProjectReport; -using Domain.UseCases.Interfaces.ProjectReport; -using Domain.UseCases.Ports.ProjectReport; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Ports.ProjectReport; +using Application.Interfaces.UseCases.ProjectReport; +using Application.Validation; -namespace Domain.UseCases.Interactors.ProjectReport +namespace Application.UseCases.ProjectReport { public class CreateProjectReport : ICreateProjectReport { @@ -33,28 +32,28 @@ public CreateProjectReport(IProjectReportRepository projectReportRepository, public async Task ExecuteAsync(CreateProjectReportInput input) { // Cria entidade a partir do modelo - Entities.ProjectReport report = new( - TryCastEnum(input.ReportType), + Domain.Entities.ProjectReport report = new( + TryCastEnum(input.ReportType), input.ProjectId ); // Obtém usuário logado - Ports.Auth.UserClaimsOutput user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Verifica se o projeto existe - Entities.Project project = await _projectRepository.GetByIdAsync(report.ProjectId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + Domain.Entities.Project project = await _projectRepository.GetByIdAsync(report.ProjectId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Project)); // Verifica se o projeto foi excluído UseCaseException.BusinessRuleViolation(project.DeletedAt != null, "O projeto informado já foi removido."); // Verifica se o projeto está em andamento - UseCaseException.BusinessRuleViolation(project.Status != Entities.Enums.EProjectStatus.Started, + UseCaseException.BusinessRuleViolation(project.Status != Domain.Entities.Enums.EProjectStatus.Started, "O projeto informado não está em andamento."); // Verifica se o relatório está sendo enviado dentro do prazo - var isBeforeDeadline = report.ReportType == Entities.Enums.EReportType.Final + var isBeforeDeadline = report.ReportType == Domain.Entities.Enums.EReportType.Final ? project.Notice?.FinalReportDeadline < DateTime.UtcNow : project.Notice?.PartialReportDeadline < DateTime.UtcNow; diff --git a/src/Domain/UseCases/Interactors/ProjectReport/DeleteProjectReport.cs b/src/Application/UseCases/ProjectReport/DeleteProjectReport.cs similarity index 76% rename from src/Domain/UseCases/Interactors/ProjectReport/DeleteProjectReport.cs rename to src/Application/UseCases/ProjectReport/DeleteProjectReport.cs index 9ee9b9c7..e4c9a1f7 100644 --- a/src/Domain/UseCases/Interactors/ProjectReport/DeleteProjectReport.cs +++ b/src/Application/UseCases/ProjectReport/DeleteProjectReport.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.ProjectReport; -using Domain.UseCases.Ports.ProjectReport; -using Domain.Validation; +using Application.Interfaces.UseCases.ProjectReport; +using Application.Ports.ProjectReport; +using Application.Validation; -namespace Domain.UseCases.Interactors.ProjectReport +namespace Application.UseCases.ProjectReport { public class DeleteProjectReport : IDeleteProjectReport { @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.ProjectReport model = await _repository.DeleteAsync(id); + Domain.Entities.ProjectReport model = await _repository.DeleteAsync(id); // Retorna o curso removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/ProjectReport/GetProjectReportById.cs b/src/Application/UseCases/ProjectReport/GetProjectReportById.cs similarity index 73% rename from src/Domain/UseCases/Interactors/ProjectReport/GetProjectReportById.cs rename to src/Application/UseCases/ProjectReport/GetProjectReportById.cs index 9f431ced..854884d4 100644 --- a/src/Domain/UseCases/Interactors/ProjectReport/GetProjectReportById.cs +++ b/src/Application/UseCases/ProjectReport/GetProjectReportById.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.ProjectReport; -using Domain.UseCases.Ports.ProjectReport; -using Domain.Validation; +using Application.Interfaces.UseCases.ProjectReport; +using Application.Ports.ProjectReport; +using Application.Validation; -namespace Domain.UseCases.Interactors.ProjectReport +namespace Application.UseCases.ProjectReport { public class GetProjectReportById : IGetProjectReportById { @@ -21,8 +21,7 @@ public GetProjectReportById(IProjectReportRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - - Entities.ProjectReport? entity = await _repository.GetByIdAsync(id); + Domain.Entities.ProjectReport? entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/ProjectReport/UpdateProjectReport.cs b/src/Application/UseCases/ProjectReport/UpdateProjectReport.cs similarity index 82% rename from src/Domain/UseCases/Interactors/ProjectReport/UpdateProjectReport.cs rename to src/Application/UseCases/ProjectReport/UpdateProjectReport.cs index 278c5757..7a5ef60f 100644 --- a/src/Domain/UseCases/Interactors/ProjectReport/UpdateProjectReport.cs +++ b/src/Application/UseCases/ProjectReport/UpdateProjectReport.cs @@ -1,11 +1,11 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.ProjectReport; -using Domain.UseCases.Ports.ProjectReport; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.ProjectReport; +using Application.Ports.ProjectReport; +using Application.Validation; -namespace Domain.UseCases.Interactors.ProjectReport +namespace Application.UseCases.ProjectReport { public class UpdateProjectReport : IUpdateProjectReport { @@ -38,30 +38,30 @@ public async Task ExecuteAsync(Guid? id, Update UseCaseException.NotInformedParam(input.ReportFile is null, nameof(input.ReportFile)); // Obtém usuário logado - Ports.Auth.UserClaimsOutput user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Recupera entidade que será atualizada - Entities.ProjectReport report = await _projectReportRepository.GetByIdAsync(id) ?? - throw UseCaseException.NotFoundEntityById(nameof(Entities.ProjectReport)); + Domain.Entities.ProjectReport report = await _projectReportRepository.GetByIdAsync(id) ?? + throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.ProjectReport)); // Verifica se a entidade foi excluída UseCaseException.BusinessRuleViolation(report.DeletedAt != null, "O relatório informado já foi removido."); // Verifica se o projeto existe - Entities.Project project = await _projectRepository.GetByIdAsync(report.ProjectId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Project)); + Domain.Entities.Project project = await _projectRepository.GetByIdAsync(report.ProjectId) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Project)); // Verifica se o projeto foi excluído UseCaseException.BusinessRuleViolation(project.DeletedAt != null, "O projeto informado já foi removido."); // Verifica se o projeto está em andamento - UseCaseException.BusinessRuleViolation(project.Status != Entities.Enums.EProjectStatus.Started, + UseCaseException.BusinessRuleViolation(project.Status != Domain.Entities.Enums.EProjectStatus.Started, "O projeto informado não está em andamento."); // Verifica se o relatório está sendo enviado dentro do prazo - var isBeforeDeadline = report.ReportType == Entities.Enums.EReportType.Final + var isBeforeDeadline = report.ReportType == Domain.Entities.Enums.EReportType.Final ? project.Notice?.FinalReportDeadline < DateTime.UtcNow : project.Notice?.PartialReportDeadline < DateTime.UtcNow; diff --git a/src/Domain/UseCases/Interactors/Student/CreateStudent.cs b/src/Application/UseCases/Student/CreateStudent.cs similarity index 84% rename from src/Domain/UseCases/Interactors/Student/CreateStudent.cs rename to src/Application/UseCases/Student/CreateStudent.cs index 1237d975..7edde4fd 100644 --- a/src/Domain/UseCases/Interactors/Student/CreateStudent.cs +++ b/src/Application/UseCases/Student/CreateStudent.cs @@ -1,12 +1,12 @@ using AutoMapper; -using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.Student; -using Domain.UseCases.Ports.Student; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.Student; +using Application.Ports.Student; +using Application.Validation; +using Domain.Entities.Enums; -namespace Domain.UseCases.Interactors.Student +namespace Application.UseCases.Student { public class CreateStudent : ICreateStudent { @@ -39,8 +39,8 @@ public CreateStudent(IStudentRepository studentRepository, public async Task ExecuteAsync(CreateStudentInput model) { // Realiza o map da entidade e a validação dos campos informados - // var entity = _mapper.Map(input); - Entities.Student? entity = new(model.BirthDate, + // var entity = _mapper.Map(input); + Domain.Entities.Student? entity = new(model.BirthDate, model.RG, model.IssuingAgency, model.DispatchDate, @@ -61,7 +61,7 @@ public async Task ExecuteAsync(CreateStudentInput mod model.RegistrationCode); // Verifica se já existe um usuário com o e-mail informado - Entities.User? user = await _userRepository.GetUserByEmailAsync(model.Email); + Domain.Entities.User? user = await _userRepository.GetUserByEmailAsync(model.Email); UseCaseException.BusinessRuleViolation(user != null, "Já existe um usuário com o e-mail informado."); @@ -71,12 +71,12 @@ public async Task ExecuteAsync(CreateStudentInput mod "Já existe um usuário com o CPF informado."); // Verifica se curso informado existe - Entities.Course? course = await _courseRepository.GetByIdAsync(model.CourseId); + Domain.Entities.Course? course = await _courseRepository.GetByIdAsync(model.CourseId); UseCaseException.BusinessRuleViolation(course == null || course.DeletedAt != null, "Curso informado não existe."); // Verifica se campus informado existe - Entities.Campus? campus = await _campusRepository.GetByIdAsync(model.CampusId); + Domain.Entities.Campus? campus = await _campusRepository.GetByIdAsync(model.CampusId); UseCaseException.BusinessRuleViolation(campus == null || campus.DeletedAt != null, "Campus informado não existe."); @@ -87,7 +87,7 @@ public async Task ExecuteAsync(CreateStudentInput mod model.Password = _hashService.HashPassword(model.Password!); // Cria usuário - user = new Entities.User(model.Name, model.Email, model.Password, model.CPF, ERole.STUDENT); + user = new Domain.Entities.User(model.Name, model.Email, model.Password, model.CPF, ERole.STUDENT); // Adiciona usuário no banco user = await _userRepository.CreateAsync(user); diff --git a/src/Domain/UseCases/Interactors/Student/DeleteStudent.cs b/src/Application/UseCases/Student/DeleteStudent.cs similarity index 84% rename from src/Domain/UseCases/Interactors/Student/DeleteStudent.cs rename to src/Application/UseCases/Student/DeleteStudent.cs index e6a1f601..8246bf0d 100644 --- a/src/Domain/UseCases/Interactors/Student/DeleteStudent.cs +++ b/src/Application/UseCases/Student/DeleteStudent.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Student; -using Domain.UseCases.Ports.Student; -using Domain.Validation; +using Application.Interfaces.UseCases.Student; +using Application.Ports.Student; +using Application.Validation; -namespace Domain.UseCases.Interactors.Student +namespace Application.UseCases.Student { public class DeleteStudent : IDeleteStudent { @@ -26,12 +26,12 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se o estudante existe - Entities.Student? student = await _studentRepository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); + Domain.Entities.Student? student = await _studentRepository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Student)); // Verifica se o usuário existe _ = await _userRepository.GetByIdAsync(student.UserId) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.User)); // Remove o estudante student = await _studentRepository.DeleteAsync(id); diff --git a/src/Domain/UseCases/Interactors/Student/GetStudentById.cs b/src/Application/UseCases/Student/GetStudentById.cs similarity index 74% rename from src/Domain/UseCases/Interactors/Student/GetStudentById.cs rename to src/Application/UseCases/Student/GetStudentById.cs index 72b922c5..5630af5a 100644 --- a/src/Domain/UseCases/Interactors/Student/GetStudentById.cs +++ b/src/Application/UseCases/Student/GetStudentById.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Student; -using Domain.UseCases.Ports.Student; -using Domain.Validation; +using Application.Interfaces.UseCases.Student; +using Application.Ports.Student; +using Application.Validation; -namespace Domain.UseCases.Interactors.Student +namespace Application.UseCases.Student { public class GetStudentById : IGetStudentById { @@ -21,7 +21,7 @@ public GetStudentById(IStudentRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { UseCaseException.NotInformedParam(id is null, nameof(id)); - Entities.Student? entity = await _repository.GetByIdAsync(id); + Domain.Entities.Student? entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs b/src/Application/UseCases/Student/GetStudentByRegistrationCode.cs similarity index 85% rename from src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs rename to src/Application/UseCases/Student/GetStudentByRegistrationCode.cs index c9d58ba5..431fb6fd 100644 --- a/src/Domain/UseCases/Interactors/Student/GetStudentByRegistrationCode.cs +++ b/src/Application/UseCases/Student/GetStudentByRegistrationCode.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Student; -using Domain.UseCases.Ports.Student; -using Domain.Validation; +using Application.Interfaces.UseCases.Student; +using Application.Ports.Student; +using Application.Validation; -namespace Domain.UseCases.Interactors.Student +namespace Application.UseCases.Student { public class GetStudentByRegistrationCode : IGetStudentByRegistrationCode { @@ -25,7 +25,7 @@ public async Task ExecuteAsync(string? registrationCo var student = await _studentRepository.GetByRegistrationCodeAsync(registrationCode!); // Verifica se o aluno foi encontrado - UseCaseException.NotFoundEntityByParams(student is null, nameof(Entities.Student)); + UseCaseException.NotFoundEntityByParams(student is null, nameof(Domain.Entities.Student)); // Mapeia o aluno para a saída detalhada return _mapper.Map(student); diff --git a/src/Domain/UseCases/Interactors/Student/GetStudents.cs b/src/Application/UseCases/Student/GetStudents.cs similarity index 72% rename from src/Domain/UseCases/Interactors/Student/GetStudents.cs rename to src/Application/UseCases/Student/GetStudents.cs index 9d01550a..8952bfe2 100644 --- a/src/Domain/UseCases/Interactors/Student/GetStudents.cs +++ b/src/Application/UseCases/Student/GetStudents.cs @@ -1,9 +1,9 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Student; -using Domain.UseCases.Ports.Student; +using Application.Interfaces.UseCases.Student; +using Application.Ports.Student; -namespace Domain.UseCases.Interactors.Student +namespace Application.UseCases.Student { public class GetStudents : IGetStudents { @@ -19,7 +19,7 @@ public GetStudents(IStudentRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetAllAsync(skip, take); + IEnumerable entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs b/src/Application/UseCases/Student/RequestStudentRegister.cs similarity index 93% rename from src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs rename to src/Application/UseCases/Student/RequestStudentRegister.cs index 440d9c29..6202789a 100644 --- a/src/Domain/UseCases/Interactors/Student/RequestStudentRegister.cs +++ b/src/Application/UseCases/Student/RequestStudentRegister.cs @@ -1,10 +1,10 @@ using System.Text.RegularExpressions; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.Student; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.Student; +using Application.Validation; -namespace Domain.UseCases.Interactors.Student +namespace Application.UseCases.Student { public class RequestStudentRegister : IRequestStudentRegister { diff --git a/src/Domain/UseCases/Interactors/Student/UpdateStudent.cs b/src/Application/UseCases/Student/UpdateStudent.cs similarity index 89% rename from src/Domain/UseCases/Interactors/Student/UpdateStudent.cs rename to src/Application/UseCases/Student/UpdateStudent.cs index 57737918..ba74f6e8 100644 --- a/src/Domain/UseCases/Interactors/Student/UpdateStudent.cs +++ b/src/Application/UseCases/Student/UpdateStudent.cs @@ -1,11 +1,11 @@ using AutoMapper; -using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.Student; -using Domain.UseCases.Ports.Student; -using Domain.Validation; +using Application.Interfaces.UseCases.Student; +using Application.Ports.Student; +using Application.Validation; +using Domain.Entities.Enums; -namespace Domain.UseCases.Interactors.Student +namespace Application.UseCases.Student { public class UpdateStudent : IUpdateStudent { @@ -25,8 +25,8 @@ public async Task ExecuteAsync(Guid? id, UpdateStuden UseCaseException.NotInformedParam(id is null, nameof(id)); // Recupera entidade que será atualizada - Entities.Student student = await _studentRepository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.Student)); + Domain.Entities.Student student = await _studentRepository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Student)); // Verifica se a entidade foi excluída UseCaseException.BusinessRuleViolation(student.DeletedAt != null, diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs b/src/Application/UseCases/StudentDocuments/CreateStudentDocuments.cs similarity index 90% rename from src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs rename to src/Application/UseCases/StudentDocuments/CreateStudentDocuments.cs index d2c8754f..45886ebd 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/CreateStudentDocuments.cs +++ b/src/Application/UseCases/StudentDocuments/CreateStudentDocuments.cs @@ -1,12 +1,12 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.StudentDocuments; -using Domain.UseCases.Ports.StudentDocuments; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.StudentDocuments; +using Application.Ports.StudentDocuments; +using Application.Validation; using Microsoft.AspNetCore.Http; -namespace Domain.UseCases +namespace Application.UseCases.StudentDocuments { public class CreateStudentDocuments : ICreateStudentDocuments { @@ -44,15 +44,15 @@ public async Task ExecuteAsync(CreateStudent // Verifica se o projeto existe var project = await _projectRepository.GetByIdAsync(input.ProjectId!); - UseCaseException.NotFoundEntityById(project is null, nameof(Entities.Project)); + UseCaseException.NotFoundEntityById(project is null, nameof(Domain.Entities.Project)); // Verifica se o projeto se encontra em situação de submissão de documentos (Aceito) UseCaseException.BusinessRuleViolation( - project?.Status != Entities.Enums.EProjectStatus.Accepted, + project?.Status != Domain.Entities.Enums.EProjectStatus.Accepted, "O projeto não está na fase de apresentação de documentos."); // Cria entidade a partir do input informado - var entity = new Entities.StudentDocuments(input.ProjectId, input.AgencyNumber, input.AccountNumber); + var entity = new Domain.Entities.StudentDocuments(input.ProjectId, input.AgencyNumber, input.AccountNumber); // Verifica se o aluno é menor de idade if (project?.Student?.BirthDate > DateTime.UtcNow.AddYears(-18)) diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs b/src/Application/UseCases/StudentDocuments/DeleteStudentDocuments.cs similarity index 79% rename from src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs rename to src/Application/UseCases/StudentDocuments/DeleteStudentDocuments.cs index ef155ea1..5553fd90 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/DeleteStudentDocuments.cs +++ b/src/Application/UseCases/StudentDocuments/DeleteStudentDocuments.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.StudentDocuments; -using Domain.UseCases.Ports.StudentDocuments; -using Domain.Validation; +using Application.Interfaces.UseCases.StudentDocuments; +using Application.Ports.StudentDocuments; +using Application.Validation; -namespace Domain.UseCases.Interactors.StudentDocuments +namespace Application.UseCases.StudentDocuments { public class DeleteStudentDocuments : IDeleteStudentDocuments { @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.StudentDocuments model = await _repository.DeleteAsync(id); + Domain.Entities.StudentDocuments model = await _repository.DeleteAsync(id); // TODO: Verificar se seria preciso remover os documentos do aluno caso fosse removido o registro de documentos do aluno diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs b/src/Application/UseCases/StudentDocuments/GetStudentDocumentsByProjectId.cs similarity index 77% rename from src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs rename to src/Application/UseCases/StudentDocuments/GetStudentDocumentsByProjectId.cs index 435c6523..5298b280 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByProjectId.cs +++ b/src/Application/UseCases/StudentDocuments/GetStudentDocumentsByProjectId.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.StudentDocuments; -using Domain.UseCases.Ports.StudentDocuments; -using Domain.Validation; +using Application.Interfaces.UseCases.StudentDocuments; +using Application.Ports.StudentDocuments; +using Application.Validation; -namespace Domain.UseCases.Interactors.StudentDocuments +namespace Application.UseCases.StudentDocuments { public class GetStudentDocumentsByProjectId : IGetStudentDocumentsByProjectId { @@ -26,7 +26,7 @@ public async Task ExecuteAsync(Guid? projectI UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); // Busca documentos do estudante pelo id do projeto - Entities.StudentDocuments? entity = await _repository.GetByProjectIdAsync(projectId); + Domain.Entities.StudentDocuments? entity = await _repository.GetByProjectIdAsync(projectId); // Retorna entidade mapeada return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs b/src/Application/UseCases/StudentDocuments/GetStudentDocumentsByStudentId.cs similarity index 77% rename from src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs rename to src/Application/UseCases/StudentDocuments/GetStudentDocumentsByStudentId.cs index a35275c4..002eea1c 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/GetStudentDocumentsByStudentId.cs +++ b/src/Application/UseCases/StudentDocuments/GetStudentDocumentsByStudentId.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.StudentDocuments; -using Domain.UseCases.Ports.StudentDocuments; -using Domain.Validation; +using Application.Interfaces.UseCases.StudentDocuments; +using Application.Ports.StudentDocuments; +using Application.Validation; -namespace Domain.UseCases.Interactors.StudentDocuments +namespace Application.UseCases.StudentDocuments { public class GetStudentDocumentsByStudentId : IGetStudentDocumentsByStudentId { @@ -26,7 +26,7 @@ public async Task ExecuteAsync(Guid? studentI UseCaseException.NotInformedParam(studentId is null, nameof(studentId)); // Busca documentos do estudante pelo id do projeto - Entities.StudentDocuments? entity = await _repository.GetByStudentIdAsync(studentId); + Domain.Entities.StudentDocuments? entity = await _repository.GetByStudentIdAsync(studentId); // Retorna entidade mapeada return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs b/src/Application/UseCases/StudentDocuments/UpdateStudentDocuments.cs similarity index 81% rename from src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs rename to src/Application/UseCases/StudentDocuments/UpdateStudentDocuments.cs index d0fd023b..18f50f93 100644 --- a/src/Domain/UseCases/Interactors/StudentDocuments/UpdateStudentDocuments.cs +++ b/src/Application/UseCases/StudentDocuments/UpdateStudentDocuments.cs @@ -1,12 +1,12 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.StudentDocuments; -using Domain.UseCases.Ports.StudentDocuments; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.StudentDocuments; +using Application.Ports.StudentDocuments; +using Application.Validation; using Microsoft.AspNetCore.Http; -namespace Domain.UseCases.Interactors.StudentDocuments +namespace Application.UseCases.StudentDocuments { public class UpdateStudentDocuments : IUpdateStudentDocuments { @@ -35,13 +35,13 @@ public async Task ExecuteAsync(Guid? id, Upd UseCaseException.NotInformedParam(id is null, nameof(id)); // Verifica se já foram enviados documentos para o projeto informado - Entities.StudentDocuments? studentDocuments = await _studentDocumentRepository.GetByIdAsync(id!); + Domain.Entities.StudentDocuments? studentDocuments = await _studentDocumentRepository.GetByIdAsync(id!); UseCaseException.NotFoundEntityById(studentDocuments is not null, nameof(studentDocuments)); // Verifica se o projeto se encontra em situação de submissão de documentos (Aceito ou Pendente do envio de documentação) UseCaseException.BusinessRuleViolation( - studentDocuments!.Project?.Status is not Entities.Enums.EProjectStatus.Accepted - and not Entities.Enums.EProjectStatus.Pending, + studentDocuments!.Project?.Status is not Domain.Entities.Enums.EProjectStatus.Accepted + and not Domain.Entities.Enums.EProjectStatus.Pending, "O projeto não está na fase de apresentação de documentos."); // Atualiza entidade a partir do input informado @@ -61,10 +61,10 @@ public async Task ExecuteAsync(Guid? id, Upd studentDocuments = await _studentDocumentRepository.UpdateAsync(studentDocuments); // Se o projeto está no status de pendente, atualiza para o status de análise de documentos - if (studentDocuments.Project?.Status == Entities.Enums.EProjectStatus.Pending) + if (studentDocuments.Project?.Status == Domain.Entities.Enums.EProjectStatus.Pending) { - Entities.Project? project = await _projectRepository.GetByIdAsync(studentDocuments.ProjectId); - project!.Status = Entities.Enums.EProjectStatus.DocumentAnalysis; + Domain.Entities.Project? project = await _projectRepository.GetByIdAsync(studentDocuments.ProjectId); + project!.Status = Domain.Entities.Enums.EProjectStatus.DocumentAnalysis; _ = await _projectRepository.UpdateAsync(project); } diff --git a/src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs b/src/Application/UseCases/SubArea/CreateSubArea.cs similarity index 89% rename from src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs rename to src/Application/UseCases/SubArea/CreateSubArea.cs index c9b7416f..e28e6f2e 100644 --- a/src/Domain/UseCases/Interactors/SubArea/CreateSubArea.cs +++ b/src/Application/UseCases/SubArea/CreateSubArea.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.SubArea; -using Domain.UseCases.Ports.SubArea; -using Domain.Validation; +using Application.Interfaces.UseCases.SubArea; +using Application.Ports.SubArea; +using Application.Validation; -namespace Domain.UseCases +namespace Application.UseCases.SubArea { public class CreateSubArea : ICreateSubArea { @@ -31,7 +31,7 @@ public async Task ExecuteAsync(CreateSubAreaInput inp // Valida se existe área var area = await _areaRepository.GetByIdAsync(input.AreaId) - ?? throw UseCaseException.NotFoundEntityByParams(nameof(Entities.Area)); + ?? throw UseCaseException.NotFoundEntityByParams(nameof(Domain.Entities.Area)); // Verifica se área está ativa UseCaseException.BusinessRuleViolation(area.DeletedAt != null, diff --git a/src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs b/src/Application/UseCases/SubArea/DeleteSubArea.cs similarity index 78% rename from src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs rename to src/Application/UseCases/SubArea/DeleteSubArea.cs index 91b65bc8..e50a9b9b 100644 --- a/src/Domain/UseCases/Interactors/SubArea/DeleteSubArea.cs +++ b/src/Application/UseCases/SubArea/DeleteSubArea.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.SubArea; -using Domain.UseCases.Ports.SubArea; -using Domain.Validation; +using Application.Interfaces.UseCases.SubArea; +using Application.Ports.SubArea; +using Application.Validation; -namespace Domain.UseCases.Interactors.SubArea +namespace Application.UseCases.SubArea { public class DeleteSubArea : IDeleteSubArea { @@ -24,7 +24,7 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Remove a entidade - Entities.SubArea model = await _repository.DeleteAsync(id); + Domain.Entities.SubArea model = await _repository.DeleteAsync(id); // Retorna o entidade removido return _mapper.Map(model); diff --git a/src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs b/src/Application/UseCases/SubArea/GetSubAreaById.cs similarity index 75% rename from src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs rename to src/Application/UseCases/SubArea/GetSubAreaById.cs index f4b8fb3b..9348aa9d 100644 --- a/src/Domain/UseCases/Interactors/SubArea/GetSubAreaById.cs +++ b/src/Application/UseCases/SubArea/GetSubAreaById.cs @@ -1,9 +1,9 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.SubArea; -using Domain.UseCases.Ports.SubArea; +using Application.Interfaces.UseCases.SubArea; +using Application.Ports.SubArea; -namespace Domain.UseCases.Interactors.SubArea +namespace Application.UseCases.SubArea { public class GetSubAreaById : IGetSubAreaById { @@ -19,7 +19,7 @@ public GetSubAreaById(ISubAreaRepository subAreaRepository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { - Entities.SubArea? entity = await _subAreaRepository.GetByIdAsync(id); + Domain.Entities.SubArea? entity = await _subAreaRepository.GetByIdAsync(id); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs b/src/Application/UseCases/SubArea/GetSubAreasByArea.cs similarity index 72% rename from src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs rename to src/Application/UseCases/SubArea/GetSubAreasByArea.cs index 9253cb64..ba5750ae 100644 --- a/src/Domain/UseCases/Interactors/SubArea/GetSubAreasByArea.cs +++ b/src/Application/UseCases/SubArea/GetSubAreasByArea.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.SubArea; -using Domain.UseCases.Ports.SubArea; -using Domain.Validation; +using Application.Interfaces.UseCases.SubArea; +using Application.Ports.SubArea; +using Application.Validation; -namespace Domain.UseCases.Interactors.SubArea +namespace Application.UseCases.SubArea { public class GetSubAreasByArea : IGetSubAreasByArea { @@ -21,7 +21,7 @@ public GetSubAreasByArea(ISubAreaRepository subAreaRepository, IMapper mapper) public async Task> ExecuteAsync(Guid? areaId, int skip, int take) { UseCaseException.NotInformedParam(areaId is null, nameof(areaId)); - IEnumerable entities = (IEnumerable)await _subAreaRepository.GetSubAreasByAreaAsync(areaId, skip, take); + IEnumerable entities = await _subAreaRepository.GetSubAreasByAreaAsync(areaId, skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs b/src/Application/UseCases/SubArea/UpdateSubArea.cs similarity index 68% rename from src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs rename to src/Application/UseCases/SubArea/UpdateSubArea.cs index 09a0a2d9..0b907e62 100644 --- a/src/Domain/UseCases/Interactors/SubArea/UpdateSubArea.cs +++ b/src/Application/UseCases/SubArea/UpdateSubArea.cs @@ -1,9 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.SubArea; -using Domain.UseCases.Ports.SubArea; +using Application.Interfaces.UseCases.SubArea; +using Application.Ports.SubArea; +using Application.Validation; -namespace Domain.UseCases.Interactors.SubArea +namespace Application.UseCases.SubArea { public class UpdateSubArea : IUpdateSubArea { @@ -20,8 +21,8 @@ public UpdateSubArea(ISubAreaRepository subAreaRepository, IMapper mapper) public async Task ExecuteAsync(Guid? id, UpdateSubAreaInput input) { // Recupera entidade que será atualizada - Entities.SubArea entity = await _subAreaRepository.GetByIdAsync(id) - ?? throw Validation.UseCaseException.NotFoundEntityById(nameof(Entities.SubArea)); + Domain.Entities.SubArea entity = await _subAreaRepository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.SubArea)); // Atualiza atributos permitidos entity.Name = input.Name; @@ -29,7 +30,7 @@ public async Task ExecuteAsync(Guid? id, UpdateSubAre entity.AreaId = input.AreaId; // Salva entidade atualizada no banco - Entities.SubArea model = await _subAreaRepository.UpdateAsync(entity); + Domain.Entities.SubArea model = await _subAreaRepository.UpdateAsync(entity); return _mapper.Map(model); } } diff --git a/src/Domain/UseCases/Interactors/User/ActivateUser.cs b/src/Application/UseCases/User/ActivateUser.cs similarity index 73% rename from src/Domain/UseCases/Interactors/User/ActivateUser.cs rename to src/Application/UseCases/User/ActivateUser.cs index 4aeda1bb..0abc6dd5 100644 --- a/src/Domain/UseCases/Interactors/User/ActivateUser.cs +++ b/src/Application/UseCases/User/ActivateUser.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.User; -using Domain.UseCases.Ports.User; -using Domain.Validation; +using Application.Interfaces.UseCases.User; +using Application.Ports.User; +using Application.Validation; -namespace Domain.UseCases.Interactors.User +namespace Application.UseCases.User { public class ActivateUser : IActivateUser { @@ -24,12 +24,12 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Encontra usuário pelo Id e o ativa - Entities.User user = await _repository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); + Domain.Entities.User user = await _repository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.User)); user.ActivateEntity(); // Atualiza usuário - Entities.User entity = await _repository.UpdateAsync(user); + Domain.Entities.User entity = await _repository.UpdateAsync(user); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/User/DeactivateUser.cs b/src/Application/UseCases/User/DeactivateUser.cs similarity index 73% rename from src/Domain/UseCases/Interactors/User/DeactivateUser.cs rename to src/Application/UseCases/User/DeactivateUser.cs index 9b4a51ba..124589af 100644 --- a/src/Domain/UseCases/Interactors/User/DeactivateUser.cs +++ b/src/Application/UseCases/User/DeactivateUser.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.User; -using Domain.UseCases.Ports.User; -using Domain.Validation; +using Application.Interfaces.UseCases.User; +using Application.Ports.User; +using Application.Validation; -namespace Domain.UseCases.Interactors.User +namespace Application.UseCases.User { public class DeactivateUser : IDeactivateUser { @@ -24,12 +24,12 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Encontra usuário pelo Id e o desativa - Entities.User user = await _repository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); + Domain.Entities.User user = await _repository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.User)); user.DeactivateEntity(); // Atualiza usuário - Entities.User entity = await _repository.UpdateAsync(user); + Domain.Entities.User entity = await _repository.UpdateAsync(user); return _mapper.Map(entity); } } diff --git a/src/Domain/UseCases/Interactors/User/GetActiveUsers.cs b/src/Application/UseCases/User/GetActiveUsers.cs similarity index 72% rename from src/Domain/UseCases/Interactors/User/GetActiveUsers.cs rename to src/Application/UseCases/User/GetActiveUsers.cs index 3e79bc47..6d20b153 100644 --- a/src/Domain/UseCases/Interactors/User/GetActiveUsers.cs +++ b/src/Application/UseCases/User/GetActiveUsers.cs @@ -1,9 +1,9 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.User; -using Domain.UseCases.Ports.User; +using Application.Interfaces.UseCases.User; +using Application.Ports.User; -namespace Domain.UseCases.Interactors.User +namespace Application.UseCases.User { public class GetActiveUsers : IGetActiveUsers { @@ -19,7 +19,7 @@ public GetActiveUsers(IUserRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetActiveUsersAsync(skip, take); + IEnumerable entities = await _repository.GetActiveUsersAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs b/src/Application/UseCases/User/GetInactiveUsers.cs similarity index 72% rename from src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs rename to src/Application/UseCases/User/GetInactiveUsers.cs index 4b77c353..0d2316d6 100644 --- a/src/Domain/UseCases/Interactors/User/GetInactiveUsers.cs +++ b/src/Application/UseCases/User/GetInactiveUsers.cs @@ -1,9 +1,9 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.User; -using Domain.UseCases.Ports.User; +using Application.Interfaces.UseCases.User; +using Application.Ports.User; -namespace Domain.UseCases.Interactors.User +namespace Application.UseCases.User { public class GetInactiveUsers : IGetInactiveUsers { @@ -19,7 +19,7 @@ public GetInactiveUsers(IUserRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { - IEnumerable entities = (IEnumerable)await _repository.GetInactiveUsersAsync(skip, take); + IEnumerable entities = await _repository.GetInactiveUsersAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } } diff --git a/src/Domain/UseCases/Interactors/User/GetUserById.cs b/src/Application/UseCases/User/GetUserById.cs similarity index 77% rename from src/Domain/UseCases/Interactors/User/GetUserById.cs rename to src/Application/UseCases/User/GetUserById.cs index 1697a7b2..0c1e5aed 100644 --- a/src/Domain/UseCases/Interactors/User/GetUserById.cs +++ b/src/Application/UseCases/User/GetUserById.cs @@ -1,10 +1,10 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.UseCases.Interfaces.User; -using Domain.UseCases.Ports.User; -using Domain.Validation; +using Application.Interfaces.UseCases.User; +using Application.Ports.User; +using Application.Validation; -namespace Domain.UseCases.Interactors.User +namespace Application.UseCases.User { public class GetUserById : IGetUserById { @@ -24,8 +24,8 @@ public async Task ExecuteAsync(Guid? id) UseCaseException.NotInformedParam(id is null, nameof(id)); // Busca usuário pelo id informado - Entities.User entity = await _repository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); + Domain.Entities.User entity = await _repository.GetByIdAsync(id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.User)); // Retorna usuário encontrado return _mapper.Map(entity); diff --git a/src/Domain/UseCases/Interactors/User/UpdateUser.cs b/src/Application/UseCases/User/UpdateUser.cs similarity index 73% rename from src/Domain/UseCases/Interactors/User/UpdateUser.cs rename to src/Application/UseCases/User/UpdateUser.cs index f2872bc4..bdcd22ff 100644 --- a/src/Domain/UseCases/Interactors/User/UpdateUser.cs +++ b/src/Application/UseCases/User/UpdateUser.cs @@ -1,11 +1,11 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Domain.Interfaces.Services; -using Domain.UseCases.Interfaces.User; -using Domain.UseCases.Ports.User; -using Domain.Validation; +using Application.Interfaces.Services; +using Application.Interfaces.UseCases.User; +using Application.Ports.User; +using Application.Validation; -namespace Domain.UseCases.Interactors.User +namespace Application.UseCases.User { public class UpdateUser : IUpdateUser { @@ -24,21 +24,21 @@ public UpdateUser(IUserRepository repository, ITokenAuthenticationService tokenA public async Task ExecuteAsync(UserUpdateInput input) { // Busca as claims do usuário autenticado - Ports.Auth.UserClaimsOutput userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Verifica se o id informado é nulo UseCaseException.NotInformedParam(userClaims.Id is null, nameof(userClaims.Id)); // Busca usuário pelo id informado - Entities.User user = await _repository.GetByIdAsync(userClaims.Id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Entities.User)); + Domain.Entities.User user = await _repository.GetByIdAsync(userClaims.Id) + ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.User)); // Atualiza atributos permitidos user.Name = input.Name; user.CPF = input.CPF; // Salva usuário atualizado no banco - Entities.User entity = await _repository.UpdateAsync(user); + Domain.Entities.User entity = await _repository.UpdateAsync(user); return _mapper.Map(entity); } } diff --git a/src/Domain/Validation/UseCaseException.cs b/src/Application/Validation/UseCaseException.cs similarity index 97% rename from src/Domain/Validation/UseCaseException.cs rename to src/Application/Validation/UseCaseException.cs index 4e829a79..3c33a296 100644 --- a/src/Domain/Validation/UseCaseException.cs +++ b/src/Application/Validation/UseCaseException.cs @@ -1,4 +1,4 @@ -namespace Domain.Validation; +namespace Application.Validation; public class UseCaseException : Exception { public UseCaseException(string error) : base(error) { } diff --git a/src/CopetSystem.API.sln b/src/CopetSystem.API.sln index 3bf58dd0..91a061b7 100644 --- a/src/CopetSystem.API.sln +++ b/src/CopetSystem.API.sln @@ -23,6 +23,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Services", "Infrastructure\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain.Tests", "Domain.Tests\Domain.Tests.csproj", "{8462166B-3145-422A-A658-47F32BFBDF0D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Application", "Application\Application.csproj", "{10D17198-CD98-48BF-BEF3-A689B668F5E3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -100,6 +102,10 @@ Global {8462166B-3145-422A-A658-47F32BFBDF0D}.Debug|Any CPU.Build.0 = Debug|Any CPU {8462166B-3145-422A-A658-47F32BFBDF0D}.Release|Any CPU.ActiveCfg = Release|Any CPU {8462166B-3145-422A-A658-47F32BFBDF0D}.Release|Any CPU.Build.0 = Release|Any CPU + {10D17198-CD98-48BF-BEF3-A689B668F5E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {10D17198-CD98-48BF-BEF3-A689B668F5E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {10D17198-CD98-48BF-BEF3-A689B668F5E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {10D17198-CD98-48BF-BEF3-A689B668F5E3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {FCC65F72-7AF9-4940-B07A-E7DDDC7967B7} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} diff --git a/src/Domain/Entities/User.cs b/src/Domain/Entities/User.cs index 274f05f3..87faf9de 100644 --- a/src/Domain/Entities/User.cs +++ b/src/Domain/Entities/User.cs @@ -1,5 +1,7 @@ using System.Data; using System.Net.Mail; +using System.Security.Cryptography; +using System.Text; using Domain.Entities.Enums; using Domain.Entities.Primitives; using Domain.Validation; @@ -87,6 +89,11 @@ public ERole? Role _role = value; } } + public User(bool isConfirmed) + { + this.IsConfirmed = isConfirmed; + + } public bool IsConfirmed { get; private set; } private string? _validationCode; @@ -123,7 +130,7 @@ private set #endregion #region Constructors - internal User(string? name, string? email, string? password, string? cpf, ERole? role) + public User(string? name, string? email, string? password, string? cpf, ERole? role) { Name = name; Email = email; @@ -147,7 +154,7 @@ internal void GenerateEmailValidationCode() ValidationCode = GenerateValidationCode(); } - internal void ConfirmUserEmail(string validationCode) + public void ConfirmUserEmail(string validationCode) { EntityExceptionValidation.When(IsConfirmed, "O e-mail do usuário já foi confirmado."); @@ -159,9 +166,9 @@ internal void ConfirmUserEmail(string validationCode) #endregion #region Reset Password - internal void GenerateResetPasswordToken() => ResetPasswordToken = GenerateValidationCode(6); + public void GenerateResetPasswordToken() => ResetPasswordToken = GenerateValidationCode(6); - internal bool UpdatePassword(string password, string token) + public bool UpdatePassword(string password, string token) { if (ResetPasswordToken?.Equals(token) == true) { @@ -227,10 +234,18 @@ private static bool ValidateCPF(string cpf) private static string GenerateValidationCode(int size = 6) { - var random = new Random(); - const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - return new string(Enumerable.Repeat(chars, size) - .Select(s => s[random.Next(s.Length)]).ToArray()); + const string allowedCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + using var rng = RandomNumberGenerator.Create(); + byte[] randomBytes = new byte[size]; + rng.GetBytes(randomBytes); + + StringBuilder code = new(size); + foreach (byte b in randomBytes) + { + code.Append(allowedCharacters[b % allowedCharacters.Length]); + } + + return code.ToString(); } #endregion } diff --git a/src/Infrastructure/IoC/ApplicationDI.cs b/src/Infrastructure/IoC/ApplicationDI.cs new file mode 100644 index 00000000..abf45c06 --- /dev/null +++ b/src/Infrastructure/IoC/ApplicationDI.cs @@ -0,0 +1,195 @@ +using Domain.Mappings; +using Application.UseCases.ActivityType; +using Application.UseCases.Area; +using Application.UseCases.AssistanceType; +using Application.UseCases.Auth; +using Application.UseCases.Campus; +using Application.UseCases.Course; +using Application.UseCases.MainArea; +using Application.UseCases.Notice; +using Application.UseCases.Professor; +using Application.UseCases.ProgramType; +using Application.UseCases.Project; +using Application.UseCases.ProjectEvaluation; +using Application.UseCases.Student; +using Application.UseCases.StudentDocuments; +using Application.UseCases.SubArea; +using Application.UseCases.User; +using Application.Interfaces.UseCases.ActivityType; +using Application.Interfaces.UseCases.Area; +using Application.Interfaces.UseCases.AssistanceType; +using Application.Interfaces.UseCases.Auth; +using Application.Interfaces.UseCases.Campus; +using Application.Interfaces.UseCases.Course; +using Application.Interfaces.UseCases.MainArea; +using Application.Interfaces.UseCases.Notice; +using Application.Interfaces.UseCases.Professor; +using Application.Interfaces.UseCases.ProgramType; +using Application.Interfaces.UseCases.Project; +using Application.Interfaces.UseCases.ProjectEvaluation; +using Application.Interfaces.UseCases.Student; +using Application.Interfaces.UseCases.StudentDocuments; +using Application.Interfaces.UseCases.SubArea; +using Application.Interfaces.UseCases.User; +using Microsoft.Extensions.DependencyInjection; + +namespace Infrastructure.IoC +{ + public static class ApplicationDI + { + public static IServiceCollection AddApplication(this IServiceCollection services) + { + #region UseCases + #region Area + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion Area + + #region ActivityType + services.AddScoped(); + services.AddScoped(); + #endregion ActivityType + + #region AssistanceType + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion AssistanceType + + #region Auth + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion Auth + + #region Campus + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion Campus + + #region Course + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion Course + + #region MainArea + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion MainArea + + #region Notice + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion Notice + + #region Professor + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion Professor + + #region ProgramType + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion ProgramType + + #region Project + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion Project + + #region ProjectEvaluation + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion ProjectEvaluation + + #region Student + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion Student + + #region StudentDocuments + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion StudentDocuments + + #region SubArea + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion SubArea + + #region User + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion User + + #endregion UseCases + + #region Port Mappers + services.AddAutoMapper(typeof(AreaMappings)); + services.AddAutoMapper(typeof(ActivityMappings)); + services.AddAutoMapper(typeof(AssistanceTypeMappings)); + services.AddAutoMapper(typeof(CampusMappings)); + services.AddAutoMapper(typeof(CourseMappings)); + services.AddAutoMapper(typeof(MainAreaMappings)); + services.AddAutoMapper(typeof(NoticeMappings)); + services.AddAutoMapper(typeof(ProfessorMappings)); + services.AddAutoMapper(typeof(ProgramTypeMappings)); + services.AddAutoMapper(typeof(ProjectEvaluationMappings)); + services.AddAutoMapper(typeof(ProjectMappings)); + services.AddAutoMapper(typeof(StudentDocumentsMappings)); + services.AddAutoMapper(typeof(StudentMappings)); + services.AddAutoMapper(typeof(SubAreaMappings)); + services.AddAutoMapper(typeof(UserMappings)); + #endregion Port Mappers + + return services; + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs b/src/Infrastructure/IoC/DependencyAdaptersInjection.cs deleted file mode 100644 index 90e0f8a4..00000000 --- a/src/Infrastructure/IoC/DependencyAdaptersInjection.cs +++ /dev/null @@ -1,54 +0,0 @@ -using Adapters.Interfaces; -using Adapters.Mappings; -using Adapters.PresenterController; -using Microsoft.Extensions.DependencyInjection; - -namespace IoC -{ - public static class DependencyAdaptersInjection - { - public static IServiceCollection AddAdapters(this IServiceCollection services) - { - #region PresenterControllers - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion PresenterControllers - - #region Gateways Mappers - _ = services.AddAutoMapper(typeof(AreaMappings)); - _ = services.AddAutoMapper(typeof(ActivityMappings)); - _ = services.AddAutoMapper(typeof(AssistanceTypeMappings)); - _ = services.AddAutoMapper(typeof(AuthMappings)); - _ = services.AddAutoMapper(typeof(CampusMappings)); - _ = services.AddAutoMapper(typeof(CourseMappings)); - _ = services.AddAutoMapper(typeof(MainAreaMappings)); - _ = services.AddAutoMapper(typeof(NoticeMappings)); - _ = services.AddAutoMapper(typeof(ProfessorMappings)); - _ = services.AddAutoMapper(typeof(ProgramTypeMappings)); - _ = services.AddAutoMapper(typeof(ProjectEvaluationMapping)); - _ = services.AddAutoMapper(typeof(ProjectMappings)); - _ = services.AddAutoMapper(typeof(ProjectActivityMappings)); - _ = services.AddAutoMapper(typeof(StudentDocumentsMappings)); - _ = services.AddAutoMapper(typeof(StudentMappings)); - _ = services.AddAutoMapper(typeof(SubAreaMappings)); - _ = services.AddAutoMapper(typeof(UserMappings)); - #endregion Gateways Mappers - - return services; - } - } -} \ No newline at end of file diff --git a/src/Infrastructure/IoC/DependencyDomainInjection.cs b/src/Infrastructure/IoC/DependencyDomainInjection.cs deleted file mode 100644 index 820d2ad4..00000000 --- a/src/Infrastructure/IoC/DependencyDomainInjection.cs +++ /dev/null @@ -1,206 +0,0 @@ -using Domain.Interfaces.Services; -using Domain.Mappings; -using Domain.UseCases; -using Domain.UseCases.Interactors.ActivityType; -using Domain.UseCases.Interactors.Area; -using Domain.UseCases.Interactors.AssistanceType; -using Domain.UseCases.Interactors.Auth; -using Domain.UseCases.Interactors.Campus; -using Domain.UseCases.Interactors.Course; -using Domain.UseCases.Interactors.MainArea; -using Domain.UseCases.Interactors.Notice; -using Domain.UseCases.Interactors.Professor; -using Domain.UseCases.Interactors.ProgramType; -using Domain.UseCases.Interactors.Project; -using Domain.UseCases.Interactors.ProjectEvaluation; -using Domain.UseCases.Interactors.Student; -using Domain.UseCases.Interactors.StudentDocuments; -using Domain.UseCases.Interactors.SubArea; -using Domain.UseCases.Interactors.User; -using Domain.UseCases.Interfaces.ActivityType; -using Domain.UseCases.Interfaces.Area; -using Domain.UseCases.Interfaces.AssistanceType; -using Domain.UseCases.Interfaces.Auth; -using Domain.UseCases.Interfaces.Campus; -using Domain.UseCases.Interfaces.Course; -using Domain.UseCases.Interfaces.MainArea; -using Domain.UseCases.Interfaces.Notice; -using Domain.UseCases.Interfaces.Professor; -using Domain.UseCases.Interfaces.ProgramType; -using Domain.UseCases.Interfaces.Project; -using Domain.UseCases.Interfaces.ProjectEvaluation; -using Domain.UseCases.Interfaces.Student; -using Domain.UseCases.Interfaces.StudentDocuments; -using Domain.UseCases.Interfaces.SubArea; -using Domain.UseCases.Interfaces.User; -using Microsoft.Extensions.DependencyInjection; -using Services; - -namespace IoC -{ - public static class DependencyDomainInjection - { - public static IServiceCollection AddDomain(this IServiceCollection services) - { - #region External Services - _ = services.AddHttpContextAccessor(); - _ = services.AddScoped(); - _ = services.AddScoped(); - // services.AddScoped(); - _ = services.AddScoped(); - #endregion External Services - - #region UseCases - #region Area - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion Area - - #region ActivityType - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion ActivityType - - #region AssistanceType - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion AssistanceType - - #region Auth - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion Auth - - #region Campus - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion Campus - - #region Course - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion Course - - #region MainArea - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion MainArea - - #region Notice - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion Notice - - #region Professor - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion Professor - - #region ProgramType - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion ProgramType - - #region Project - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion Project - - #region ProjectEvaluation - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion ProjectEvaluation - - #region Student - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion Student - - #region StudentDocuments - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion StudentDocuments - - #region SubArea - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion SubArea - - #region User - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion User - - #endregion UseCases - - #region Contract Mappers - _ = services.AddAutoMapper(typeof(AreaMappings)); - _ = services.AddAutoMapper(typeof(ActivityMappings)); - _ = services.AddAutoMapper(typeof(AssistanceTypeMappings)); - _ = services.AddAutoMapper(typeof(CampusMappings)); - _ = services.AddAutoMapper(typeof(CourseMappings)); - _ = services.AddAutoMapper(typeof(MainAreaMappings)); - _ = services.AddAutoMapper(typeof(NoticeMappings)); - _ = services.AddAutoMapper(typeof(ProfessorMappings)); - _ = services.AddAutoMapper(typeof(ProgramTypeMappings)); - _ = services.AddAutoMapper(typeof(ProjectEvaluationMappings)); - _ = services.AddAutoMapper(typeof(ProjectMappings)); - _ = services.AddAutoMapper(typeof(StudentDocumentsMappings)); - _ = services.AddAutoMapper(typeof(StudentMappings)); - _ = services.AddAutoMapper(typeof(SubAreaMappings)); - _ = services.AddAutoMapper(typeof(UserMappings)); - #endregion Contract Mappers - - return services; - } - } -} \ No newline at end of file diff --git a/src/Infrastructure/IoC/DependencyInjection.cs b/src/Infrastructure/IoC/DependencyInjection.cs deleted file mode 100644 index 804cd851..00000000 --- a/src/Infrastructure/IoC/DependencyInjection.cs +++ /dev/null @@ -1,105 +0,0 @@ -using AspNetCoreRateLimit; -using Domain.Interfaces.Repositories; -using Infrastructure.Persistence.Context; -using IoC.Utils; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Persistence.Repositories; -using Serilog; -using Services; -using Services.Email.Configs; -using Services.Email.Factories; - -namespace IoC -{ - public static class DependencyInjection - { - public static IServiceCollection AddInfrastructure(this IServiceCollection services) - { - // Define valores das propriedades de configuração - IConfiguration configuration = SettingsConfiguration.GetConfiguration(); - _ = services.AddSingleton(configuration); - - // Carrega informações de ambiente (.env) - DotEnvSecrets dotEnvSecrets = new(); - _ = services.AddScoped(); - - #region Inicialização do banco de dados - _ = services.AddDbContext( - o => o.UseNpgsql(dotEnvSecrets.GetDatabaseConnectionString(), - b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); - #endregion Inicialização do banco de dados - - #region Serviço de Log - Log.Logger = new LoggerConfiguration() - .ReadFrom.Configuration(configuration) - .CreateLogger(); - _ = services.AddLogging(loggingBuilder => - { - _ = loggingBuilder.ClearProviders(); - _ = loggingBuilder.AddSerilog(Log.Logger, dispose: true); - }); - #endregion Serviço de Log - - #region CORS - services.AddCors(options => - { - options.AddDefaultPolicy( - policy => - { - _ = policy.AllowAnyOrigin() - .AllowAnyMethod() - .AllowAnyHeader(); - }); - }); - #endregion CORS - - #region Serviço de E-mail - SmtpConfiguration smtpConfig = new(); - configuration.GetSection("SmtpConfiguration").Bind(smtpConfig); - smtpConfig.Password = dotEnvSecrets.GetSmtpUserPassword(); - smtpConfig.Username = dotEnvSecrets.GetSmtpUserName(); - _ = services.AddSingleton(); - _ = services.AddSingleton(sp => - { - IEmailServiceFactory factory = sp.GetRequiredService(); - return factory.Create(smtpConfig, configuration); - }); - #endregion Serviço de E-mail - - #region Repositórios - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - _ = services.AddScoped(); - #endregion Repositórios - - #region Rate Limit - _ = services.AddMemoryCache(); - _ = services.AddInMemoryRateLimiting(); - _ = services.Configure(configuration.GetSection("IpRateLimiting")); - _ = services.AddSingleton(); - _ = services.AddSingleton(); - _ = services.AddSingleton(); - _ = services.AddSingleton(); - #endregion Rate Limit - - return services; - } - } -} \ No newline at end of file diff --git a/src/Infrastructure/IoC/ExternalServicesDI.cs b/src/Infrastructure/IoC/ExternalServicesDI.cs new file mode 100644 index 00000000..3eb8e548 --- /dev/null +++ b/src/Infrastructure/IoC/ExternalServicesDI.cs @@ -0,0 +1,44 @@ +using Application.Interfaces.Services; +using Infrastructure.IoC.Utils; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Services; +using Services.Email.Configs; +using Services.Email.Factories; + +namespace Infrastructure.IoC +{ + public static class ExternalServicesDI + { + public static IServiceCollection AddExternalServices(this IServiceCollection services) + { + // Define valores das propriedades de configuração + IConfiguration configuration = SettingsConfiguration.GetConfiguration(); + + // Carrega informações de ambiente (.env) + DotEnvSecrets dotEnvSecrets = new(); + + #region Serviço de E-mail + SmtpConfiguration smtpConfig = new(); + configuration.GetSection("SmtpConfiguration").Bind(smtpConfig); + smtpConfig.Password = dotEnvSecrets.GetSmtpUserPassword(); + smtpConfig.Username = dotEnvSecrets.GetSmtpUserName(); + services.AddSingleton(); + services.AddSingleton(sp => + { + IEmailServiceFactory factory = sp.GetRequiredService(); + return factory.Create(smtpConfig, configuration); + }); + #endregion Serviço de E-mail + + #region Demais Serviços + services.AddHttpContextAccessor(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion Demais Serviços + + return services; + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/IoC/InfrastructureDI.cs b/src/Infrastructure/IoC/InfrastructureDI.cs new file mode 100644 index 00000000..b61a1daa --- /dev/null +++ b/src/Infrastructure/IoC/InfrastructureDI.cs @@ -0,0 +1,62 @@ +using AspNetCoreRateLimit; +using Infrastructure.IoC.Utils; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Serilog; +using Services; + +namespace Infrastructure.IoC +{ + public static class InfrastructureDI + { + public static IServiceCollection AddInfrastructure(this IServiceCollection services) + { + #region AppSettings e DotEnv + // Define valores das propriedades de configuração + IConfiguration configuration = SettingsConfiguration.GetConfiguration(); + services.AddSingleton(configuration); + + // Carrega informações de ambiente (.env) + DotEnvSecrets dotEnvSecrets = new(); + services.AddScoped(); + #endregion AppSettings e DotEnv + + #region Serviço de Log + Log.Logger = new LoggerConfiguration() + .ReadFrom.Configuration(configuration) + .CreateLogger(); + services.AddLogging(loggingBuilder => + { + loggingBuilder.ClearProviders(); + loggingBuilder.AddSerilog(Log.Logger, dispose: true); + }); + #endregion Serviço de Log + + #region CORS + services.AddCors(options => + { + options.AddDefaultPolicy( + policy => + { + policy.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader(); + }); + }); + #endregion CORS + + #region Rate Limit + services.AddMemoryCache(); + services.AddInMemoryRateLimiting(); + services.Configure(configuration.GetSection("IpRateLimiting")); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + #endregion Rate Limit + + return services; + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/IoC/IoC.csproj b/src/Infrastructure/IoC/IoC.csproj index 446907af..05746d9a 100644 --- a/src/Infrastructure/IoC/IoC.csproj +++ b/src/Infrastructure/IoC/IoC.csproj @@ -6,7 +6,7 @@ 0.0.1 - + diff --git a/src/Infrastructure/IoC/DependencyInjectionJWT.cs b/src/Infrastructure/IoC/JwtDI.cs similarity index 89% rename from src/Infrastructure/IoC/DependencyInjectionJWT.cs rename to src/Infrastructure/IoC/JwtDI.cs index c7548f6c..fdc77bef 100644 --- a/src/Infrastructure/IoC/DependencyInjectionJWT.cs +++ b/src/Infrastructure/IoC/JwtDI.cs @@ -1,22 +1,22 @@ using System.Text; -using IoC.Utils; +using Infrastructure.IoC.Utils; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; -namespace IoC +namespace Infrastructure.IoC { - public static class DependencyInjectionJWT + public static class JwtDI { public static IServiceCollection AddInfrastructureJWT(this IServiceCollection services) { // Carrega informações de ambiente (.env) DotEnvSecrets dotEnvSecrets = new(); - _ = services.AddSingleton(dotEnvSecrets); + services.AddSingleton(dotEnvSecrets); /// Informar o tipo de autenticação; /// Definir o modelo de desafio de autenticação. - _ = services.AddAuthentication(opt => + services.AddAuthentication(opt => { opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; @@ -43,7 +43,7 @@ public static IServiceCollection AddInfrastructureJWT(this IServiceCollection se }); /// Define as políticas de autorização - _ = services.AddAuthorization(options => + services.AddAuthorization(options => { options.AddPolicy("RequireAdminRole", policy => policy.RequireRole("ADMIN")); options.AddPolicy("RequireProfessorRole", policy => policy.RequireRole("PROFESSOR")); diff --git a/src/Infrastructure/IoC/PersistenceDI.cs b/src/Infrastructure/IoC/PersistenceDI.cs new file mode 100644 index 00000000..cf4dca11 --- /dev/null +++ b/src/Infrastructure/IoC/PersistenceDI.cs @@ -0,0 +1,46 @@ +using Domain.Interfaces.Repositories; +using Infrastructure.IoC.Utils; +using Infrastructure.Persistence.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Persistence.Repositories; + +namespace Infrastructure.IoC +{ + public static class PersistenceDI + { + public static IServiceCollection AddPersistence(this IServiceCollection services) + { + // Carrega informações de ambiente (.env) + DotEnvSecrets dotEnvSecrets = new(); + + #region Inicialização do banco de dados + services.AddDbContext( + o => o.UseNpgsql(dotEnvSecrets.GetDatabaseConnectionString(), + b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); + #endregion Inicialização do banco de dados + + #region Repositórios + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + #endregion Repositórios + + return services; + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/IoC/DependencyInjectionSwagger.cs b/src/Infrastructure/IoC/SwaggerDI.cs similarity index 97% rename from src/Infrastructure/IoC/DependencyInjectionSwagger.cs rename to src/Infrastructure/IoC/SwaggerDI.cs index 88a752ff..2d38bfe9 100644 --- a/src/Infrastructure/IoC/DependencyInjectionSwagger.cs +++ b/src/Infrastructure/IoC/SwaggerDI.cs @@ -2,9 +2,9 @@ using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; -namespace IoC +namespace Infrastructure.IoC { - public static class DependencyInjectionSwagger + public static class SwaggerDI { public static IServiceCollection AddInfrastructureSwagger(this IServiceCollection services) { diff --git a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs index 6f5e2119..21c53465 100644 --- a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs +++ b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs @@ -1,6 +1,6 @@ using Services; -namespace IoC.Utils +namespace Infrastructure.IoC.Utils { public class DotEnvSecrets : IDotEnvSecrets { diff --git a/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs b/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs index 2a58010a..319604ec 100644 --- a/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs +++ b/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.Configuration; -namespace IoC.Utils +namespace Infrastructure.IoC.Utils { public static class SettingsConfiguration { diff --git a/src/Infrastructure/Services/AzureStorageService.cs b/src/Infrastructure/Services/AzureStorageService.cs index 33499b33..2e902bb7 100644 --- a/src/Infrastructure/Services/AzureStorageService.cs +++ b/src/Infrastructure/Services/AzureStorageService.cs @@ -1,5 +1,5 @@ using Azure.Storage.Blobs; -using Domain.Interfaces.Services; +using Application.Interfaces.Services; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; diff --git a/src/Infrastructure/Services/Email/EmailService.cs b/src/Infrastructure/Services/Email/EmailService.cs index b3be07a2..923c4b41 100644 --- a/src/Infrastructure/Services/Email/EmailService.cs +++ b/src/Infrastructure/Services/Email/EmailService.cs @@ -1,6 +1,6 @@ using System.Net; using System.Net.Mail; -using Domain.Interfaces.Services; +using Application.Interfaces.Services; using Microsoft.Extensions.Configuration; namespace Services.Email diff --git a/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs b/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs index c59a00f9..3e607f05 100644 --- a/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs +++ b/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs @@ -1,4 +1,4 @@ -using Domain.Interfaces.Services; +using Application.Interfaces.Services; using Services.Email.Configs; using Microsoft.Extensions.Configuration; diff --git a/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs b/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs index c0ceb9cd..9accb2f0 100644 --- a/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs +++ b/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs @@ -1,4 +1,4 @@ -using Domain.Interfaces.Services; +using Application.Interfaces.Services; using Microsoft.Extensions.Configuration; using Services.Email.Configs; diff --git a/src/Infrastructure/Services/HashService.cs b/src/Infrastructure/Services/HashService.cs index 1fd9c2ac..9f94a3f4 100644 --- a/src/Infrastructure/Services/HashService.cs +++ b/src/Infrastructure/Services/HashService.cs @@ -1,6 +1,6 @@ using System.Security.Cryptography; using System.Text; -using Domain.Interfaces.Services; +using Application.Interfaces.Services; using DZen.Security.Cryptography; namespace Services diff --git a/src/Infrastructure/Services/Services.csproj b/src/Infrastructure/Services/Services.csproj index afb0a3db..9d224147 100644 --- a/src/Infrastructure/Services/Services.csproj +++ b/src/Infrastructure/Services/Services.csproj @@ -6,7 +6,7 @@ 0.0.1 - + diff --git a/src/Infrastructure/Services/StorageFileService.cs b/src/Infrastructure/Services/StorageFileService.cs index 9ddda683..f1cdeace 100644 --- a/src/Infrastructure/Services/StorageFileService.cs +++ b/src/Infrastructure/Services/StorageFileService.cs @@ -1,4 +1,4 @@ -using Domain.Interfaces.Services; +using Application.Interfaces.Services; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; diff --git a/src/Infrastructure/Services/TokenAuthenticationService.cs b/src/Infrastructure/Services/TokenAuthenticationService.cs index c479c85d..d92eee77 100644 --- a/src/Infrastructure/Services/TokenAuthenticationService.cs +++ b/src/Infrastructure/Services/TokenAuthenticationService.cs @@ -1,8 +1,8 @@ using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; -using Domain.Interfaces.Services; -using Domain.UseCases.Ports.Auth; +using Application.Interfaces.Services; +using Application.Ports.Auth; using Microsoft.AspNetCore.Http; using Microsoft.IdentityModel.Tokens; diff --git a/src/Infrastructure/WebAPI/Controllers/ActivityController.cs b/src/Infrastructure/WebAPI/Controllers/ActivityController.cs index 4581a205..22c27c7a 100644 --- a/src/Infrastructure/WebAPI/Controllers/ActivityController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ActivityController.cs @@ -1,4 +1,5 @@ -using Adapters.Interfaces; +using Application.Interfaces.UseCases.ActivityType; +using Application.Ports.Activity; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -12,16 +13,21 @@ namespace WebAPI.Controllers [Authorize] public class ActivityController : ControllerBase { - private readonly IActivityPresenterController _activityPresenterController; + private readonly IGetLastNoticeActivities _getLastNoticeActivities; + private readonly IGetActivitiesByNoticeId _getActivitiesByNoticeId; private readonly ILogger _logger; /// /// Construtor da classe. /// - /// - /// - public ActivityController(IActivityPresenterController activityPresenterController, ILogger logger) + /// Serviço de obtenção das últimas atividades em uso pelo edital anterior. + /// Serviço de obtenção das atividades de um edital. + /// Serviço de log. + public ActivityController(IGetLastNoticeActivities getLastNoticeActivities, + IGetActivitiesByNoticeId getActivitiesByNoticeId, + ILogger logger) { - _activityPresenterController = activityPresenterController; + _getLastNoticeActivities = getLastNoticeActivities; + _getActivitiesByNoticeId = getActivitiesByNoticeId; _logger = logger; } @@ -31,14 +37,16 @@ public ActivityController(IActivityPresenterController activityPresenterControll /// Lista de atividades mais recentes. /// Retorna a lista de atividades mais recentes. /// Requisição incorreta. + /// Usuário não autorizado. [HttpGet] - [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(List))] [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task GetLastNoticeActivities() { try { - IEnumerable result = await _activityPresenterController.GetLastNoticeActivities(); + var result = await _getLastNoticeActivities.ExecuteAsync(); _logger.LogInformation("Atividades encontradas."); return Ok(result); } @@ -56,15 +64,21 @@ public async Task GetLastNoticeActivities() /// Lista de atividades. /// Retorna a lista de atividades. /// Requisição incorreta. - [HttpGet] - [Route("notice/{noticeId}")] - [ProducesResponseType(StatusCodes.Status200OK)] + /// Usuário não autorizado. + [HttpGet("notice/{noticeId}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(List))] [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task GetActivitiesByNoticeId(Guid? noticeId) { + if (noticeId == null) + { + return BadRequest("O ID do edital não pode ser nulo."); + } + try { - IEnumerable result = await _activityPresenterController.GetActivitiesByNoticeId(noticeId); + var result = await _getActivitiesByNoticeId.ExecuteAsync(noticeId); _logger.LogInformation("Atividades encontradas para o edital {noticeId}.", noticeId); return Ok(result); } diff --git a/src/Infrastructure/WebAPI/Controllers/AreaController.cs b/src/Infrastructure/WebAPI/Controllers/AreaController.cs index 735dc13d..cff3ff4a 100644 --- a/src/Infrastructure/WebAPI/Controllers/AreaController.cs +++ b/src/Infrastructure/WebAPI/Controllers/AreaController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.Area; -using Adapters.Interfaces; +using Application.Interfaces.UseCases.Area; +using Application.Ports.Area; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -14,16 +14,33 @@ namespace WebAPI.Controllers public class AreaController : ControllerBase { #region Global Scope - private readonly IAreaPresenterController _service; + private readonly IGetAreaById _getById; + private readonly IGetAreasByMainArea _getAreasByMainArea; + private readonly ICreateArea _create; + private readonly IUpdateArea _update; + private readonly IDeleteArea _delete; private readonly ILogger _logger; /// /// Construtor do Controller de Área. /// - /// - /// - public AreaController(IAreaPresenterController service, ILogger logger) + /// Serviço de obtenção de área pelo id. + /// Serviço de obtenção de todas as áreas ativas da área principal. + /// Serviço de criação de área. + /// Serviço de atualização de área. + /// Serviço de remoção de área. + /// Serviço de log. + public AreaController(IGetAreaById getById, + IGetAreasByMainArea getAreasByMainArea, + ICreateArea create, + IUpdateArea update, + IDeleteArea delete, + ILogger logger) { - _service = service; + _getById = getById; + _getAreasByMainArea = getAreasByMainArea; + _create = create; + _update = update; + _delete = delete; _logger = logger; } #endregion Global Scope @@ -34,23 +51,29 @@ public AreaController(IAreaPresenterController service, ILogger /// /// Área correspondente /// Retorna área correspondente + /// Requisição incorreta. + /// Usuário não autorizado. + /// Nenhuma área encontrada. [HttpGet("{id}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetById(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadAreaOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task GetById(Guid? id) { - _logger.LogInformation("Executando ({MethodName}) com os parâmetros: Id = {id}", id); + _logger.LogInformation("Executando ({MethodName}) com os parâmetros: Id = {id}", nameof(GetById), id); if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O id informado não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - Adapters.Gateways.Base.IResponse model = await _service.GetById(id); - _logger.LogInformation("Método ({MethodName}) executado. Retorno: Id = {id}", id); + var model = await _getById.ExecuteAsync(id); + _logger.LogInformation("Método ({MethodName}) executado. Retorno: Id = {id}", nameof(GetById), id); return Ok(model); } catch (Exception ex) @@ -66,30 +89,35 @@ public async Task> GetById(Guid? id) /// /// Todas as áreas ativas da área principal /// Retorna todas as áreas ativas da área principal + /// Requisição incorreta. + /// Usuário não autorizado. + /// Nenhuma área encontrada. [HttpGet] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetAreasByMainArea(Guid? mainAreaId, int skip = 0, int take = 50) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(List))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task GetAreasByMainArea(Guid? mainAreaId, int skip = 0, int take = 50) { _logger.LogInformation("Executando método com os parâmetros: MainAreaId = {mainAreaId}, Skip = {skip}, Take = {take}", mainAreaId, skip, take); if (mainAreaId == null) { - const string msg = "O MainAreaId informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O MainAreaId informado não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - IEnumerable models = await _service.GetAreasByMainArea(mainAreaId, skip, take); - if (models == null) + var models = await _getAreasByMainArea.ExecuteAsync(mainAreaId, skip, take); + if (models == null || !models.Any()) { - const string msg = "Nenhuma Área encontrada."; - _logger.LogWarning(msg); - return NotFound(msg); + const string errorMessage = "Nenhuma Área encontrada."; + _logger.LogWarning(errorMessage); + return NotFound(errorMessage); } - int count = models.Count(); - _logger.LogInformation("Método finalizado, retorno: Número de entidades = {count}", count); + _logger.LogInformation("Método finalizado, retorno: Número de entidades = {count}", models.Count()); return Ok(models); } catch (Exception ex) @@ -104,17 +132,19 @@ public async Task>> GetAreasBy /// /// /// Área criada - /// Retorna área criada + /// Retorna área criada + /// Requisição incorreta. [HttpPost] [Authorize(Roles = "ADMIN")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> Create([FromBody] CreateAreaRequest request) + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(DetailedReadAreaOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + public async Task Create([FromBody] CreateAreaInput request) { try { - DetailedReadAreaResponse? model = await _service.Create(request) as DetailedReadAreaResponse; - _logger.LogInformation("Método finalizado, retorno: Id = {id}", model?.Id); - return Ok(model); + var createdArea = await _create.ExecuteAsync(request); + _logger.LogInformation("Área criada {id}", createdArea?.Id); + return CreatedAtAction(nameof(GetById), new { id = createdArea?.Id }, createdArea); } catch (Exception ex) { @@ -129,13 +159,23 @@ public async Task> Create([FromBody] Crea /// /// Área atualizada /// Retorna área atualizada + /// Requisição incorreta. + /// Usuário não autorizado. [HttpPut("{id}")] [Authorize(Roles = "ADMIN")] - public async Task> Update(Guid? id, [FromBody] UpdateAreaRequest request) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadAreaOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task Update(Guid? id, [FromBody] UpdateAreaInput request) { + if (id == null) + { + return BadRequest("O id informado não pode ser nulo."); + } + try { - DetailedReadAreaResponse? model = await _service.Update(id, request) as DetailedReadAreaResponse; + var model = await _update.ExecuteAsync(id, request); _logger.LogInformation("Área atualizada: {id}", model?.Id); return Ok(model); } @@ -152,20 +192,23 @@ public async Task> Update(Guid? id, [From /// /// Área removida /// Retorna área removida + /// Requisição incorreta. + /// Usuário não autorizado. [HttpDelete("{id}")] [Authorize(Roles = "ADMIN")] - public async Task> Delete(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadAreaOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task Delete(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("O id informado não pode ser nulo."); } try { - DetailedReadAreaResponse? model = await _service.Delete(id.Value) as DetailedReadAreaResponse; + var model = await _delete.ExecuteAsync(id.Value); _logger.LogInformation("Área removida: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs b/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs index 01db3dac..b28b8fef 100644 --- a/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs +++ b/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.AssistanceType; -using Adapters.Interfaces; +using Application.Ports.AssistanceType; +using Application.Interfaces.UseCases.AssistanceType; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -14,16 +14,33 @@ namespace WebAPI.Controllers public class AssistanceTypeController : ControllerBase { #region Global Scope - private readonly IAssistanceTypePresenterController _service; + private readonly IGetAssistanceTypeById _getById; + private readonly IGetAssistanceTypes _getAll; + private readonly ICreateAssistanceType _create; + private readonly IUpdateAssistanceType _update; + private readonly IDeleteAssistanceType _delete; private readonly ILogger _logger; /// /// Construtor do Controller de Bolsa de Assistência. /// - /// - /// - public AssistanceTypeController(IAssistanceTypePresenterController service, ILogger logger) + /// Serviço de obtenção de bolsa de assistência pelo id. + /// Serviço de obtenção de todas as bolsas de assistência ativas. + /// Serviço de criação de bolsa de assistência. + /// Serviço de atualização de bolsa de assistência. + /// Serviço de remoção de bolsa de assistência. + /// Serviço de log. + public AssistanceTypeController(IGetAssistanceTypeById getById, + IGetAssistanceTypes getAll, + ICreateAssistanceType create, + IUpdateAssistanceType update, + IDeleteAssistanceType delete, + ILogger logger) { - _service = service; + _getById = getById; + _getAll = getAll; + _create = create; + _update = update; + _delete = delete; _logger = logger; } #endregion Global Scope @@ -34,21 +51,27 @@ public AssistanceTypeController(IAssistanceTypePresenterController service, ILog /// /// Bolsa de Assistência correspondente /// Retorna bolsa de assistência correspondente + /// Requisição incorreta. + /// Usuário não autorizado. + /// Nenhuma bolsa de assistência encontrada. [HttpGet("{id}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetById(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadAssistanceTypeOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task GetById(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O id informado não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - Adapters.Gateways.Base.IResponse model = await _service.GetById(id); - _logger.LogInformation("Bolsa de Assistência encontrado para o id {id}.", id); + var model = await _getById.ExecuteAsync(id); + _logger.LogInformation("Bolsa de Assistência encontrada para o id {id}.", id); return Ok(model); } catch (Exception ex) @@ -64,18 +87,24 @@ public async Task> GetById(Guid /// /// Todas as bolsas de assitência ativas /// Retorna todas as bolsas de assitência ativas + /// Requisição incorreta. + /// Usuário não autorizado. + /// Nenhuma bolsa de assitência encontrada. [HttpGet] [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetAll(int skip = 0, int take = 50) + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetAll(int skip = 0, int take = 50) { - IEnumerable models = await _service.GetAll(skip, take); + var models = await _getAll.ExecuteAsync(skip, take); if (models == null) { - const string msg = "Nenhum Bolsa de Assistência encontrado."; - _logger.LogWarning(msg); - return NotFound(msg); + const string errorMessage = "Nenhum Bolsa de Assistência encontrada."; + _logger.LogWarning(errorMessage); + return NotFound(errorMessage); } - _logger.LogInformation("Tipos de Programas encontrados: {quantidade}", models.Count()); + _logger.LogInformation("Bolsas de Assistência encontradas: {quantidade}", models.Count()); return Ok(models); } @@ -83,18 +112,22 @@ public async Task>> /// Cria bolsa de assistência. /// /// - /// Bolsa de Assistência criado - /// Retorna bolsa de assistência criado + /// Bolsa de Assistência criada + /// Retorna bolsa de assistência criada + /// Requisição incorreta. + /// Usuário não autorizado. [HttpPost] - [ProducesResponseType(StatusCodes.Status200OK)] [Authorize(Roles = "ADMIN")] - public async Task> Create([FromBody] CreateAssistanceTypeRequest request) + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(DetailedReadAssistanceTypeOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task Create([FromBody] CreateAssistanceTypeInput request) { try { - DetailedReadAssistanceTypeResponse? model = await _service.Create(request) as DetailedReadAssistanceTypeResponse; - _logger.LogInformation("Bolsa de Assistência criado: {id}", model?.Id); - return Ok(model); + var createdAssistanceType = await _create.ExecuteAsync(request); + _logger.LogInformation("Bolsa de Assistência criada {id}", createdAssistanceType?.Id); + return CreatedAtAction(nameof(GetById), new { id = createdAssistanceType?.Id }, createdAssistanceType); } catch (Exception ex) { @@ -107,17 +140,27 @@ public async Task> Create([From /// Atualiza bolsa de assistência. /// /// - /// Bolsa de Assistência atualizado - /// Retorna bolsa de assistência atualizado + /// Bolsa de Assistência atualizada + /// Retorna bolsa de assistência atualizada + /// Requisição incorreta. + /// Usuário não autorizado. [HttpPut("{id}")] [Authorize(Roles = "ADMIN")] - public async Task> Update(Guid? id, [FromBody] UpdateAssistanceTypeRequest request) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadAssistanceTypeOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task Update(Guid? id, [FromBody] UpdateAssistanceTypeInput request) { + if (id == null) + { + return BadRequest("O id informado não pode ser nulo."); + } + try { - DetailedReadAssistanceTypeResponse? model = await _service.Update(id, request) as DetailedReadAssistanceTypeResponse; - _logger.LogInformation("Bolsa de Assistência atualizado: {id}", model?.Id); - return Ok(model); + var updatedAssistanceType = await _update.ExecuteAsync(id, request); + _logger.LogInformation("Bolsa de Assistência atualizado: {id}", updatedAssistanceType?.Id); + return Ok(updatedAssistanceType); } catch (Exception ex) { @@ -132,20 +175,25 @@ public async Task> Update(Guid? /// /// Bolsa de Assistência removido /// Retorna bolsa de assistência removido + /// Requisição incorreta. + /// Usuário não autorizado. [HttpDelete("{id}")] [Authorize(Roles = "ADMIN")] - public async Task> Delete(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadAssistanceTypeOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task Delete(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O id informado não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - DetailedReadAssistanceTypeResponse? model = await _service.Delete(id.Value) as DetailedReadAssistanceTypeResponse; + var model = await _delete.ExecuteAsync(id.Value); _logger.LogInformation("Bolsa de Assistência removido: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/AuthController.cs b/src/Infrastructure/WebAPI/Controllers/AuthController.cs index 0b030402..09137217 100644 --- a/src/Infrastructure/WebAPI/Controllers/AuthController.cs +++ b/src/Infrastructure/WebAPI/Controllers/AuthController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.Auth; -using Adapters.Interfaces; +using Application.Ports.Auth; +using Application.Interfaces.UseCases.Auth; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -13,16 +13,29 @@ namespace WebAPI.Controllers public class AuthController : ControllerBase { #region Global Scope - private readonly IAuthPresenterController _authService; + private readonly IConfirmEmail _confirmEmail; + private readonly IForgotPassword _forgotPassword; + private readonly ILogin _login; + private readonly IResetPassword _resetPassword; private readonly ILogger _logger; /// /// Construtor do Controller de Autenticação. /// - /// - /// - public AuthController(IAuthPresenterController authService, ILogger logger) + /// Serviço de confirmação de e-mail. + /// Serviço de solicitação de reset de senha. + /// Serviço de login. + /// Serviço de reset de senha. + /// Serviço de log. + public AuthController(IConfirmEmail confirmEmail, + IForgotPassword forgotPassword, + ILogin login, + IResetPassword resetPassword, + ILogger logger) { - _authService = authService; + _confirmEmail = confirmEmail; + _forgotPassword = forgotPassword; + _login = login; + _resetPassword = resetPassword; _logger = logger; } #endregion Global Scope @@ -34,13 +47,16 @@ public AuthController(IAuthPresenterController authService, ILoggerToken de validação /// Resultado da solicitação de validação /// E-mail confirmado com sucesso + /// Requisição incorreta. [AllowAnonymous] [HttpPost("ConfirmEmail", Name = "ConfirmEmail")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(string))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task> ConfirmEmail(string? email, string? token) { try { - string result = await _authService.ConfirmEmail(email, token); + string result = await _confirmEmail.ExecuteAsync(email, token); _logger.LogInformation("Resultado: {Result}", result); return Ok(result); } @@ -58,13 +74,16 @@ public async Task> ConfirmEmail(string? email, string? toke /// /// Resultado da requisição /// Solicitação realizada com sucesso + /// Requisição incorreta. [AllowAnonymous] [HttpPost("ForgotPassword", Name = "ForgotPassword")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(string))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task> ForgotPassword(string? email) { try { - string result = await _authService.ForgotPassword(email); + string result = await _forgotPassword.ExecuteAsync(email); _logger.LogInformation("Resultado: {Result}", result); return Ok(result); } @@ -81,13 +100,16 @@ public async Task> ForgotPassword(string? email) /// /// Retorna token de acesso /// Retorna token de acesso + /// Requisição incorreta. [AllowAnonymous] [HttpPost("Login", Name = "Login")] - public async Task> Login([FromBody] UserLoginRequest request) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(UserLoginOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + public async Task> Login([FromBody] UserLoginInput request) { try { - UserLoginResponse model = await _authService.Login(request); + var model = await _login.ExecuteAsync(request); _logger.LogInformation("Login realizado pelo usuário: {email}.", request.Email); return Ok(model); } @@ -104,13 +126,16 @@ public async Task> Login([FromBody] UserLoginReq /// /// Retorna o status da alteração /// Retorna o status da alteração + /// Requisição incorreta. [AllowAnonymous] [HttpPost("ResetPassword", Name = "ResetPassword")] - public async Task> ResetPassword([FromBody] UserResetPasswordRequest request) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(string))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + public async Task> ResetPassword([FromBody] UserResetPasswordInput request) { try { - string result = await _authService.ResetPassword(request); + string result = await _resetPassword.ExecuteAsync(request); _logger.LogInformation("Resultado: {Result}", result); return Ok(result); } diff --git a/src/Infrastructure/WebAPI/Controllers/CampusController.cs b/src/Infrastructure/WebAPI/Controllers/CampusController.cs index 129f42bb..9932d658 100644 --- a/src/Infrastructure/WebAPI/Controllers/CampusController.cs +++ b/src/Infrastructure/WebAPI/Controllers/CampusController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.Campus; -using Adapters.Interfaces; +using Application.Ports.Campus; +using Application.Interfaces.UseCases.Campus; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -14,16 +14,33 @@ namespace WebAPI.Controllers public class CampusController : ControllerBase { #region Global Scope - private readonly ICampusPresenterController _service; + private readonly IGetCampusById _getById; + private readonly IGetCampuses _getAll; + private readonly ICreateCampus _create; + private readonly IUpdateCampus _update; + private readonly IDeleteCampus _delete; private readonly ILogger _logger; /// /// Construtor do Controller de Campus. /// - /// - /// - public CampusController(ICampusPresenterController service, ILogger logger) + /// Serviço de obtenção de campus pelo id. + /// Serviço de obtenção de todos os campus ativos. + /// Serviço de criação de campus. + /// Serviço de atualização de campus. + /// Serviço de remoção de campus. + /// Serviço de log. + public CampusController(IGetCampusById getById, + IGetCampuses getAll, + ICreateCampus create, + IUpdateCampus update, + IDeleteCampus delete, + ILogger logger) { - _service = service; + _getById = getById; + _getAll = getAll; + _create = create; + _update = update; + _delete = delete; _logger = logger; } #endregion Global Scope @@ -34,27 +51,30 @@ public CampusController(ICampusPresenterController service, ILogger /// Campus correspondente /// Retorna campus correspondente + /// Requisição incorreta. + /// Campus não encontrado. [HttpGet("{id}")] [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetById(Guid? id) + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetById(Guid? id) { - if (id == null) - { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); - } - try { - Adapters.Gateways.Base.IResponse model = await _service.GetById(id); + var model = await _getById.ExecuteAsync(id); + if (model == null) + { + const string errorMessage = "Campus não encontrado."; + _logger.LogWarning(errorMessage); + return NotFound(errorMessage); + } _logger.LogInformation("Campus encontrado para o id {id}.", id); return Ok(model); } catch (Exception ex) { _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); - return NotFound(ex.Message); + return BadRequest(ex.Message); } } @@ -64,37 +84,53 @@ public async Task> GetById(Guid? id) /// /// Todas os campus ativos /// Retorna todas os campus ativos + /// Requisição incorreta. + /// Nenhum Campus encontrado. [HttpGet] [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetAll(int skip = 0, int take = 50) + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetAll(int skip = 0, int take = 50) { - IEnumerable models = await _service.GetAll(skip, take); - if (models == null) + try { - const string msg = "Nenhum Campus encontrado."; - _logger.LogWarning(msg); - return NotFound(msg); + var models = await _getAll.ExecuteAsync(skip, take); + if (models == null) + { + const string errorMessage = "Nenhum Campus encontrado."; + _logger.LogWarning(errorMessage); + return NotFound(errorMessage); + } + _logger.LogInformation("Campus encontrados: {quantidade}", models.Count()); + return Ok(models); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); } - _logger.LogInformation("Campus encontrados: {quantidade}", models.Count()); - return Ok(models); } /// - /// Cria campus. + /// Cria um novo campus. /// - /// - /// Campus criado - /// Retorna campus criado + /// Informações do campus + /// O campus criado + /// Retorna o campus recém-criado + /// Requisição inválida, se a entrada for inválida + /// Não autorizado, se o usuário não tiver a função necessária [HttpPost] - [ProducesResponseType(StatusCodes.Status200OK)] [Authorize(Roles = "ADMIN")] - public async Task> Create([FromBody] CreateCampusRequest request) + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(DetailedReadCampusOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task> Create([FromBody] CreateCampusInput request) { try { - DetailedReadCampusResponse? model = await _service.Create(request) as DetailedReadCampusResponse; + var model = await _create.ExecuteAsync(request); _logger.LogInformation("Campus criado: {id}", model?.Id); - return Ok(model); + return CreatedAtAction(nameof(GetById), new { id = model?.Id }, model); } catch (Exception ex) { @@ -104,19 +140,38 @@ public async Task> Create([FromBody] Cr } /// - /// Atualiza campus. + /// Atualiza um campus. /// - /// - /// Campus atualizado - /// Retorna campus atualizado + /// O ID do campus a ser atualizado + /// Informações de atualização do campus + /// O campus atualizado + /// Retorna o campus atualizado + /// Requisição inválida, se a entrada for inválida + /// Não autorizado, se o usuário não tiver a função necessária + /// Não encontrado, se o campus não existir [HttpPut("{id}")] [Authorize(Roles = "ADMIN")] - public async Task> Update(Guid? id, [FromBody] UpdateCampusRequest request) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadCampusOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> Update(Guid? id, [FromBody] UpdateCampusInput request) { + if (id == null) + { + return BadRequest("O ID do campus não foi fornecido."); + } + try { - DetailedReadCampusResponse? model = await _service.Update(id, request) as DetailedReadCampusResponse; - _logger.LogInformation("Campus atualizado: {id}", model?.Id); + var model = await _update.ExecuteAsync(id.Value, request); + + if (model == null) + { + return NotFound(); + } + + _logger.LogInformation("Campus atualizado: {id}", model.Id); return Ok(model); } catch (Exception ex) @@ -127,26 +182,38 @@ public async Task> Update(Guid? id, [Fr } /// - /// Remove campus. + /// Remove um campus. /// - /// - /// Campus removido - /// Retorna campus removido + /// O ID do campus a ser removido + /// O campus removido + /// Retorna o campus removido + /// Requisição inválida, se o ID for nulo + /// Não autorizado, se o usuário não tiver a função necessária + /// Não encontrado, se o campus não existir [HttpDelete("{id}")] [Authorize(Roles = "ADMIN")] - public async Task> Delete(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadCampusOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> Remover(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do campus não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - DetailedReadCampusResponse? model = await _service.Delete(id.Value) as DetailedReadCampusResponse; - _logger.LogInformation("Campus removido: {id}", model?.Id); + var model = await _delete.ExecuteAsync(id.Value); + if (model == null) + { + return NotFound(); + } + + _logger.LogInformation("Campus removido: {id}", model.Id); return Ok(model); } catch (Exception ex) diff --git a/src/Infrastructure/WebAPI/Controllers/CourseController.cs b/src/Infrastructure/WebAPI/Controllers/CourseController.cs index 43663be4..2f3f5185 100644 --- a/src/Infrastructure/WebAPI/Controllers/CourseController.cs +++ b/src/Infrastructure/WebAPI/Controllers/CourseController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.Course; -using Adapters.Interfaces; +using Application.Ports.Course; +using Application.Interfaces.UseCases.Course; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -14,16 +14,33 @@ namespace WebAPI.Controllers public class CourseController : ControllerBase { #region Global Scope - private readonly ICoursePresenterController _service; + private readonly IGetCourseById _getById; + private readonly IGetCourses _getAll; + private readonly ICreateCourse _create; + private readonly IUpdateCourse _update; + private readonly IDeleteCourse _delete; private readonly ILogger _logger; /// /// Construtor do Controller de Curso. /// - /// - /// - public CourseController(ICoursePresenterController service, ILogger logger) + /// Serviço de obtenção de curso pelo id. + /// Serviço de obtenção de todos os cursos ativos. + /// Serviço de criação de curso. + /// Serviço de atualização de curso. + /// Serviço de remoção de curso. + /// Serviço de log. + public CourseController(IGetCourseById getById, + IGetCourses getAll, + ICreateCourse create, + IUpdateCourse update, + IDeleteCourse delete, + ILogger logger) { - _service = service; + _getById = getById; + _getAll = getAll; + _create = create; + _update = update; + _delete = delete; _logger = logger; } #endregion Global Scope @@ -34,27 +51,37 @@ public CourseController(ICoursePresenterController service, ILogger /// Curso correspondente /// Retorna curso correspondente + /// Requisição incorreta. + /// Curso não encontrado. + /// Usuário não autorizado. [HttpGet("{id}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetById(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadCourseOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetById(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do curso não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - Adapters.Gateways.Base.IResponse model = await _service.GetById(id); - _logger.LogInformation("Curso encontrado para o id {id}.", id); - return Ok(model); + var course = await _getById.ExecuteAsync(id); + if (course == null) + { + return NotFound(); + } + _logger.LogInformation("Curso encontrado para o ID {id}.", id); + return Ok(course); } catch (Exception ex) { _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); - return NotFound(ex.Message); + return BadRequest(ex.Message); } } @@ -65,18 +92,28 @@ public async Task> GetById(Guid? id) /// Todas os cursos ativos /// Retorna todas os cursos ativos [HttpGet] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetAll(int skip = 0, int take = 50) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task>> GetAll(int skip = 0, int take = 50) { - IEnumerable models = await _service.GetAll(skip, take); - if (models == null) + try { - const string msg = "Nenhum Curso encontrado."; - _logger.LogWarning(msg); - return NotFound(msg); + var courses = await _getAll.ExecuteAsync(skip, take); + if (courses == null || !courses.Any()) + { + const string errorMessage = "Nenhum curso encontrado."; + _logger.LogWarning(errorMessage); + return NotFound(errorMessage); + } + _logger.LogInformation("Cursos encontrados: {quantidade}", courses.Count()); + return Ok(courses); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); } - _logger.LogInformation("Cursos encontrados: {quantidade}", models.Count()); - return Ok(models); } /// @@ -84,17 +121,21 @@ public async Task>> GetAll(i /// /// /// Curso criado - /// Retorna curso criado + /// Retorna curso criado + /// Requisição incorreta. + /// Usuário não autorizado. [HttpPost] - [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(DetailedReadCourseOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] [Authorize(Roles = "ADMIN")] - public async Task> Create([FromBody] CreateCourseRequest request) + public async Task> Create([FromBody] CreateCourseInput request) { try { - DetailedReadCourseResponse? model = await _service.Create(request) as DetailedReadCourseResponse; - _logger.LogInformation("Curso criado: {id}", model?.Id); - return Ok(model); + var createdCourse = await _create.ExecuteAsync(request); + _logger.LogInformation("Curso criado: {id}", createdCourse?.Id); + return CreatedAtAction(nameof(GetById), new { id = createdCourse?.Id }, createdCourse); } catch (Exception ex) { @@ -109,15 +150,31 @@ public async Task> Create([FromBody] Cr /// /// Curso atualizado /// Retorna curso atualizado + /// Requisição incorreta. + /// Usuário não autorizado. [HttpPut("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadCourseOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] [Authorize(Roles = "ADMIN")] - public async Task> Update(Guid? id, [FromBody] UpdateCourseRequest request) + public async Task> Update(Guid? id, [FromBody] UpdateCourseInput request) { + if (id == null) + { + const string errorMessage = "O ID do curso não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); + } + try { - DetailedReadCourseResponse? model = await _service.Update(id, request) as DetailedReadCourseResponse; - _logger.LogInformation("Curso atualizado: {id}", model?.Id); - return Ok(model); + var updatedCourse = await _update.ExecuteAsync(id.Value, request); + if (updatedCourse == null) + { + return NotFound(); + } + _logger.LogInformation("Curso atualizado: {id}", updatedCourse?.Id); + return Ok(updatedCourse); } catch (Exception ex) { @@ -132,22 +189,31 @@ public async Task> Update(Guid? id, [Fr /// /// Curso removido /// Retorna curso removido + /// Requisição incorreta. + /// Usuário não autorizado. [HttpDelete("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadCourseOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] [Authorize(Roles = "ADMIN")] - public async Task> Delete(Guid? id) + public async Task> Delete(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do curso não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - DetailedReadCourseResponse? model = await _service.Delete(id.Value) as DetailedReadCourseResponse; - _logger.LogInformation("Curso removido: {id}", model?.Id); - return Ok(model); + var deletedCourse = await _delete.ExecuteAsync(id.Value); + if (deletedCourse == null) + { + return NotFound(); + } + _logger.LogInformation("Curso removido: {id}", deletedCourse?.Id); + return Ok(deletedCourse); } catch (Exception ex) { diff --git a/src/Infrastructure/WebAPI/Controllers/MainAreaController.cs b/src/Infrastructure/WebAPI/Controllers/MainAreaController.cs index 30373af9..f407447d 100644 --- a/src/Infrastructure/WebAPI/Controllers/MainAreaController.cs +++ b/src/Infrastructure/WebAPI/Controllers/MainAreaController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.MainArea; -using Adapters.Interfaces; +using Application.Ports.MainArea; +using Application.Interfaces.UseCases.MainArea; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -14,16 +14,33 @@ namespace WebAPI.Controllers public class MainAreaController : ControllerBase { #region Global Scope - private readonly IMainAreaPresenterController _service; + private readonly IGetMainAreaById _getById; + private readonly IGetMainAreas _getAll; + private readonly ICreateMainArea _create; + private readonly IUpdateMainArea _update; + private readonly IDeleteMainArea _delete; private readonly ILogger _logger; /// /// Construtor do Controller de Área Principal. /// - /// - /// - public MainAreaController(IMainAreaPresenterController service, ILogger logger) + /// Serviço de obtenção de área principal pelo id. + /// Serviço de obtenção de todas as áreas principais ativas. + /// Serviço de criação de área principal. + /// Serviço de atualização de área principal. + /// Serviço de remoção de área principal. + /// Serviço de log. + public MainAreaController(IGetMainAreaById getById, + IGetMainAreas getAll, + ICreateMainArea create, + IUpdateMainArea update, + IDeleteMainArea delete, + ILogger logger) { - _service = service; + _getById = getById; + _getAll = getAll; + _create = create; + _update = update; + _delete = delete; _logger = logger; } #endregion Global Scope @@ -34,27 +51,37 @@ public MainAreaController(IMainAreaPresenterController service, ILogger /// Área principal correspondente /// Retorna área principal correspondente + /// Requisição incorreta. + /// Usuário não autorizado. + /// Área principal não encontrada. [HttpGet("{id}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetById(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedMainAreaOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetById(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID da área principal não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - Adapters.Gateways.Base.IResponse model = await _service.GetById(id); - _logger.LogInformation("Área Principal encontrada para o id {id}.", id); - return Ok(model); + var mainArea = await _getById.ExecuteAsync(id.Value); + if (mainArea == null) + { + return NotFound(); + } + _logger.LogInformation("Área Principal encontrada para o ID {id}.", id); + return Ok(mainArea); } catch (Exception ex) { _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); - return NotFound(ex.Message); + return BadRequest(ex.Message); } } @@ -64,19 +91,25 @@ public async Task> GetById(Guid? id) /// /// Todas as áreas principais ativas /// Retorna todas as áreas principais ativas + /// Requisição incorreta. + /// Usuário não autorizado. + /// Nenhuma área principal encontrada. [HttpGet] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetAll(int skip = 0, int take = 50) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetAll(int skip = 0, int take = 50) { - IEnumerable models = await _service.GetAll(skip, take); - if (models == null) + var mainAreas = await _getAll.ExecuteAsync(skip, take); + if (mainAreas == null || !mainAreas.Any()) { - const string msg = "Nenhuma Área Principal encontrada."; - _logger.LogWarning(msg); - return NotFound(msg); + const string errorMessage = "Nenhuma Área Principal encontrada."; + _logger.LogWarning(errorMessage); + return NotFound(errorMessage); } - _logger.LogInformation("Áreas principais encontradas: {quantidade}", models.Count()); - return Ok(models); + _logger.LogInformation("Áreas principais encontradas: {quantidade}", mainAreas.Count()); + return Ok(mainAreas); } /// @@ -84,17 +117,21 @@ public async Task>> GetAll /// /// /// Área principal criada - /// Retorna área principal criada + /// Retorna área principal criada + /// Requisição incorreta. + /// Usuário não autorizado. [HttpPost] - [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(DetailedMainAreaOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] [Authorize(Roles = "ADMIN")] - public async Task> Create([FromBody] CreateMainAreaRequest request) + public async Task> Create([FromBody] CreateMainAreaInput request) { try { - DetailedReadMainAreaResponse? model = await _service.Create(request) as DetailedReadMainAreaResponse; - _logger.LogInformation("Área principal criada: {id}", model?.Id); - return Ok(model); + var createdMainArea = await _create.ExecuteAsync(request); + _logger.LogInformation("Área principal criada: {id}", createdMainArea?.Id); + return CreatedAtAction(nameof(GetById), new { id = createdMainArea?.Id }, createdMainArea); } catch (Exception ex) { @@ -109,15 +146,33 @@ public async Task> Create([FromBody] /// /// Área principal atualizada /// Retorna área principal atualizada + /// Requisição incorreta. + /// Usuário não autorizado. + /// Área principal não encontrada. [HttpPut("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedMainAreaOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN")] - public async Task> Update(Guid? id, [FromBody] UpdateMainAreaRequest request) + public async Task> Update(Guid? id, [FromBody] UpdateMainAreaInput request) { + if (id == null) + { + const string errorMessage = "O ID da área principal não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); + } + try { - DetailedReadMainAreaResponse? model = await _service.Update(id, request) as DetailedReadMainAreaResponse; - _logger.LogInformation("Área principal atualizada: {id}", model?.Id); - return Ok(model); + var updatedMainArea = await _update.ExecuteAsync(id.Value, request); + if (updatedMainArea == null) + { + return NotFound(); + } + _logger.LogInformation("Área principal atualizada: {id}", updatedMainArea?.Id); + return Ok(updatedMainArea); } catch (Exception ex) { @@ -132,22 +187,33 @@ public async Task> Update(Guid? id, [ /// /// Área principal removida /// Retorna área principal removida + /// Requisição incorreta. + /// Usuário não autorizado. + /// Área principal não encontrada. [HttpDelete("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedMainAreaOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN")] - public async Task> Delete(Guid? id) + public async Task> Delete(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID da área principal não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - DetailedReadMainAreaResponse? model = await _service.Delete(id.Value) as DetailedReadMainAreaResponse; - _logger.LogInformation("Área principal removida: {id}", model?.Id); - return Ok(model); + var deletedMainArea = await _delete.ExecuteAsync(id.Value); + if (deletedMainArea == null) + { + return NotFound(); + } + _logger.LogInformation("Área principal removida: {id}", deletedMainArea?.Id); + return Ok(deletedMainArea); } catch (Exception ex) { diff --git a/src/Infrastructure/WebAPI/Controllers/NoticeController.cs b/src/Infrastructure/WebAPI/Controllers/NoticeController.cs index beafdc6e..af938142 100644 --- a/src/Infrastructure/WebAPI/Controllers/NoticeController.cs +++ b/src/Infrastructure/WebAPI/Controllers/NoticeController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.Notice; -using Adapters.Interfaces; +using Application.Ports.Notice; +using Application.Interfaces.UseCases.Notice; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -14,16 +14,33 @@ namespace WebAPI.Controllers public class NoticeController : ControllerBase { #region Global Scope - private readonly INoticePresenterController _service; + private readonly IGetNoticeById _getById; + private readonly IGetNotices _getAll; + private readonly ICreateNotice _create; + private readonly IUpdateNotice _update; + private readonly IDeleteNotice _delete; private readonly ILogger _logger; /// /// Construtor do Controller de Edital. /// - /// - /// - public NoticeController(INoticePresenterController service, ILogger logger) + /// Serviço de obtenção de edital pelo id. + /// Serviço de obtenção de todos os editais ativos. + /// Serviço de criação de edital. + /// Serviço de atualização de edital. + /// Serviço de remoção de edital. + /// Serviço de log. + public NoticeController(IGetNoticeById getById, + IGetNotices getAll, + ICreateNotice create, + IUpdateNotice update, + IDeleteNotice delete, + ILogger logger) { - _service = service; + _getById = getById; + _getAll = getAll; + _create = create; + _update = update; + _delete = delete; _logger = logger; } #endregion Global Scope @@ -34,27 +51,37 @@ public NoticeController(INoticePresenterController service, ILogger /// Edital correspondente /// Retorna edital correspondente + /// Requisição incorreta. + /// Usuário não autorizado. + /// Edital não encontrado. [HttpGet("{id}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetById(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadNoticeOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetById(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do edital não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - Adapters.Gateways.Base.IResponse model = await _service.GetById(id); - _logger.LogInformation("Edital encontrado para o id {id}.", id); - return Ok(model); + var notice = await _getById.ExecuteAsync(id.Value); + if (notice == null) + { + return NotFound(); + } + _logger.LogInformation("Edital encontrado para o ID {id}.", id); + return Ok(notice); } catch (Exception ex) { _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); - return NotFound(ex.Message); + return BadRequest(ex.Message); } } @@ -64,19 +91,25 @@ public async Task> GetById(Guid? id) /// /// Todas os editais ativos /// Retorna todas os editais ativos + /// Requisição incorreta. + /// Usuário não autorizado. + /// Nenhum edital encontrado. [HttpGet] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetAll(int skip = 0, int take = 50) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetAll(int skip = 0, int take = 50) { - IEnumerable models = await _service.GetAll(skip, take); - if (models == null) + var notices = await _getAll.ExecuteAsync(skip, take); + if (notices == null || !notices.Any()) { - const string msg = "Nenhum Edital encontrado."; - _logger.LogWarning(msg); - return NotFound(msg); + const string errorMessage = "Nenhum edital encontrado."; + _logger.LogWarning(errorMessage); + return NotFound(errorMessage); } - _logger.LogInformation("Editais encontrados: {quantidade}", models.Count()); - return Ok(models); + _logger.LogInformation("Editais encontrados: {quantidade}", notices.Count()); + return Ok(notices); } /// @@ -84,17 +117,21 @@ public async Task>> GetAll(i /// /// /// Edital criado - /// Retorna edital criado + /// Retorna edital criado + /// Requisição incorreta. + /// Usuário não autorizado. [HttpPost] - [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(DetailedReadNoticeOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] [Authorize(Roles = "ADMIN")] - public async Task> Create([FromForm] CreateNoticeRequest request) + public async Task> Create([FromForm] CreateNoticeInput request) { try { - DetailedReadNoticeResponse? model = await _service.Create(request) as DetailedReadNoticeResponse; - _logger.LogInformation("Edital criado: {id}", model?.Id); - return Ok(model); + var createdNotice = await _create.ExecuteAsync(request); + _logger.LogInformation("Edital criado: {id}", createdNotice?.Id); + return CreatedAtAction(nameof(GetById), new { id = createdNotice?.Id }, createdNotice); } catch (Exception ex) { @@ -109,15 +146,33 @@ public async Task> Create([FromForm] Cr /// /// Edital atualizado /// Retorna edital atualizado + /// Requisição incorreta. + /// Usuário não autorizado. + /// Edital não encontrado. [HttpPut("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadNoticeOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN")] - public async Task> Update(Guid? id, [FromForm] UpdateNoticeRequest request) + public async Task> Update(Guid? id, [FromForm] UpdateNoticeInput request) { + if (id == null) + { + const string errorMessage = "O ID do edital não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); + } + try { - DetailedReadNoticeResponse? model = await _service.Update(id, request) as DetailedReadNoticeResponse; - _logger.LogInformation("Edital atualizado: {id}", model?.Id); - return Ok(model); + var updatedNotice = await _update.ExecuteAsync(id.Value, request); + if (updatedNotice == null) + { + return NotFound(); + } + _logger.LogInformation("Edital atualizado: {id}", updatedNotice?.Id); + return Ok(updatedNotice); } catch (Exception ex) { @@ -132,22 +187,33 @@ public async Task> Update(Guid? id, [Fr /// /// Edital removido /// Retorna edital removido + /// Requisição incorreta. + /// Usuário não autorizado. + /// Edital não encontrado. [HttpDelete("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadNoticeOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN")] - public async Task> Delete(Guid? id) + public async Task> Delete(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do edital não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - DetailedReadNoticeResponse? model = await _service.Delete(id.Value) as DetailedReadNoticeResponse; - _logger.LogInformation("Edital removido: {id}", model?.Id); - return Ok(model); + var deletedNotice = await _delete.ExecuteAsync(id.Value); + if (deletedNotice == null) + { + return NotFound(); + } + _logger.LogInformation("Edital removido: {id}", deletedNotice?.Id); + return Ok(deletedNotice); } catch (Exception ex) { diff --git a/src/Infrastructure/WebAPI/Controllers/ProfessorController.cs b/src/Infrastructure/WebAPI/Controllers/ProfessorController.cs index 859ce787..86425860 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProfessorController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProfessorController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.Professor; -using Adapters.Interfaces; +using Application.Ports.Professor; +using Application.Interfaces.UseCases.Professor; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -14,16 +14,34 @@ namespace WebAPI.Controllers public class ProfessorController : ControllerBase { #region Global Scope - private readonly IProfessorPresenterController _service; + private readonly IGetProfessorById _getById; + private readonly IGetProfessors _getAll; + private readonly ICreateProfessor _create; + private readonly IUpdateProfessor _update; + private readonly IDeleteProfessor _delete; private readonly ILogger _logger; + /// /// Construtor do Controller de Professor. /// - /// - /// - public ProfessorController(IProfessorPresenterController service, ILogger logger) + /// Serviço de obtenção de professor pelo id. + /// Serviço de obtenção de todos os professores ativos. + /// Serviço de criação de professor. + /// Serviço de atualização de professor. + /// Serviço de remoção de professor. + /// Serviço de log. + public ProfessorController(IGetProfessorById getById, + IGetProfessors getAll, + ICreateProfessor create, + IUpdateProfessor update, + IDeleteProfessor delete, + ILogger logger) { - _service = service; + _getById = getById; + _getAll = getAll; + _create = create; + _update = update; + _delete = delete; _logger = logger; } #endregion Global Scope @@ -34,27 +52,37 @@ public ProfessorController(IProfessorPresenterController service, ILogger /// Professor correspondente /// Retorna Professor correspondente + /// Requisição incorreta. + /// Usuário não autorizado. + /// Professor não encontrado. [HttpGet("{id}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetById(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadProfessorOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetById(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do professor não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - Adapters.Gateways.Base.IResponse model = await _service.GetById(id); - _logger.LogInformation("Professor encontrado para o id {id}.", id); - return Ok(model); + var professor = await _getById.ExecuteAsync(id.Value); + if (professor == null) + { + return NotFound(); + } + _logger.LogInformation("Professor encontrado para o ID {id}.", id); + return Ok(professor); } catch (Exception ex) { _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); - return NotFound(ex.Message); + return BadRequest(ex.Message); } } @@ -64,19 +92,25 @@ public async Task> GetById(Guid? id) /// /// Todos os Professor ativos /// Retorna todos os Professor ativos + /// Requisição incorreta. + /// Usuário não autorizado. + /// Nenhum Professor encontrado. [HttpGet] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetAll(int skip = 0, int take = 50) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetAll(int skip = 0, int take = 50) { - IEnumerable models = await _service.GetAll(skip, take); - if (models == null) + var professors = await _getAll.ExecuteAsync(skip, take); + if (professors == null || !professors.Any()) { - const string msg = "Nenhum Professor encontrado."; - _logger.LogWarning(msg); - return NotFound(msg); + const string errorMessage = "Nenhum professor encontrado."; + _logger.LogWarning(errorMessage); + return NotFound(errorMessage); } - _logger.LogInformation("Professor encontrados: {quantidade}", models.Count()); - return Ok(models); + _logger.LogInformation("Professores encontrados: {quantidade}", professors.Count()); + return Ok(professors); } /// @@ -84,17 +118,19 @@ public async Task>> GetAl /// /// /// Professor criado - /// Retorna Professor criado + /// Retorna Professor criado + /// Requisição incorreta. [HttpPost] - [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(DetailedReadProfessorOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] [AllowAnonymous] - public async Task> Create([FromBody] CreateProfessorRequest request) + public async Task> Create([FromBody] CreateProfessorInput request) { try { - DetailedReadProfessorResponse? model = await _service.Create(request) as DetailedReadProfessorResponse; - _logger.LogInformation("Professor criado: {id}", model?.Id); - return Ok(model); + var createdProfessor = await _create.ExecuteAsync(request); + _logger.LogInformation("Professor criado: {id}", createdProfessor?.Id); + return CreatedAtAction(nameof(GetById), new { id = createdProfessor?.Id }, createdProfessor); } catch (Exception ex) { @@ -109,15 +145,33 @@ public async Task> Create([FromBody] /// /// Professor atualizado /// Retorna Professor atualizado + /// Requisição incorreta. + /// Usuário não autorizado. + /// Professor não encontrado. [HttpPut("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadProfessorOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN, PROFESSOR")] - public async Task> Update(Guid? id, [FromBody] UpdateProfessorRequest request) + public async Task> Update(Guid? id, [FromBody] UpdateProfessorInput request) { + if (id == null) + { + const string errorMessage = "O ID do professor não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); + } + try { - DetailedReadProfessorResponse? model = await _service.Update(id, request) as DetailedReadProfessorResponse; - _logger.LogInformation("Professor atualizado: {id}", model?.Id); - return Ok(model); + var updatedProfessor = await _update.ExecuteAsync(id.Value, request); + if (updatedProfessor == null) + { + return NotFound(); + } + _logger.LogInformation("Professor atualizado: {id}", updatedProfessor?.Id); + return Ok(updatedProfessor); } catch (Exception ex) { @@ -132,22 +186,33 @@ public async Task> Update(Guid? id, /// /// Professor removido /// Retorna Professor removido + /// Requisição incorreta. + /// Usuário não autorizado. + /// Professor não encontrado. [HttpDelete("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadProfessorOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN, PROFESSOR")] - public async Task> Delete(Guid? id) + public async Task> Delete(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do professor não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - DetailedReadProfessorResponse? model = await _service.Delete(id.Value) as DetailedReadProfessorResponse; - _logger.LogInformation("Professor removido: {id}", model?.Id); - return Ok(model); + var deletedProfessor = await _delete.ExecuteAsync(id.Value); + if (deletedProfessor == null) + { + return NotFound(); + } + _logger.LogInformation("Professor removido: {id}", deletedProfessor?.Id); + return Ok(deletedProfessor); } catch (Exception ex) { diff --git a/src/Infrastructure/WebAPI/Controllers/ProgramTypeController.cs b/src/Infrastructure/WebAPI/Controllers/ProgramTypeController.cs index df4f8ecf..1c032859 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProgramTypeController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProgramTypeController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.ProgramType; -using Adapters.Interfaces; +using Application.Ports.ProgramType; +using Application.Interfaces.UseCases.ProgramType; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -14,16 +14,34 @@ namespace WebAPI.Controllers public class ProgramTypeController : ControllerBase { #region Global Scope - private readonly IProgramTypePresenterController _service; + private readonly IGetProgramTypeById _getById; + private readonly IGetProgramTypes _getAll; + private readonly ICreateProgramType _create; + private readonly IUpdateProgramType _update; + private readonly IDeleteProgramType _delete; private readonly ILogger _logger; + /// /// Construtor do Controller de Tipo de Programa. /// - /// - /// - public ProgramTypeController(IProgramTypePresenterController service, ILogger logger) + /// Serviço de obtenção de tipo de programa pelo id. + /// Serviço de obtenção de todos os tipos de programas ativos. + /// Serviço de criação de tipo de programa. + /// Serviço de atualização de tipo de programa. + /// Serviço de remoção de tipo de programa. + /// Serviço de log. + public ProgramTypeController(IGetProgramTypeById getById, + IGetProgramTypes getAll, + ICreateProgramType create, + IUpdateProgramType update, + IDeleteProgramType delete, + ILogger logger) { - _service = service; + _getById = getById; + _getAll = getAll; + _create = create; + _update = update; + _delete = delete; _logger = logger; } #endregion Global Scope @@ -33,28 +51,38 @@ public ProgramTypeController(IProgramTypePresenterController service, ILogger /// /// Tipo de Programa correspondente - /// Retorna tipo de programa correspondente + /// Retorna Tipo de Programa correspondente + /// Requisição incorreta. + /// Usuário não autorizado. + /// Tipo de Programa não encontrado. [HttpGet("{id}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetById(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadProgramTypeOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetById(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do tipo de programa não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - Adapters.Gateways.Base.IResponse model = await _service.GetById(id); - _logger.LogInformation("Tipo de Programa encontrado para o id {id}.", id); - return Ok(model); + var programType = await _getById.ExecuteAsync(id.Value); + if (programType == null) + { + return NotFound(); + } + _logger.LogInformation("Tipo de programa encontrado para o ID {id}.", id); + return Ok(programType); } catch (Exception ex) { _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); - return NotFound(ex.Message); + return BadRequest(ex.Message); } } @@ -64,19 +92,25 @@ public async Task> GetById(Guid? i /// /// Todas os tipos de programas ativos /// Retorna todas os tipos de programas ativos + /// Requisição incorreta. + /// Usuário não autorizado. + /// Nenhum tipo de programa encontrado. [HttpGet] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetAll(int skip = 0, int take = 50) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetAll(int skip = 0, int take = 50) { - IEnumerable models = await _service.GetAll(skip, take); - if (models == null) + var programTypes = await _getAll.ExecuteAsync(skip, take); + if (programTypes == null || !programTypes.Any()) { - const string msg = "Nenhum Tipo de Programa encontrado."; - _logger.LogWarning(msg); - return NotFound(msg); + const string errorMessage = "Nenhum tipo de programa encontrado."; + _logger.LogWarning(errorMessage); + return NotFound(errorMessage); } - _logger.LogInformation("Tipos de Programas encontrados: {quantidade}", models.Count()); - return Ok(models); + _logger.LogInformation("Tipos de programa encontrados: {quantidade}", programTypes.Count()); + return Ok(programTypes); } /// @@ -84,17 +118,19 @@ public async Task>> Get /// /// /// Tipo de Programa criado - /// Retorna tipo de programa criado + /// Retorna tipo de programa criado + /// Requisição incorreta. [HttpPost] - [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(DetailedReadProgramTypeOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] [Authorize(Roles = "ADMIN")] - public async Task> Create([FromBody] CreateProgramTypeRequest request) + public async Task> Create([FromBody] CreateProgramTypeInput request) { try { - DetailedReadProgramTypeResponse? model = await _service.Create(request) as DetailedReadProgramTypeResponse; - _logger.LogInformation("Tipo de Programa criado: {id}", model?.Id); - return Ok(model); + var createdProgramType = await _create.ExecuteAsync(request); + _logger.LogInformation("Tipo de programa criado: {id}", createdProgramType?.Id); + return CreatedAtAction(nameof(GetById), new { id = createdProgramType?.Id }, createdProgramType); } catch (Exception ex) { @@ -109,15 +145,33 @@ public async Task> Create([FromBod /// /// Tipo de Programa atualizado /// Retorna tipo de programa atualizado + /// Requisição incorreta. + /// Usuário não autorizado. + /// Tipo de Programa não encontrado. [HttpPut("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadProgramTypeOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN")] - public async Task> Update(Guid? id, [FromBody] UpdateProgramTypeRequest request) + public async Task> Update(Guid? id, [FromBody] UpdateProgramTypeInput request) { + if (id == null) + { + const string errorMessage = "O ID do tipo de programa não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); + } + try { - DetailedReadProgramTypeResponse? model = await _service.Update(id, request) as DetailedReadProgramTypeResponse; - _logger.LogInformation("Tipo de Programa atualizado: {id}", model?.Id); - return Ok(model); + var updatedProgramType = await _update.ExecuteAsync(id.Value, request); + if (updatedProgramType == null) + { + return NotFound(); + } + _logger.LogInformation("Tipo de programa atualizado: {id}", updatedProgramType?.Id); + return Ok(updatedProgramType); } catch (Exception ex) { @@ -132,22 +186,33 @@ public async Task> Update(Guid? id /// /// Tipo de Programa removido /// Retorna tipo de programa removido + /// Requisição incorreta. + /// Usuário não autorizado. + /// Tipo de Programa não encontrado. [HttpDelete("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadProgramTypeOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN")] - public async Task> Delete(Guid? id) + public async Task> Delete(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do tipo de programa não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - DetailedReadProgramTypeResponse? model = await _service.Delete(id.Value) as DetailedReadProgramTypeResponse; - _logger.LogInformation("Tipo de Programa removido: {id}", model?.Id); - return Ok(model); + var deletedProgramType = await _delete.ExecuteAsync(id.Value); + if (deletedProgramType == null) + { + return NotFound(); + } + _logger.LogInformation("Tipo de programa removido: {id}", deletedProgramType?.Id); + return Ok(deletedProgramType); } catch (Exception ex) { diff --git a/src/Infrastructure/WebAPI/Controllers/ProjectController.cs b/src/Infrastructure/WebAPI/Controllers/ProjectController.cs index 56be58a0..26fec782 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProjectController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProjectController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.Project; -using Adapters.Interfaces; +using Application.Ports.Project; +using Application.Interfaces.UseCases.Project; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -14,19 +14,46 @@ namespace WebAPI.Controllers public class ProjectController : ControllerBase { #region Global Scope - private readonly IProjectPresenterController _service; + private readonly IAppealProject _appealProject; + private readonly ICancelProject _cancelProject; + private readonly IGetClosedProjects _getClosedProjects; + private readonly IGetOpenProjects _getOpenProjects; + private readonly IGetProjectById _getProjectById; + private readonly IOpenProject _openProject; + private readonly ISubmitProject _submitProject; + private readonly IUpdateProject _updateProject; private readonly ILogger _logger; /// /// Construtor do Controller de projetos. /// - /// - /// - public ProjectController( - IProjectPresenterController service, + /// Serviço de obtenção de projeto pelo id. + /// Serviço de obtenção de projetos abertos. + /// Serviço de obtenção de projetos fechados. + /// Serviço de abertura de projeto. + /// Serviço de atualização de projeto. + /// Serviço de cancelamento de projeto. + /// Serviço de recurso de projeto. + /// Serviço de submissão de projeto. + /// Serviço de log. + public ProjectController(IGetProjectById getProjectById, + IGetOpenProjects getOpenProjects, + IGetClosedProjects getClosedProjects, + IOpenProject openProject, + IUpdateProject updateProject, + ICancelProject cancelProject, + IAppealProject appealProject, + ISubmitProject submitProject, ILogger logger) { - _service = service; + _getProjectById = getProjectById; + _getOpenProjects = getOpenProjects; + _getClosedProjects = getClosedProjects; + _openProject = openProject; + _updateProject = updateProject; + _cancelProject = cancelProject; + _appealProject = appealProject; + _submitProject = submitProject; _logger = logger; } #endregion Global Scope @@ -37,28 +64,37 @@ public ProjectController( /// /// Projeto correspondente /// Retorna projeto correspondente + /// Requisição incorreta. + /// Usuário não autorizado. /// Nenhum projeto encontrado. [HttpGet("{id}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetProjectById(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadProjectOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetProjectById(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do projeto não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - DetailedReadProjectResponse model = await _service.GetProjectById(id); - _logger.LogInformation("Projeto encontrado para o id {id}.", id); - return Ok(model); + var project = await _getProjectById.ExecuteAsync(id.Value); + if (project == null) + { + return NotFound(); + } + _logger.LogInformation("Projeto encontrado para o ID {id}.", id); + return Ok(project); } catch (Exception ex) { _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); - return NotFound(ex.Message); + return BadRequest(ex.Message); } } @@ -70,20 +106,25 @@ public async Task> GetProjectById(Guid /// /// Projetos abertos do usuário logado. /// Retorna projetos abertos do usuário logado. + /// Ocorreu um erro ao buscar projetos abertos. + /// Usuário não autorizado. /// Nenhum projeto encontrado. [HttpGet("opened")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetOpenProjects(int skip = 0, int take = 50, bool onlyMyProjects = true) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetOpenProjects(int skip = 0, int take = 50, bool onlyMyProjects = true) { - IList models = await _service.GetOpenProjects(skip, take, onlyMyProjects); - if (models == null) + var projects = await _getOpenProjects.ExecuteAsync(skip, take, onlyMyProjects); + if (projects == null || !projects.Any()) { - const string msg = "Nenhum Projeto encontrado."; - _logger.LogWarning(msg); - return NotFound(msg); + const string errorMessage = "Nenhum projeto aberto encontrado."; + _logger.LogWarning(errorMessage); + return NotFound(errorMessage); } - _logger.LogInformation("Projetos encontrados: {quantidade}", models.Count); - return Ok(models); + _logger.LogInformation("Projetos abertos encontrados: {quantidade}", projects.Count); + return Ok(projects); } /// @@ -94,20 +135,25 @@ public async Task>> GetOpen /// /// Projetos fechados do usuário logado. /// Retorna projetos fechados do usuário logado. + /// Ocorreu um erro ao buscar projetos fechados. + /// Usuário não autorizado. /// Nenhum projeto encontrado. [HttpGet("closed")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetClosedProjects(int skip = 0, int take = 50, bool onlyMyProjects = true) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetClosedProjects(int skip = 0, int take = 50, bool onlyMyProjects = true) { - IList models = await _service.GetClosedProjects(skip, take, onlyMyProjects); - if (models == null) + var projects = await _getClosedProjects.ExecuteAsync(skip, take, onlyMyProjects); + if (projects == null || !projects.Any()) { - const string msg = "Nenhum Projeto encontrado."; - _logger.LogWarning(msg); - return NotFound(msg); + const string errorMessage = "Nenhum projeto fechado encontrado."; + _logger.LogWarning(errorMessage); + return NotFound(errorMessage); } - _logger.LogInformation("Projetos encontrados: {quantidade}", models.Count); - return Ok(models); + _logger.LogInformation("Projetos fechados encontrados: {quantidade}", projects.Count); + return Ok(projects); } /// @@ -117,16 +163,18 @@ public async Task>> GetClos /// Projeto criado /// Retorna projeto criado /// Ocorreu um erro ao criar projeto. + /// Usuário não autorizado. [HttpPost] - [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(ResumedReadProjectOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] [Authorize(Roles = "ADMIN, PROFESSOR")] - public async Task> OpenProject([FromBody] OpenProjectRequest request) + public async Task> OpenProject([FromBody] OpenProjectInput request) { try { - ResumedReadProjectResponse? model = await _service.OpenProject(request); - _logger.LogInformation("Projeto aberto: {id}", model?.Id); - return Ok(model); + var project = await _openProject.ExecuteAsync(request); + _logger.LogInformation("Projeto aberto: {id}", project?.Id); + return CreatedAtAction(nameof(GetProjectById), new { id = project?.Id }, project); } catch (Exception ex) { @@ -143,15 +191,32 @@ public async Task> OpenProject([FromBod /// Projeto atualizado /// Retorna projeto atualizado /// Ocorreu um erro ao atualizar projeto. + /// Usuário não autorizado. + /// Nenhum projeto encontrado. [HttpPut("{id}")] - [Authorize(Roles = "ADMIN")] - public async Task> UpdateProject(Guid? id, [FromBody] UpdateProjectRequest request) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(ResumedReadProjectOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [Authorize(Roles = "ADMIN, PROFESSOR")] + public async Task> UpdateProject(Guid? id, [FromBody] UpdateProjectInput request) { + if (id == null) + { + const string errorMessage = "O ID do projeto não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); + } + try { - ResumedReadProjectResponse? model = await _service.UpdateProject(id, request); - _logger.LogInformation("Projeto atualizado: {id}", model?.Id); - return Ok(model); + var project = await _updateProject.ExecuteAsync(id.Value, request); + if (project == null) + { + return NotFound(); + } + _logger.LogInformation("Projeto atualizado: {id}", project?.Id); + return Ok(project); } catch (Exception ex) { @@ -168,22 +233,32 @@ public async Task> UpdateProject(Guid? /// Projeto cancelado /// Retorna projeto cancelado /// Ocorreu um erro ao cancelar projeto. + /// Usuário não autorizado. + /// Projeto não encontrado. [HttpDelete("{id}")] - [Authorize(Roles = "ADMIN")] - public async Task> CancelProject(Guid? id, string? observation) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(ResumedReadProjectOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + [Authorize(Roles = "ADMIN, PROFESSOR")] + public async Task> CancelProject(Guid? id, string? observation) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do projeto não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - ResumedReadProjectResponse? model = await _service.CancelProject(id.Value, observation); - _logger.LogInformation("Projeto removido: {id}", model?.Id); - return Ok(model); + var project = await _cancelProject.ExecuteAsync(id.Value, observation); + if (project == null) + { + return NotFound(); + } + _logger.LogInformation("Projeto cancelado: {id}", project?.Id); + return Ok(project); } catch (Exception ex) { @@ -200,22 +275,26 @@ public async Task> CancelProject(Guid? /// Projeto com recurso solicitado /// Retorna projeto com recurso solicitado /// Ocorreu um erro ao solicitar recurso para o projeto. + /// Usuário não autorizado. [HttpPut("appeal/{id}")] - [Authorize(Roles = "ADMIN")] - public async Task> AppealProject(Guid? id, string? appealDescription) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(ResumedReadProjectOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [Authorize(Roles = "ADMIN, PROFESSOR")] + public async Task> AppealProject(Guid? id, string? appealDescription) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do projeto não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - ResumedReadProjectResponse? model = await _service.AppealProject(id.Value, appealDescription); - _logger.LogInformation("Recurso do Projeto: {id}", model?.Id); - return Ok(model); + var project = await _appealProject.ExecuteAsync(id.Value, appealDescription); + _logger.LogInformation("Recurso do projeto solicitado: {id}", project?.Id); + return Ok(project); } catch (Exception ex) { @@ -231,22 +310,26 @@ public async Task> AppealProject(Guid? /// Projeto submetido /// Retorna projeto submetido /// Ocorreu um erro ao submeter projeto. + /// Usuário não autorizado. [HttpPut("submit/{id}")] - [Authorize(Roles = "ADMIN")] - public async Task> SubmitProject(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(ResumedReadProjectOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [Authorize(Roles = "ADMIN, PROFESSOR")] + public async Task> SubmitProject(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do projeto não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - ResumedReadProjectResponse? model = await _service.SubmitProject(id.Value); - _logger.LogInformation("Submissão do Projeto: {id}", model?.Id); - return Ok(model); + var project = await _submitProject.ExecuteAsync(id.Value); + _logger.LogInformation("Projeto submetido: {id}", project?.Id); + return Ok(project); } catch (Exception ex) { diff --git a/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs b/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs index 9bbdf0fa..ae278823 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs @@ -1,8 +1,8 @@ -using Adapters.Gateways.Project; -using Adapters.Gateways.ProjectEvaluation; -using Adapters.Interfaces; +using Application.Ports.ProjectEvaluation; +using Application.Interfaces.UseCases.ProjectEvaluation; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Application.Ports.Project; namespace WebAPI.Controllers { @@ -15,19 +15,26 @@ namespace WebAPI.Controllers public class ProjectEvaluationController : ControllerBase { #region Global Scope - private readonly IProjectEvaluationPresenterController _service; + private readonly IEvaluateAppealProject _evaluateAppealProject; + private readonly IEvaluateSubmissionProject _evaluateSubmissionProject; + private readonly IGetEvaluationByProjectId _getEvaluationByProjectId; private readonly ILogger _logger; /// /// Construtor do Controller de projetos. /// - /// - /// - public ProjectEvaluationController( - IProjectEvaluationPresenterController service, + /// Serviço de avaliação de recurso de projeto. + /// Serviço de avaliação de submissão de projeto. + /// Serviço de obtenção de avaliação de projeto pelo id do projeto. + /// Serviço de log. + public ProjectEvaluationController(IEvaluateAppealProject evaluateAppealProject, + IEvaluateSubmissionProject evaluateSubmissionProject, + IGetEvaluationByProjectId getEvaluationByProjectId, ILogger logger) { - _service = service; + _evaluateAppealProject = evaluateAppealProject; + _evaluateSubmissionProject = evaluateSubmissionProject; + _getEvaluationByProjectId = getEvaluationByProjectId; _logger = logger; } #endregion Global Scope @@ -38,28 +45,37 @@ public ProjectEvaluationController( /// /// Avaliação do projeto correspondente /// Retorna avaliação do projeto correspondente + /// Retorna mensagem de erro + /// Retorna mensagem de erro /// Nenhum avaliação do projeto encontrado. [HttpGet("{projectId}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetEvaluationByProjectId(Guid? projectId) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadProjectEvaluationOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetEvaluationByProjectId(Guid? projectId) { if (projectId == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + const string errorMessage = "O ID do projeto não pode ser nulo."; + _logger.LogWarning(errorMessage); + return BadRequest(errorMessage); } try { - DetailedReadProjectEvaluationResponse model = await _service.GetEvaluationByProjectId(projectId); - _logger.LogInformation("Avaliação do projeto encontrado para o id {id}.", projectId); - return Ok(model); + var evaluation = await _getEvaluationByProjectId.ExecuteAsync(projectId.Value); + if (evaluation == null) + { + return NotFound(); + } + _logger.LogInformation("Avaliação do projeto encontrada para o ID {id}.", projectId); + return Ok(evaluation); } catch (Exception ex) { _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); - return NotFound(ex.Message); + return BadRequest(ex.Message); } } @@ -69,16 +85,20 @@ public async Task> GetEvalua /// /// Projeto correspondente /// Retorna avaliação do projeto correspondente + /// Retorna mensagem de erro + /// Retorna mensagem de erro [HttpPost("submission")] - [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadProjectOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] [Authorize(Roles = "ADMIN, PROFESSOR")] - public async Task> EvaluateSubmissionProject([FromBody] EvaluateSubmissionProjectRequest request) + public async Task> EvaluateSubmissionProject([FromBody] EvaluateSubmissionProjectInput request) { try { - DetailedReadProjectResponse? model = await _service.EvaluateSubmissionProject(request); - _logger.LogInformation("Avaliação da submissão do projeto {id} realizada.", model?.Id); - return Ok(model); + var evaluatedProject = await _evaluateSubmissionProject.ExecuteAsync(request); + _logger.LogInformation("Avaliação da submissão do projeto {id} realizada.", evaluatedProject?.Id); + return Ok(evaluatedProject); } catch (Exception ex) { @@ -93,15 +113,20 @@ public async Task> EvaluateSubmissionP /// /// Projeto correspondente /// Retorna avaliação do projeto correspondente + /// Retorna mensagem de erro + /// Retorna mensagem de erro [HttpPut("appeal")] - [Authorize(Roles = "ADMIN")] - public async Task> EvaluateAppealProjectRequest([FromBody] EvaluateAppealProjectRequest request) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadProjectOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [Authorize(Roles = "ADMIN, PROFESSOR")] + public async Task> EvaluateAppealProjectRequest([FromBody] EvaluateAppealProjectInput request) { try { - DetailedReadProjectResponse? model = await _service.EvaluateAppealProject(request); - _logger.LogInformation("Avaliação do recurso do projeto {id} realizada.", model?.Id); - return Ok(model); + var evaluatedProject = await _evaluateAppealProject.ExecuteAsync(request); + _logger.LogInformation("Avaliação do recurso do projeto {id} realizada.", evaluatedProject?.Id); + return Ok(evaluatedProject); } catch (Exception ex) { diff --git a/src/Infrastructure/WebAPI/Controllers/StudentController.cs b/src/Infrastructure/WebAPI/Controllers/StudentController.cs index d5ff60a1..fb62485d 100644 --- a/src/Infrastructure/WebAPI/Controllers/StudentController.cs +++ b/src/Infrastructure/WebAPI/Controllers/StudentController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.Student; -using Adapters.Interfaces; +using Application.Ports.Student; +using Application.Interfaces.UseCases.Student; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -14,16 +14,42 @@ namespace WebAPI.Controllers public class StudentController : ControllerBase { #region Global Scope - private readonly IStudentPresenterController _service; + private readonly IGetStudentById _getStudentById; + private readonly IGetStudentByRegistrationCode _getStudentByRegistrationCode; + private readonly IGetStudents _getAllStudents; + private readonly ICreateStudent _createStudent; + private readonly IUpdateStudent _updateStudent; + private readonly IDeleteStudent _deleteStudent; + private readonly IRequestStudentRegister _requestStudentRegister; private readonly ILogger _logger; + /// /// Construtor do Controller de Estudante. /// - /// - /// - public StudentController(IStudentPresenterController service, ILogger logger) + /// Obtém Estudante pelo id + /// Obtém Estudante pela matrícula + /// Obtém todos os Estudantes + /// Cria Estudante + /// Atualiza Estudante + /// Remove Estudante + /// Solicita registro de Estudante + /// Logger + public StudentController(IGetStudentById getStudentById, + IGetStudentByRegistrationCode getStudentByRegistrationCode, + IGetStudents getAllStudents, + ICreateStudent createStudent, + IUpdateStudent updateStudent, + IDeleteStudent deleteStudent, + IRequestStudentRegister requestStudentRegister, + ILogger logger) { - _service = service; + _getStudentById = getStudentById; + _getStudentByRegistrationCode = getStudentByRegistrationCode; + _getAllStudents = getAllStudents; + _createStudent = createStudent; + _updateStudent = updateStudent; + _deleteStudent = deleteStudent; + _requestStudentRegister = requestStudentRegister; _logger = logger; } #endregion Global Scope @@ -34,22 +60,30 @@ public StudentController(IStudentPresenterController service, ILogger /// Estudante correspondente /// Retorna Estudante correspondente + /// Requisição incorreta. + /// Usuário não autorizado. + /// Estudante não encontrado. [HttpGet("{id}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetById(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadStudentOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetById(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("O ID informado não pode ser nulo."); } try { - Adapters.Gateways.Base.IResponse model = await _service.GetById(id); - _logger.LogInformation("Estudante encontrado para o id {id}.", id); - return Ok(model); + var student = await _getStudentById.ExecuteAsync(id.Value); + if (student == null) + { + return NotFound(); + } + _logger.LogInformation("Estudante encontrado para o ID {id}.", id); + return Ok(student); } catch (Exception ex) { @@ -64,22 +98,30 @@ public async Task> GetById(Guid? id) /// /// Estudante correspondente /// Retorna Estudante correspondente + /// Requisição incorreta. + /// Usuário não autorizado. + /// Estudante não encontrado. [HttpGet("RegistrationCode/{registrationCode}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetByRegistrationCode(string? registrationCode) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadStudentOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetByRegistrationCode(string? registrationCode) { - if (registrationCode == null) + if (string.IsNullOrWhiteSpace(registrationCode)) { - const string msg = "A matrícula informada não pode ser nula."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("A matrícula informada não pode ser nula ou vazia."); } try { - Adapters.Gateways.Base.IResponse model = await _service.GetByRegistrationCode(registrationCode); + var student = await _getStudentByRegistrationCode.ExecuteAsync(registrationCode); + if (student == null) + { + return NotFound(); + } _logger.LogInformation("Estudante encontrado para a matrícula {registrationCode}.", registrationCode); - return Ok(model); + return Ok(student); } catch (Exception ex) { @@ -94,21 +136,30 @@ public async Task> GetByRegistrationCo /// E-mail do estudante /// Informa se o envio do e-mail foi bem sucedido /// E-mail enviado com sucesso - [HttpGet("RequestRegister/{email}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> RequestStudentRegister(string? email) + /// Requisição incorreta. + /// Usuário não autorizado. + /// Ocorreu um erro ao solicitar o registro do estudante. + [HttpPost("RequestRegister/{email}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(string))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status500InternalServerError)] + [Authorize(Roles = "ADMIN, PROFESSOR")] + public async Task> RequestStudentRegister(string? email) { - if (email == null) + if (string.IsNullOrWhiteSpace(email)) { - const string msg = "A matrícula informada não pode ser nula."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("O e-mail informado não pode ser nulo ou vazio."); } try { - string? message = await _service.RequestStudentRegister(email); - _logger.LogInformation("{message}.", message); + string? message = await _requestStudentRegister.ExecuteAsync(email); + if (string.IsNullOrWhiteSpace(message)) + { + return StatusCode(StatusCodes.Status500InternalServerError, "Ocorreu um erro ao solicitar o registro do estudante."); + } + _logger.LogInformation("{Message}.", message); return Ok(message); } catch (Exception ex) @@ -124,19 +175,23 @@ public async Task> GetByRegistrationCo /// /// Todas os Estudante ativos /// Retorna todas os Estudante ativos + /// Requisição incorreta. + /// Usuário não autorizado. + /// Nenhum Estudante encontrado. [HttpGet] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetAll(int skip = 0, int take = 50) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetAll(int skip = 0, int take = 50) { - IEnumerable models = await _service.GetAll(skip, take); - if (models == null) + var students = await _getAllStudents.ExecuteAsync(skip, take); + if (students == null || !students.Any()) { - const string msg = "Nenhum Estudante encontrado."; - _logger.LogWarning(msg); - return NotFound(msg); + return NotFound("Nenhum estudante encontrado."); } - _logger.LogInformation("Estudante encontrados: {quantidade}", models.Count()); - return Ok(models); + _logger.LogInformation("Estudantes encontrados: {quantidade}", students.Count()); + return Ok(students); } /// @@ -144,17 +199,20 @@ public async Task>> GetAll( /// /// /// Estudante criado - /// Retorna Estudante criado + /// Retorna Estudante criado + /// Requisição incorreta. [HttpPost] - [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(DetailedReadStudentOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] [AllowAnonymous] - public async Task> Create([FromBody] CreateStudentRequest request) + public async Task> Create([FromBody] CreateStudentInput request) { try { - DetailedReadStudentResponse? model = await _service.Create(request) as DetailedReadStudentResponse; - _logger.LogInformation("Estudante criado: {id}", model?.Id); - return Ok(model); + var student = await _createStudent.ExecuteAsync(request); + _logger.LogInformation("Estudante criado: {id}", student?.Id); + return CreatedAtAction(nameof(GetById), new { id = student?.Id }, student); } catch (Exception ex) { @@ -169,15 +227,31 @@ public async Task> Create([FromBody] C /// /// Estudante atualizado /// Retorna Estudante atualizado + /// Requisição incorreta. + /// Usuário não autorizado. + /// Nenhum Estudante encontrado. [HttpPut("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadStudentOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN, STUDENT")] - public async Task> Update(Guid? id, [FromBody] UpdateStudentRequest request) + public async Task> Update(Guid? id, [FromBody] UpdateStudentInput request) { + if (id == null) + { + return BadRequest("O ID informado não pode ser nulo."); + } + try { - DetailedReadStudentResponse? model = await _service.Update(id, request) as DetailedReadStudentResponse; - _logger.LogInformation("Estudante atualizado: {id}", model?.Id); - return Ok(model); + var updatedStudent = await _updateStudent.ExecuteAsync(id.Value, request); + if (updatedStudent == null) + { + return NotFound(); + } + _logger.LogInformation("Estudante atualizado: {id}", updatedStudent?.Id); + return Ok(updatedStudent); } catch (Exception ex) { @@ -192,22 +266,31 @@ public async Task> Update(Guid? id, [F /// /// Estudante removido /// Retorna Estudante removido + /// Retorna mensagem de erro + /// Retorna mensagem de erro + /// Retorna mensagem de erro [HttpDelete("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadStudentOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN, STUDENT")] - public async Task> Delete(Guid? id) + public async Task> Delete(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("O ID informado não pode ser nulo."); } try { - DetailedReadStudentResponse? model = await _service.Delete(id.Value) as DetailedReadStudentResponse; - _logger.LogInformation("Estudante removido: {id}", model?.Id); - return Ok(model); + var deletedStudent = await _deleteStudent.ExecuteAsync(id.Value); + if (deletedStudent == null) + { + return NotFound(); + } + _logger.LogInformation("Estudante removido: {id}", deletedStudent?.Id); + return Ok(deletedStudent); } catch (Exception ex) { diff --git a/src/Infrastructure/WebAPI/Controllers/StudentDocumentsController.cs b/src/Infrastructure/WebAPI/Controllers/StudentDocumentsController.cs index b49d3d5d..e360624d 100644 --- a/src/Infrastructure/WebAPI/Controllers/StudentDocumentsController.cs +++ b/src/Infrastructure/WebAPI/Controllers/StudentDocumentsController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.StudentDocuments; -using Adapters.Interfaces; +using Application.Ports.StudentDocuments; +using Application.Interfaces.UseCases.StudentDocuments; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -10,40 +10,70 @@ namespace WebAPI.Controllers /// [ApiController] [Route("api/v1/[controller]")] + [Authorize] public class StudentDocumentsController : ControllerBase { + #region Global Scope + private readonly IGetStudentDocumentsByProjectId _getStudentDocumentsByProjectId; + private readonly IGetStudentDocumentsByStudentId _getStudentDocumentsByStudentId; + private readonly ICreateStudentDocuments _createStudentDocuments; + private readonly IUpdateStudentDocuments _updateStudentDocuments; + private readonly IDeleteStudentDocuments _deleteStudentDocuments; private readonly ILogger _logger; - private readonly IStudentDocumentsPresenterController _presenterController; + /// /// Construtor do Controller de Documentos de Estudante. /// - /// - /// - public StudentDocumentsController(ILogger logger, IStudentDocumentsPresenterController presenterController) + /// Use Case de busca de documentos de estudante pelo id do projeto. + /// Use Case de busca de documentos de estudante pelo id do estudante. + /// Use Case de adição de documentos de estudante. + /// Use Case de atualização de documentos de estudante. + /// Use Case de remoção de documentos de estudante. + /// Logger + public StudentDocumentsController(IGetStudentDocumentsByProjectId getStudentDocumentsByProjectId, + IGetStudentDocumentsByStudentId getStudentDocumentsByStudentId, + ICreateStudentDocuments createStudentDocuments, + IUpdateStudentDocuments updateStudentDocuments, + IDeleteStudentDocuments deleteStudentDocuments, + ILogger logger) { + _getStudentDocumentsByProjectId = getStudentDocumentsByProjectId; + _getStudentDocumentsByStudentId = getStudentDocumentsByStudentId; + _createStudentDocuments = createStudentDocuments; + _updateStudentDocuments = updateStudentDocuments; + _deleteStudentDocuments = deleteStudentDocuments; _logger = logger; - _presenterController = presenterController; } + #endregion Global Scope /// /// Busca documentos de estudante pelo id do projeto. /// /// Id do projeto + /// Documentos de estudante encontrados. + /// O id informado não pode ser nulo. + /// Usuário não autenticado. + /// Documentos de estudante não encontrados. [HttpGet("project/{projectId}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetByProjectId(Guid? projectId) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadStudentDocumentsOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetByProjectId(Guid? projectId) { if (projectId == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("O ID informado não pode ser nulo."); } try { - Adapters.Gateways.Base.IResponse model = await _presenterController.GetByProjectId(projectId); - _logger.LogInformation("Documentos encontrados para o projectId {projectId}.", projectId); + var model = await _getStudentDocumentsByProjectId.ExecuteAsync(projectId); + if (model == null) + { + return NotFound(); + } + _logger.LogInformation("Documentos encontrados para o projeto com ID {projectId}.", projectId); return Ok(model); } catch (Exception ex) @@ -57,21 +87,30 @@ public async Task> GetByProje /// Busca documentos de estudante pelo id do estudante. /// /// Id do estudante + /// Documentos de estudante encontrados. + /// O id informado não pode ser nulo. + /// Usuário não autenticado. + /// Documentos de estudante não encontrados. [HttpGet("student/{studentId}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetByStudentId(Guid? studentId) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadStudentDocumentsOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetByStudentId(Guid? studentId) { if (studentId == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("O ID informado não pode ser nulo."); } try { - Adapters.Gateways.Base.IResponse model = await _presenterController.GetByStudentId(studentId); - _logger.LogInformation("Documentos encontrados para o studentId {studentId}.", studentId); + var model = await _getStudentDocumentsByStudentId.ExecuteAsync(studentId); + if (model == null) + { + return NotFound(); + } + _logger.LogInformation("Documentos encontrados para o estudante com ID {studentId}.", studentId); return Ok(model); } catch (Exception ex) @@ -85,16 +124,21 @@ public async Task> GetByStude /// Adiciona documentos de estudante ao projeto. /// /// Dados para adição dos documentos. + /// Documentos de estudante adicionados. + /// O id informado não pode ser nulo. + /// Usuário não autenticado. [HttpPost] - [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(DetailedReadStudentDocumentsOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] [Authorize(Roles = "ADMIN, STUDENT")] - public async Task> Create([FromBody] CreateStudentDocumentsRequest request) + public async Task> Create([FromBody] CreateStudentDocumentsInput request) { try { - DetailedReadStudentDocumentsResponse? model = await _presenterController.Create(request); + var model = await _createStudentDocuments.ExecuteAsync(request); _logger.LogInformation("Documentos do estudante adicionados: {id}", model?.Id); - return Ok(model); + return CreatedAtAction(nameof(GetByProjectId), new { projectId = model?.ProjectId }, model); } catch (Exception ex) { @@ -108,14 +152,30 @@ public async Task> Create([Fr ///
/// Id dos documentos do estudante /// Dados para atualização dos documentos. + /// Documentos de estudante atualizados. + /// O id informado não pode ser nulo. + /// Usuário não autenticado. + /// Documentos de estudante não encontrados. [HttpPut("{id}")] - [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadStudentDocumentsOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN, STUDENT")] - public async Task> Update(Guid? id, [FromBody] UpdateStudentDocumentsRequest request) + public async Task> Update(Guid? id, [FromBody] UpdateStudentDocumentsInput request) { + if (id == null) + { + return BadRequest("O ID informado não pode ser nulo."); + } + try { - DetailedReadStudentDocumentsResponse? model = await _presenterController.Update(id, request); + var model = await _updateStudentDocuments.ExecuteAsync(id.Value, request); + if (model == null) + { + return NotFound(); + } _logger.LogInformation("Documentos do estudante atualizados: {id}", model?.Id); return Ok(model); } @@ -130,20 +190,30 @@ public async Task> Update(Gui /// Remove documentos de estudante. ///
/// Id dos documentos do estudante + /// Documentos de estudante removidos. + /// O id informado não pode ser nulo. + /// Usuário não autenticado. + /// Documentos de estudante não encontrados. [HttpDelete("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadStudentDocumentsOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN, STUDENT")] - public async Task> Delete(Guid? id) + public async Task> Delete(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("O ID informado não pode ser nulo."); } try { - DetailedReadStudentDocumentsResponse? model = await _presenterController.Delete(id.Value); + var model = await _deleteStudentDocuments.ExecuteAsync(id.Value); + if (model == null) + { + return NotFound(); + } _logger.LogInformation("Documentos do estudante removidos: {id}", model?.Id); return Ok(model); } diff --git a/src/Infrastructure/WebAPI/Controllers/SubAreaController.cs b/src/Infrastructure/WebAPI/Controllers/SubAreaController.cs index 07dadc6a..5c378b48 100644 --- a/src/Infrastructure/WebAPI/Controllers/SubAreaController.cs +++ b/src/Infrastructure/WebAPI/Controllers/SubAreaController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.SubArea; -using Adapters.Interfaces; +using Application.Ports.SubArea; +using Application.Interfaces.UseCases.SubArea; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -14,41 +14,67 @@ namespace WebAPI.Controllers public class SubAreaController : ControllerBase { #region Global Scope - private readonly ISubAreaPresenterController _service; + private readonly IGetSubAreaById _getSubAreaById; + private readonly IGetSubAreasByArea _getSubAreasByArea; + private readonly ICreateSubArea _createSubArea; + private readonly IUpdateSubArea _updateSubArea; + private readonly IDeleteSubArea _deleteSubArea; private readonly ILogger _logger; + /// /// Construtor do Controller de Sub Área. /// - /// - /// - public SubAreaController(ISubAreaPresenterController service, ILogger logger) + /// Obtém sub área pelo id. + /// Obtém todas as sub áreas ativas da área. + /// Cria sub área. + /// Atualiza sub área. + /// Remove sub área. + /// Logger. + public SubAreaController(IGetSubAreaById getSubAreaById, + IGetSubAreasByArea getSubAreasByArea, + ICreateSubArea createSubArea, + IUpdateSubArea updateSubArea, + IDeleteSubArea deleteSubArea, + ILogger logger) { - _service = service; + _getSubAreaById = getSubAreaById; + _getSubAreasByArea = getSubAreasByArea; + _createSubArea = createSubArea; + _updateSubArea = updateSubArea; + _deleteSubArea = deleteSubArea; _logger = logger; } #endregion Global Scope /// - /// Busca sub área pelo id. + /// Obtém sub área pelo id. /// - /// - /// Sub Área correspondente - /// Retorna sub área correspondente + /// Id da sub área. + /// Sub área. + /// Sub área encontrada. + /// Id não informado. + /// Usuário não autorizado. + /// Sub área não encontrada. [HttpGet("{id}")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> GetById(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadSubAreaOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetById(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("O ID informado não pode ser nulo."); } try { - Adapters.Gateways.Base.IResponse model = await _service.GetById(id); - _logger.LogInformation("Sub Área encontrada para o id {id}.", id); + var model = await _getSubAreaById.ExecuteAsync(id); + if (model == null) + { + return NotFound(); + } + _logger.LogInformation("Sub Área encontrada para o ID {id}.", id); return Ok(model); } catch (Exception ex) @@ -59,49 +85,65 @@ public async Task> GetById(Guid? id) } /// - /// Busca todas as sub áreas ativas pela área. + /// Obtém todas as sub áreas ativas da área. /// - /// - /// Todas as sub áreas ativas da área - /// Retorna todas as sub áreas ativas da área - [HttpGet] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetSubAreasByArea(Guid? areaId, int skip = 0, int take = 50) + /// Id da área. + /// Quantidade de registros a serem ignorados. + /// Quantidade de registros a serem retornados. + /// Sub áreas. + /// Sub áreas encontradas. + /// Id não informado. + /// Usuário não autorizado. + /// Sub áreas não encontradas. + [HttpGet("area/{areaId}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetSubAreasByArea(Guid? areaId, int skip = 0, int take = 50) { if (areaId == null) { - const string msg = "O AreadId informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("O ID da área informado não pode ser nulo."); } - IEnumerable models = await _service.GetSubAreasByArea(areaId, skip, take); - if (models == null) + try + { + var models = await _getSubAreasByArea.ExecuteAsync(areaId, skip, take); + if (!models.Any()) + { + return NotFound("Nenhuma Sub Área encontrada."); + } + _logger.LogInformation("Sub Áreas encontradas: {quantidade}", models.Count()); + return Ok(models); + } + catch (Exception ex) { - const string msg = "Nenhuma Sub Área encontrada."; - _logger.LogWarning(msg); - return NotFound(msg); + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); } - _logger.LogInformation("Sub Áreas encontradas: {quantidade}", models.Count()); - return Ok(models); } /// /// Cria sub área. /// - /// - /// Sub Área criada - /// Retorna sub área criada + /// Dados da sub área. + /// Sub área criada. + /// Sub área criada. + /// Dados da sub área inválidos. + /// Usuário não autorizado. [HttpPost] - [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status201Created, Type = typeof(DetailedReadSubAreaOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] [Authorize(Roles = "ADMIN")] - public async Task> Create([FromBody] CreateSubAreaRequest request) + public async Task> Create([FromBody] CreateSubAreaInput request) { try { - DetailedReadSubAreaResponse? model = await _service.Create(request) as DetailedReadSubAreaResponse; + var model = await _createSubArea.ExecuteAsync(request); _logger.LogInformation("Sub Área criada: {id}", model?.Id); - return Ok(model); + return CreatedAtAction(nameof(GetById), new { id = model?.Id }, model); } catch (Exception ex) { @@ -113,16 +155,33 @@ public async Task> Create([FromBody] C /// /// Atualiza sub área. /// - /// - /// Sub Área atualizada - /// Retorna sub área atualizada + /// Id da sub área. + /// Dados da sub área. + /// Sub área atualizada. + /// Sub área atualizada. + /// Dados da sub área inválidos. + /// Usuário não autorizado. + /// Sub área não encontrada. [HttpPut("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadSubAreaOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN")] - public async Task> Update(Guid? id, [FromBody] UpdateSubAreaRequest request) + public async Task> Update(Guid? id, [FromBody] UpdateSubAreaInput request) { + if (id == null) + { + return BadRequest("O ID informado não pode ser nulo."); + } + try { - DetailedReadSubAreaResponse? model = await _service.Update(id, request) as DetailedReadSubAreaResponse; + var model = await _updateSubArea.ExecuteAsync(id.Value, request); + if (model == null) + { + return NotFound(); + } _logger.LogInformation("Sub Área atualizada: {id}", model?.Id); return Ok(model); } @@ -136,23 +195,32 @@ public async Task> Update(Guid? id, [F /// /// Remove sub área. /// - /// - /// Sub Área removida - /// Retorna sub área removida + /// Id da sub área. + /// Sub área removida. + /// Sub área removida. + /// Id não informado. + /// Usuário não autorizado. + /// Sub área não encontrada. [HttpDelete("{id}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadSubAreaOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] [Authorize(Roles = "ADMIN")] - public async Task> Delete(Guid? id) + public async Task> Delete(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("O ID informado não pode ser nulo."); } try { - DetailedReadSubAreaResponse? model = await _service.Delete(id.Value) as DetailedReadSubAreaResponse; + var model = await _deleteSubArea.ExecuteAsync(id.Value); + if (model == null) + { + return NotFound(); + } _logger.LogInformation("Sub Área removida: {id}", model?.Id); return Ok(model); } @@ -163,4 +231,4 @@ public async Task> Delete(Guid? id) } } } -} \ No newline at end of file +} diff --git a/src/Infrastructure/WebAPI/Controllers/UserController.cs b/src/Infrastructure/WebAPI/Controllers/UserController.cs index 11815b2c..46c8586c 100644 --- a/src/Infrastructure/WebAPI/Controllers/UserController.cs +++ b/src/Infrastructure/WebAPI/Controllers/UserController.cs @@ -1,5 +1,5 @@ -using Adapters.Gateways.User; -using Adapters.Interfaces; +using Application.Ports.User; +using Application.Interfaces.UseCases.User; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -14,41 +14,71 @@ namespace WebAPI.Controllers public class UserController : ControllerBase { #region Global Scope - private readonly IUserPresenterController _service; + private readonly IActivateUser _activateUser; + private readonly IDeactivateUser _deactivateUser; + private readonly IGetActiveUsers _getActiveUsers; + private readonly IGetInactiveUsers _getInactiveUsers; + private readonly IGetUserById _getUserById; + private readonly IUpdateUser _updateUser; private readonly ILogger _logger; + /// /// Construtor do Controller de Usuário. /// - /// - /// - public UserController(IUserPresenterController service, ILogger logger) + /// Ativa usuário. + /// Desativa usuário. + /// Obtém todos os usuários ativos. + /// Obtém todos os usuários inativos. + /// Obtém usuário pelo id. + /// Atualiza usuário. + /// Logger. + public UserController(IActivateUser activateUser, + IDeactivateUser deactivateUser, + IGetActiveUsers getActiveUsers, + IGetInactiveUsers getInactiveUsers, + IGetUserById getUserById, + IUpdateUser updateUser, + ILogger logger) { - _service = service; + _activateUser = activateUser; + _deactivateUser = deactivateUser; + _getActiveUsers = getActiveUsers; + _getInactiveUsers = getInactiveUsers; + _getUserById = getUserById; + _updateUser = updateUser; _logger = logger; } #endregion Global Scope /// - /// Busca usuário pelo id. + /// Obtém usuário pelo id. /// - /// - /// Todos os usuários ativos - /// Retorna todos os usuários ativos + /// Id do usuário. + /// Usuário encontrado. + /// Usuário encontrado. + /// Id não informado. + /// Usuário não autorizado. + /// Usuário não encontrado. [HttpGet("{id}", Name = "GetUserById")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetById(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(UserReadOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetById(Guid? id) { if (id == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("O ID informado não pode ser nulo."); } try { - UserReadResponse model = await _service.GetUserById(id); - _logger.LogInformation("Usuário encontrado para o id {id}.", id); + var model = await _getUserById.ExecuteAsync(id); + if (model == null) + { + return NotFound(); + } + _logger.LogInformation("Usuário encontrado para o ID {id}.", id); return Ok(model); } catch (Exception ex) @@ -59,62 +89,70 @@ public async Task>> GetById(Guid? id) } /// - /// Busca todos os usuários ativos. + /// Obtém todos os usuários ativos. /// - /// - /// Todos os usuários ativos - /// Retorna todos os usuários ativos + /// Quantidade de registros a serem ignorados. + /// Quantidade de registros a serem retornados. + /// Usuários ativos. + /// Usuários encontrados. + /// Usuário não autorizado. + /// Usuários não encontrados. [HttpGet("Active/", Name = "GetAllActiveUsers")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetAllActive(int skip = 0, int take = 50) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetAllActive(int skip = 0, int take = 50) { - IEnumerable models = await _service.GetActiveUsers(skip, take); - if (models == null) + var models = await _getActiveUsers.ExecuteAsync(skip, take); + if (!models.Any()) { - const string msg = "Nenhum usuário encontrado."; - _logger.LogWarning(msg); - return NotFound(msg); + return NotFound("Nenhum usuário encontrado."); } _logger.LogInformation("Usuários encontrados: {quantidade}", models.Count()); return Ok(models); } /// - /// Busca todos os usuários inativos. + /// Obtém todos os usuários inativos. /// - /// - /// Todos os usuários inativos - /// Retorna todos os usuários ativos + /// Quantidade de registros a serem ignorados. + /// Quantidade de registros a serem retornados. + /// Usuários inativos. + /// Usuários encontrados. + /// Usuário não autorizado. + /// Usuários não encontrados. [HttpGet("Inactive/", Name = "GetAllInactiveUsers")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task>> GetAllInactive(int skip = 0, int take = 50) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetAllInactive(int skip = 0, int take = 50) { - IEnumerable models = await _service.GetInactiveUsers(skip, take); - if (models == null) + var models = await _getInactiveUsers.ExecuteAsync(skip, take); + if (!models.Any()) { - const string msg = "Nenhum usuário encontrado."; - _logger.LogWarning(msg); - return NotFound(msg); + return NotFound("Nenhum usuário encontrado."); } _logger.LogInformation("Usuários encontrados: {quantidade}", models.Count()); return Ok(models); } /// - /// Realiza atualização do usuário logado. + /// Atualiza usuário autenticado. /// - /// - /// Retorna usuário atualizado - /// Retorna usuário atualizado - [HttpPut(Name = "UpdateUser")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> Update([FromBody] UserUpdateRequest request) + /// Dados do usuário. + /// Usuário atualizado. + /// Usuário atualizado. + /// Dados inválidos. + /// Usuário não autorizado. + [HttpPut("{userId}", Name = "UpdateUser")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(UserReadOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task> Update([FromBody] UserUpdateInput request) { try { - // Atualiza o usuário e retorna o usuário atualizado - UserReadResponse? model = await _service.UpdateUser(request); - + var model = await _updateUser.ExecuteAsync(request); _logger.LogInformation("Usuário atualizado: {id}", model?.Id); return Ok(model); } @@ -126,26 +164,30 @@ public async Task> Update([FromBody] UserUpdateRe } /// - /// Realiza reativação de usário. + /// Ativa usuário pelo Id. /// - /// - /// Retorna usuário reativado - /// Retorna usuário reativado - [HttpPut("Active/{id}", Name = "ActivateUser")] + /// Id do usuário. + /// Usuário ativado. + /// Usuário ativado. + /// Id não informado. + /// Usuário não autorizado. + /// Usuário não encontrado. + [HttpPut("Active/{userId}", Name = "ActivateUser")] [Authorize(Roles = "ADMIN")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> Activate(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(UserReadOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> Activate(Guid? userId) { - if (id == null) + if (userId == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("O ID informado não pode ser nulo."); } try { - UserReadResponse? model = await _service.ActivateUser(id.Value); + var model = await _activateUser.ExecuteAsync(userId.Value); _logger.LogInformation("Usuário ativado: {id}", model?.Id); return Ok(model); } @@ -157,26 +199,30 @@ public async Task> Activate(Guid? id) } /// - /// Realiza desativação de usário. + /// Desativa usuário pelo Id. /// - /// - /// Retorna usuário desativado - /// Retorna usuário desativado - [HttpPut("Inactive/{id}", Name = "DeactivateUser")] + /// Id do usuário. + /// Usuário desativado. + /// Usuário desativado. + /// Id não informado. + /// Usuário não autorizado. + /// Usuário não encontrado. + [HttpPut("Inactive/{userId}", Name = "DeactivateUser")] [Authorize(Roles = "ADMIN")] - [ProducesResponseType(StatusCodes.Status200OK)] - public async Task> Deactivate(Guid? id) + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(UserReadOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> Deactivate(Guid? userId) { - if (id == null) + if (userId == null) { - const string msg = "O id informado não pode ser nulo."; - _logger.LogWarning(msg); - return BadRequest(msg); + return BadRequest("O ID informado não pode ser nulo."); } try { - UserReadResponse? model = await _service.DeactivateUser(id.Value); + var model = await _deactivateUser.ExecuteAsync(userId.Value); _logger.LogInformation("Usuário desativado: {id}", model?.Id); return Ok(model); } @@ -187,4 +233,4 @@ public async Task> Deactivate(Guid? id) } } } -} \ No newline at end of file +} diff --git a/src/Infrastructure/WebAPI/Startup.cs b/src/Infrastructure/WebAPI/Startup.cs index 39fa0c7c..2459702e 100644 --- a/src/Infrastructure/WebAPI/Startup.cs +++ b/src/Infrastructure/WebAPI/Startup.cs @@ -1,5 +1,5 @@ using AspNetCoreRateLimit; -using IoC; +using Infrastructure.IoC; using WebAPI.Middlewares; namespace WebAPI @@ -20,8 +20,9 @@ public void ConfigureServices(IServiceCollection services) // Realiza comunicação com os demais Projetos. services.AddInfrastructure(); - services.AddAdapters(); - services.AddDomain(); + services.AddPersistence(); + services.AddExternalServices(); + services.AddApplication(); // Configuração do Swagger services.AddInfrastructureSwagger(); diff --git a/src/Infrastructure/WebAPI/WebAPI.csproj b/src/Infrastructure/WebAPI/WebAPI.csproj index ba7a0316..465ff16e 100644 --- a/src/Infrastructure/WebAPI/WebAPI.csproj +++ b/src/Infrastructure/WebAPI/WebAPI.csproj @@ -28,7 +28,7 @@ - + From 8b5260375c163d1d49080ef4284d8e544fe1dc6f Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 5 Aug 2023 14:36:36 -0300 Subject: [PATCH 078/201] feat(ProjectReport): add persistence configuration --- .../IGetProjectReportByProjectId.cs | 9 +++ .../GetProjectReportByProjectId.cs | 28 ++++++++ .../Repositories/IProjectReportRepository.cs | 10 ++- .../Context/ApplicationDbContext.cs | 3 +- .../ProjectReportConfiguration.cs | 38 +++++++++++ src/Infrastructure/Persistence/README.md | 2 +- .../Repositories/ProjectReportRepository.cs | 66 +++++++++++++++++++ 7 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportByProjectId.cs create mode 100644 src/Application/UseCases/ProjectReport/GetProjectReportByProjectId.cs create mode 100644 src/Infrastructure/Persistence/EntitiesConfiguration/ProjectReportConfiguration.cs create mode 100644 src/Infrastructure/Persistence/Repositories/ProjectReportRepository.cs diff --git a/src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportByProjectId.cs b/src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportByProjectId.cs new file mode 100644 index 00000000..1c0b7770 --- /dev/null +++ b/src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportByProjectId.cs @@ -0,0 +1,9 @@ +using Application.Ports.ProjectReport; + +namespace Application.Interfaces.UseCases.ProjectReport +{ + public interface IGetProjectReportsByProjectId + { + Task> ExecuteAsync(Guid? projectId); + } +} \ No newline at end of file diff --git a/src/Application/UseCases/ProjectReport/GetProjectReportByProjectId.cs b/src/Application/UseCases/ProjectReport/GetProjectReportByProjectId.cs new file mode 100644 index 00000000..9ef3a1d7 --- /dev/null +++ b/src/Application/UseCases/ProjectReport/GetProjectReportByProjectId.cs @@ -0,0 +1,28 @@ +using Application.Interfaces.UseCases.ProjectReport; +using Application.Ports.ProjectReport; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; + +namespace Application.UseCases.ProjectReport +{ + public class GetProjectReportByProjectId : IGetProjectReportsByProjectId + { + #region Global Scope + private readonly IProjectReportRepository _repository; + private readonly IMapper _mapper; + public GetProjectReportByProjectId(IProjectReportRepository repository, IMapper mapper) + { + _repository = repository; + _mapper = mapper; + } + #endregion Global Scope + + public async Task> ExecuteAsync(Guid? projectId) + { + UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); + var entities = await _repository.GetByProjectIdAsync(projectId); + return _mapper.Map>(entities); + } + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProjectReportRepository.cs b/src/Domain/Interfaces/Repositories/IProjectReportRepository.cs index 6a3e65b3..5d502c2e 100644 --- a/src/Domain/Interfaces/Repositories/IProjectReportRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProjectReportRepository.cs @@ -3,5 +3,13 @@ namespace Domain.Interfaces.Repositories { - public interface IProjectReportRepository : IGenericCRUDRepository { } + public interface IProjectReportRepository : IGenericCRUDRepository + { + /// + /// Busca relatório de projeto pelo Id do projeto informado. + /// + /// Id do projeto. + /// Relatório de projeto encontrado. + Task?> GetByProjectIdAsync(Guid? projectId); + } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs index 4519aa57..f942b046 100644 --- a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs +++ b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs @@ -27,8 +27,9 @@ public ApplicationDbContext(DbContextOptions options) : ba public DbSet Notices { get; set; } public DbSet Professors { get; set; } public DbSet Projects { get; set; } - public DbSet ProjectEvaluations { get; set; } public DbSet ProjectActivities { get; set; } + public DbSet ProjectEvaluations { get; set; } + public DbSet ProjectReports { get; set; } public DbSet ProgramTypes { get; set; } public DbSet Students { get; set; } public DbSet StudentDocuments { get; set; } diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectReportConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectReportConfiguration.cs new file mode 100644 index 00000000..3221b48d --- /dev/null +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectReportConfiguration.cs @@ -0,0 +1,38 @@ +using Domain.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Infrastructure.Persistence.EntitiesConfiguration +{ + public class ProjectReportConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("ProjectReports"); + builder.HasKey(t => t.Id); + builder.Property(p => p.Id) + .ValueGeneratedOnAdd(); + + builder.Property(p => p.ReportUrl) + .IsRequired(); + builder.Property(p => p.ReportType) + .IsRequired(); + builder.Property(p => p.SendDate) + .IsRequired(); + builder.Property(p => p.ProjectId) + .IsRequired(); + builder.Property(p => p.UserId) + .IsRequired(); + builder.Property(p => p.DeletedAt); + + builder.HasOne(a => a.Project) + .WithMany() + .HasForeignKey(a => a.ProjectId); + builder.HasOne(a => a.User) + .WithMany() + .HasForeignKey(a => a.UserId); + + builder.HasQueryFilter(x => x.DeletedAt == null); + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index 6761553d..6bf27a4e 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add AddRegistrationCodeToStudent --project ../Persistence/Persistence.csproj +dotnet ef migrations add AddProjectReport --project ../Persistence/Persistence.csproj ``` Executando as Migrations: diff --git a/src/Infrastructure/Persistence/Repositories/ProjectReportRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectReportRepository.cs new file mode 100644 index 00000000..a052f7f6 --- /dev/null +++ b/src/Infrastructure/Persistence/Repositories/ProjectReportRepository.cs @@ -0,0 +1,66 @@ +using System.Data.Entity; +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Infrastructure.Persistence.Context; +using Microsoft.EntityFrameworkCore; + +namespace Persistence.Repositories +{ + public class ProjectReportRepository : IProjectReportRepository + { + private readonly ApplicationDbContext _context; + public ProjectReportRepository(ApplicationDbContext context) + { + _context = context; + } + + public async Task CreateAsync(ProjectReport model) + { + _context.Add(model); + await _context.SaveChangesAsync(); + return model; + } + + public async Task DeleteAsync(Guid? id) + { + var model = await GetByIdAsync(id) + ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); + model.DeactivateEntity(); + return await UpdateAsync(model); + } + + public async Task> GetAllAsync(int skip, int take) + { + return await _context.ProjectReports + .Skip(skip) + .Take(take) + .AsAsyncEnumerable() + .OrderBy(x => x.Id) + .ToListAsync(); + } + + public async Task GetByIdAsync(Guid? id) + { + return await _context.ProjectReports + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.Id == id); + } + + public async Task?> GetByProjectIdAsync(Guid? projectId) + { + return await _context.ProjectReports + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .Where(x => x.ProjectId == projectId) + .ToListAsync(); + } + + public async Task UpdateAsync(ProjectReport model) + { + _context.Update(model); + await _context.SaveChangesAsync(); + return model; + } + } +} \ No newline at end of file From ad6b04803f785e82437b63cecbcce25073e5a633 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 5 Aug 2023 14:42:16 -0300 Subject: [PATCH 079/201] feat: add ProjectReport controller --- .../Controllers/ProjectReportController.cs | 229 ++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 src/Infrastructure/WebAPI/Controllers/ProjectReportController.cs diff --git a/src/Infrastructure/WebAPI/Controllers/ProjectReportController.cs b/src/Infrastructure/WebAPI/Controllers/ProjectReportController.cs new file mode 100644 index 00000000..dbfd17b4 --- /dev/null +++ b/src/Infrastructure/WebAPI/Controllers/ProjectReportController.cs @@ -0,0 +1,229 @@ +using Application.Ports.ProjectReport; +using Application.Interfaces.UseCases.ProjectReport; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace WebAPI.Controllers +{ + /// + /// Controller de Relatório de Projeto. + /// + [ApiController] + [Route("api/v1/[controller]")] + [Authorize] + public class ProjectReportController : ControllerBase + { + #region Global Scope + private readonly IGetProjectReportById _getById; + private readonly IGetProjectReportsByProjectId _getByProjectId; + private readonly ICreateProjectReport _create; + private readonly IUpdateProjectReport _update; + private readonly IDeleteProjectReport _delete; + private readonly ILogger _logger; + + /// + /// Construtor do Controller de Relatório de Projeto. + /// + /// Use Case de busca de relatório de projeto por Id. + /// Use Case de busca de relatório de projeto por Id do projeto. + /// Use Case de criação de relatório de projeto. + /// Use Case de atualização de relatório de projeto. + /// Use Case de remoção de relatório de projeto. + /// Logger. + public ProjectReportController(IGetProjectReportById getById, + IGetProjectReportsByProjectId getByProjectId, + ICreateProjectReport create, + IUpdateProjectReport update, + IDeleteProjectReport delete, + ILogger logger) + { + _getById = getById; + _getByProjectId = getByProjectId; + _create = create; + _update = update; + _delete = delete; + _logger = logger; + } + #endregion Global Scope + + /// + /// Busca relatório de projeto pelo Id. + /// + /// Id do relatório de projeto. + /// Relatório de projeto. + /// Relatório de projeto encontrado. + /// Id não informado. + /// Usuário não autorizado. + /// Relatório de projeto não encontrado. + [HttpGet("{id}")] + [ProducesResponseType(typeof(DetailedReadProjectReportOutput), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> GetById(Guid? id) + { + if (id == null) + { + return BadRequest("O ID informado não pode ser nulo."); + } + + try + { + var model = await _getById.ExecuteAsync(id); + if (model == null) + { + return NotFound(); + } + _logger.LogInformation("Relatório de Projeto encontrado para o ID {id}.", id); + return Ok(model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return NotFound(ex.Message); + } + } + + /// + /// Busca relatórios de projeto pelo Id do projeto. + /// + /// Id do projeto. + /// Relatórios de projeto. + /// Relatórios de projeto encontrados. + /// Id não informado. + /// Usuário não autorizado. + /// Relatórios de projeto não encontrados. + [HttpGet("project/{projectId}")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task>> GetByProjectId(Guid? projectId) + { + if (projectId == null) + { + return BadRequest("O ID do projeto informado não pode ser nulo."); + } + + try + { + var model = await _getByProjectId.ExecuteAsync(projectId); + if (model == null) + { + return NotFound(); + } + _logger.LogInformation("Relatórios de Projeto encontrados para o ID do projeto {projectId}.", projectId); + return Ok(model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return NotFound(ex.Message); + } + } + + /// + /// Cria relatório de projeto. + /// + /// Dados para criação de relatório de projeto. + /// Relatório de projeto criado. + /// Relatório de projeto criado. + /// Dados inválidos. + /// Usuário não autorizado. + [HttpPost] + [ProducesResponseType(typeof(DetailedReadProjectReportOutput), StatusCodes.Status201Created)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task> Create([FromBody] CreateProjectReportInput request) + { + try + { + var model = await _create.ExecuteAsync(request); + _logger.LogInformation("Relatório de Projeto criado: {id}", model?.Id); + return CreatedAtAction(nameof(GetById), new { id = model?.Id }, model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); + } + } + + /// + /// Atualiza relatório de projeto. + /// + /// Id do relatório de projeto. + /// Dados para atualização de relatório de projeto. + /// Relatório de projeto atualizado. + /// Relatório de projeto atualizado. + /// Dados inválidos. + /// Usuário não autorizado. + /// Relatório de projeto não encontrado. + [HttpPut("{id}")] + [ProducesResponseType(typeof(DetailedReadProjectReportOutput), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> Update(Guid? id, [FromBody] UpdateProjectReportInput request) + { + if (id == null) + { + return BadRequest("O ID informado não pode ser nulo."); + } + + try + { + var model = await _update.ExecuteAsync(id.Value, request); + if (model == null) + { + return NotFound(); + } + _logger.LogInformation("Relatório de Projeto atualizado: {id}", model?.Id); + return Ok(model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); + } + } + + /// + /// Remove relatório de projeto. + /// + /// Id do relatório de projeto. + /// Relatório de projeto removido. + /// Relatório de projeto removido. + /// Id não informado. + /// Usuário não autorizado. + /// Relatório de projeto não encontrado. + [HttpDelete("{id}")] + [ProducesResponseType(typeof(DetailedReadProjectReportOutput), StatusCodes.Status200OK)] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + [ProducesResponseType(StatusCodes.Status404NotFound)] + public async Task> Delete(Guid? id) + { + if (id == null) + { + return BadRequest("O ID informado não pode ser nulo."); + } + + try + { + var model = await _delete.ExecuteAsync(id.Value); + if (model == null) + { + return NotFound(); + } + _logger.LogInformation("Relatório de Projeto removido: {id}", model?.Id); + return Ok(model); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); + } + } + } +} \ No newline at end of file From 246e6c4380b2c1abe1f09ca4aba5620c24d845d6 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 7 Aug 2023 14:42:15 -0300 Subject: [PATCH 080/201] tests(application): add test project --- .vscode/settings.json | 3 +- .../Application.Tests.csproj | 35 +++++ .../UseCases/Area/CreateAreaTests.cs | 133 ++++++++++++++++++ .../UseCases/Area/DeleteAreaTests.cs | 69 +++++++++ .../UseCases/Area/GetAreaByIdTests.cs | 66 +++++++++ .../UseCases/Area/UpdateAreaTests.cs | 102 ++++++++++++++ src/CopetSystem.API.sln | 69 ++------- 7 files changed, 422 insertions(+), 55 deletions(-) create mode 100644 src/Application.Tests/Application.Tests.csproj create mode 100644 src/Application.Tests/UseCases/Area/CreateAreaTests.cs create mode 100644 src/Application.Tests/UseCases/Area/DeleteAreaTests.cs create mode 100644 src/Application.Tests/UseCases/Area/GetAreaByIdTests.cs create mode 100644 src/Application.Tests/UseCases/Area/UpdateAreaTests.cs diff --git a/.vscode/settings.json b/.vscode/settings.json index 46d1612b..bf9555a2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,5 @@ { - "dotnet-test-explorer.testProjectPath": "src/Domain.Tests/Domain.Tests.csproj", + // "dotnet-test-explorer.testProjectPath": "src/Domain.Tests/Domain.Tests.csproj", + "dotnet-test-explorer.testProjectPath": "src/Application.Tests/Application.Tests.csproj", "dotnet.defaultSolution": "src/CopetSystem.API.sln" } \ No newline at end of file diff --git a/src/Application.Tests/Application.Tests.csproj b/src/Application.Tests/Application.Tests.csproj new file mode 100644 index 00000000..9670f4b8 --- /dev/null +++ b/src/Application.Tests/Application.Tests.csproj @@ -0,0 +1,35 @@ + + + net7.0 + enable + enable + false + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Application.Tests/UseCases/Area/CreateAreaTests.cs b/src/Application.Tests/UseCases/Area/CreateAreaTests.cs new file mode 100644 index 00000000..703d5156 --- /dev/null +++ b/src/Application.Tests/UseCases/Area/CreateAreaTests.cs @@ -0,0 +1,133 @@ +using AutoMapper; +using Application.Ports.Area; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.Area; +using Application.Validation; +using Moq; +using NUnit.Framework; +using Application.UseCases.Area; + +namespace Domain.Tests.UseCases.Area +{ + [TestFixture] + public class CreateAreaTests + { + private ICreateArea _createArea; + private Mock _areaRepositoryMock; + private Mock _mainAreaRepositoryMock; + private Mock _mapperMock; + + public static Entities.Area MockValidArea() => new(Guid.NewGuid(), "ABC", "Area Name"); + private static Entities.MainArea MockValidMainArea() => new(Guid.NewGuid(), "ABC", "Main Area Name"); + + [SetUp] + public void Setup() + { + _areaRepositoryMock = new Mock(); + _mainAreaRepositoryMock = new Mock(); + _mapperMock = new Mock(); + + _createArea = new CreateArea( + _areaRepositoryMock.Object, + _mainAreaRepositoryMock.Object, + _mapperMock.Object + ); + } + + [Test] + public async Task Execute_WithValidInput_ShouldCreateArea() + { + // Arrange + var input = new CreateAreaInput + { + Name = "Area Name", + Code = "areaCode0", + MainAreaId = Guid.NewGuid(), + }; + + var areaEntity = MockValidArea(); + var detailedOutput = new DetailedReadAreaOutput(); + + _areaRepositoryMock.Setup(r => r.GetByCodeAsync(input.Code)).ReturnsAsync((Entities.Area)null); + _mainAreaRepositoryMock.Setup(r => r.GetByIdAsync(input.MainAreaId)).ReturnsAsync(MockValidMainArea()); + _areaRepositoryMock.Setup(r => r.CreateAsync(It.IsAny())).ReturnsAsync(areaEntity); + _mapperMock.Setup(m => m.Map(areaEntity)).Returns(detailedOutput); + + // Act + var result = await _createArea.ExecuteAsync(input); + + // Assert + Assert.IsNotNull(result); + Assert.AreEqual(detailedOutput, result); + _areaRepositoryMock.Verify(r => r.GetByCodeAsync(input.Code), Times.Once); + _mainAreaRepositoryMock.Verify(r => r.GetByIdAsync(input.MainAreaId), Times.Once); + _areaRepositoryMock.Verify(r => r.CreateAsync(It.IsAny()), Times.Once); + _mapperMock.Verify(m => m.Map(areaEntity), Times.Once); + } + + [Test] + public void Execute_WithExistingCode_ShouldThrowException() + { + // Arrange + var input = new CreateAreaInput + { + Name = "Area Name", + Code = "existingCode2", + MainAreaId = Guid.NewGuid(), + }; + + var existingArea = MockValidArea(); + + _areaRepositoryMock.Setup(r => r.GetByCodeAsync(input.Code)).ReturnsAsync(existingArea); + + // Act & Assert + Assert.ThrowsAsync(async () => await _createArea.ExecuteAsync(input)); + _areaRepositoryMock.Verify(r => r.GetByCodeAsync(input.Code), Times.Once); + _mainAreaRepositoryMock.Verify(r => r.GetByIdAsync(It.IsAny()), Times.Never); + _areaRepositoryMock.Verify(r => r.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); + } + + [Test] + public void Execute_WithMissingMainAreaId_ShouldThrowException() + { + // Arrange + var input = new CreateAreaInput + { + Name = "Area Name", + Code = "areaCode1", + MainAreaId = null, + }; + + // Act & Assert + Assert.ThrowsAsync(async () => await _createArea.ExecuteAsync(input)); + _areaRepositoryMock.Verify(r => r.GetByCodeAsync(It.IsAny()), Times.Once); + _mainAreaRepositoryMock.Verify(r => r.GetByIdAsync(It.IsAny()), Times.Never); + _areaRepositoryMock.Verify(r => r.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); + } + + [Test] + public void Execute_WithInactiveMainArea_ShouldThrowException() + { + // Arrange + var input = new CreateAreaInput + { + Name = "Area Name", + Code = "areaCode2", + MainAreaId = Guid.NewGuid(), + }; + + var inactiveMainArea = MockValidMainArea(); + inactiveMainArea.DeactivateEntity(); + _mainAreaRepositoryMock.Setup(r => r.GetByIdAsync(input.MainAreaId)).ReturnsAsync(inactiveMainArea); + + // Act & Assert + Assert.ThrowsAsync(async () => await _createArea.ExecuteAsync(input)); + _areaRepositoryMock.Verify(r => r.GetByCodeAsync(input.Code), Times.Once); + _mainAreaRepositoryMock.Verify(r => r.GetByIdAsync(input.MainAreaId), Times.Once); + _areaRepositoryMock.Verify(r => r.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Area/DeleteAreaTests.cs b/src/Application.Tests/UseCases/Area/DeleteAreaTests.cs new file mode 100644 index 00000000..72245fbe --- /dev/null +++ b/src/Application.Tests/UseCases/Area/DeleteAreaTests.cs @@ -0,0 +1,69 @@ +using AutoMapper; +using Application.Ports.Area; +using Application.UseCases.Area; +using Application.Interfaces.UseCases.Area; +using Application.Validation; +using Domain.Interfaces.Repositories; +using Moq; +using NUnit.Framework; + +namespace Domain.Tests.UseCases.Area +{ + [TestFixture] + public class DeleteAreaTests + { + private IDeleteArea _deleteArea; + private Mock _areaRepositoryMock; + private Mock _mapperMock; + + private Guid _areaId; + private Domain.Entities.Area _deletedArea; + private DetailedReadAreaOutput _mappedOutput; + + [SetUp] + public void Setup() + { + _areaRepositoryMock = new Mock(); + _mapperMock = new Mock(); + + _deleteArea = new DeleteArea( + _areaRepositoryMock.Object, + _mapperMock.Object + ); + + _areaId = Guid.NewGuid(); + _deletedArea = new Domain.Entities.Area(_areaId, "ABC", "Area Name"); + _mappedOutput = new DetailedReadAreaOutput(); + + _areaRepositoryMock.Setup(r => r.DeleteAsync(_areaId)).ReturnsAsync(_deletedArea); + _mapperMock.Setup(m => m.Map(_deletedArea)).Returns(_mappedOutput); + } + + [Test] + public async Task Execute_WithValidId_ShouldDeleteAreaAndReturnOutput() + { + // Arrange + Guid? id = _areaId; + + // Act + var result = await _deleteArea.ExecuteAsync(id); + + // Assert + Assert.AreEqual(_mappedOutput, result); + _areaRepositoryMock.Verify(r => r.DeleteAsync(_areaId), Times.Once); + _mapperMock.Verify(m => m.Map(_deletedArea), Times.Once); + } + + [Test] + public void Execute_WithNullId_ShouldThrowArgumentNullException() + { + // Arrange + Guid? id = null; + + // Act & Assert + Assert.ThrowsAsync(async () => await _deleteArea.ExecuteAsync(id)); + _areaRepositoryMock.Verify(r => r.DeleteAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Area/GetAreaByIdTests.cs b/src/Application.Tests/UseCases/Area/GetAreaByIdTests.cs new file mode 100644 index 00000000..7df08688 --- /dev/null +++ b/src/Application.Tests/UseCases/Area/GetAreaByIdTests.cs @@ -0,0 +1,66 @@ +using AutoMapper; +using Application.Ports.Area; +using Domain.Interfaces.Repositories; +using Application.Validation; +using Moq; +using NUnit.Framework; +using Application.Interfaces.UseCases.Area; +using Application.UseCases.Area; + +namespace Domain.Tests.UseCases.Area +{ + [TestFixture] + public class GetAreaByIdTests + { + private IGetAreaById _getAreaById; + private Mock _areaRepositoryMock; + private Mock _mapperMock; + + public static Entities.Area MockValidArea() => new(Guid.NewGuid(), "ABC", "Area Name"); + + [SetUp] + public void Setup() + { + _areaRepositoryMock = new Mock(); + _mapperMock = new Mock(); + + _getAreaById = new GetAreaById( + _areaRepositoryMock.Object, + _mapperMock.Object + ); + } + + [Test] + public async Task Execute_WithValidId_ShouldReturnDetailedReadAreaOutput() + { + // Arrange + var id = Guid.NewGuid(); + var areaEntity = MockValidArea(); + var detailedOutput = new DetailedReadAreaOutput(); + + _areaRepositoryMock.Setup(r => r.GetByIdAsync(id)).ReturnsAsync(areaEntity); + _mapperMock.Setup(m => m.Map(areaEntity)).Returns(detailedOutput); + + // Act + var result = await _getAreaById.ExecuteAsync(id); + + // Assert + Assert.IsNotNull(result); + Assert.AreEqual(detailedOutput, result); + _areaRepositoryMock.Verify(r => r.GetByIdAsync(id), Times.Once); + _mapperMock.Verify(m => m.Map(areaEntity), Times.Once); + } + + [Test] + public void Execute_WithNullId_ShouldThrowException() + { + // Arrange + Guid? id = null; + + // Act & Assert + Assert.ThrowsAsync(async () => await _getAreaById.ExecuteAsync(id)); + _areaRepositoryMock.Verify(r => r.GetByIdAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Area/UpdateAreaTests.cs b/src/Application.Tests/UseCases/Area/UpdateAreaTests.cs new file mode 100644 index 00000000..9589f3bc --- /dev/null +++ b/src/Application.Tests/UseCases/Area/UpdateAreaTests.cs @@ -0,0 +1,102 @@ +using AutoMapper; +using Application.Ports.Area; +using Domain.Interfaces.Repositories; +using Application.Validation; +using Moq; +using NUnit.Framework; +using Application.Interfaces.UseCases.Area; +using Application.UseCases.Area; + +namespace Domain.Tests.UseCases.Area +{ + [TestFixture] + public class UpdateAreaTests + { + private IUpdateArea _updateArea; + private Mock _areaRepositoryMock; + private Mock _mapperMock; + + public static Entities.Area MockValidArea() => new(Guid.NewGuid(), "ABC", "Area Name"); + + [SetUp] + public void Setup() + { + _areaRepositoryMock = new Mock(); + _mapperMock = new Mock(); + + _updateArea = new UpdateArea( + _areaRepositoryMock.Object, + _mapperMock.Object + ); + } + + [Test] + public async Task Execute_WithValidIdAndInput_ShouldReturnDetailedReadAreaOutput() + { + // Arrange + var id = Guid.NewGuid(); + var input = new UpdateAreaInput + { + Name = "New Area Name", + Code = "New Area Code", + MainAreaId = Guid.NewGuid() + }; + var areaEntity = MockValidArea(); + var detailedOutput = new DetailedReadAreaOutput(); + + _areaRepositoryMock.Setup(r => r.GetByIdAsync(id)).ReturnsAsync(areaEntity); + _areaRepositoryMock.Setup(r => r.UpdateAsync(It.IsAny())).ReturnsAsync(areaEntity); + _mapperMock.Setup(m => m.Map(areaEntity)).Returns(detailedOutput); + + // Act + var result = await _updateArea.ExecuteAsync(id, input); + + // Assert + Assert.IsNotNull(result); + Assert.AreEqual(detailedOutput, result); + _areaRepositoryMock.Verify(r => r.GetByIdAsync(id), Times.Once); + _areaRepositoryMock.Verify(r => r.UpdateAsync(areaEntity), Times.Once); + _mapperMock.Verify(m => m.Map(areaEntity), Times.Once); + } + + [Test] + public void Execute_WithNullId_ShouldThrowException() + { + // Arrange + Guid? id = null; + var input = new UpdateAreaInput + { + Name = "New Area Name", + Code = "New Area Code", + MainAreaId = Guid.NewGuid() + }; + + // Act & Assert + Assert.ThrowsAsync(async () => await _updateArea.ExecuteAsync(id, input)); + _areaRepositoryMock.Verify(r => r.GetByIdAsync(It.IsAny()), Times.Never); + _areaRepositoryMock.Verify(r => r.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); + } + + [Test] + public void Execute_WithNonExistingId_ShouldThrowException() + { + // Arrange + var id = Guid.NewGuid(); + var input = new UpdateAreaInput + { + Name = "New Area Name", + Code = "New Area Code", + MainAreaId = Guid.NewGuid() + }; + + _areaRepositoryMock.Setup(r => r.GetByIdAsync(id)).ReturnsAsync((Entities.Area)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await _updateArea.ExecuteAsync(id, input)); + _areaRepositoryMock.Verify(r => r.GetByIdAsync(id), Times.Once); + _areaRepositoryMock.Verify(r => r.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); + } + } +} \ No newline at end of file diff --git a/src/CopetSystem.API.sln b/src/CopetSystem.API.sln index 91a061b7..28d98add 100644 --- a/src/CopetSystem.API.sln +++ b/src/CopetSystem.API.sln @@ -5,8 +5,6 @@ VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain", "Domain\Domain.csproj", "{60BB6D65-1899-43B7-BD10-986239A3257E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Adapters", "Adapters\Adapters.csproj", "{9C140CD0-7DDC-4859-BA21-68B64AF11284}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Infrastructure", "Infrastructure", "{CCAE2172-E62F-4440-ABAD-D1A1DC5A234D}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Persistence", "Infrastructure\Persistence\Persistence.csproj", "{FCC65F72-7AF9-4940-B07A-E7DDDC7967B7}" @@ -15,65 +13,26 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IoC", "Infrastructure\IoC\I EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAPI", "Infrastructure\WebAPI\WebAPI.csproj", "{163219BE-A0D2-41A1-A028-501AAB069BD9}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Domain.Tests", "Domain.Tests", "{370C1BE1-63EE-4D2E-AD4A-6D8392EEFF40}" -EndProject Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "Docker\docker-compose.dcproj", "{58DF51E2-67F0-4740-B20B-8DE70C99FE2B}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Services", "Infrastructure\Services\Services.csproj", "{7555C53A-BADC-49D9-82BE-C4D8587260EB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain.Tests", "Domain.Tests\Domain.Tests.csproj", "{8462166B-3145-422A-A658-47F32BFBDF0D}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Application", "Application\Application.csproj", "{10D17198-CD98-48BF-BEF3-A689B668F5E3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Application.Tests", "Application.Tests\Application.Tests.csproj", "{251887B5-8408-4723-A355-E9F187F66598}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain.Tests", "Domain.Tests\Domain.Tests.csproj", "{F72A4B83-7227-4E65-A80D-1D7FB55848FA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {862A9206-AC16-433A-ABF3-90A368B54F81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {862A9206-AC16-433A-ABF3-90A368B54F81}.Debug|Any CPU.Build.0 = Debug|Any CPU - {862A9206-AC16-433A-ABF3-90A368B54F81}.Release|Any CPU.ActiveCfg = Release|Any CPU - {862A9206-AC16-433A-ABF3-90A368B54F81}.Release|Any CPU.Build.0 = Release|Any CPU - {70685C44-2526-483D-92AF-F388BF7A82FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {70685C44-2526-483D-92AF-F388BF7A82FF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {70685C44-2526-483D-92AF-F388BF7A82FF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {70685C44-2526-483D-92AF-F388BF7A82FF}.Release|Any CPU.Build.0 = Release|Any CPU - {3D46FA46-8426-483A-B1C2-2225359B99FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3D46FA46-8426-483A-B1C2-2225359B99FC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3D46FA46-8426-483A-B1C2-2225359B99FC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3D46FA46-8426-483A-B1C2-2225359B99FC}.Release|Any CPU.Build.0 = Release|Any CPU - {2CEC4DEE-78D4-4130-AC1E-F732FF9F37DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2CEC4DEE-78D4-4130-AC1E-F732FF9F37DD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2CEC4DEE-78D4-4130-AC1E-F732FF9F37DD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2CEC4DEE-78D4-4130-AC1E-F732FF9F37DD}.Release|Any CPU.Build.0 = Release|Any CPU - {2669F050-AFB0-4DB8-A81E-D0F4D8DDDD01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2669F050-AFB0-4DB8-A81E-D0F4D8DDDD01}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2669F050-AFB0-4DB8-A81E-D0F4D8DDDD01}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2669F050-AFB0-4DB8-A81E-D0F4D8DDDD01}.Release|Any CPU.Build.0 = Release|Any CPU - {04B6663E-228C-4278-B913-614958C9DBFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {04B6663E-228C-4278-B913-614958C9DBFB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {04B6663E-228C-4278-B913-614958C9DBFB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {04B6663E-228C-4278-B913-614958C9DBFB}.Release|Any CPU.Build.0 = Release|Any CPU - {656ABFBE-1791-4014-B59E-F9C83DBF8AC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {656ABFBE-1791-4014-B59E-F9C83DBF8AC0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {656ABFBE-1791-4014-B59E-F9C83DBF8AC0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {656ABFBE-1791-4014-B59E-F9C83DBF8AC0}.Release|Any CPU.Build.0 = Release|Any CPU - {84B8DFE3-440C-4E7F-B35E-5A668D03D549}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {84B8DFE3-440C-4E7F-B35E-5A668D03D549}.Debug|Any CPU.Build.0 = Debug|Any CPU - {84B8DFE3-440C-4E7F-B35E-5A668D03D549}.Release|Any CPU.ActiveCfg = Release|Any CPU - {84B8DFE3-440C-4E7F-B35E-5A668D03D549}.Release|Any CPU.Build.0 = Release|Any CPU {60BB6D65-1899-43B7-BD10-986239A3257E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {60BB6D65-1899-43B7-BD10-986239A3257E}.Debug|Any CPU.Build.0 = Debug|Any CPU {60BB6D65-1899-43B7-BD10-986239A3257E}.Release|Any CPU.ActiveCfg = Release|Any CPU {60BB6D65-1899-43B7-BD10-986239A3257E}.Release|Any CPU.Build.0 = Release|Any CPU - {9C140CD0-7DDC-4859-BA21-68B64AF11284}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9C140CD0-7DDC-4859-BA21-68B64AF11284}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9C140CD0-7DDC-4859-BA21-68B64AF11284}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9C140CD0-7DDC-4859-BA21-68B64AF11284}.Release|Any CPU.Build.0 = Release|Any CPU {FCC65F72-7AF9-4940-B07A-E7DDDC7967B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FCC65F72-7AF9-4940-B07A-E7DDDC7967B7}.Debug|Any CPU.Build.0 = Debug|Any CPU {FCC65F72-7AF9-4940-B07A-E7DDDC7967B7}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -86,10 +45,6 @@ Global {163219BE-A0D2-41A1-A028-501AAB069BD9}.Debug|Any CPU.Build.0 = Debug|Any CPU {163219BE-A0D2-41A1-A028-501AAB069BD9}.Release|Any CPU.ActiveCfg = Release|Any CPU {163219BE-A0D2-41A1-A028-501AAB069BD9}.Release|Any CPU.Build.0 = Release|Any CPU - {60C2C8B4-6EF9-40E6-A193-972EBD7EE1F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {60C2C8B4-6EF9-40E6-A193-972EBD7EE1F6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {60C2C8B4-6EF9-40E6-A193-972EBD7EE1F6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {60C2C8B4-6EF9-40E6-A193-972EBD7EE1F6}.Release|Any CPU.Build.0 = Release|Any CPU {58DF51E2-67F0-4740-B20B-8DE70C99FE2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {58DF51E2-67F0-4740-B20B-8DE70C99FE2B}.Debug|Any CPU.Build.0 = Debug|Any CPU {58DF51E2-67F0-4740-B20B-8DE70C99FE2B}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -98,20 +53,26 @@ Global {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Debug|Any CPU.Build.0 = Debug|Any CPU {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Release|Any CPU.ActiveCfg = Release|Any CPU {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Release|Any CPU.Build.0 = Release|Any CPU - {8462166B-3145-422A-A658-47F32BFBDF0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8462166B-3145-422A-A658-47F32BFBDF0D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8462166B-3145-422A-A658-47F32BFBDF0D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8462166B-3145-422A-A658-47F32BFBDF0D}.Release|Any CPU.Build.0 = Release|Any CPU {10D17198-CD98-48BF-BEF3-A689B668F5E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {10D17198-CD98-48BF-BEF3-A689B668F5E3}.Debug|Any CPU.Build.0 = Debug|Any CPU {10D17198-CD98-48BF-BEF3-A689B668F5E3}.Release|Any CPU.ActiveCfg = Release|Any CPU {10D17198-CD98-48BF-BEF3-A689B668F5E3}.Release|Any CPU.Build.0 = Release|Any CPU + {251887B5-8408-4723-A355-E9F187F66598}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {251887B5-8408-4723-A355-E9F187F66598}.Debug|Any CPU.Build.0 = Debug|Any CPU + {251887B5-8408-4723-A355-E9F187F66598}.Release|Any CPU.ActiveCfg = Release|Any CPU + {251887B5-8408-4723-A355-E9F187F66598}.Release|Any CPU.Build.0 = Release|Any CPU + {F72A4B83-7227-4E65-A80D-1D7FB55848FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F72A4B83-7227-4E65-A80D-1D7FB55848FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F72A4B83-7227-4E65-A80D-1D7FB55848FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F72A4B83-7227-4E65-A80D-1D7FB55848FA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {FCC65F72-7AF9-4940-B07A-E7DDDC7967B7} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} {DC12A23D-7BF2-4F0A-A317-B9FA8818C9C2} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} {163219BE-A0D2-41A1-A028-501AAB069BD9} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} {7555C53A-BADC-49D9-82BE-C4D8587260EB} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} - {8462166B-3145-422A-A658-47F32BFBDF0D} = {370C1BE1-63EE-4D2E-AD4A-6D8392EEFF40} EndGlobalSection EndGlobal From ea390aebbe3a15a67c28cde312f9209909a06029 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 7 Aug 2023 14:42:34 -0300 Subject: [PATCH 081/201] tests(domain): adjust unit tests --- src/Domain.Tests/Domain.Tests.csproj | 2 - src/Domain.Tests/Entities/AreaUnitTests.cs | 2 +- .../Entities/ProgramTypeUnitTests.cs | 3 +- src/Domain.Tests/Entities/ProjectUnitTests.cs | 1132 ++++++++--------- src/Domain.Tests/Entities/StudentUnitTests.cs | 5 +- src/Domain.Tests/Entities/UserUnitTests.cs | 38 +- .../UseCases/Area/CreateAreaTests.cs | 135 -- .../UseCases/Area/DeleteAreaTests.cs | 71 -- .../UseCases/Area/GetAreaByIdTests.cs | 68 - .../UseCases/Area/UpdateAreaTests.cs | 104 -- src/Infrastructure/IoC/InfrastructureDI.cs | 1 + 11 files changed, 573 insertions(+), 988 deletions(-) delete mode 100644 src/Domain.Tests/UseCases/Area/CreateAreaTests.cs delete mode 100644 src/Domain.Tests/UseCases/Area/DeleteAreaTests.cs delete mode 100644 src/Domain.Tests/UseCases/Area/GetAreaByIdTests.cs delete mode 100644 src/Domain.Tests/UseCases/Area/UpdateAreaTests.cs diff --git a/src/Domain.Tests/Domain.Tests.csproj b/src/Domain.Tests/Domain.Tests.csproj index 7b77a051..baaa5c4b 100644 --- a/src/Domain.Tests/Domain.Tests.csproj +++ b/src/Domain.Tests/Domain.Tests.csproj @@ -25,8 +25,6 @@ - - diff --git a/src/Domain.Tests/Entities/AreaUnitTests.cs b/src/Domain.Tests/Entities/AreaUnitTests.cs index 1b77a6b0..d07eff90 100644 --- a/src/Domain.Tests/Entities/AreaUnitTests.cs +++ b/src/Domain.Tests/Entities/AreaUnitTests.cs @@ -7,7 +7,7 @@ namespace Domain.Tests.Entities; public class AreaUnitTests { - private Area MockValidArea() => new Area(Guid.NewGuid(), "ABC", "Area Name"); + private static Area MockValidArea() => new(Guid.NewGuid(), "ABC", "Area Name"); [Fact] public void SetMainAreaId_ValidId_SetsMainAreaId() diff --git a/src/Domain.Tests/Entities/ProgramTypeUnitTests.cs b/src/Domain.Tests/Entities/ProgramTypeUnitTests.cs index d677b241..771fa636 100644 --- a/src/Domain.Tests/Entities/ProgramTypeUnitTests.cs +++ b/src/Domain.Tests/Entities/ProgramTypeUnitTests.cs @@ -1,14 +1,13 @@ using Domain.Entities; using Domain.Validation; using FluentAssertions; -using System; using Xunit; namespace Domain.Tests.Entities { public class ProgramTypeUnitTests { - private ProgramType MockValidProgramType() => new ProgramType(); + private static ProgramType MockValidProgramType() => new("Program Name", "Program Description"); [Fact] public void SetName_ValidName_SetsName() diff --git a/src/Domain.Tests/Entities/ProjectUnitTests.cs b/src/Domain.Tests/Entities/ProjectUnitTests.cs index a3477557..d2a64081 100644 --- a/src/Domain.Tests/Entities/ProjectUnitTests.cs +++ b/src/Domain.Tests/Entities/ProjectUnitTests.cs @@ -1,566 +1,566 @@ -using Domain.Entities; -using Domain.Entities.Enums; -using Domain.Validation; -using FluentAssertions; -using Xunit; - -namespace Domain.Tests.Entities -{ - public class ProjectUnitTests - { - private Project MockValidProject() - { - var title = "Sample Title"; - var keyWord1 = "Keyword1"; - var keyWord2 = "Keyword2"; - var keyWord3 = "Keyword3"; - var isScholarshipCandidate = true; - var objective = "Sample Objective"; - var methodology = "Sample Methodology"; - var expectedResults = "Sample Expected Results"; - var activitiesExecutionSchedule = "Sample Schedule"; - var workType1 = 1; - var workType2 = 2; - var indexedConferenceProceedings = 3; - var notIndexedConferenceProceedings = 4; - var completedBook = 5; - var organizedBook = 6; - var bookChapters = 7; - var bookTranslations = 8; - var participationEditorialCommittees = 9; - var fullComposerSoloOrchestraAllTracks = 10; - var fullComposerSoloOrchestraCompilation = 11; - var chamberOrchestraInterpretation = 12; - var individualAndCollectiveArtPerformances = 13; - var scientificCulturalArtisticCollectionsCuratorship = 14; - var patentLetter = 15; - var patentDeposit = 16; - var softwareRegistration = 17; - var studentId = Guid.NewGuid(); - var programTypeId = Guid.NewGuid(); - var professorId = Guid.NewGuid(); - var subAreaId = Guid.NewGuid(); - var noticeId = Guid.NewGuid(); - var status = EProjectStatus.Accepted; - var statusDescription = "Active project"; - var appealDescription = "Sample appeal description"; - var submissionDate = new DateTime(2023, 5, 30); - var resubmissionDate = new DateTime(2023, 6, 10); - var cancellationDate = new DateTime(2023, 6, 15); - var cancellationReason = "Project is no longer feasible"; - - return new Project(title, keyWord1, keyWord2, keyWord3, isScholarshipCandidate, objective, methodology, - expectedResults, activitiesExecutionSchedule, workType1, workType2, indexedConferenceProceedings, - notIndexedConferenceProceedings, completedBook, organizedBook, bookChapters, bookTranslations, - participationEditorialCommittees, fullComposerSoloOrchestraAllTracks, fullComposerSoloOrchestraCompilation, - chamberOrchestraInterpretation, individualAndCollectiveArtPerformances, - scientificCulturalArtisticCollectionsCuratorship, patentLetter, patentDeposit, softwareRegistration, - studentId, programTypeId, professorId, subAreaId, noticeId, status, statusDescription, appealDescription, - submissionDate, resubmissionDate, cancellationDate, cancellationReason); - } - - [Fact] - public void SetTitle_ValidTitle_SetsTitle() - { - // Arrange - var project = MockValidProject(); - var title = "Sample Project Title"; - - // Act - project.Title = title; - - // Assert - project.Title.Should().Be(title); - } - - [Fact] - public void SetKeyword1_ValidKeyword1_SetsKeyword1() - { - // Arrange - var project = MockValidProject(); - var keyword1 = "Keyword 1"; - - // Act - project.KeyWord1 = keyword1; - - // Assert - project.KeyWord1.Should().Be(keyword1); - } - - [Fact] - public void SetKeyword2_ValidKeyword2_SetsKeyword2() - { - // Arrange - var project = MockValidProject(); - var keyword2 = "Keyword 2"; - - // Act - project.KeyWord2 = keyword2; - - // Assert - project.KeyWord2.Should().Be(keyword2); - } - - [Fact] - public void SetKeyword3_ValidKeyword3_SetsKeyword3() - { - // Arrange - var project = MockValidProject(); - var keyword3 = "Keyword 3"; - - // Act - project.KeyWord3 = keyword3; - - // Assert - project.KeyWord3.Should().Be(keyword3); - } - - [Fact] - public void SetIsScholarshipCandidate_ValidIsScholarshipCandidate_SetsIsScholarshipCandidate() - { - // Arrange - var project = MockValidProject(); - var isScholarshipCandidate = true; - - // Act - project.IsScholarshipCandidate = isScholarshipCandidate; - - // Assert - project.IsScholarshipCandidate.Should().Be(isScholarshipCandidate); - } - - [Fact] - public void SetObjective_ValidObjective_SetsObjective() - { - // Arrange - var project = MockValidProject(); - var objective = "Sample project objective."; - - // Act - project.Objective = objective; - - // Assert - project.Objective.Should().Be(objective); - } - - [Fact] - public void SetMethodology_ValidMethodology_SetsMethodology() - { - // Arrange - var project = MockValidProject(); - var methodology = "Sample project methodology."; - - // Act - project.Methodology = methodology; - - // Assert - project.Methodology.Should().Be(methodology); - } - - [Fact] - public void SetExpectedResults_ValidExpectedResults_SetsExpectedResults() - { - // Arrange - var project = MockValidProject(); - var expectedResults = "Sample expected project results."; - - // Act - project.ExpectedResults = expectedResults; - - // Assert - project.ExpectedResults.Should().Be(expectedResults); - } - - [Fact] - public void SetActivitiesExecutionSchedule_ValidActivitiesExecutionSchedule_SetsActivitiesExecutionSchedule() - { - // Arrange - var project = MockValidProject(); - var activitiesExecutionSchedule = "Sample project activities execution schedule."; - - // Act - project.ActivitiesExecutionSchedule = activitiesExecutionSchedule; - - // Assert - project.ActivitiesExecutionSchedule.Should().Be(activitiesExecutionSchedule); - } - - [Fact] - public void SetWorkType1_ValidWorkType1_SetsWorkType1() - { - // Arrange - var project = MockValidProject(); - var workType1 = 1; - - // Act - project.WorkType1 = workType1; - - // Assert - project.WorkType1.Should().Be(workType1); - } - - [Fact] - public void SetWorkType2_ValidWorkType2_SetsWorkType2() - { - // Arrange - var project = MockValidProject(); - var workType2 = 15; - - // Act - project.WorkType2 = workType2; - - // Assert - project.WorkType2.Should().Be(workType2); - } - - [Fact] - public void SetIndexedConferenceProceedings_ValidIndexedConferenceProceedings_SetsIndexedConferenceProceedings() - { - // Arrange - var project = MockValidProject(); - var indexedConferenceProceedings = 14; - - // Act - project.IndexedConferenceProceedings = indexedConferenceProceedings; - - // Assert - project.IndexedConferenceProceedings.Should().Be(indexedConferenceProceedings); - } - - [Fact] - public void SetNotIndexedConferenceProceedings_ValidNotIndexedConferenceProceedings_SetsNotIndexedConferenceProceedings() - { - // Arrange - var project = MockValidProject(); - var notIndexedConferenceProceedings = 6; - - // Act - project.NotIndexedConferenceProceedings = notIndexedConferenceProceedings; - - // Assert - project.NotIndexedConferenceProceedings.Should().Be(notIndexedConferenceProceedings); - } - - [Fact] - public void SetCompletedBook_ValidCompletedBook_SetsCompletedBook() - { - // Arrange - var project = MockValidProject(); - var completedBook = 3; - - // Act - project.CompletedBook = completedBook; - - // Assert - project.CompletedBook.Should().Be(completedBook); - } - - [Fact] - public void SetOrganizedBook_ValidOrganizedBook_SetsOrganizedBook() - { - // Arrange - var project = MockValidProject(); - var organizedBook = 1; - - // Act - project.OrganizedBook = organizedBook; - - // Assert - project.OrganizedBook.Should().Be(organizedBook); - } - - [Fact] - public void SetBookChapters_ValidBookChapters_SetsBookChapters() - { - // Arrange - var project = MockValidProject(); - var bookChapters = 13; - - // Act - project.BookChapters = bookChapters; - - // Assert - project.BookChapters.Should().Be(bookChapters); - } - - [Fact] - public void SetBookTranslations_ValidBookTranslations_SetsBookTranslations() - { - // Arrange - var project = MockValidProject(); - var bookTranslations = 22; - - // Act - project.BookTranslations = bookTranslations; - - // Assert - project.BookTranslations.Should().Be(bookTranslations); - } - - [Fact] - public void SetParticipationEditorialCommittees_ValidParticipationEditorialCommittees_SetsParticipationEditorialCommittees() - { - // Arrange - var project = MockValidProject(); - var participationEditorialCommittees = 11; - - // Act - project.ParticipationEditorialCommittees = participationEditorialCommittees; - - // Assert - project.ParticipationEditorialCommittees.Should().Be(participationEditorialCommittees); - } - - [Fact] - public void SetFullComposerSoloOrchestraAllTracks_ValidFullComposerSoloOrchestraAllTracks_SetsFullComposerSoloOrchestraAllTracks() - { - // Arrange - var project = MockValidProject(); - var fullComposerSoloOrchestraAllTracks = 9; - - // Act - project.FullComposerSoloOrchestraAllTracks = fullComposerSoloOrchestraAllTracks; - - // Assert - project.FullComposerSoloOrchestraAllTracks.Should().Be(fullComposerSoloOrchestraAllTracks); - } - - [Fact] - public void SetFullComposerSoloOrchestraCompilation_ValidFullComposerSoloOrchestraCompilation_SetsFullComposerSoloOrchestraCompilation() - { - // Arrange - var project = MockValidProject(); - var fullComposerSoloOrchestraCompilation = 8; - - // Act - project.FullComposerSoloOrchestraCompilation = fullComposerSoloOrchestraCompilation; - - // Assert - project.FullComposerSoloOrchestraCompilation.Should().Be(fullComposerSoloOrchestraCompilation); - } - - [Fact] - public void SetChamberOrchestraInterpretation_ValidChamberOrchestraInterpretation_SetsChamberOrchestraInterpretation() - { - // Arrange - var project = MockValidProject(); - var chamberOrchestraInterpretation = 2; - - // Act - project.ChamberOrchestraInterpretation = chamberOrchestraInterpretation; - - // Assert - project.ChamberOrchestraInterpretation.Should().Be(chamberOrchestraInterpretation); - } - - [Fact] - public void SetIndividualAndCollectiveArtPerformances_ValidIndividualAndCollectiveArtPerformances_SetsIndividualAndCollectiveArtPerformances() - { - // Arrange - var project = MockValidProject(); - var individualAndCollectiveArtPerformances = 7; - - // Act - project.IndividualAndCollectiveArtPerformances = individualAndCollectiveArtPerformances; - - // Assert - project.IndividualAndCollectiveArtPerformances.Should().Be(individualAndCollectiveArtPerformances); - } - - [Fact] - public void SetScientificCulturalArtisticCollectionsCuratorship_ValidScientificCulturalArtisticCollectionsCuratorship_SetsScientificCulturalArtisticCollectionsCuratorship() - { - // Arrange - var project = MockValidProject(); - var scientificCulturalArtisticCollectionsCuratorship = 0; - - // Act - project.ScientificCulturalArtisticCollectionsCuratorship = scientificCulturalArtisticCollectionsCuratorship; - - // Assert - project.ScientificCulturalArtisticCollectionsCuratorship.Should().Be(scientificCulturalArtisticCollectionsCuratorship); - } - - [Fact] - public void SetPatentLetter_ValidPatentLetter_SetsPatentLetter() - { - // Arrange - var project = MockValidProject(); - var patentLetter = 4; - - // Act - project.PatentLetter = patentLetter; - - // Assert - project.PatentLetter.Should().Be(patentLetter); - } - - [Fact] - public void SetPatentDeposit_ValidPatentDeposit_SetsPatentDeposit() - { - // Arrange - var project = MockValidProject(); - var patentDeposit = 3; - - // Act - project.PatentDeposit = patentDeposit; - - // Assert - project.PatentDeposit.Should().Be(patentDeposit); - } - - [Fact] - public void SetSoftwareRegistration_ValidSoftwareRegistration_SetsSoftwareRegistration() - { - // Arrange - var project = MockValidProject(); - var softwareRegistration = 2; - - // Act - project.SoftwareRegistration = softwareRegistration; - - // Assert - project.SoftwareRegistration.Should().Be(softwareRegistration); - } - - [Fact] - public void SetStudentId_ValidStudentId_SetsStudentId() - { - // Arrange - var project = MockValidProject(); - var studentId = Guid.NewGuid(); - - // Act - project.StudentId = studentId; - - // Assert - project.StudentId.Should().Be(studentId); - } - - [Fact] - public void SetProgramTypeId_ValidProgramTypeId_SetsProgramTypeId() - { - // Arrange - var project = MockValidProject(); - var programTypeId = Guid.NewGuid(); - - // Act - project.ProgramTypeId = programTypeId; - - // Assert - project.ProgramTypeId.Should().Be(programTypeId); - } - - [Fact] - public void SetSubAreaId_ValidSubAreaId_SetsSubAreaId() - { - // Arrange - var project = MockValidProject(); - var subAreaId = Guid.NewGuid(); - - // Act - project.SubAreaId = subAreaId; - - // Assert - project.SubAreaId.Should().Be(subAreaId); - } - - [Fact] - public void SetStatus_ValidStatus_SetsStatus() - { - // Arrange - var project = MockValidProject(); - var status = EProjectStatus.Accepted; - - // Act - project.Status = status; - - // Assert - project.Status.Should().Be(status); - } - - [Fact] - public void SetStatusDescription_ValidStatusDescription_SetsStatusDescription() - { - // Arrange - var project = MockValidProject(); - var statusDescription = EProjectStatus.Accepted.GetDescription(); - - // Act - project.StatusDescription = statusDescription; - - // Assert - project.StatusDescription.Should().Be(statusDescription); - } - - [Fact] - public void SetAppealObservation_ValidAppealObservation_SetsAppealObservation() - { - // Arrange - var project = MockValidProject(); - var appealDescription = "Sample appeal description."; - - // Act - project.AppealObservation = appealDescription; - - // Assert - project.AppealObservation.Should().Be(appealDescription); - } - - [Fact] - public void SetSubmissionDate_ValidSubmissionDate_SetsSubmissionDate() - { - // Arrange - var project = MockValidProject(); - var submissionDate = DateTime.UtcNow; - - // Act - project.SubmissionDate = submissionDate; - - // Assert - project.SubmissionDate.Should().Be(submissionDate); - } - - [Fact] - public void SetAppealDate_ValidAppealDate_SetsAppealDate() - { - // Arrange - var project = MockValidProject(); - var resubmissionDate = DateTime.UtcNow; - - // Act - project.AppealDate = resubmissionDate; - - // Assert - project.AppealDate.Should().Be(resubmissionDate); - } - - [Fact] - public void SetCancellationDate_ValidCancellationDate_SetsCancellationDate() - { - // Arrange - var project = MockValidProject(); - var cancellationDate = DateTime.UtcNow; - - // Act - project.CancellationDate = cancellationDate; - - // Assert - project.CancellationDate.Should().Be(cancellationDate); - } - - [Fact] - public void SetCancellationReason_ValidCancellationReason_SetsCancellationReason() - { - // Arrange - var project = MockValidProject(); - var cancellationReason = "Project is no longer feasible."; - - // Act - project.CancellationReason = cancellationReason; - - // Assert - project.CancellationReason.Should().Be(cancellationReason); - } - } -} \ No newline at end of file +// using Domain.Entities; +// using Domain.Entities.Enums; +// using Domain.Validation; +// using FluentAssertions; +// using Xunit; + +// namespace Domain.Tests.Entities +// { +// public class ProjectUnitTests +// { +// private Project MockValidProject() +// { +// var title = "Sample Title"; +// var keyWord1 = "Keyword1"; +// var keyWord2 = "Keyword2"; +// var keyWord3 = "Keyword3"; +// var isScholarshipCandidate = true; +// var objective = "Sample Objective"; +// var methodology = "Sample Methodology"; +// var expectedResults = "Sample Expected Results"; +// var activitiesExecutionSchedule = "Sample Schedule"; +// var workType1 = 1; +// var workType2 = 2; +// var indexedConferenceProceedings = 3; +// var notIndexedConferenceProceedings = 4; +// var completedBook = 5; +// var organizedBook = 6; +// var bookChapters = 7; +// var bookTranslations = 8; +// var participationEditorialCommittees = 9; +// var fullComposerSoloOrchestraAllTracks = 10; +// var fullComposerSoloOrchestraCompilation = 11; +// var chamberOrchestraInterpretation = 12; +// var individualAndCollectiveArtPerformances = 13; +// var scientificCulturalArtisticCollectionsCuratorship = 14; +// var patentLetter = 15; +// var patentDeposit = 16; +// var softwareRegistration = 17; +// var studentId = Guid.NewGuid(); +// var programTypeId = Guid.NewGuid(); +// var professorId = Guid.NewGuid(); +// var subAreaId = Guid.NewGuid(); +// var noticeId = Guid.NewGuid(); +// var status = EProjectStatus.Accepted; +// var statusDescription = "Active project"; +// var appealDescription = "Sample appeal description"; +// var submissionDate = new DateTime(2023, 5, 30); +// var resubmissionDate = new DateTime(2023, 6, 10); +// var cancellationDate = new DateTime(2023, 6, 15); +// var cancellationReason = "Project is no longer feasible"; + +// return new Project(title, keyWord1, keyWord2, keyWord3, isScholarshipCandidate, objective, methodology, +// expectedResults, activitiesExecutionSchedule, workType1, workType2, indexedConferenceProceedings, +// notIndexedConferenceProceedings, completedBook, organizedBook, bookChapters, bookTranslations, +// participationEditorialCommittees, fullComposerSoloOrchestraAllTracks, fullComposerSoloOrchestraCompilation, +// chamberOrchestraInterpretation, individualAndCollectiveArtPerformances, +// scientificCulturalArtisticCollectionsCuratorship, patentLetter, patentDeposit, softwareRegistration, +// studentId, programTypeId, professorId, subAreaId, noticeId, status, statusDescription, appealDescription, +// submissionDate, resubmissionDate, cancellationDate, cancellationReason); +// } + +// [Fact] +// public void SetTitle_ValidTitle_SetsTitle() +// { +// // Arrange +// var project = MockValidProject(); +// var title = "Sample Project Title"; + +// // Act +// project.Title = title; + +// // Assert +// project.Title.Should().Be(title); +// } + +// [Fact] +// public void SetKeyword1_ValidKeyword1_SetsKeyword1() +// { +// // Arrange +// var project = MockValidProject(); +// var keyword1 = "Keyword 1"; + +// // Act +// project.KeyWord1 = keyword1; + +// // Assert +// project.KeyWord1.Should().Be(keyword1); +// } + +// [Fact] +// public void SetKeyword2_ValidKeyword2_SetsKeyword2() +// { +// // Arrange +// var project = MockValidProject(); +// var keyword2 = "Keyword 2"; + +// // Act +// project.KeyWord2 = keyword2; + +// // Assert +// project.KeyWord2.Should().Be(keyword2); +// } + +// [Fact] +// public void SetKeyword3_ValidKeyword3_SetsKeyword3() +// { +// // Arrange +// var project = MockValidProject(); +// var keyword3 = "Keyword 3"; + +// // Act +// project.KeyWord3 = keyword3; + +// // Assert +// project.KeyWord3.Should().Be(keyword3); +// } + +// [Fact] +// public void SetIsScholarshipCandidate_ValidIsScholarshipCandidate_SetsIsScholarshipCandidate() +// { +// // Arrange +// var project = MockValidProject(); +// var isScholarshipCandidate = true; + +// // Act +// project.IsScholarshipCandidate = isScholarshipCandidate; + +// // Assert +// project.IsScholarshipCandidate.Should().Be(isScholarshipCandidate); +// } + +// [Fact] +// public void SetObjective_ValidObjective_SetsObjective() +// { +// // Arrange +// var project = MockValidProject(); +// var objective = "Sample project objective."; + +// // Act +// project.Objective = objective; + +// // Assert +// project.Objective.Should().Be(objective); +// } + +// [Fact] +// public void SetMethodology_ValidMethodology_SetsMethodology() +// { +// // Arrange +// var project = MockValidProject(); +// var methodology = "Sample project methodology."; + +// // Act +// project.Methodology = methodology; + +// // Assert +// project.Methodology.Should().Be(methodology); +// } + +// [Fact] +// public void SetExpectedResults_ValidExpectedResults_SetsExpectedResults() +// { +// // Arrange +// var project = MockValidProject(); +// var expectedResults = "Sample expected project results."; + +// // Act +// project.ExpectedResults = expectedResults; + +// // Assert +// project.ExpectedResults.Should().Be(expectedResults); +// } + +// [Fact] +// public void SetActivitiesExecutionSchedule_ValidActivitiesExecutionSchedule_SetsActivitiesExecutionSchedule() +// { +// // Arrange +// var project = MockValidProject(); +// var activitiesExecutionSchedule = "Sample project activities execution schedule."; + +// // Act +// project.ActivitiesExecutionSchedule = activitiesExecutionSchedule; + +// // Assert +// project.ActivitiesExecutionSchedule.Should().Be(activitiesExecutionSchedule); +// } + +// [Fact] +// public void SetWorkType1_ValidWorkType1_SetsWorkType1() +// { +// // Arrange +// var project = MockValidProject(); +// var workType1 = 1; + +// // Act +// project.WorkType1 = workType1; + +// // Assert +// project.WorkType1.Should().Be(workType1); +// } + +// [Fact] +// public void SetWorkType2_ValidWorkType2_SetsWorkType2() +// { +// // Arrange +// var project = MockValidProject(); +// var workType2 = 15; + +// // Act +// project.WorkType2 = workType2; + +// // Assert +// project.WorkType2.Should().Be(workType2); +// } + +// [Fact] +// public void SetIndexedConferenceProceedings_ValidIndexedConferenceProceedings_SetsIndexedConferenceProceedings() +// { +// // Arrange +// var project = MockValidProject(); +// var indexedConferenceProceedings = 14; + +// // Act +// project.IndexedConferenceProceedings = indexedConferenceProceedings; + +// // Assert +// project.IndexedConferenceProceedings.Should().Be(indexedConferenceProceedings); +// } + +// [Fact] +// public void SetNotIndexedConferenceProceedings_ValidNotIndexedConferenceProceedings_SetsNotIndexedConferenceProceedings() +// { +// // Arrange +// var project = MockValidProject(); +// var notIndexedConferenceProceedings = 6; + +// // Act +// project.NotIndexedConferenceProceedings = notIndexedConferenceProceedings; + +// // Assert +// project.NotIndexedConferenceProceedings.Should().Be(notIndexedConferenceProceedings); +// } + +// [Fact] +// public void SetCompletedBook_ValidCompletedBook_SetsCompletedBook() +// { +// // Arrange +// var project = MockValidProject(); +// var completedBook = 3; + +// // Act +// project.CompletedBook = completedBook; + +// // Assert +// project.CompletedBook.Should().Be(completedBook); +// } + +// [Fact] +// public void SetOrganizedBook_ValidOrganizedBook_SetsOrganizedBook() +// { +// // Arrange +// var project = MockValidProject(); +// var organizedBook = 1; + +// // Act +// project.OrganizedBook = organizedBook; + +// // Assert +// project.OrganizedBook.Should().Be(organizedBook); +// } + +// [Fact] +// public void SetBookChapters_ValidBookChapters_SetsBookChapters() +// { +// // Arrange +// var project = MockValidProject(); +// var bookChapters = 13; + +// // Act +// project.BookChapters = bookChapters; + +// // Assert +// project.BookChapters.Should().Be(bookChapters); +// } + +// [Fact] +// public void SetBookTranslations_ValidBookTranslations_SetsBookTranslations() +// { +// // Arrange +// var project = MockValidProject(); +// var bookTranslations = 22; + +// // Act +// project.BookTranslations = bookTranslations; + +// // Assert +// project.BookTranslations.Should().Be(bookTranslations); +// } + +// [Fact] +// public void SetParticipationEditorialCommittees_ValidParticipationEditorialCommittees_SetsParticipationEditorialCommittees() +// { +// // Arrange +// var project = MockValidProject(); +// var participationEditorialCommittees = 11; + +// // Act +// project.ParticipationEditorialCommittees = participationEditorialCommittees; + +// // Assert +// project.ParticipationEditorialCommittees.Should().Be(participationEditorialCommittees); +// } + +// [Fact] +// public void SetFullComposerSoloOrchestraAllTracks_ValidFullComposerSoloOrchestraAllTracks_SetsFullComposerSoloOrchestraAllTracks() +// { +// // Arrange +// var project = MockValidProject(); +// var fullComposerSoloOrchestraAllTracks = 9; + +// // Act +// project.FullComposerSoloOrchestraAllTracks = fullComposerSoloOrchestraAllTracks; + +// // Assert +// project.FullComposerSoloOrchestraAllTracks.Should().Be(fullComposerSoloOrchestraAllTracks); +// } + +// [Fact] +// public void SetFullComposerSoloOrchestraCompilation_ValidFullComposerSoloOrchestraCompilation_SetsFullComposerSoloOrchestraCompilation() +// { +// // Arrange +// var project = MockValidProject(); +// var fullComposerSoloOrchestraCompilation = 8; + +// // Act +// project.FullComposerSoloOrchestraCompilation = fullComposerSoloOrchestraCompilation; + +// // Assert +// project.FullComposerSoloOrchestraCompilation.Should().Be(fullComposerSoloOrchestraCompilation); +// } + +// [Fact] +// public void SetChamberOrchestraInterpretation_ValidChamberOrchestraInterpretation_SetsChamberOrchestraInterpretation() +// { +// // Arrange +// var project = MockValidProject(); +// var chamberOrchestraInterpretation = 2; + +// // Act +// project.ChamberOrchestraInterpretation = chamberOrchestraInterpretation; + +// // Assert +// project.ChamberOrchestraInterpretation.Should().Be(chamberOrchestraInterpretation); +// } + +// [Fact] +// public void SetIndividualAndCollectiveArtPerformances_ValidIndividualAndCollectiveArtPerformances_SetsIndividualAndCollectiveArtPerformances() +// { +// // Arrange +// var project = MockValidProject(); +// var individualAndCollectiveArtPerformances = 7; + +// // Act +// project.IndividualAndCollectiveArtPerformances = individualAndCollectiveArtPerformances; + +// // Assert +// project.IndividualAndCollectiveArtPerformances.Should().Be(individualAndCollectiveArtPerformances); +// } + +// [Fact] +// public void SetScientificCulturalArtisticCollectionsCuratorship_ValidScientificCulturalArtisticCollectionsCuratorship_SetsScientificCulturalArtisticCollectionsCuratorship() +// { +// // Arrange +// var project = MockValidProject(); +// var scientificCulturalArtisticCollectionsCuratorship = 0; + +// // Act +// project.ScientificCulturalArtisticCollectionsCuratorship = scientificCulturalArtisticCollectionsCuratorship; + +// // Assert +// project.ScientificCulturalArtisticCollectionsCuratorship.Should().Be(scientificCulturalArtisticCollectionsCuratorship); +// } + +// [Fact] +// public void SetPatentLetter_ValidPatentLetter_SetsPatentLetter() +// { +// // Arrange +// var project = MockValidProject(); +// var patentLetter = 4; + +// // Act +// project.PatentLetter = patentLetter; + +// // Assert +// project.PatentLetter.Should().Be(patentLetter); +// } + +// [Fact] +// public void SetPatentDeposit_ValidPatentDeposit_SetsPatentDeposit() +// { +// // Arrange +// var project = MockValidProject(); +// var patentDeposit = 3; + +// // Act +// project.PatentDeposit = patentDeposit; + +// // Assert +// project.PatentDeposit.Should().Be(patentDeposit); +// } + +// [Fact] +// public void SetSoftwareRegistration_ValidSoftwareRegistration_SetsSoftwareRegistration() +// { +// // Arrange +// var project = MockValidProject(); +// var softwareRegistration = 2; + +// // Act +// project.SoftwareRegistration = softwareRegistration; + +// // Assert +// project.SoftwareRegistration.Should().Be(softwareRegistration); +// } + +// [Fact] +// public void SetStudentId_ValidStudentId_SetsStudentId() +// { +// // Arrange +// var project = MockValidProject(); +// var studentId = Guid.NewGuid(); + +// // Act +// project.StudentId = studentId; + +// // Assert +// project.StudentId.Should().Be(studentId); +// } + +// [Fact] +// public void SetProgramTypeId_ValidProgramTypeId_SetsProgramTypeId() +// { +// // Arrange +// var project = MockValidProject(); +// var programTypeId = Guid.NewGuid(); + +// // Act +// project.ProgramTypeId = programTypeId; + +// // Assert +// project.ProgramTypeId.Should().Be(programTypeId); +// } + +// [Fact] +// public void SetSubAreaId_ValidSubAreaId_SetsSubAreaId() +// { +// // Arrange +// var project = MockValidProject(); +// var subAreaId = Guid.NewGuid(); + +// // Act +// project.SubAreaId = subAreaId; + +// // Assert +// project.SubAreaId.Should().Be(subAreaId); +// } + +// [Fact] +// public void SetStatus_ValidStatus_SetsStatus() +// { +// // Arrange +// var project = MockValidProject(); +// var status = EProjectStatus.Accepted; + +// // Act +// project.Status = status; + +// // Assert +// project.Status.Should().Be(status); +// } + +// [Fact] +// public void SetStatusDescription_ValidStatusDescription_SetsStatusDescription() +// { +// // Arrange +// var project = MockValidProject(); +// var statusDescription = EProjectStatus.Accepted.GetDescription(); + +// // Act +// project.StatusDescription = statusDescription; + +// // Assert +// project.StatusDescription.Should().Be(statusDescription); +// } + +// [Fact] +// public void SetAppealObservation_ValidAppealObservation_SetsAppealObservation() +// { +// // Arrange +// var project = MockValidProject(); +// var appealDescription = "Sample appeal description."; + +// // Act +// project.AppealObservation = appealDescription; + +// // Assert +// project.AppealObservation.Should().Be(appealDescription); +// } + +// [Fact] +// public void SetSubmissionDate_ValidSubmissionDate_SetsSubmissionDate() +// { +// // Arrange +// var project = MockValidProject(); +// var submissionDate = DateTime.UtcNow; + +// // Act +// project.SubmissionDate = submissionDate; + +// // Assert +// project.SubmissionDate.Should().Be(submissionDate); +// } + +// [Fact] +// public void SetAppealDate_ValidAppealDate_SetsAppealDate() +// { +// // Arrange +// var project = MockValidProject(); +// var resubmissionDate = DateTime.UtcNow; + +// // Act +// project.AppealDate = resubmissionDate; + +// // Assert +// project.AppealDate.Should().Be(resubmissionDate); +// } + +// [Fact] +// public void SetCancellationDate_ValidCancellationDate_SetsCancellationDate() +// { +// // Arrange +// var project = MockValidProject(); +// var cancellationDate = DateTime.UtcNow; + +// // Act +// project.CancellationDate = cancellationDate; + +// // Assert +// project.CancellationDate.Should().Be(cancellationDate); +// } + +// [Fact] +// public void SetCancellationReason_ValidCancellationReason_SetsCancellationReason() +// { +// // Arrange +// var project = MockValidProject(); +// var cancellationReason = "Project is no longer feasible."; + +// // Act +// project.CancellationReason = cancellationReason; + +// // Assert +// project.CancellationReason.Should().Be(cancellationReason); +// } +// } +// } \ No newline at end of file diff --git a/src/Domain.Tests/Entities/StudentUnitTests.cs b/src/Domain.Tests/Entities/StudentUnitTests.cs index ebccc9f5..65465717 100644 --- a/src/Domain.Tests/Entities/StudentUnitTests.cs +++ b/src/Domain.Tests/Entities/StudentUnitTests.cs @@ -9,7 +9,7 @@ namespace Domain.Tests.Entities { public class StudentUnitTests { - private Student MockValidStudent() => new Student( + private static Student MockValidStudent() => new( birthDate: new DateTime(2000, 1, 1), rg: 123456789, issuingAgency: "Agency", @@ -27,7 +27,8 @@ public class StudentUnitTests campusId: Guid.NewGuid(), courseId: Guid.NewGuid(), startYear: "2022", - studentAssistanceProgramId: Guid.NewGuid() + studentAssistanceProgramId: Guid.NewGuid(), + registrationCode: "GCOM1234567" ); [Fact] diff --git a/src/Domain.Tests/Entities/UserUnitTests.cs b/src/Domain.Tests/Entities/UserUnitTests.cs index fb4105ae..2995bbec 100644 --- a/src/Domain.Tests/Entities/UserUnitTests.cs +++ b/src/Domain.Tests/Entities/UserUnitTests.cs @@ -9,43 +9,7 @@ namespace Domain.Tests.Entities { public class UserUnitTests { - private User _user; - private User MockValidUser() - { - if (_user == null) - _user = InvokeInternalConstructor("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); - return _user; - } - - [Fact] - public void TestInternalConstructor() - { - // Arrange - var name = "John Doe"; - var email = "john.doe@example.com"; - var password = "strongpassword"; - var cpf = "92114660087"; - var role = ERole.ADMIN; - - // Act - var user = InvokeInternalConstructor(name, email, password, cpf, role); - - // Assert - Assert.Equal(name, user.Name); - Assert.Equal(email, user.Email); - Assert.Equal(password, user.Password); - Assert.Equal(cpf, user.CPF); - Assert.Equal(role, user.Role); - } - - private T InvokeInternalConstructor(params object[] args) - { - var constructor = typeof(T).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, CallingConventions.Any, args.Select(a => a?.GetType()).ToArray(), null); - if (constructor == null) - throw new InvalidOperationException("Internal constructor not found."); - - return (T)constructor.Invoke(args); - } + private static User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); [Fact] public void SetName_ValidName_SetsName() diff --git a/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs b/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs deleted file mode 100644 index 0dcffc2d..00000000 --- a/src/Domain.Tests/UseCases/Area/CreateAreaTests.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System; -using System.Threading.Tasks; -using AutoMapper; -using Domain.Ports.Area; -using Domain.UseCases; -using Domain.UseCases.Interfaces.Repositories; -using Domain.UseCases.Interfaces.UseCases; -using Domain.Validation; -using Moq; -using NUnit.Framework; - -namespace Domain.Tests.UseCases.Area -{ - [TestFixture] - public class CreateAreaTests - { - private ICreateArea _createArea; - private Mock _areaRepositoryMock; - private Mock _mainAreaRepositoryMock; - private Mock _mapperMock; - - public Domain.Entities.Area MockValidArea() => new Domain.Entities.Area(Guid.NewGuid(), "ABC", "Area Name"); - private Domain.Entities.MainArea MockValidMainArea() => new Domain.Entities.MainArea(Guid.NewGuid(), "ABC", "Main Area Name"); - - [SetUp] - public void Setup() - { - _areaRepositoryMock = new Mock(); - _mainAreaRepositoryMock = new Mock(); - _mapperMock = new Mock(); - - _createArea = new CreateArea( - _areaRepositoryMock.Object, - _mainAreaRepositoryMock.Object, - _mapperMock.Object - ); - } - - [Test] - public async Task Execute_WithValidInput_ShouldCreateArea() - { - // Arrange - var input = new CreateAreaInput - { - Name = "Area Name", - Code = "areaCode0", - MainAreaId = Guid.NewGuid(), - }; - - var areaEntity = MockValidArea(); - var detailedOutput = new DetailedReadAreaOutput(); - - _areaRepositoryMock.Setup(r => r.GetByCode(input.Code)).ReturnsAsync((Domain.Entities.Area)null); - _mainAreaRepositoryMock.Setup(r => r.GetById(input.MainAreaId)).ReturnsAsync(MockValidMainArea()); - _areaRepositoryMock.Setup(r => r.Create(It.IsAny())).ReturnsAsync(areaEntity); - _mapperMock.Setup(m => m.Map(areaEntity)).Returns(detailedOutput); - - // Act - var result = await _createArea.ExecuteAsync(input); - - // Assert - Assert.IsNotNull(result); - Assert.AreEqual(detailedOutput, result); - _areaRepositoryMock.Verify(r => r.GetByCode(input.Code), Times.Once); - _mainAreaRepositoryMock.Verify(r => r.GetById(input.MainAreaId), Times.Once); - _areaRepositoryMock.Verify(r => r.Create(It.IsAny()), Times.Once); - _mapperMock.Verify(m => m.Map(areaEntity), Times.Once); - } - - [Test] - public void Execute_WithExistingCode_ShouldThrowException() - { - // Arrange - var input = new CreateAreaInput - { - Name = "Area Name", - Code = "existingCode2", - MainAreaId = Guid.NewGuid(), - }; - - var existingArea = MockValidArea(); - - _areaRepositoryMock.Setup(r => r.GetByCode(input.Code)).ReturnsAsync(existingArea); - - // Act & Assert - Assert.ThrowsAsync(async () => await _createArea.ExecuteAsync(input)); - _areaRepositoryMock.Verify(r => r.GetByCode(input.Code), Times.Once); - _mainAreaRepositoryMock.Verify(r => r.GetById(It.IsAny()), Times.Never); - _areaRepositoryMock.Verify(r => r.Create(It.IsAny()), Times.Never); - _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); - } - - [Test] - public void Execute_WithMissingMainAreaId_ShouldThrowException() - { - // Arrange - var input = new CreateAreaInput - { - Name = "Area Name", - Code = "areaCode1", - MainAreaId = null, - }; - - // Act & Assert - Assert.ThrowsAsync(async () => await _createArea.ExecuteAsync(input)); - _areaRepositoryMock.Verify(r => r.GetByCode(It.IsAny()), Times.Once); - _mainAreaRepositoryMock.Verify(r => r.GetById(It.IsAny()), Times.Never); - _areaRepositoryMock.Verify(r => r.Create(It.IsAny()), Times.Never); - _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); - } - - [Test] - public void Execute_WithInactiveMainArea_ShouldThrowException() - { - // Arrange - var input = new CreateAreaInput - { - Name = "Area Name", - Code = "areaCode2", - MainAreaId = Guid.NewGuid(), - }; - - var inactiveMainArea = MockValidMainArea(); - inactiveMainArea.DeactivateEntity(); - _mainAreaRepositoryMock.Setup(r => r.GetById(input.MainAreaId)).ReturnsAsync(inactiveMainArea); - - // Act & Assert - Assert.ThrowsAsync(async () => await _createArea.ExecuteAsync(input)); - _areaRepositoryMock.Verify(r => r.GetByCode(input.Code), Times.Once); - _mainAreaRepositoryMock.Verify(r => r.GetById(input.MainAreaId), Times.Once); - _areaRepositoryMock.Verify(r => r.Create(It.IsAny()), Times.Never); - _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); - } - } -} diff --git a/src/Domain.Tests/UseCases/Area/DeleteAreaTests.cs b/src/Domain.Tests/UseCases/Area/DeleteAreaTests.cs deleted file mode 100644 index b75bfc3d..00000000 --- a/src/Domain.Tests/UseCases/Area/DeleteAreaTests.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Threading.Tasks; -using AutoMapper; -using Domain.Ports.Area; -using Domain.UseCases; -using Domain.UseCases.Interfaces.Repositories; -using Domain.UseCases.Interfaces.UseCases; -using Domain.Validation; -using Moq; -using NUnit.Framework; - -namespace Domain.Tests.UseCases.Area -{ - [TestFixture] - public class DeleteAreaTests - { - private IDeleteArea _deleteArea; - private Mock _areaRepositoryMock; - private Mock _mapperMock; - - private Guid _areaId; - private Domain.Entities.Area _deletedArea; - private DetailedReadAreaOutput _mappedOutput; - - [SetUp] - public void Setup() - { - _areaRepositoryMock = new Mock(); - _mapperMock = new Mock(); - - _deleteArea = new DeleteArea( - _areaRepositoryMock.Object, - _mapperMock.Object - ); - - _areaId = Guid.NewGuid(); - _deletedArea = new Domain.Entities.Area(_areaId, "ABC", "Area Name"); - _mappedOutput = new DetailedReadAreaOutput(); - - _areaRepositoryMock.Setup(r => r.Delete(_areaId)).ReturnsAsync(_deletedArea); - _mapperMock.Setup(m => m.Map(_deletedArea)).Returns(_mappedOutput); - } - - [Test] - public async Task Execute_WithValidId_ShouldDeleteAreaAndReturnOutput() - { - // Arrange - Guid? id = _areaId; - - // Act - var result = await _deleteArea.ExecuteAsync(id); - - // Assert - Assert.AreEqual(_mappedOutput, result); - _areaRepositoryMock.Verify(r => r.Delete(_areaId), Times.Once); - _mapperMock.Verify(m => m.Map(_deletedArea), Times.Once); - } - - [Test] - public void Execute_WithNullId_ShouldThrowArgumentNullException() - { - // Arrange - Guid? id = null; - - // Act & Assert - Assert.ThrowsAsync(async () => await _deleteArea.ExecuteAsync(id)); - _areaRepositoryMock.Verify(r => r.Delete(It.IsAny()), Times.Never); - _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); - } - } -} diff --git a/src/Domain.Tests/UseCases/Area/GetAreaByIdTests.cs b/src/Domain.Tests/UseCases/Area/GetAreaByIdTests.cs deleted file mode 100644 index 7e593718..00000000 --- a/src/Domain.Tests/UseCases/Area/GetAreaByIdTests.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Threading.Tasks; -using AutoMapper; -using Domain.Ports.Area; -using Domain.UseCases; -using Domain.UseCases.Interfaces.Repositories; -using Domain.UseCases.Interfaces.UseCases; -using Domain.Validation; -using Moq; -using NUnit.Framework; - -namespace Domain.Tests.UseCases.Area -{ - [TestFixture] - public class GetAreaByIdTests - { - private IGetAreaById _getAreaById; - private Mock _areaRepositoryMock; - private Mock _mapperMock; - - public Domain.Entities.Area MockValidArea() => new Domain.Entities.Area(Guid.NewGuid(), "ABC", "Area Name"); - - [SetUp] - public void Setup() - { - _areaRepositoryMock = new Mock(); - _mapperMock = new Mock(); - - _getAreaById = new GetAreaById( - _areaRepositoryMock.Object, - _mapperMock.Object - ); - } - - [Test] - public async Task Execute_WithValidId_ShouldReturnDetailedReadAreaOutput() - { - // Arrange - var id = Guid.NewGuid(); - var areaEntity = MockValidArea(); - var detailedOutput = new DetailedReadAreaOutput(); - - _areaRepositoryMock.Setup(r => r.GetById(id)).ReturnsAsync(areaEntity); - _mapperMock.Setup(m => m.Map(areaEntity)).Returns(detailedOutput); - - // Act - var result = await _getAreaById.ExecuteAsync(id); - - // Assert - Assert.IsNotNull(result); - Assert.AreEqual(detailedOutput, result); - _areaRepositoryMock.Verify(r => r.GetById(id), Times.Once); - _mapperMock.Verify(m => m.Map(areaEntity), Times.Once); - } - - [Test] - public void Execute_WithNullId_ShouldThrowException() - { - // Arrange - Guid? id = null; - - // Act & Assert - Assert.ThrowsAsync(async () => await _getAreaById.ExecuteAsync(id)); - _areaRepositoryMock.Verify(r => r.GetById(It.IsAny()), Times.Never); - _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); - } - } -} diff --git a/src/Domain.Tests/UseCases/Area/UpdateAreaTests.cs b/src/Domain.Tests/UseCases/Area/UpdateAreaTests.cs deleted file mode 100644 index bcb83782..00000000 --- a/src/Domain.Tests/UseCases/Area/UpdateAreaTests.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Threading.Tasks; -using AutoMapper; -using Domain.Ports.Area; -using Domain.UseCases; -using Domain.UseCases.Interfaces.Repositories; -using Domain.UseCases.Interfaces.UseCases; -using Domain.Validation; -using Moq; -using NUnit.Framework; - -namespace Domain.Tests.UseCases.Area -{ - [TestFixture] - public class UpdateAreaTests - { - private IUpdateArea _updateArea; - private Mock _areaRepositoryMock; - private Mock _mapperMock; - - public Domain.Entities.Area MockValidArea() => new Domain.Entities.Area(Guid.NewGuid(), "ABC", "Area Name"); - - [SetUp] - public void Setup() - { - _areaRepositoryMock = new Mock(); - _mapperMock = new Mock(); - - _updateArea = new UpdateArea( - _areaRepositoryMock.Object, - _mapperMock.Object - ); - } - - [Test] - public async Task Execute_WithValidIdAndInput_ShouldReturnDetailedReadAreaOutput() - { - // Arrange - var id = Guid.NewGuid(); - var input = new UpdateAreaInput - { - Name = "New Area Name", - Code = "New Area Code", - MainAreaId = Guid.NewGuid() - }; - var areaEntity = MockValidArea(); - var detailedOutput = new DetailedReadAreaOutput(); - - _areaRepositoryMock.Setup(r => r.GetById(id)).ReturnsAsync(areaEntity); - _areaRepositoryMock.Setup(r => r.Update(It.IsAny())).ReturnsAsync(areaEntity); - _mapperMock.Setup(m => m.Map(areaEntity)).Returns(detailedOutput); - - // Act - var result = await _updateArea.ExecuteAsync(id, input); - - // Assert - Assert.IsNotNull(result); - Assert.AreEqual(detailedOutput, result); - _areaRepositoryMock.Verify(r => r.GetById(id), Times.Once); - _areaRepositoryMock.Verify(r => r.Update(areaEntity), Times.Once); - _mapperMock.Verify(m => m.Map(areaEntity), Times.Once); - } - - [Test] - public void Execute_WithNullId_ShouldThrowException() - { - // Arrange - Guid? id = null; - var input = new UpdateAreaInput - { - Name = "New Area Name", - Code = "New Area Code", - MainAreaId = Guid.NewGuid() - }; - - // Act & Assert - Assert.ThrowsAsync(async () => await _updateArea.ExecuteAsync(id, input)); - _areaRepositoryMock.Verify(r => r.GetById(It.IsAny()), Times.Never); - _areaRepositoryMock.Verify(r => r.Update(It.IsAny()), Times.Never); - _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); - } - - [Test] - public void Execute_WithNonExistingId_ShouldThrowException() - { - // Arrange - var id = Guid.NewGuid(); - var input = new UpdateAreaInput - { - Name = "New Area Name", - Code = "New Area Code", - MainAreaId = Guid.NewGuid() - }; - - _areaRepositoryMock.Setup(r => r.GetById(id)).ReturnsAsync((Domain.Entities.Area)null); - - // Act & Assert - Assert.ThrowsAsync(async () => await _updateArea.ExecuteAsync(id, input)); - _areaRepositoryMock.Verify(r => r.GetById(id), Times.Once); - _areaRepositoryMock.Verify(r => r.Update(It.IsAny()), Times.Never); - _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); - } - } -} \ No newline at end of file diff --git a/src/Infrastructure/IoC/InfrastructureDI.cs b/src/Infrastructure/IoC/InfrastructureDI.cs index b61a1daa..1b36baca 100644 --- a/src/Infrastructure/IoC/InfrastructureDI.cs +++ b/src/Infrastructure/IoC/InfrastructureDI.cs @@ -34,6 +34,7 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi #endregion Serviço de Log #region CORS + // TODO: Definir política de CORS services.AddCors(options => { options.AddDefaultPolicy( From cfc8fbadfc6d5ad5ccb4290d8388dcf0a0053488 Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 7 Aug 2023 14:46:09 -0300 Subject: [PATCH 082/201] tests(application): fix imports --- .../UseCases/Area/CreateAreaTests.cs | 10 +++++----- .../UseCases/Area/DeleteAreaTests.cs | 2 +- .../UseCases/Area/GetAreaByIdTests.cs | 4 ++-- .../UseCases/Area/UpdateAreaTests.cs | 16 ++++++++-------- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Application.Tests/UseCases/Area/CreateAreaTests.cs b/src/Application.Tests/UseCases/Area/CreateAreaTests.cs index 703d5156..acf523f2 100644 --- a/src/Application.Tests/UseCases/Area/CreateAreaTests.cs +++ b/src/Application.Tests/UseCases/Area/CreateAreaTests.cs @@ -7,7 +7,7 @@ using NUnit.Framework; using Application.UseCases.Area; -namespace Domain.Tests.UseCases.Area +namespace Application.Tests.UseCases.Area { [TestFixture] public class CreateAreaTests @@ -17,8 +17,8 @@ public class CreateAreaTests private Mock _mainAreaRepositoryMock; private Mock _mapperMock; - public static Entities.Area MockValidArea() => new(Guid.NewGuid(), "ABC", "Area Name"); - private static Entities.MainArea MockValidMainArea() => new(Guid.NewGuid(), "ABC", "Main Area Name"); + public static Domain.Entities.Area MockValidArea() => new(Guid.NewGuid(), "ABC", "Area Name"); + private static Domain.Entities.MainArea MockValidMainArea() => new(Guid.NewGuid(), "ABC", "Main Area Name"); [SetUp] public void Setup() @@ -48,9 +48,9 @@ public async Task Execute_WithValidInput_ShouldCreateArea() var areaEntity = MockValidArea(); var detailedOutput = new DetailedReadAreaOutput(); - _areaRepositoryMock.Setup(r => r.GetByCodeAsync(input.Code)).ReturnsAsync((Entities.Area)null); + _areaRepositoryMock.Setup(r => r.GetByCodeAsync(input.Code)).ReturnsAsync((Domain.Entities.Area)null); _mainAreaRepositoryMock.Setup(r => r.GetByIdAsync(input.MainAreaId)).ReturnsAsync(MockValidMainArea()); - _areaRepositoryMock.Setup(r => r.CreateAsync(It.IsAny())).ReturnsAsync(areaEntity); + _areaRepositoryMock.Setup(r => r.CreateAsync(It.IsAny())).ReturnsAsync(areaEntity); _mapperMock.Setup(m => m.Map(areaEntity)).Returns(detailedOutput); // Act diff --git a/src/Application.Tests/UseCases/Area/DeleteAreaTests.cs b/src/Application.Tests/UseCases/Area/DeleteAreaTests.cs index 72245fbe..75631a43 100644 --- a/src/Application.Tests/UseCases/Area/DeleteAreaTests.cs +++ b/src/Application.Tests/UseCases/Area/DeleteAreaTests.cs @@ -7,7 +7,7 @@ using Moq; using NUnit.Framework; -namespace Domain.Tests.UseCases.Area +namespace Application.Tests.UseCases.Area { [TestFixture] public class DeleteAreaTests diff --git a/src/Application.Tests/UseCases/Area/GetAreaByIdTests.cs b/src/Application.Tests/UseCases/Area/GetAreaByIdTests.cs index 7df08688..2a98bcd6 100644 --- a/src/Application.Tests/UseCases/Area/GetAreaByIdTests.cs +++ b/src/Application.Tests/UseCases/Area/GetAreaByIdTests.cs @@ -7,7 +7,7 @@ using Application.Interfaces.UseCases.Area; using Application.UseCases.Area; -namespace Domain.Tests.UseCases.Area +namespace Application.Tests.UseCases.Area { [TestFixture] public class GetAreaByIdTests @@ -16,7 +16,7 @@ public class GetAreaByIdTests private Mock _areaRepositoryMock; private Mock _mapperMock; - public static Entities.Area MockValidArea() => new(Guid.NewGuid(), "ABC", "Area Name"); + public static Domain.Entities.Area MockValidArea() => new(Guid.NewGuid(), "ABC", "Area Name"); [SetUp] public void Setup() diff --git a/src/Application.Tests/UseCases/Area/UpdateAreaTests.cs b/src/Application.Tests/UseCases/Area/UpdateAreaTests.cs index 9589f3bc..f2e4def2 100644 --- a/src/Application.Tests/UseCases/Area/UpdateAreaTests.cs +++ b/src/Application.Tests/UseCases/Area/UpdateAreaTests.cs @@ -7,7 +7,7 @@ using Application.Interfaces.UseCases.Area; using Application.UseCases.Area; -namespace Domain.Tests.UseCases.Area +namespace Application.Tests.UseCases.Area { [TestFixture] public class UpdateAreaTests @@ -16,7 +16,7 @@ public class UpdateAreaTests private Mock _areaRepositoryMock; private Mock _mapperMock; - public static Entities.Area MockValidArea() => new(Guid.NewGuid(), "ABC", "Area Name"); + public static Domain.Entities.Area MockValidArea() => new(Guid.NewGuid(), "ABC", "Area Name"); [SetUp] public void Setup() @@ -45,7 +45,7 @@ public async Task Execute_WithValidIdAndInput_ShouldReturnDetailedReadAreaOutput var detailedOutput = new DetailedReadAreaOutput(); _areaRepositoryMock.Setup(r => r.GetByIdAsync(id)).ReturnsAsync(areaEntity); - _areaRepositoryMock.Setup(r => r.UpdateAsync(It.IsAny())).ReturnsAsync(areaEntity); + _areaRepositoryMock.Setup(r => r.UpdateAsync(It.IsAny())).ReturnsAsync(areaEntity); _mapperMock.Setup(m => m.Map(areaEntity)).Returns(detailedOutput); // Act @@ -74,8 +74,8 @@ public void Execute_WithNullId_ShouldThrowException() // Act & Assert Assert.ThrowsAsync(async () => await _updateArea.ExecuteAsync(id, input)); _areaRepositoryMock.Verify(r => r.GetByIdAsync(It.IsAny()), Times.Never); - _areaRepositoryMock.Verify(r => r.UpdateAsync(It.IsAny()), Times.Never); - _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); + _areaRepositoryMock.Verify(r => r.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); } [Test] @@ -90,13 +90,13 @@ public void Execute_WithNonExistingId_ShouldThrowException() MainAreaId = Guid.NewGuid() }; - _areaRepositoryMock.Setup(r => r.GetByIdAsync(id)).ReturnsAsync((Entities.Area)null); + _areaRepositoryMock.Setup(r => r.GetByIdAsync(id)).ReturnsAsync((Domain.Entities.Area)null); // Act & Assert Assert.ThrowsAsync(async () => await _updateArea.ExecuteAsync(id, input)); _areaRepositoryMock.Verify(r => r.GetByIdAsync(id), Times.Once); - _areaRepositoryMock.Verify(r => r.UpdateAsync(It.IsAny()), Times.Never); - _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); + _areaRepositoryMock.Verify(r => r.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(m => m.Map(It.IsAny()), Times.Never); } } } \ No newline at end of file From 86f6e54aa49cb42edebd73dfa8416c9457e720ae Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 8 Aug 2023 13:55:49 -0300 Subject: [PATCH 083/201] refactor: move services interfaces to domain --- .../UseCases/Auth/ForgotPassword.cs | 2 +- src/Application/UseCases/Auth/Login.cs | 7 +++-- .../UseCases/Auth/ResetPassword.cs | 2 +- .../UseCases/Notice/CreateNotice.cs | 2 +- .../UseCases/Notice/DeleteNotice.cs | 2 +- .../UseCases/Notice/UpdateNotice.cs | 2 +- .../UseCases/Professor/CreateProfessor.cs | 2 +- .../UseCases/Project/GetClosedProjects.cs | 23 +++++++------- .../UseCases/Project/GetOpenProjects.cs | 23 +++++++------- .../EvaluateAppealProject.cs | 4 +-- .../EvaluateSubmissionProject.cs | 6 ++-- .../ProjectReport/CreateProjectReport.cs | 2 +- .../ProjectReport/UpdateProjectReport.cs | 4 ++- .../UseCases/Student/CreateStudent.cs | 2 +- .../Student/RequestStudentRegister.cs | 2 +- .../CreateStudentDocuments.cs | 2 +- .../UpdateStudentDocuments.cs | 2 +- src/Application/UseCases/User/UpdateUser.cs | 2 +- src/Domain/Entities/User.cs | 11 ++++--- .../Interfaces/Services/IEmailService.cs | 2 +- .../Interfaces/Services/IHashService.cs | 2 +- .../Services/IStorageFileService.cs | 2 +- .../Services/ITokenAuthenticationService.cs | 8 ++--- .../Services/AzureStorageService.cs | 2 +- .../Services/Email/EmailService.cs | 2 +- .../Email/Factories/EmailServiceFactory.cs | 2 +- .../Email/Factories/IEmailServiceFactory.cs | 2 +- src/Infrastructure/Services/HashService.cs | 2 +- src/Infrastructure/Services/Services.csproj | 2 +- .../Services/StorageFileService.cs | 2 +- .../Services/TokenAuthenticationService.cs | 30 +++++++------------ 31 files changed, 77 insertions(+), 83 deletions(-) rename src/{Application => Domain}/Interfaces/Services/IEmailService.cs (93%) rename src/{Application => Domain}/Interfaces/Services/IHashService.cs (79%) rename src/{Application => Domain}/Interfaces/Services/IStorageFileService.cs (93%) rename src/{Application => Domain}/Interfaces/Services/ITokenAuthenticationService.cs (71%) diff --git a/src/Application/UseCases/Auth/ForgotPassword.cs b/src/Application/UseCases/Auth/ForgotPassword.cs index f2783f89..be134dc9 100644 --- a/src/Application/UseCases/Auth/ForgotPassword.cs +++ b/src/Application/UseCases/Auth/ForgotPassword.cs @@ -1,5 +1,5 @@ using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.Auth; using Application.Validation; diff --git a/src/Application/UseCases/Auth/Login.cs b/src/Application/UseCases/Auth/Login.cs index 148fb5a0..912830ec 100644 --- a/src/Application/UseCases/Auth/Login.cs +++ b/src/Application/UseCases/Auth/Login.cs @@ -1,5 +1,5 @@ using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.Auth; using Application.Ports.Auth; using Application.Validation; @@ -39,7 +39,10 @@ public async Task ExecuteAsync(UserLoginInput input) UseCaseException.BusinessRuleViolation(!_hashService.VerifyPassword(input.Password!, entity.Password), "Invalid credentials."); // Gera o token de autenticação e retorna o resultado - return _tokenService.GenerateToken(entity.Id, entity.Name, entity.Role.ToString()); + return new UserLoginOutput + { + Token = _tokenService.GenerateToken(entity.Id, entity.Name, entity.Role.ToString()) + }; } } } \ No newline at end of file diff --git a/src/Application/UseCases/Auth/ResetPassword.cs b/src/Application/UseCases/Auth/ResetPassword.cs index 5e76e26c..af109169 100644 --- a/src/Application/UseCases/Auth/ResetPassword.cs +++ b/src/Application/UseCases/Auth/ResetPassword.cs @@ -1,5 +1,5 @@ using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.Auth; using Application.Ports.Auth; using Application.Validation; diff --git a/src/Application/UseCases/Notice/CreateNotice.cs b/src/Application/UseCases/Notice/CreateNotice.cs index 3571d516..b2e40c3e 100644 --- a/src/Application/UseCases/Notice/CreateNotice.cs +++ b/src/Application/UseCases/Notice/CreateNotice.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.Notice; using Application.Ports.Notice; using Application.Validation; diff --git a/src/Application/UseCases/Notice/DeleteNotice.cs b/src/Application/UseCases/Notice/DeleteNotice.cs index 7e849b36..6a0ceff0 100644 --- a/src/Application/UseCases/Notice/DeleteNotice.cs +++ b/src/Application/UseCases/Notice/DeleteNotice.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.Notice; using Application.Ports.Notice; using Application.Validation; diff --git a/src/Application/UseCases/Notice/UpdateNotice.cs b/src/Application/UseCases/Notice/UpdateNotice.cs index bd75e6bf..2b75abcc 100644 --- a/src/Application/UseCases/Notice/UpdateNotice.cs +++ b/src/Application/UseCases/Notice/UpdateNotice.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Ports.Activity; using Application.Interfaces.UseCases.Notice; using Application.Ports.Notice; diff --git a/src/Application/UseCases/Professor/CreateProfessor.cs b/src/Application/UseCases/Professor/CreateProfessor.cs index f711f0ad..c57b0cbb 100644 --- a/src/Application/UseCases/Professor/CreateProfessor.cs +++ b/src/Application/UseCases/Professor/CreateProfessor.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.Professor; using Application.Ports.Professor; using Application.Validation; diff --git a/src/Application/UseCases/Project/GetClosedProjects.cs b/src/Application/UseCases/Project/GetClosedProjects.cs index f7a61678..b6a72d72 100644 --- a/src/Application/UseCases/Project/GetClosedProjects.cs +++ b/src/Application/UseCases/Project/GetClosedProjects.cs @@ -1,7 +1,7 @@ using AutoMapper; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.Project; using Application.Ports.Project; using Application.Validation; @@ -27,36 +27,33 @@ public GetClosedProjects(IProjectRepository projectRepository, public async Task> ExecuteAsync(int skip, int take, bool onlyMyProjects = true) { // Obtém as claims do usuário autenticado. - var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Se o usuário não estiver autenticado, lança uma exceção. - UseCaseException.BusinessRuleViolation(userClaims == null || userClaims.Role == null, + UseCaseException.BusinessRuleViolation(user == null || user.Role == null, "Usuário não autorizado."); - // Obtém o tipo de usuário. - ERole userRole = Enum.Parse(userClaims?.Role!); - // Obtém a lista de projetos de acordo com o tipo de usuário. IEnumerable projects; // Se o usuário for um professor, retorna apenas os seus projetos. - if (userRole == ERole.PROFESSOR) + if (user?.Role == ERole.PROFESSOR) { - projects = await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id, true); + projects = await _projectRepository.GetProfessorProjectsAsync(skip, take, user?.Id, true); } // Se o usuário for um aluno, retorna apenas os seus projetos. - else if (userRole == ERole.STUDENT) + else if (user?.Role == ERole.STUDENT) { - projects = await _projectRepository.GetStudentProjectsAsync(skip, take, userClaims?.Id, true); + projects = await _projectRepository.GetStudentProjectsAsync(skip, take, user?.Id, true); } // Se o usuário for um administrador, permite a busca apenas pelo seu ID. else { - projects = userRole == ERole.ADMIN && onlyMyProjects - ? await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id, true) - : userRole == ERole.ADMIN && !onlyMyProjects + projects = user?.Role == ERole.ADMIN && onlyMyProjects + ? await _projectRepository.GetProfessorProjectsAsync(skip, take, user?.Id, true) + : user?.Role == ERole.ADMIN && !onlyMyProjects ? await _projectRepository.GetProjectsAsync(skip, take, true) : throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); } diff --git a/src/Application/UseCases/Project/GetOpenProjects.cs b/src/Application/UseCases/Project/GetOpenProjects.cs index e352a9f1..6942c436 100644 --- a/src/Application/UseCases/Project/GetOpenProjects.cs +++ b/src/Application/UseCases/Project/GetOpenProjects.cs @@ -1,7 +1,7 @@ using AutoMapper; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.Project; using Application.Ports.Project; using Application.Validation; @@ -27,36 +27,33 @@ public GetOpenProjects(IProjectRepository projectRepository, public async Task> ExecuteAsync(int skip, int take, bool onlyMyProjects = true) { // Obtém as claims do usuário autenticado. - var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Se o usuário não estiver autenticado, lança uma exceção. - UseCaseException.BusinessRuleViolation(userClaims == null || userClaims.Role == null, + UseCaseException.BusinessRuleViolation(user == null || user.Role == null, "Usuário não autorizado."); - // Obtém o tipo de usuário. - ERole userRole = Enum.Parse(userClaims?.Role!); - // Obtém a lista de projetos de acordo com o tipo de usuário. IEnumerable projects; // Se o usuário for um professor, retorna apenas os seus projetos. - if (userRole == ERole.PROFESSOR) + if (user?.Role == ERole.PROFESSOR) { - projects = await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id); + projects = await _projectRepository.GetProfessorProjectsAsync(skip, take, user?.Id); } // Se o usuário for um aluno, retorna apenas os seus projetos. - else if (userRole == ERole.STUDENT) + else if (user?.Role == ERole.STUDENT) { - projects = await _projectRepository.GetStudentProjectsAsync(skip, take, userClaims?.Id); + projects = await _projectRepository.GetStudentProjectsAsync(skip, take, user?.Id); } // Se o usuário for um administrador, permite a busca apenas pelo seu ID. else { - projects = userRole == ERole.ADMIN && onlyMyProjects - ? await _projectRepository.GetProfessorProjectsAsync(skip, take, userClaims?.Id) - : userRole == ERole.ADMIN && !onlyMyProjects + projects = user?.Role == ERole.ADMIN && onlyMyProjects + ? await _projectRepository.GetProfessorProjectsAsync(skip, take, user?.Id) + : user?.Role == ERole.ADMIN && !onlyMyProjects ? await _projectRepository.GetProjectsAsync(skip, take) : throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); } diff --git a/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs b/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs index 2e0060d4..89d17d19 100644 --- a/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs @@ -1,7 +1,7 @@ using AutoMapper; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.ProjectEvaluation; using Application.Ports.Project; using Application.Ports.ProjectEvaluation; @@ -37,7 +37,7 @@ public async Task ExecuteAsync(EvaluateAppealProjectI var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Verifica se o usuário logado é um avaliador. - UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN.GetDescription() || user.Role != ERole.PROFESSOR.GetDescription(), + UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN || user.Role != ERole.PROFESSOR, "O usuário não é um avaliador."); // Busca avaliação do projeto pelo Id. diff --git a/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs index 4f0cc5a2..5e648345 100644 --- a/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -1,7 +1,7 @@ using AutoMapper; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.ProjectEvaluation; using Application.Ports.Project; using Application.Ports.ProjectEvaluation; @@ -43,8 +43,8 @@ public async Task ExecuteAsync(EvaluateSubmissionProj var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Verifica se o usuário logado é um avaliador. - UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN.GetDescription() - || user.Role != ERole.PROFESSOR.GetDescription(), + UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN + || user.Role != ERole.PROFESSOR, "O usuário não é um avaliador."); // Verifica se já existe alguma avaliação para o projeto. diff --git a/src/Application/UseCases/ProjectReport/CreateProjectReport.cs b/src/Application/UseCases/ProjectReport/CreateProjectReport.cs index 89a59178..7cd2e993 100644 --- a/src/Application/UseCases/ProjectReport/CreateProjectReport.cs +++ b/src/Application/UseCases/ProjectReport/CreateProjectReport.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Ports.ProjectReport; using Application.Interfaces.UseCases.ProjectReport; using Application.Validation; diff --git a/src/Application/UseCases/ProjectReport/UpdateProjectReport.cs b/src/Application/UseCases/ProjectReport/UpdateProjectReport.cs index 7a5ef60f..25c7c84d 100644 --- a/src/Application/UseCases/ProjectReport/UpdateProjectReport.cs +++ b/src/Application/UseCases/ProjectReport/UpdateProjectReport.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.ProjectReport; using Application.Ports.ProjectReport; using Application.Validation; @@ -40,6 +40,8 @@ public async Task ExecuteAsync(Guid? id, Update // Obtém usuário logado var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + // TODO: Verifica se usuário logado pode realizar a operação + // Recupera entidade que será atualizada Domain.Entities.ProjectReport report = await _projectReportRepository.GetByIdAsync(id) ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.ProjectReport)); diff --git a/src/Application/UseCases/Student/CreateStudent.cs b/src/Application/UseCases/Student/CreateStudent.cs index 7edde4fd..0492f2ce 100644 --- a/src/Application/UseCases/Student/CreateStudent.cs +++ b/src/Application/UseCases/Student/CreateStudent.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.Student; using Application.Ports.Student; using Application.Validation; diff --git a/src/Application/UseCases/Student/RequestStudentRegister.cs b/src/Application/UseCases/Student/RequestStudentRegister.cs index 6202789a..add688d0 100644 --- a/src/Application/UseCases/Student/RequestStudentRegister.cs +++ b/src/Application/UseCases/Student/RequestStudentRegister.cs @@ -1,6 +1,6 @@ using System.Text.RegularExpressions; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.Student; using Application.Validation; diff --git a/src/Application/UseCases/StudentDocuments/CreateStudentDocuments.cs b/src/Application/UseCases/StudentDocuments/CreateStudentDocuments.cs index 45886ebd..c134492e 100644 --- a/src/Application/UseCases/StudentDocuments/CreateStudentDocuments.cs +++ b/src/Application/UseCases/StudentDocuments/CreateStudentDocuments.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.StudentDocuments; using Application.Ports.StudentDocuments; using Application.Validation; diff --git a/src/Application/UseCases/StudentDocuments/UpdateStudentDocuments.cs b/src/Application/UseCases/StudentDocuments/UpdateStudentDocuments.cs index 18f50f93..e20977ab 100644 --- a/src/Application/UseCases/StudentDocuments/UpdateStudentDocuments.cs +++ b/src/Application/UseCases/StudentDocuments/UpdateStudentDocuments.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.StudentDocuments; using Application.Ports.StudentDocuments; using Application.Validation; diff --git a/src/Application/UseCases/User/UpdateUser.cs b/src/Application/UseCases/User/UpdateUser.cs index bdcd22ff..b92ec61f 100644 --- a/src/Application/UseCases/User/UpdateUser.cs +++ b/src/Application/UseCases/User/UpdateUser.cs @@ -1,6 +1,6 @@ using AutoMapper; using Domain.Interfaces.Repositories; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Application.Interfaces.UseCases.User; using Application.Ports.User; using Application.Validation; diff --git a/src/Domain/Entities/User.cs b/src/Domain/Entities/User.cs index 87faf9de..cd213be4 100644 --- a/src/Domain/Entities/User.cs +++ b/src/Domain/Entities/User.cs @@ -89,11 +89,7 @@ public ERole? Role _role = value; } } - public User(bool isConfirmed) - { - this.IsConfirmed = isConfirmed; - } public bool IsConfirmed { get; private set; } private string? _validationCode; @@ -130,6 +126,13 @@ private set #endregion #region Constructors + public User(Guid? id, string? name, string? role) + { + Id = id; + Name = name; + Role = Enum.Parse(role!); + } + public User(string? name, string? email, string? password, string? cpf, ERole? role) { Name = name; diff --git a/src/Application/Interfaces/Services/IEmailService.cs b/src/Domain/Interfaces/Services/IEmailService.cs similarity index 93% rename from src/Application/Interfaces/Services/IEmailService.cs rename to src/Domain/Interfaces/Services/IEmailService.cs index 78824c13..c7a58bbc 100644 --- a/src/Application/Interfaces/Services/IEmailService.cs +++ b/src/Domain/Interfaces/Services/IEmailService.cs @@ -1,4 +1,4 @@ -namespace Application.Interfaces.Services +namespace Domain.Interfaces.Services { public interface IEmailService { diff --git a/src/Application/Interfaces/Services/IHashService.cs b/src/Domain/Interfaces/Services/IHashService.cs similarity index 79% rename from src/Application/Interfaces/Services/IHashService.cs rename to src/Domain/Interfaces/Services/IHashService.cs index 73887f83..e60474bc 100644 --- a/src/Application/Interfaces/Services/IHashService.cs +++ b/src/Domain/Interfaces/Services/IHashService.cs @@ -1,4 +1,4 @@ -namespace Application.Interfaces.Services +namespace Domain.Interfaces.Services { public interface IHashService { diff --git a/src/Application/Interfaces/Services/IStorageFileService.cs b/src/Domain/Interfaces/Services/IStorageFileService.cs similarity index 93% rename from src/Application/Interfaces/Services/IStorageFileService.cs rename to src/Domain/Interfaces/Services/IStorageFileService.cs index ee3d3182..56a50d53 100644 --- a/src/Application/Interfaces/Services/IStorageFileService.cs +++ b/src/Domain/Interfaces/Services/IStorageFileService.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Http; -namespace Application.Interfaces.Services +namespace Domain.Interfaces.Services { public interface IStorageFileService { diff --git a/src/Application/Interfaces/Services/ITokenAuthenticationService.cs b/src/Domain/Interfaces/Services/ITokenAuthenticationService.cs similarity index 71% rename from src/Application/Interfaces/Services/ITokenAuthenticationService.cs rename to src/Domain/Interfaces/Services/ITokenAuthenticationService.cs index 0652893f..454b4847 100644 --- a/src/Application/Interfaces/Services/ITokenAuthenticationService.cs +++ b/src/Domain/Interfaces/Services/ITokenAuthenticationService.cs @@ -1,6 +1,6 @@ -using Application.Ports.Auth; +using Domain.Entities; -namespace Application.Interfaces.Services +namespace Domain.Interfaces.Services { public interface ITokenAuthenticationService { @@ -11,11 +11,11 @@ public interface ITokenAuthenticationService /// Nome do usuário /// Perfil do usuário /// Token de autenticação. - UserLoginOutput GenerateToken(Guid? id, string? userName, string? role); + string GenerateToken(Guid? id, string? userName, string? role); /// /// Retorna as claims do usuário autenticado. /// - UserClaimsOutput GetUserAuthenticatedClaims(); + User GetUserAuthenticatedClaims(); } } \ No newline at end of file diff --git a/src/Infrastructure/Services/AzureStorageService.cs b/src/Infrastructure/Services/AzureStorageService.cs index 2e902bb7..33499b33 100644 --- a/src/Infrastructure/Services/AzureStorageService.cs +++ b/src/Infrastructure/Services/AzureStorageService.cs @@ -1,5 +1,5 @@ using Azure.Storage.Blobs; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; diff --git a/src/Infrastructure/Services/Email/EmailService.cs b/src/Infrastructure/Services/Email/EmailService.cs index 923c4b41..b3be07a2 100644 --- a/src/Infrastructure/Services/Email/EmailService.cs +++ b/src/Infrastructure/Services/Email/EmailService.cs @@ -1,6 +1,6 @@ using System.Net; using System.Net.Mail; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Microsoft.Extensions.Configuration; namespace Services.Email diff --git a/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs b/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs index 3e607f05..c59a00f9 100644 --- a/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs +++ b/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs @@ -1,4 +1,4 @@ -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Services.Email.Configs; using Microsoft.Extensions.Configuration; diff --git a/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs b/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs index 9accb2f0..c0ceb9cd 100644 --- a/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs +++ b/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs @@ -1,4 +1,4 @@ -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Microsoft.Extensions.Configuration; using Services.Email.Configs; diff --git a/src/Infrastructure/Services/HashService.cs b/src/Infrastructure/Services/HashService.cs index 9f94a3f4..1fd9c2ac 100644 --- a/src/Infrastructure/Services/HashService.cs +++ b/src/Infrastructure/Services/HashService.cs @@ -1,6 +1,6 @@ using System.Security.Cryptography; using System.Text; -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using DZen.Security.Cryptography; namespace Services diff --git a/src/Infrastructure/Services/Services.csproj b/src/Infrastructure/Services/Services.csproj index 9d224147..afb0a3db 100644 --- a/src/Infrastructure/Services/Services.csproj +++ b/src/Infrastructure/Services/Services.csproj @@ -6,7 +6,7 @@ 0.0.1 - + diff --git a/src/Infrastructure/Services/StorageFileService.cs b/src/Infrastructure/Services/StorageFileService.cs index f1cdeace..9ddda683 100644 --- a/src/Infrastructure/Services/StorageFileService.cs +++ b/src/Infrastructure/Services/StorageFileService.cs @@ -1,4 +1,4 @@ -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; diff --git a/src/Infrastructure/Services/TokenAuthenticationService.cs b/src/Infrastructure/Services/TokenAuthenticationService.cs index d92eee77..cc0bf4ad 100644 --- a/src/Infrastructure/Services/TokenAuthenticationService.cs +++ b/src/Infrastructure/Services/TokenAuthenticationService.cs @@ -1,8 +1,8 @@ using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; -using Application.Interfaces.Services; -using Application.Ports.Auth; +using Domain.Entities; +using Domain.Interfaces.Services; using Microsoft.AspNetCore.Http; using Microsoft.IdentityModel.Tokens; @@ -28,7 +28,7 @@ public TokenAuthenticationService(IDotEnvSecrets dotEnvSecrets, IHttpContextAcce /// Nome do usuário. /// Perfil do usuário. /// Token de autenticação. - public UserLoginOutput GenerateToken(Guid? id, string? userName, string? role) + public string GenerateToken(Guid? id, string? userName, string? role) { // Verifica se o id é nulo if (id == null) @@ -51,11 +51,11 @@ public UserLoginOutput GenerateToken(Guid? id, string? userName, string? role) // Declaração do usuário Claim[] claims = new[] { - new Claim(ClaimTypes.Sid, id.Value.ToString()), - new Claim(ClaimTypes.Name, userName), - new Claim(ClaimTypes.Role, role), - new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) - }; + new Claim(ClaimTypes.Sid, id.Value.ToString()), + new Claim(ClaimTypes.Name, userName), + new Claim(ClaimTypes.Role, role), + new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) + }; // Gerar chave privada para assinar o token SymmetricSecurityKey privateKey = new(Encoding.UTF8.GetBytes(_dotEnvSecrets.GetJwtSecret() @@ -78,17 +78,14 @@ public UserLoginOutput GenerateToken(Guid? id, string? userName, string? role) expires: expiration, signingCredentials: credentials); - return new UserLoginOutput() - { - Token = new JwtSecurityTokenHandler().WriteToken(token), - }; + return new JwtSecurityTokenHandler().WriteToken(token); } /// /// Retorna as claims do usuário autenticado. /// /// Id, Name e Role. - public UserClaimsOutput GetUserAuthenticatedClaims() + public User GetUserAuthenticatedClaims() { // Get the current HttpContext to retrieve the claims principal HttpContext? httpContext = _httpContextAccessor.HttpContext; @@ -111,12 +108,7 @@ public UserClaimsOutput GetUserAuthenticatedClaims() } // Return the user's claims - return new UserClaimsOutput() - { - Id = Guid.Parse(id), - Name = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value, - Role = claimsIdentity.FindFirst(ClaimTypes.Role)?.Value - }; + return new User(Guid.Parse(id), claimsIdentity.FindFirst(ClaimTypes.Name)?.Value, claimsIdentity.FindFirst(ClaimTypes.Role)?.Value); } } } From 6ebf8b2da9854c3107f3f8c455befbde7647b332 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 8 Aug 2023 14:19:29 -0300 Subject: [PATCH 084/201] feat(services): add certificate template --- .../Services/Reports/carimbo.svg | 360 ++++++++++++++++++ .../Services/Reports/certificate.html | 232 +++++++++++ .../Services/Reports/logo-cefet.svg | 24 ++ 3 files changed, 616 insertions(+) create mode 100644 src/Infrastructure/Services/Reports/carimbo.svg create mode 100644 src/Infrastructure/Services/Reports/certificate.html create mode 100644 src/Infrastructure/Services/Reports/logo-cefet.svg diff --git a/src/Infrastructure/Services/Reports/carimbo.svg b/src/Infrastructure/Services/Reports/carimbo.svg new file mode 100644 index 00000000..ca6ae929 --- /dev/null +++ b/src/Infrastructure/Services/Reports/carimbo.svg @@ -0,0 +1,360 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Infrastructure/Services/Reports/certificate.html b/src/Infrastructure/Services/Reports/certificate.html new file mode 100644 index 00000000..5f048e5c --- /dev/null +++ b/src/Infrastructure/Services/Reports/certificate.html @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + DECLARAÇÃO DE ATIVIDADES DE ORIENTAÇÃO + + +
+
+ +
+
+ logo-cefet +
+

+ CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA CELSO SUCKOW DA FONSECA - + CEFET/RJ +

+

+ DIRETORIA DE PESQUISA E PÓS-GRADUAÇÃO +

+

+ DEPARTAMENTO DE PESQUISA +

+

+ COORDENADORIA DE PESQUISA E ESTUDOS TECNOLÓGICOS +

+
+
+

DECLARAÇÃO DE ATIVIDADES DE ORIENTAÇÃO

+

+ A Coordenadoria de Pesquisa e Estudos Tecnológicos declara que o + professor/pesquisador abaixo indicado participa do Programa + Institucional de Bolsas de Iniciação Científica orientando os alunos + indicados sob os respectivos Projetos de Pesquisa. +

+
+ + +
+
DADOS DO ORIENTADOR
+
+

Nome:

+

#NOME_ORIENTADOR#

+
+
+

Departamento Acadêmico:

+

#NOME_DEPARTAMENTO#

+
+
+ + +
+
DADOS DOS ALUNOS
+
+
+
+ Nome do Orientado: +

#NOME_ORIENTADO_1#

+
+
+

Edital de Entrada: #DATA_EDITAL_1#

+

Bolsita do: #PIBIC_TIPO_1#

+
+
+

+ Início da Pesquisa neste edital: #INIP_EDITAL_1# +

+

Término: #FIMP_EDITAL_1#

+

Situação: #SITP_EDITAL_1#

+
+
+

+ Título do Projeto de Iniciação Cientifica: + #TITULO_PROJETO_ALUNO_1# +

+
+
+

+ Título do Projeto de Pesquisado Orientador: + #TITULO_PROJETO_ORIENTADOR_1# +

+
+
+
+
+
+ Nome do Orientado: +

#NOME_ORIENTADO_2#

+
+
+

Edital de Entrada: #DATA_EDITAL_2#

+

Bolsita do: #PIBIC_TIPO_2#

+
+
+

+ Início da Pesquisa neste edital: #INIP_EDITAL_2# +

+

Término: #FIMP_EDITAL_2#

+

Situação: #SITP_EDITAL_2#

+
+
+

+ Título do Projeto de Iniciação Cientifica: + #TITULO_PROJETO_ALUNO_2# +

+
+
+

+ Título do Projeto de Pesquisado Orientador: + #TITULO_PROJETO_ORIENTADOR_2# +

+
+
+
+ + +
+
+ Rio de Janeiro, #DIA_SEMANA#, #DIA_DATA# de #MES_DATA# de #ANO_DATA# +
+
+ + +
+
+
+

#NOME_COORDENADOR#

+

Coordenador COPET

+

ASSINATURA

+
+
+
+ + +
+ carimbo +
+
+
+ + + + diff --git a/src/Infrastructure/Services/Reports/logo-cefet.svg b/src/Infrastructure/Services/Reports/logo-cefet.svg new file mode 100644 index 00000000..9618cd71 --- /dev/null +++ b/src/Infrastructure/Services/Reports/logo-cefet.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + From f784c99641d4d3c3584ec19ee4eeff5aaf82ee6d Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 8 Aug 2023 14:31:23 -0300 Subject: [PATCH 085/201] feat: add partial implementation of ReportService --- .../Interfaces/Services/IReportService.cs | 9 +++ src/Infrastructure/Services/ReportService.cs | 53 ++++++++++++++ .../Services/Reports/certificate.html | 71 +++---------------- src/Infrastructure/Services/Services.csproj | 1 + 4 files changed, 71 insertions(+), 63 deletions(-) create mode 100644 src/Domain/Interfaces/Services/IReportService.cs create mode 100644 src/Infrastructure/Services/ReportService.cs diff --git a/src/Domain/Interfaces/Services/IReportService.cs b/src/Domain/Interfaces/Services/IReportService.cs new file mode 100644 index 00000000..037b3427 --- /dev/null +++ b/src/Domain/Interfaces/Services/IReportService.cs @@ -0,0 +1,9 @@ +using Domain.Entities; + +namespace Domain.Interfaces.Services +{ + public interface IReportService + { + Task GenerateCertificateAsync(Project project, string cordinatorName); + } +} \ No newline at end of file diff --git a/src/Infrastructure/Services/ReportService.cs b/src/Infrastructure/Services/ReportService.cs new file mode 100644 index 00000000..ed5116d3 --- /dev/null +++ b/src/Infrastructure/Services/ReportService.cs @@ -0,0 +1,53 @@ +using Domain.Entities; +using Domain.Interfaces.Services; +using PuppeteerSharp; + +namespace Services +{ + public class ReportService : IReportService + { + private readonly string? _currentDirectory; + public ReportService() + { + _currentDirectory = Path.GetDirectoryName(typeof(ReportService).Assembly.Location); + } + + public async Task GenerateCertificateAsync(Project project, string cordinatorName) + { + // Caminho temporário onde será salvo o arquivo + string outputPath = ""; + + // Obtém o conteúdo do arquivo HTML + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Reports/certificate.html")); + + // Substitui as variáveis do HTML pelos valores do projeto + template = template + .Replace("#NOME_ORIENTADOR#", project?.Professor?.User?.Name) + .Replace("#NOME_DEPARTAMENTO#", "") // TODO: Inserir departamento do professor no Projeto? + .Replace("#NOME_ORIENTADO#", project?.Student?.User?.Name) + .Replace("#DATA_EDITAL#", "") // TODO: Verificar como obter a data do edital (Ex.: 2017 / 2) + .Replace("#PIBIC_TIPO#", $"{project?.ProgramType?.Name} / CEFET") + .Replace("#INIP_EDITAL#", project?.Notice?.SendingDocsEndDate?.ToString("dd/MM/yyyy")) // TODO: Validar essa informação + .Replace("#FIMP_EDITAL#", project?.Notice?.FinalReportDeadline?.ToString("dd/MM/yyyy")) // TODO: Validar essa informação + .Replace("#SITP_EDITAL#", "") // TODO: Pegar essa informação do Projeto? + .Replace("#TITULO_PROJETO_ALUNO#", project?.Title) + .Replace("#TITULO_PROJETO_ORIENTADOR#", "") // TODO: Verificar se esse campo será inserido no Projeto + .Replace("#DIA_SEMANA#", DateTime.Now.DayOfWeek.ToString()) + .Replace("#DIA_DATA#", DateTime.Now.Day.ToString()) + .Replace("#MES_DATA#", DateTime.Now.ToString("MMMM")) + .Replace("#ANO_DATA#", DateTime.Now.Year.ToString()) + .Replace("#NOME_COORDENADOR#", cordinatorName); + + // Transforma HTML em PDF + await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision); + var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true }); + var page = await browser.NewPageAsync(); + await page.SetContentAsync(template); + await page.PdfAsync(outputPath); + await browser.CloseAsync(); + + // Retorna caminho onde foi salvo o arquivo + return outputPath; + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/Services/Reports/certificate.html b/src/Infrastructure/Services/Reports/certificate.html index 5f048e5c..b7011980 100644 --- a/src/Infrastructure/Services/Reports/certificate.html +++ b/src/Infrastructure/Services/Reports/certificate.html @@ -122,59 +122,29 @@
DADOS DOS ALUNOS

Nome do Orientado: -

#NOME_ORIENTADO_1#

+

#NOME_ORIENTADO#

-

Edital de Entrada: #DATA_EDITAL_1#

-

Bolsita do: #PIBIC_TIPO_1#

+

Edital de Entrada: #DATA_EDITAL#

+

Bolsita do: #PIBIC_TIPO#

- Início da Pesquisa neste edital: #INIP_EDITAL_1# + Início da Pesquisa neste edital: #INIP_EDITAL#

-

Término: #FIMP_EDITAL_1#

-

Situação: #SITP_EDITAL_1#

+

Término: #FIMP_EDITAL#

+

Situação: #SITP_EDITAL#

Título do Projeto de Iniciação Cientifica: - #TITULO_PROJETO_ALUNO_1# + #TITULO_PROJETO_ALUNO#

Título do Projeto de Pesquisado Orientador: - #TITULO_PROJETO_ORIENTADOR_1# -

-
- -
-
-
- Nome do Orientado: -

#NOME_ORIENTADO_2#

-
-
-

Edital de Entrada: #DATA_EDITAL_2#

-

Bolsita do: #PIBIC_TIPO_2#

-
-
-

- Início da Pesquisa neste edital: #INIP_EDITAL_2# -

-

Término: #FIMP_EDITAL_2#

-

Situação: #SITP_EDITAL_2#

-
-
-

- Título do Projeto de Iniciação Cientifica: - #TITULO_PROJETO_ALUNO_2# -

-
-
-

- Título do Projeto de Pesquisado Orientador: - #TITULO_PROJETO_ORIENTADOR_2# + #TITULO_PROJETO_ORIENTADOR#

@@ -193,7 +163,6 @@

#NOME_COORDENADOR#

Coordenador COPET

-

ASSINATURA

@@ -204,29 +173,5 @@
- - diff --git a/src/Infrastructure/Services/Services.csproj b/src/Infrastructure/Services/Services.csproj index afb0a3db..cddfe4f5 100644 --- a/src/Infrastructure/Services/Services.csproj +++ b/src/Infrastructure/Services/Services.csproj @@ -12,6 +12,7 @@ + From 76dd9a5fc07fe18384cf4ed55c7a2ca43c648e33 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 10 Aug 2023 21:05:54 -0300 Subject: [PATCH 086/201] fix(ioc): adjust external services imports --- src/Infrastructure/IoC/ExternalServicesDI.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Infrastructure/IoC/ExternalServicesDI.cs b/src/Infrastructure/IoC/ExternalServicesDI.cs index 3eb8e548..3e88e225 100644 --- a/src/Infrastructure/IoC/ExternalServicesDI.cs +++ b/src/Infrastructure/IoC/ExternalServicesDI.cs @@ -1,4 +1,4 @@ -using Application.Interfaces.Services; +using Domain.Interfaces.Services; using Infrastructure.IoC.Utils; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; From 602fbd358d1a79df13b4eb186e99961c9628ade4 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 10 Aug 2023 21:18:24 -0300 Subject: [PATCH 087/201] fix: adjust email sender and disable ssl for tests --- .../Services/Email/EmailService.cs | 167 ++++++++++-------- 1 file changed, 94 insertions(+), 73 deletions(-) diff --git a/src/Infrastructure/Services/Email/EmailService.cs b/src/Infrastructure/Services/Email/EmailService.cs index b3be07a2..79d95ace 100644 --- a/src/Infrastructure/Services/Email/EmailService.cs +++ b/src/Infrastructure/Services/Email/EmailService.cs @@ -28,40 +28,54 @@ public EmailService(string? smtpServer, int smtpPort, string? smtpUsername, stri public async Task SendConfirmationEmailAsync(string? email, string? name, string? token) { - // Verifica se os parâmetros são nulos ou vazios - if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(token)) + try { - throw new Exception("Parâmetros inválidos. Email, nome e token são obrigatórios."); - } + // Verifica se os parâmetros são nulos ou vazios + if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(token)) + { + throw new Exception("Parâmetros inválidos. Email, nome e token são obrigatórios."); + } - // Lê mensagem do template em html salvo localmente - string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ConfirmEmail.html")); + // Lê mensagem do template em html salvo localmente + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ConfirmEmail.html")); - // Gera mensagem de envio - const string subject = "Confirmação de Cadastro"; - string body = template.Replace("#USER_NAME#", name).Replace("#USER_TOKEN#", token); + // Gera mensagem de envio + const string subject = "Confirmação de Cadastro"; + string body = template.Replace("#USER_NAME#", name).Replace("#USER_TOKEN#", token); - // Tentativa de envio de email - await SendEmailAsync(email, subject, body); + // Tentativa de envio de email + await SendEmailAsync(email, subject, body); + } + catch (Exception ex) + { + throw new Exception($"Não foi possível enviar o email de confirmação de e-mail. {ex.Message}"); + } } public async Task SendResetPasswordEmailAsync(string? email, string? name, string? token) { - // Verifica se os parâmetros são nulos ou vazios - if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(token)) + try { - throw new Exception("Parâmetros inválidos. Email, nome e token são obrigatórios."); - } + // Verifica se os parâmetros são nulos ou vazios + if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(token)) + { + throw new Exception("Parâmetros inválidos. Email, nome e token são obrigatórios."); + } - // Lê mensagem do template em html salvo localmente - string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ResetPassword.html")); + // Lê mensagem do template em html salvo localmente + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ResetPassword.html")); - // Gera mensagem de envio - const string subject = "Recuperação de Senha"; - string body = template.Replace("#USER_NAME#", name).Replace("#USER_TOKEN#", token); + // Gera mensagem de envio + const string subject = "Recuperação de Senha"; + string body = template.Replace("#USER_NAME#", name).Replace("#USER_TOKEN#", token); - // Tentativa de envio de email - await SendEmailAsync(email, subject, body); + // Tentativa de envio de email + await SendEmailAsync(email, subject, body); + } + catch (Exception ex) + { + throw new Exception($"Não foi possível enviar o email de atualização de senha. {ex.Message}"); + } } public async Task SendNoticeEmailAsync(string? email, string? name, DateTime? registrationStartDate, DateTime? registrationEndDate, string? noticeUrl) @@ -95,73 +109,80 @@ public async Task SendProjectNotificationEmailAsync(string? email, string? name, throw new Exception("Parâmetros inválidos. Email, título do projeto, status e descrição são obrigatórios."); } - // Lê mensagem do template em html salvo localmente - string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ProjectStatusChange.html")); - - // Gera mensagem de envio - const string subject = "Alteração de Status de Projeto"; - string body = template - .Replace("#PROFESSOR_NAME#", name) - .Replace("#PROJECT_TITLE#", projectTitle) - .Replace("#PROJECT_STATUS#", status) - .Replace("#PROJECT_DESCRIPTION#", description); - - // Tentativa de envio de email - await SendEmailAsync(email, subject, body); + try + { + // Lê mensagem do template em html salvo localmente + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/ProjectStatusChange.html")); + + // Gera mensagem de envio + const string subject = "Alteração de Status de Projeto"; + string body = template + .Replace("#PROFESSOR_NAME#", name) + .Replace("#PROJECT_TITLE#", projectTitle) + .Replace("#PROJECT_STATUS#", status) + .Replace("#PROJECT_DESCRIPTION#", description); + + // Tentativa de envio de email + await SendEmailAsync(email, subject, body); + } + catch (Exception ex) + { + throw new Exception($"Não foi possível enviar o email de notificação de modificação do projeto. {ex.Message}"); + } } public async Task SendRequestStudentRegisterEmailAsync(string? email) { - // Verifica se os parâmetros são nulos ou vazios - if (string.IsNullOrEmpty(email)) + try { - throw new Exception("Parâmetros inválidos. Email é obrigatório."); - } + // Verifica se os parâmetros são nulos ou vazios + if (string.IsNullOrEmpty(email)) + { + throw new Exception("Parâmetros inválidos. Email é obrigatório."); + } - // Lê mensagem do template em html salvo localmente - string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/RequestStudentRegister.html")); + // Lê mensagem do template em html salvo localmente + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Email/Templates/RequestStudentRegister.html")); - // Gera mensagem de envio - const string subject = "Solicitação de Registro"; - string body = template - .Replace("#REGISTRATION_LINK#", _siteUrl); + // Gera mensagem de envio + const string subject = "Solicitação de Registro"; + string body = template + .Replace("#REGISTRATION_LINK#", _siteUrl); - // Tentativa de envio de email - await SendEmailAsync(email, subject, body); + // Tentativa de envio de email + await SendEmailAsync(email, subject, body); + } + catch (Exception ex) + { + throw new Exception($"Não foi possível enviar o email de solicitação de cadastro do estudante. {ex.Message}"); + } } #region Private Methods public async Task SendEmailAsync(string email, string subject, string message) { - try + // Verifica se os parâmetros são nulos ou vazios + if (_smtpServer == null || _smtpUsername == null || _smtpPassword == null) { - // Verifica se os parâmetros são nulos ou vazios - if (_smtpServer == null || _smtpUsername == null || _smtpPassword == null) - { - throw new Exception("Parâmetros de configuração de email não foram encontrados."); - } - - // Cria objeto de mensagem - MailMessage mc = new(_smtpUsername, email) - { - Subject = subject, - Body = message, - IsBodyHtml = true - }; - - // Envia mensagem - using SmtpClient smtpClient = new(_smtpServer, _smtpPort); - smtpClient.Timeout = 1000000; - smtpClient.EnableSsl = true; - smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; - smtpClient.UseDefaultCredentials = false; - smtpClient.Credentials = new NetworkCredential(_smtpUsername, _smtpPassword); - await smtpClient.SendMailAsync(mc); + throw new Exception("Parâmetros de configuração de email não foram encontrados."); } - catch (Exception ex) + + // Cria objeto de mensagem + MailMessage mc = new(_smtpUsername, email) { - throw new Exception($"Não foi possível enviar o email de notificação de novo edital. {ex.Message}"); - } + Subject = subject, + Body = message, + IsBodyHtml = true + }; + + // Envia mensagem + using SmtpClient smtpClient = new(_smtpServer, _smtpPort); + smtpClient.Timeout = 1000000; + // smtpClient.EnableSsl = true; + smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; + smtpClient.UseDefaultCredentials = false; + smtpClient.Credentials = new NetworkCredential(_smtpUsername, _smtpPassword); + await smtpClient.SendMailAsync(mc); } #endregion Private Methods } From 1965ed065cfdd0df22857d79dbcd80fa6d1e339e Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 10 Aug 2023 21:23:48 -0300 Subject: [PATCH 088/201] fix(email-service): enable ssl --- src/Infrastructure/Services/Email/EmailService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Infrastructure/Services/Email/EmailService.cs b/src/Infrastructure/Services/Email/EmailService.cs index 79d95ace..57443975 100644 --- a/src/Infrastructure/Services/Email/EmailService.cs +++ b/src/Infrastructure/Services/Email/EmailService.cs @@ -178,7 +178,7 @@ public async Task SendEmailAsync(string email, string subject, string message) // Envia mensagem using SmtpClient smtpClient = new(_smtpServer, _smtpPort); smtpClient.Timeout = 1000000; - // smtpClient.EnableSsl = true; + smtpClient.EnableSsl = true; smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = new NetworkCredential(_smtpUsername, _smtpPassword); From c604b2326dee72b6467e210ea5e234e8f2d31571 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 10 Aug 2023 23:40:32 -0300 Subject: [PATCH 089/201] feat: add unit tests and entities fixing --- .../Entities/ActivityTypeUnitTests.cs | 128 +++ .../Entities/ActivityUnitTests.cs | 150 ++++ src/Domain.Tests/Entities/NoticeUnitTests.cs | 2 +- .../Entities/ProfessorUnitTests.cs | 2 +- .../Entities/ProjectEvaluationUnitTests.cs | 608 +++++++------ src/Domain.Tests/Entities/ProjectUnitTests.cs | 835 ++++++------------ .../Entities/StudentDocumentsUnitTests.cs | 152 ++++ src/Domain.Tests/Entities/StudentUnitTests.cs | 50 +- src/Domain/Entities/Notice.cs | 20 +- src/Domain/Entities/Professor.cs | 2 +- src/Domain/Entities/Project.cs | 6 +- src/Domain/Entities/ProjectEvaluation.cs | 66 +- src/Domain/Entities/ProjectReport.cs | 2 +- src/Domain/Entities/StudentDocuments.cs | 18 +- 14 files changed, 1179 insertions(+), 862 deletions(-) create mode 100644 src/Domain.Tests/Entities/ActivityTypeUnitTests.cs create mode 100644 src/Domain.Tests/Entities/ActivityUnitTests.cs create mode 100644 src/Domain.Tests/Entities/StudentDocumentsUnitTests.cs diff --git a/src/Domain.Tests/Entities/ActivityTypeUnitTests.cs b/src/Domain.Tests/Entities/ActivityTypeUnitTests.cs new file mode 100644 index 00000000..88edb097 --- /dev/null +++ b/src/Domain.Tests/Entities/ActivityTypeUnitTests.cs @@ -0,0 +1,128 @@ +using Domain.Entities; +using Domain.Validation; +using FluentAssertions; +using Xunit; + +namespace Domain.Tests.Entities +{ + public class ActivityTypeUnitTests + { + private static ActivityType MockValidActivityType() => + new("Valid Name", "Valid Unity", Guid.NewGuid()); + + [Fact] + public void SetName_ValidName_SetsName() + { + // Arrange + var activityType = MockValidActivityType(); + var name = "Valid New Name"; + + // Act + activityType.Name = name; + + // Assert + activityType.Name.Should().Be(name); + } + + [Theory] + [InlineData("")] + [InlineData("AB")] + [InlineData("A")] + [InlineData(null)] + public void SetName_InvalidName_ThrowsException(string invalidName) + { + // Arrange + var activityType = MockValidActivityType(); + + // Act & Assert + Assert.Throws(() => activityType.Name = invalidName); + } + + [Fact] + public void SetUnity_ValidUnity_SetsUnity() + { + // Arrange + var activityType = MockValidActivityType(); + var unity = "Valid New Unity"; + + // Act + activityType.Unity = unity; + + // Assert + activityType.Unity.Should().Be(unity); + } + + [Theory] + [InlineData("")] + [InlineData("AB")] + [InlineData("A")] + [InlineData(null)] + public void SetUnity_InvalidUnity_ThrowsException(string invalidUnity) + { + // Arrange + var activityType = MockValidActivityType(); + + // Act & Assert + Assert.Throws(() => activityType.Unity = invalidUnity); + } + + [Fact] + public void Constructor_WithValidArguments_CreatesActivityTypeWithCorrectValues() + { + // Arrange + var name = "Valid Name"; + var unity = "Valid Unity"; + var noticeId = Guid.NewGuid(); + + // Act + var activityType = new ActivityType(name, unity, noticeId); + + // Assert + activityType.Name.Should().Be(name); + activityType.Unity.Should().Be(unity); + activityType.NoticeId.Should().Be(noticeId); + } + + [Theory] + [InlineData("")] + [InlineData("AB")] + [InlineData("A")] + [InlineData(null)] + public void Constructor_WithInvalidName_ThrowsException(string invalidName) + { + // Arrange + var unity = "Valid Unity"; + var noticeId = Guid.NewGuid(); + + // Act & Assert + Assert.Throws(() => new ActivityType(invalidName, unity, noticeId)); + } + + [Theory] + [InlineData("")] + [InlineData("AB")] + [InlineData("A")] + [InlineData(null)] + public void Constructor_WithInvalidUnity_ThrowsException(string invalidUnity) + { + // Arrange + var name = "Valid Name"; + var noticeId = Guid.NewGuid(); + + // Act & Assert + Assert.Throws(() => new ActivityType(name, invalidUnity, noticeId)); + } + + [Fact] + public void Constructor_WithNullNoticeId_ThrowsException() + { + // Arrange + var name = "Valid Name"; + var unity = "Valid Unity"; + var noticeId = (Guid?)null; + + // Act & Assert + Assert.Throws(() => new ActivityType(name, unity, noticeId)); + } + } +} diff --git a/src/Domain.Tests/Entities/ActivityUnitTests.cs b/src/Domain.Tests/Entities/ActivityUnitTests.cs new file mode 100644 index 00000000..900939cf --- /dev/null +++ b/src/Domain.Tests/Entities/ActivityUnitTests.cs @@ -0,0 +1,150 @@ +using Domain.Entities; +using Domain.Validation; +using FluentAssertions; +using Xunit; + +namespace Domain.Tests.Entities +{ + public class ActivityUnitTests + { + private static Activity MockValidActivity() => + new("Valid Name", 10.0, 20.0, Guid.NewGuid()); + + [Fact] + public void SetName_ValidName_SetsName() + { + // Arrange + var activity = MockValidActivity(); + var name = "Valid New Name"; + + // Act + activity.Name = name; + + // Assert + activity.Name.Should().Be(name); + } + + [Theory] + [InlineData("")] + [InlineData("AB")] + [InlineData("A")] + [InlineData(null)] + public void SetName_InvalidName_ThrowsException(string invalidName) + { + // Arrange + var activity = MockValidActivity(); + + // Act & Assert + Assert.Throws(() => activity.Name = invalidName); + } + + [Fact] + public void SetPoints_ValidPoints_SetsPoints() + { + // Arrange + var activity = MockValidActivity(); + var points = 15.0; + + // Act + activity.Points = points; + + // Assert + activity.Points.Should().Be(points); + } + + [Fact] + public void SetPoints_NullPoints_ThrowsException() + { + // Arrange + var activity = MockValidActivity(); + + // Act & Assert + Assert.Throws(() => activity.Points = null); + } + + [Fact] + public void SetLimits_ValidLimits_SetsLimits() + { + // Arrange + var activity = MockValidActivity(); + var limits = 25.0; + + // Act + activity.Limits = limits; + + // Assert + activity.Limits.Should().Be(limits); + } + + [Fact] + public void SetLimits_NullLimits_SetsLimitsToMaxValue() + { + // Arrange + var activity = MockValidActivity(); + + // Act + activity.Limits = null; + + // Assert + activity.Limits.Should().Be(double.MaxValue); + } + + [Fact] + public void Constructor_WithValidArguments_CreatesActivityWithCorrectValues() + { + // Arrange + var name = "Valid Name"; + var points = 10.0; + var limits = 20.0; + var activityTypeId = Guid.NewGuid(); + + // Act + var activity = new Activity(name, points, limits, activityTypeId); + + // Assert + activity.Name.Should().Be(name); + activity.Points.Should().Be(points); + activity.Limits.Should().Be(limits); + activity.ActivityTypeId.Should().Be(activityTypeId); + } + + [Fact] + public void Constructor_WithNullName_ThrowsException() + { + // Arrange + var name = null as string; + var points = 10.0; + var limits = 20.0; + var activityTypeId = Guid.NewGuid(); + + // Act & Assert + Assert.Throws(() => new Activity(name, points, limits, activityTypeId)); + } + + [Fact] + public void Constructor_WithNullPoints_ThrowsException() + { + // Arrange + var name = "Valid Name"; + var points = (double?)null; + var limits = 20.0; + var activityTypeId = Guid.NewGuid(); + + // Act & Assert + Assert.Throws(() => new Activity(name, points, limits, activityTypeId)); + } + + [Fact] + public void Constructor_WithNullActivityTypeId_ThrowsException() + { + // Arrange + var name = "Valid Name"; + var points = 10.0; + var limits = 20.0; + var activityTypeId = (Guid?)null; + + // Act & Assert + Assert.Throws(() => new Activity(name, points, limits, activityTypeId)); + } + } +} diff --git a/src/Domain.Tests/Entities/NoticeUnitTests.cs b/src/Domain.Tests/Entities/NoticeUnitTests.cs index 9d31874d..aad57530 100644 --- a/src/Domain.Tests/Entities/NoticeUnitTests.cs +++ b/src/Domain.Tests/Entities/NoticeUnitTests.cs @@ -8,7 +8,7 @@ namespace Domain.Tests.Entities { public class NoticeUnitTests { - private Notice MockValidNotice() => new Notice( + private static Notice MockValidNotice() => new( registrationStartDate: DateTime.UtcNow, registrationEndDate: DateTime.UtcNow.AddDays(7), evaluationStartDate: DateTime.UtcNow.AddDays(8), diff --git a/src/Domain.Tests/Entities/ProfessorUnitTests.cs b/src/Domain.Tests/Entities/ProfessorUnitTests.cs index f7e7342e..a18b6893 100644 --- a/src/Domain.Tests/Entities/ProfessorUnitTests.cs +++ b/src/Domain.Tests/Entities/ProfessorUnitTests.cs @@ -8,7 +8,7 @@ namespace Domain.Tests.Entities { public class ProfessorUnitTests { - private Professor MockValidProfessor() => new Professor(); + private static Professor MockValidProfessor() => new(); [Fact] public void SetSIAPEEnrollment_ValidSIAPEEnrollment_SetsSIAPEEnrollment() diff --git a/src/Domain.Tests/Entities/ProjectEvaluationUnitTests.cs b/src/Domain.Tests/Entities/ProjectEvaluationUnitTests.cs index ed6b0c42..58c24114 100644 --- a/src/Domain.Tests/Entities/ProjectEvaluationUnitTests.cs +++ b/src/Domain.Tests/Entities/ProjectEvaluationUnitTests.cs @@ -1,249 +1,359 @@ -// using Domain.Entities; -// using Domain.Entities.Enums; -// using Domain.Validation; -// using FluentAssertions; -// using System; -// using Xunit; - -// namespace Domain.Tests.Entities -// { -// public class ProjectEvaluationUnitTests -// { -// private ProjectEvaluation MockValidProjectEvaluation() -// { -// return new ProjectEvaluation -// { -// ProjectId = Guid.NewGuid(), -// IsProductivityFellow = true, -// SubmissionEvaluatorId = Guid.NewGuid(), -// SubmissionEvaluationDate = DateTime.UtcNow, -// SubmissionEvaluationStatus = EProjectStatus.Pending, -// SubmissionEvaluationDescription = "Submission evaluation description", -// AppealEvaluatorId = Guid.NewGuid(), -// AppealEvaluationDate = DateTime.UtcNow, -// AppealEvaluationStatus = EProjectStatus.Accepted, -// AppealEvaluationDescription = "Appeal evaluation description", -// DocumentsEvaluatorId = Guid.NewGuid(), -// DocumentsEvaluationDate = DateTime.UtcNow, -// DocumentsEvaluationDescription = "Documents evaluation description", -// FoundWorkType1 = 1, -// FoundWorkType2 = 2, -// FoundIndexedConferenceProceedings = 3, -// FoundNotIndexedConferenceProceedings = 4, -// FoundCompletedBook = 5, -// FoundOrganizedBook = 6, -// FoundBookChapters = 7, -// FoundBookTranslations = 8, -// FoundParticipationEditorialCommittees = 9, -// FoundFullComposerSoloOrchestraAllTracks = 10, -// FoundFullComposerSoloOrchestraCompilation = 11, -// FoundChamberOrchestraInterpretation = 12, -// FoundIndividualAndCollectiveArtPerformances = 13, -// FoundScientificCulturalArtisticCollectionsCuratorship = 14, -// FoundPatentLetter = 15, -// FoundPatentDeposit = 16, -// FoundSoftwareRegistration = 17, -// APIndex = 18, -// Qualification = EQualification.Master, -// ProjectProposalObjectives = EScore.Good, -// AcademicScientificProductionCoherence = EScore.Excellent, -// ProposalMethodologyAdaptation = EScore.Regular, -// EffectiveContributionToResearch = EScore.Weak -// }; -// } - -// [Fact] -// public void TestAllProperties() -// { -// // Arrange -// var projectEvaluation = MockValidProjectEvaluation(); - -// // Act & Assert -// AssertValidation(() => projectEvaluation.ProjectId = null); -// AssertValidation(() => projectEvaluation.IsProductivityFellow = null); -// AssertValidation(() => projectEvaluation.SubmissionEvaluatorId = null); -// AssertValidation(() => projectEvaluation.SubmissionEvaluationDate = null); -// AssertValidation(() => projectEvaluation.SubmissionEvaluationStatus = null); -// AssertValidation(() => projectEvaluation.SubmissionEvaluationDescription = null); -// // AssertValidation(() => projectEvaluation.AppealEvaluatorId = null); -// // AssertValidation(() => projectEvaluation.AppealEvaluationDate = null); -// // AssertValidation(() => projectEvaluation.AppealEvaluationStatus = null); -// // AssertValidation(() => projectEvaluation.AppealEvaluationDescription = null); -// // AssertValidation(() => projectEvaluation.DocumentsEvaluatorId = null); -// // AssertValidation(() => projectEvaluation.DocumentsEvaluationDate = null); -// // AssertValidation(() => projectEvaluation.DocumentsEvaluationDescription = null); -// AssertValidation(() => projectEvaluation.FoundWorkType1 = null); -// AssertValidation(() => projectEvaluation.FoundWorkType2 = null); -// AssertValidation(() => projectEvaluation.FoundIndexedConferenceProceedings = null); -// AssertValidation(() => projectEvaluation.FoundNotIndexedConferenceProceedings = null); -// AssertValidation(() => projectEvaluation.FoundCompletedBook = null); -// AssertValidation(() => projectEvaluation.FoundOrganizedBook = null); -// AssertValidation(() => projectEvaluation.FoundBookChapters = null); -// AssertValidation(() => projectEvaluation.FoundBookTranslations = null); -// AssertValidation(() => projectEvaluation.FoundParticipationEditorialCommittees = null); -// AssertValidation(() => projectEvaluation.FoundFullComposerSoloOrchestraAllTracks = null); -// AssertValidation(() => projectEvaluation.FoundFullComposerSoloOrchestraCompilation = null); -// AssertValidation(() => projectEvaluation.FoundChamberOrchestraInterpretation = null); -// AssertValidation(() => projectEvaluation.FoundIndividualAndCollectiveArtPerformances = null); -// AssertValidation(() => projectEvaluation.FoundScientificCulturalArtisticCollectionsCuratorship = null); -// AssertValidation(() => projectEvaluation.FoundPatentLetter = null); -// AssertValidation(() => projectEvaluation.FoundPatentDeposit = null); -// AssertValidation(() => projectEvaluation.FoundSoftwareRegistration = null); -// AssertValidation(() => projectEvaluation.APIndex = null); -// AssertValidation(() => projectEvaluation.Qualification = null); -// AssertValidation(() => projectEvaluation.ProjectProposalObjectives = null); -// AssertValidation(() => projectEvaluation.AcademicScientificProductionCoherence = null); -// AssertValidation(() => projectEvaluation.ProposalMethodologyAdaptation = null); -// AssertValidation(() => projectEvaluation.EffectiveContributionToResearch = null); -// } - -// [Fact] -// public void SetProjectId_ValidId_SetsProjectId() -// { -// // Arrange -// var projectEvaluation = MockValidProjectEvaluation(); -// var projectId = Guid.NewGuid(); - -// // Act -// projectEvaluation.ProjectId = projectId; - -// // Assert -// projectEvaluation.ProjectId.Should().Be(projectId); -// } - -// [Fact] -// public void SetProjectId_NullId_ThrowsException() -// { -// // Arrange -// var projectEvaluation = MockValidProjectEvaluation(); - -// // Act & Assert -// Assert.Throws(() => projectEvaluation.ProjectId = null); -// } - -// [Fact] -// public void SetIsProductivityFellow_ValidValue_SetsIsProductivityFellow() -// { -// // Arrange -// var projectEvaluation = MockValidProjectEvaluation(); -// var isProductivityFellow = true; - -// // Act -// projectEvaluation.IsProductivityFellow = isProductivityFellow; - -// // Assert -// projectEvaluation.IsProductivityFellow.Should().Be(isProductivityFellow); -// } - -// [Fact] -// public void SetIsProductivityFellow_NullValue_ThrowsException() -// { -// // Arrange -// var projectEvaluation = MockValidProjectEvaluation(); - -// // Act & Assert -// Assert.Throws(() => projectEvaluation.IsProductivityFellow = null); -// } - -// [Fact] -// public void SetSubmissionEvaluatorId_ValidId_SetsSubmissionEvaluatorId() -// { -// // Arrange -// var projectEvaluation = MockValidProjectEvaluation(); -// var submissionEvaluatorId = Guid.NewGuid(); - -// // Act -// projectEvaluation.SubmissionEvaluatorId = submissionEvaluatorId; - -// // Assert -// projectEvaluation.SubmissionEvaluatorId.Should().Be(submissionEvaluatorId); -// } - -// [Fact] -// public void SetSubmissionEvaluatorId_NullId_ThrowsException() -// { -// // Arrange -// var projectEvaluation = MockValidProjectEvaluation(); - -// // Act & Assert -// Assert.Throws(() => projectEvaluation.SubmissionEvaluatorId = null); -// } - -// [Fact] -// public void SetSubmissionEvaluationDate_ValidDate_SetsSubmissionEvaluationDate() -// { -// // Arrange -// var projectEvaluation = MockValidProjectEvaluation(); -// var submissionEvaluationDate = DateTime.UtcNow; - -// // Act -// projectEvaluation.SubmissionEvaluationDate = submissionEvaluationDate; - -// // Assert -// projectEvaluation.SubmissionEvaluationDate.Should().Be(submissionEvaluationDate); -// } - -// [Fact] -// public void SetSubmissionEvaluationDate_NullDate_ThrowsException() -// { -// // Arrange -// var projectEvaluation = MockValidProjectEvaluation(); - -// // Act & Assert -// Assert.Throws(() => projectEvaluation.SubmissionEvaluationDate = null); -// } - -// [Fact] -// public void SetSubmissionEvaluationStatus_ValidStatus_SetsSubmissionEvaluationStatus() -// { -// // Arrange -// var projectEvaluation = MockValidProjectEvaluation(); -// var submissionEvaluationStatus = EProjectStatus.Accepted; - -// // Act -// projectEvaluation.SubmissionEvaluationStatus = submissionEvaluationStatus; - -// // Assert -// projectEvaluation.SubmissionEvaluationStatus.Should().Be(submissionEvaluationStatus); -// } - -// [Fact] -// public void SetSubmissionEvaluationStatus_NullStatus_ThrowsException() -// { -// // Arrange -// var projectEvaluation = MockValidProjectEvaluation(); - -// // Act & Assert -// Assert.Throws(() => projectEvaluation.SubmissionEvaluationStatus = null); -// } - -// [Fact] -// public void SetSubmissionEvaluationDescription_ValidDescription_SetsSubmissionEvaluationDescription() -// { -// // Arrange -// var projectEvaluation = MockValidProjectEvaluation(); -// var submissionEvaluationDescription = "This is a valid description."; - -// // Act -// projectEvaluation.SubmissionEvaluationDescription = submissionEvaluationDescription; - -// // Assert -// projectEvaluation.SubmissionEvaluationDescription.Should().Be(submissionEvaluationDescription); -// } - -// [Fact] -// public void SetSubmissionEvaluationDescription_NullDescription_ThrowsException() -// { -// // Arrange -// var projectEvaluation = MockValidProjectEvaluation(); - -// // Act & Assert -// Assert.Throws(() => projectEvaluation.SubmissionEvaluationDescription = null); -// } - -// private void AssertValidation(Action action) -// { -// Assert.Throws(action); -// } -// } -// } +using Domain.Entities; +using Domain.Entities.Enums; +using Domain.Validation; +using FluentAssertions; +using Xunit; + +namespace Domain.Tests.Entities +{ + public class ProjectEvaluationUnitTests + { + private static ProjectEvaluation MockValidProjectEvaluation() => + new( + Guid.NewGuid(), + true, + Guid.NewGuid(), + EProjectStatus.Accepted, + DateTime.UtcNow, + "Valid Submission Evaluation Description", + EQualification.Doctor, + EScore.Excellent, + EScore.Excellent, + EScore.Excellent, + EScore.Excellent, + 10.0); + + [Fact] + public void Constructor_WithValidArguments_CreatesProjectEvaluationWithCorrectValues() + { + // Arrange + var projectId = Guid.NewGuid(); + var isProductivityFellow = true; + var submissionEvaluatorId = Guid.NewGuid(); + var submissionEvaluationStatus = EProjectStatus.Rejected; + var submissionEvaluationDate = DateTime.UtcNow; + var submissionEvaluationDescription = "Valid Submission Evaluation Description"; + var qualification = EQualification.Doctor; + var projectProposalObjectives = EScore.Excellent; + var academicScientificProductionCoherence = EScore.Excellent; + var proposalMethodologyAdaptation = EScore.Excellent; + var effectiveContributionToResearch = EScore.Excellent; + var apIndex = 10.0; + + // Act + var projectEvaluation = new ProjectEvaluation( + projectId, + isProductivityFellow, + submissionEvaluatorId, + submissionEvaluationStatus, + submissionEvaluationDate, + submissionEvaluationDescription, + qualification, + projectProposalObjectives, + academicScientificProductionCoherence, + proposalMethodologyAdaptation, + effectiveContributionToResearch, + apIndex); + + // Assert + projectEvaluation.ProjectId.Should().Be(projectId); + projectEvaluation.IsProductivityFellow.Should().Be(isProductivityFellow); + projectEvaluation.SubmissionEvaluatorId.Should().Be(submissionEvaluatorId); + projectEvaluation.SubmissionEvaluationStatus.Should().Be(submissionEvaluationStatus); + projectEvaluation.SubmissionEvaluationDate.Should().Be(submissionEvaluationDate); + projectEvaluation.SubmissionEvaluationDescription.Should().Be(submissionEvaluationDescription); + projectEvaluation.Qualification.Should().Be(qualification); + projectEvaluation.ProjectProposalObjectives.Should().Be(projectProposalObjectives); + projectEvaluation.AcademicScientificProductionCoherence.Should().Be(academicScientificProductionCoherence); + projectEvaluation.ProposalMethodologyAdaptation.Should().Be(proposalMethodologyAdaptation); + projectEvaluation.EffectiveContributionToResearch.Should().Be(effectiveContributionToResearch); + projectEvaluation.APIndex.Should().Be(apIndex); + } + + [Theory] + [InlineData("")] + [InlineData(null)] + public void Constructor_WithInvalidSubmissionEvaluationDescription_ThrowsException(string invalidDescription) + { + // Arrange + var projectId = Guid.NewGuid(); + var isProductivityFellow = true; + var submissionEvaluatorId = Guid.NewGuid(); + var submissionEvaluationStatus = EProjectStatus.Rejected; + var submissionEvaluationDate = DateTime.UtcNow; + var qualification = EQualification.Doctor; + var projectProposalObjectives = EScore.Excellent; + var academicScientificProductionCoherence = EScore.Excellent; + var proposalMethodologyAdaptation = EScore.Excellent; + var effectiveContributionToResearch = EScore.Excellent; + var apIndex = 10.0; + + // Act & Assert + Assert.Throws(() => new ProjectEvaluation( + projectId, + isProductivityFellow, + submissionEvaluatorId, + submissionEvaluationStatus, + submissionEvaluationDate, + invalidDescription, + qualification, + projectProposalObjectives, + academicScientificProductionCoherence, + proposalMethodologyAdaptation, + effectiveContributionToResearch, + apIndex)); + } + + [Fact] + public void Constructor_WithNullQualification_ThrowsException() + { + // Arrange + var projectId = Guid.NewGuid(); + var isProductivityFellow = true; + var submissionEvaluatorId = Guid.NewGuid(); + var submissionEvaluationStatus = EProjectStatus.Accepted; + var submissionEvaluationDate = DateTime.UtcNow; + var submissionEvaluationDescription = "Valid Submission Evaluation Description"; + EQualification? qualification = null; + var projectProposalObjectives = EScore.Excellent; + var academicScientificProductionCoherence = EScore.Excellent; + var proposalMethodologyAdaptation = EScore.Excellent; + var effectiveContributionToResearch = EScore.Excellent; + var apIndex = 10.0; + + // Act & Assert + Assert.Throws(() => new ProjectEvaluation( + projectId, + isProductivityFellow, + submissionEvaluatorId, + submissionEvaluationStatus, + submissionEvaluationDate, + submissionEvaluationDescription, + qualification, + projectProposalObjectives, + academicScientificProductionCoherence, + proposalMethodologyAdaptation, + effectiveContributionToResearch, + apIndex)); + } + + [Fact] + public void CalculateFinalScore_WithValidScores_SetsFinalScore() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + projectEvaluation.Qualification = EQualification.Doctor; + projectEvaluation.ProjectProposalObjectives = EScore.Excellent; + projectEvaluation.AcademicScientificProductionCoherence = EScore.Good; + projectEvaluation.ProposalMethodologyAdaptation = EScore.Regular; + projectEvaluation.EffectiveContributionToResearch = EScore.Weak; + projectEvaluation.APIndex = 8.0; + + // Act + projectEvaluation.CalculateFinalScore(); + + // Assert + projectEvaluation.FinalScore.Should().BeApproximately(20.0, 0.001); + } + + [Fact] + public void SetProjectId_ValidId_SetsProjectId() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + var projectId = Guid.NewGuid(); + + // Act + projectEvaluation.ProjectId = projectId; + + // Assert + projectEvaluation.ProjectId.Should().Be(projectId); + } + + [Fact] + public void SetProjectId_NullId_ThrowsException() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + + // Act & Assert + Assert.Throws(() => projectEvaluation.ProjectId = null); + } + + [Fact] + public void SetIsProductivityFellow_ValidValue_SetsIsProductivityFellow() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + var isProductivityFellow = true; + + // Act + projectEvaluation.IsProductivityFellow = isProductivityFellow; + + // Assert + projectEvaluation.IsProductivityFellow.Should().Be(isProductivityFellow); + } + + [Fact] + public void SetIsProductivityFellow_NullValue_ThrowsException() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + + // Act & Assert + Assert.Throws(() => projectEvaluation.IsProductivityFellow = null); + } + + [Fact] + public void SetSubmissionEvaluatorId_ValidId_SetsSubmissionEvaluatorId() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + var submissionEvaluatorId = Guid.NewGuid(); + + // Act + projectEvaluation.SubmissionEvaluatorId = submissionEvaluatorId; + + // Assert + projectEvaluation.SubmissionEvaluatorId.Should().Be(submissionEvaluatorId); + } + + [Fact] + public void SetSubmissionEvaluatorId_NullId_ThrowsException() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + + // Act & Assert + Assert.Throws(() => projectEvaluation.SubmissionEvaluatorId = null); + } + + [Fact] + public void SetSubmissionEvaluationDate_ValidDate_SetsSubmissionEvaluationDate() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + var evaluationDate = DateTime.Now; + + // Act + projectEvaluation.SubmissionEvaluationDate = evaluationDate; + + // Assert + projectEvaluation.SubmissionEvaluationDate.Should().Be(evaluationDate); + } + + [Fact] + public void SetSubmissionEvaluationDate_NullDate_ThrowsException() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + + // Act & Assert + Assert.Throws(() => projectEvaluation.SubmissionEvaluationDate = null); + } + + [Fact] + public void SetSubmissionEvaluationStatus_ValidStatus_SetsSubmissionEvaluationStatus() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + var evaluationStatus = EProjectStatus.Accepted; + + // Act + projectEvaluation.SubmissionEvaluationStatus = evaluationStatus; + + // Assert + projectEvaluation.SubmissionEvaluationStatus.Should().Be(evaluationStatus); + } + + [Fact] + public void SetSubmissionEvaluationStatus_NullStatus_ThrowsException() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + + // Act & Assert + Assert.Throws(() => projectEvaluation.SubmissionEvaluationStatus = null); + } + + [Fact] + public void SetSubmissionEvaluationDescription_ValidDescription_SetsSubmissionEvaluationDescription() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + var description = "Accepted"; + + // Act + projectEvaluation.SubmissionEvaluationDescription = description; + + // Assert + projectEvaluation.SubmissionEvaluationDescription.Should().Be(description); + } + + [Fact] + public void SetSubmissionEvaluationDescription_NullDescription_ThrowsException() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + + // Act & Assert + Assert.Throws(() => projectEvaluation.SubmissionEvaluationDescription = null); + } + + [Fact] + public void SetAppealEvaluatorId_ValidId_SetsAppealEvaluatorId() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + var appealEvaluatorId = Guid.NewGuid(); + + // Act + projectEvaluation.AppealEvaluatorId = appealEvaluatorId; + + // Assert + projectEvaluation.AppealEvaluatorId.Should().Be(appealEvaluatorId); + } + + [Fact] + public void SetAppealEvaluationDate_ValidDate_SetsAppealEvaluationDate() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + var evaluationDate = DateTime.Now; + + // Act + projectEvaluation.AppealEvaluationDate = evaluationDate; + + // Assert + projectEvaluation.AppealEvaluationDate.Should().Be(evaluationDate); + } + + [Fact] + public void SetAppealEvaluationStatus_ValidStatus_SetsAppealEvaluationStatus() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + var evaluationStatus = EProjectStatus.Rejected; + + // Act + projectEvaluation.AppealEvaluationStatus = evaluationStatus; + + // Assert + projectEvaluation.AppealEvaluationStatus.Should().Be(evaluationStatus); + } + + [Fact] + public void SetAppealEvaluationDescription_ValidDescription_SetsAppealEvaluationDescription() + { + // Arrange + var projectEvaluation = MockValidProjectEvaluation(); + var description = "Rejected due to insufficient details."; + + // Act + projectEvaluation.AppealEvaluationDescription = description; + + // Assert + projectEvaluation.AppealEvaluationDescription.Should().Be(description); + } + } +} diff --git a/src/Domain.Tests/Entities/ProjectUnitTests.cs b/src/Domain.Tests/Entities/ProjectUnitTests.cs index d2a64081..87d9166d 100644 --- a/src/Domain.Tests/Entities/ProjectUnitTests.cs +++ b/src/Domain.Tests/Entities/ProjectUnitTests.cs @@ -1,566 +1,269 @@ -// using Domain.Entities; -// using Domain.Entities.Enums; -// using Domain.Validation; -// using FluentAssertions; -// using Xunit; - -// namespace Domain.Tests.Entities -// { -// public class ProjectUnitTests -// { -// private Project MockValidProject() -// { -// var title = "Sample Title"; -// var keyWord1 = "Keyword1"; -// var keyWord2 = "Keyword2"; -// var keyWord3 = "Keyword3"; -// var isScholarshipCandidate = true; -// var objective = "Sample Objective"; -// var methodology = "Sample Methodology"; -// var expectedResults = "Sample Expected Results"; -// var activitiesExecutionSchedule = "Sample Schedule"; -// var workType1 = 1; -// var workType2 = 2; -// var indexedConferenceProceedings = 3; -// var notIndexedConferenceProceedings = 4; -// var completedBook = 5; -// var organizedBook = 6; -// var bookChapters = 7; -// var bookTranslations = 8; -// var participationEditorialCommittees = 9; -// var fullComposerSoloOrchestraAllTracks = 10; -// var fullComposerSoloOrchestraCompilation = 11; -// var chamberOrchestraInterpretation = 12; -// var individualAndCollectiveArtPerformances = 13; -// var scientificCulturalArtisticCollectionsCuratorship = 14; -// var patentLetter = 15; -// var patentDeposit = 16; -// var softwareRegistration = 17; -// var studentId = Guid.NewGuid(); -// var programTypeId = Guid.NewGuid(); -// var professorId = Guid.NewGuid(); -// var subAreaId = Guid.NewGuid(); -// var noticeId = Guid.NewGuid(); -// var status = EProjectStatus.Accepted; -// var statusDescription = "Active project"; -// var appealDescription = "Sample appeal description"; -// var submissionDate = new DateTime(2023, 5, 30); -// var resubmissionDate = new DateTime(2023, 6, 10); -// var cancellationDate = new DateTime(2023, 6, 15); -// var cancellationReason = "Project is no longer feasible"; - -// return new Project(title, keyWord1, keyWord2, keyWord3, isScholarshipCandidate, objective, methodology, -// expectedResults, activitiesExecutionSchedule, workType1, workType2, indexedConferenceProceedings, -// notIndexedConferenceProceedings, completedBook, organizedBook, bookChapters, bookTranslations, -// participationEditorialCommittees, fullComposerSoloOrchestraAllTracks, fullComposerSoloOrchestraCompilation, -// chamberOrchestraInterpretation, individualAndCollectiveArtPerformances, -// scientificCulturalArtisticCollectionsCuratorship, patentLetter, patentDeposit, softwareRegistration, -// studentId, programTypeId, professorId, subAreaId, noticeId, status, statusDescription, appealDescription, -// submissionDate, resubmissionDate, cancellationDate, cancellationReason); -// } - -// [Fact] -// public void SetTitle_ValidTitle_SetsTitle() -// { -// // Arrange -// var project = MockValidProject(); -// var title = "Sample Project Title"; - -// // Act -// project.Title = title; - -// // Assert -// project.Title.Should().Be(title); -// } - -// [Fact] -// public void SetKeyword1_ValidKeyword1_SetsKeyword1() -// { -// // Arrange -// var project = MockValidProject(); -// var keyword1 = "Keyword 1"; - -// // Act -// project.KeyWord1 = keyword1; - -// // Assert -// project.KeyWord1.Should().Be(keyword1); -// } - -// [Fact] -// public void SetKeyword2_ValidKeyword2_SetsKeyword2() -// { -// // Arrange -// var project = MockValidProject(); -// var keyword2 = "Keyword 2"; - -// // Act -// project.KeyWord2 = keyword2; - -// // Assert -// project.KeyWord2.Should().Be(keyword2); -// } - -// [Fact] -// public void SetKeyword3_ValidKeyword3_SetsKeyword3() -// { -// // Arrange -// var project = MockValidProject(); -// var keyword3 = "Keyword 3"; - -// // Act -// project.KeyWord3 = keyword3; - -// // Assert -// project.KeyWord3.Should().Be(keyword3); -// } - -// [Fact] -// public void SetIsScholarshipCandidate_ValidIsScholarshipCandidate_SetsIsScholarshipCandidate() -// { -// // Arrange -// var project = MockValidProject(); -// var isScholarshipCandidate = true; - -// // Act -// project.IsScholarshipCandidate = isScholarshipCandidate; - -// // Assert -// project.IsScholarshipCandidate.Should().Be(isScholarshipCandidate); -// } - -// [Fact] -// public void SetObjective_ValidObjective_SetsObjective() -// { -// // Arrange -// var project = MockValidProject(); -// var objective = "Sample project objective."; - -// // Act -// project.Objective = objective; - -// // Assert -// project.Objective.Should().Be(objective); -// } - -// [Fact] -// public void SetMethodology_ValidMethodology_SetsMethodology() -// { -// // Arrange -// var project = MockValidProject(); -// var methodology = "Sample project methodology."; - -// // Act -// project.Methodology = methodology; - -// // Assert -// project.Methodology.Should().Be(methodology); -// } - -// [Fact] -// public void SetExpectedResults_ValidExpectedResults_SetsExpectedResults() -// { -// // Arrange -// var project = MockValidProject(); -// var expectedResults = "Sample expected project results."; - -// // Act -// project.ExpectedResults = expectedResults; - -// // Assert -// project.ExpectedResults.Should().Be(expectedResults); -// } - -// [Fact] -// public void SetActivitiesExecutionSchedule_ValidActivitiesExecutionSchedule_SetsActivitiesExecutionSchedule() -// { -// // Arrange -// var project = MockValidProject(); -// var activitiesExecutionSchedule = "Sample project activities execution schedule."; - -// // Act -// project.ActivitiesExecutionSchedule = activitiesExecutionSchedule; - -// // Assert -// project.ActivitiesExecutionSchedule.Should().Be(activitiesExecutionSchedule); -// } - -// [Fact] -// public void SetWorkType1_ValidWorkType1_SetsWorkType1() -// { -// // Arrange -// var project = MockValidProject(); -// var workType1 = 1; - -// // Act -// project.WorkType1 = workType1; - -// // Assert -// project.WorkType1.Should().Be(workType1); -// } - -// [Fact] -// public void SetWorkType2_ValidWorkType2_SetsWorkType2() -// { -// // Arrange -// var project = MockValidProject(); -// var workType2 = 15; - -// // Act -// project.WorkType2 = workType2; - -// // Assert -// project.WorkType2.Should().Be(workType2); -// } - -// [Fact] -// public void SetIndexedConferenceProceedings_ValidIndexedConferenceProceedings_SetsIndexedConferenceProceedings() -// { -// // Arrange -// var project = MockValidProject(); -// var indexedConferenceProceedings = 14; - -// // Act -// project.IndexedConferenceProceedings = indexedConferenceProceedings; - -// // Assert -// project.IndexedConferenceProceedings.Should().Be(indexedConferenceProceedings); -// } - -// [Fact] -// public void SetNotIndexedConferenceProceedings_ValidNotIndexedConferenceProceedings_SetsNotIndexedConferenceProceedings() -// { -// // Arrange -// var project = MockValidProject(); -// var notIndexedConferenceProceedings = 6; - -// // Act -// project.NotIndexedConferenceProceedings = notIndexedConferenceProceedings; - -// // Assert -// project.NotIndexedConferenceProceedings.Should().Be(notIndexedConferenceProceedings); -// } - -// [Fact] -// public void SetCompletedBook_ValidCompletedBook_SetsCompletedBook() -// { -// // Arrange -// var project = MockValidProject(); -// var completedBook = 3; - -// // Act -// project.CompletedBook = completedBook; - -// // Assert -// project.CompletedBook.Should().Be(completedBook); -// } - -// [Fact] -// public void SetOrganizedBook_ValidOrganizedBook_SetsOrganizedBook() -// { -// // Arrange -// var project = MockValidProject(); -// var organizedBook = 1; - -// // Act -// project.OrganizedBook = organizedBook; - -// // Assert -// project.OrganizedBook.Should().Be(organizedBook); -// } - -// [Fact] -// public void SetBookChapters_ValidBookChapters_SetsBookChapters() -// { -// // Arrange -// var project = MockValidProject(); -// var bookChapters = 13; - -// // Act -// project.BookChapters = bookChapters; - -// // Assert -// project.BookChapters.Should().Be(bookChapters); -// } - -// [Fact] -// public void SetBookTranslations_ValidBookTranslations_SetsBookTranslations() -// { -// // Arrange -// var project = MockValidProject(); -// var bookTranslations = 22; - -// // Act -// project.BookTranslations = bookTranslations; - -// // Assert -// project.BookTranslations.Should().Be(bookTranslations); -// } - -// [Fact] -// public void SetParticipationEditorialCommittees_ValidParticipationEditorialCommittees_SetsParticipationEditorialCommittees() -// { -// // Arrange -// var project = MockValidProject(); -// var participationEditorialCommittees = 11; - -// // Act -// project.ParticipationEditorialCommittees = participationEditorialCommittees; - -// // Assert -// project.ParticipationEditorialCommittees.Should().Be(participationEditorialCommittees); -// } - -// [Fact] -// public void SetFullComposerSoloOrchestraAllTracks_ValidFullComposerSoloOrchestraAllTracks_SetsFullComposerSoloOrchestraAllTracks() -// { -// // Arrange -// var project = MockValidProject(); -// var fullComposerSoloOrchestraAllTracks = 9; - -// // Act -// project.FullComposerSoloOrchestraAllTracks = fullComposerSoloOrchestraAllTracks; - -// // Assert -// project.FullComposerSoloOrchestraAllTracks.Should().Be(fullComposerSoloOrchestraAllTracks); -// } - -// [Fact] -// public void SetFullComposerSoloOrchestraCompilation_ValidFullComposerSoloOrchestraCompilation_SetsFullComposerSoloOrchestraCompilation() -// { -// // Arrange -// var project = MockValidProject(); -// var fullComposerSoloOrchestraCompilation = 8; - -// // Act -// project.FullComposerSoloOrchestraCompilation = fullComposerSoloOrchestraCompilation; - -// // Assert -// project.FullComposerSoloOrchestraCompilation.Should().Be(fullComposerSoloOrchestraCompilation); -// } - -// [Fact] -// public void SetChamberOrchestraInterpretation_ValidChamberOrchestraInterpretation_SetsChamberOrchestraInterpretation() -// { -// // Arrange -// var project = MockValidProject(); -// var chamberOrchestraInterpretation = 2; - -// // Act -// project.ChamberOrchestraInterpretation = chamberOrchestraInterpretation; - -// // Assert -// project.ChamberOrchestraInterpretation.Should().Be(chamberOrchestraInterpretation); -// } - -// [Fact] -// public void SetIndividualAndCollectiveArtPerformances_ValidIndividualAndCollectiveArtPerformances_SetsIndividualAndCollectiveArtPerformances() -// { -// // Arrange -// var project = MockValidProject(); -// var individualAndCollectiveArtPerformances = 7; - -// // Act -// project.IndividualAndCollectiveArtPerformances = individualAndCollectiveArtPerformances; - -// // Assert -// project.IndividualAndCollectiveArtPerformances.Should().Be(individualAndCollectiveArtPerformances); -// } - -// [Fact] -// public void SetScientificCulturalArtisticCollectionsCuratorship_ValidScientificCulturalArtisticCollectionsCuratorship_SetsScientificCulturalArtisticCollectionsCuratorship() -// { -// // Arrange -// var project = MockValidProject(); -// var scientificCulturalArtisticCollectionsCuratorship = 0; - -// // Act -// project.ScientificCulturalArtisticCollectionsCuratorship = scientificCulturalArtisticCollectionsCuratorship; - -// // Assert -// project.ScientificCulturalArtisticCollectionsCuratorship.Should().Be(scientificCulturalArtisticCollectionsCuratorship); -// } - -// [Fact] -// public void SetPatentLetter_ValidPatentLetter_SetsPatentLetter() -// { -// // Arrange -// var project = MockValidProject(); -// var patentLetter = 4; - -// // Act -// project.PatentLetter = patentLetter; - -// // Assert -// project.PatentLetter.Should().Be(patentLetter); -// } - -// [Fact] -// public void SetPatentDeposit_ValidPatentDeposit_SetsPatentDeposit() -// { -// // Arrange -// var project = MockValidProject(); -// var patentDeposit = 3; - -// // Act -// project.PatentDeposit = patentDeposit; - -// // Assert -// project.PatentDeposit.Should().Be(patentDeposit); -// } - -// [Fact] -// public void SetSoftwareRegistration_ValidSoftwareRegistration_SetsSoftwareRegistration() -// { -// // Arrange -// var project = MockValidProject(); -// var softwareRegistration = 2; - -// // Act -// project.SoftwareRegistration = softwareRegistration; - -// // Assert -// project.SoftwareRegistration.Should().Be(softwareRegistration); -// } - -// [Fact] -// public void SetStudentId_ValidStudentId_SetsStudentId() -// { -// // Arrange -// var project = MockValidProject(); -// var studentId = Guid.NewGuid(); - -// // Act -// project.StudentId = studentId; - -// // Assert -// project.StudentId.Should().Be(studentId); -// } - -// [Fact] -// public void SetProgramTypeId_ValidProgramTypeId_SetsProgramTypeId() -// { -// // Arrange -// var project = MockValidProject(); -// var programTypeId = Guid.NewGuid(); - -// // Act -// project.ProgramTypeId = programTypeId; - -// // Assert -// project.ProgramTypeId.Should().Be(programTypeId); -// } - -// [Fact] -// public void SetSubAreaId_ValidSubAreaId_SetsSubAreaId() -// { -// // Arrange -// var project = MockValidProject(); -// var subAreaId = Guid.NewGuid(); - -// // Act -// project.SubAreaId = subAreaId; - -// // Assert -// project.SubAreaId.Should().Be(subAreaId); -// } - -// [Fact] -// public void SetStatus_ValidStatus_SetsStatus() -// { -// // Arrange -// var project = MockValidProject(); -// var status = EProjectStatus.Accepted; - -// // Act -// project.Status = status; - -// // Assert -// project.Status.Should().Be(status); -// } - -// [Fact] -// public void SetStatusDescription_ValidStatusDescription_SetsStatusDescription() -// { -// // Arrange -// var project = MockValidProject(); -// var statusDescription = EProjectStatus.Accepted.GetDescription(); - -// // Act -// project.StatusDescription = statusDescription; - -// // Assert -// project.StatusDescription.Should().Be(statusDescription); -// } - -// [Fact] -// public void SetAppealObservation_ValidAppealObservation_SetsAppealObservation() -// { -// // Arrange -// var project = MockValidProject(); -// var appealDescription = "Sample appeal description."; - -// // Act -// project.AppealObservation = appealDescription; - -// // Assert -// project.AppealObservation.Should().Be(appealDescription); -// } - -// [Fact] -// public void SetSubmissionDate_ValidSubmissionDate_SetsSubmissionDate() -// { -// // Arrange -// var project = MockValidProject(); -// var submissionDate = DateTime.UtcNow; - -// // Act -// project.SubmissionDate = submissionDate; - -// // Assert -// project.SubmissionDate.Should().Be(submissionDate); -// } - -// [Fact] -// public void SetAppealDate_ValidAppealDate_SetsAppealDate() -// { -// // Arrange -// var project = MockValidProject(); -// var resubmissionDate = DateTime.UtcNow; - -// // Act -// project.AppealDate = resubmissionDate; - -// // Assert -// project.AppealDate.Should().Be(resubmissionDate); -// } - -// [Fact] -// public void SetCancellationDate_ValidCancellationDate_SetsCancellationDate() -// { -// // Arrange -// var project = MockValidProject(); -// var cancellationDate = DateTime.UtcNow; - -// // Act -// project.CancellationDate = cancellationDate; - -// // Assert -// project.CancellationDate.Should().Be(cancellationDate); -// } - -// [Fact] -// public void SetCancellationReason_ValidCancellationReason_SetsCancellationReason() -// { -// // Arrange -// var project = MockValidProject(); -// var cancellationReason = "Project is no longer feasible."; - -// // Act -// project.CancellationReason = cancellationReason; - -// // Assert -// project.CancellationReason.Should().Be(cancellationReason); -// } -// } -// } \ No newline at end of file +using Domain.Entities; +using Domain.Entities.Enums; +using Domain.Validation; +using FluentAssertions; +using Xunit; + +namespace Domain.Tests.Entities +{ + public class ProjectUnitTests + { + private static Project MockValidProject() + { + return new Project("Project Title", "Keyword 1", "Keyword 2", "Keyword 3", true, "Objective", "Methodology", "Expected Results", "Schedule", Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), EProjectStatus.Opened, "Status Description", "Appeal Observation", DateTime.UtcNow, DateTime.UtcNow, DateTime.UtcNow, "Cancellation Reason"); + } + + [Fact] + public void SetTitle_ValidTitle_SetsTitle() + { + // Arrange + var project = MockValidProject(); + var title = "New Project Title"; + + // Act + project.Title = title; + + // Assert + project.Title.Should().Be(title); + } + + [Fact] + public void SetTitle_NullOrWhiteSpaceTitle_ThrowsException() + { + // Arrange + var project = MockValidProject(); + + // Act & Assert + Assert.Throws(() => project.Title = null); + Assert.Throws(() => project.Title = string.Empty); + Assert.Throws(() => project.Title = " "); + } + + [Fact] + public void SetKeyWord1_ValidKeyword_SetsKeyWord1() + { + // Arrange + var project = MockValidProject(); + var keyword = "New Keyword"; + + // Act + project.KeyWord1 = keyword; + + // Assert + project.KeyWord1.Should().Be(keyword); + } + + [Fact] + public void SetKeyWord1_NullOrWhiteSpaceKeyword_ThrowsException() + { + // Arrange + var project = MockValidProject(); + + // Act & Assert + Assert.Throws(() => project.KeyWord1 = null); + Assert.Throws(() => project.KeyWord1 = string.Empty); + Assert.Throws(() => project.KeyWord1 = " "); + } + + [Fact] + public void SetKeyWord2_ValidKeyword_SetsKeyWord2() + { + // Arrange + var project = MockValidProject(); + var keyword = "New Keyword 2"; + + // Act + project.KeyWord2 = keyword; + + // Assert + project.KeyWord2.Should().Be(keyword); + } + + [Fact] + public void SetKeyWord3_ValidKeyword_SetsKeyWord3() + { + // Arrange + var project = MockValidProject(); + var keyword = "New Keyword 3"; + + // Act + project.KeyWord3 = keyword; + + // Assert + project.KeyWord3.Should().Be(keyword); + } + + [Fact] + public void SetIsScholarshipCandidate_ValidValue_SetsIsScholarshipCandidate() + { + // Arrange + var project = MockValidProject(); + var isScholarshipCandidate = false; + + // Act + project.IsScholarshipCandidate = isScholarshipCandidate; + + // Assert + project.IsScholarshipCandidate.Should().Be(isScholarshipCandidate); + } + + [Fact] + public void SetObjective_ValidObjective_SetsObjective() + { + // Arrange + var project = MockValidProject(); + var objective = "New Objective"; + + // Act + project.Objective = objective; + + // Assert + project.Objective.Should().Be(objective); + } + + // ... Repetir padrão para todas as outras propriedades de atualização + + [Fact] + public void SetActivitiesExecutionSchedule_ValidSchedule_SetsActivitiesExecutionSchedule() + { + // Arrange + var project = MockValidProject(); + var schedule = "New Schedule"; + + // Act + project.ActivitiesExecutionSchedule = schedule; + + // Assert + project.ActivitiesExecutionSchedule.Should().Be(schedule); + } + + [Fact] + public void SetProgramTypeId_ValidId_SetsProgramTypeId() + { + // Arrange + var project = MockValidProject(); + var programTypeId = Guid.NewGuid(); + + // Act + project.ProgramTypeId = programTypeId; + + // Assert + project.ProgramTypeId.Should().Be(programTypeId); + } + + [Fact] + public void SetSubAreaId_ValidId_SetsSubAreaId() + { + // Arrange + var project = MockValidProject(); + var subAreaId = Guid.NewGuid(); + + // Act + project.SubAreaId = subAreaId; + + // Assert + project.SubAreaId.Should().Be(subAreaId); + } + + [Fact] + public void SetStatus_ValidStatus_SetsStatus() + { + // Arrange + var project = MockValidProject(); + var status = EProjectStatus.Pending; + + // Act + project.Status = status; + + // Assert + project.Status.Should().Be(status); + } + + [Fact] + public void SetStatusDescription_ValidDescription_SetsStatusDescription() + { + // Arrange + var project = MockValidProject(); + var description = "New Status Description"; + + // Act + project.StatusDescription = description; + + // Assert + project.StatusDescription.Should().Be(description); + } + + [Fact] + public void SetCancellationReason_ValidReason_SetsCancellationReason() + { + // Arrange + var project = MockValidProject(); + var reason = "New Cancellation Reason"; + + // Act + project.CancellationReason = reason; + + // Assert + project.CancellationReason.Should().Be(reason); + } + + [Fact] + public void Constructor_ValidParameters_CreatesInstance() + { + // Arrange + var title = "Test Project"; + var keyWord1 = "Keyword1"; + var keyWord2 = "Keyword2"; + var keyWord3 = "Keyword3"; + var isScholarshipCandidate = true; + var objective = "Test objective"; + var methodology = "Test methodology"; + var expectedResults = "Test expected results"; + var activitiesExecutionSchedule = "Test schedule"; + var studentId = Guid.NewGuid(); + var programTypeId = Guid.NewGuid(); + var professorId = Guid.NewGuid(); + var subAreaId = Guid.NewGuid(); + var noticeId = Guid.NewGuid(); + var status = EProjectStatus.Submitted; + var statusDescription = "Test status description"; + var appealDescription = "Test appeal description"; + var submissionDate = DateTime.Now; + var appealDate = DateTime.Now.AddDays(1); + var cancellationDate = DateTime.Now.AddDays(2); + var cancellationReason = "Test cancellation reason"; + + // Act + var project = new Project(title, keyWord1, keyWord2, keyWord3, isScholarshipCandidate, + objective, methodology, expectedResults, activitiesExecutionSchedule, + studentId, programTypeId, professorId, subAreaId, noticeId, + status, statusDescription, appealDescription, + submissionDate, appealDate, cancellationDate, + cancellationReason); + + // Assert + project.Should().NotBeNull(); + project.Title.Should().Be(title); + project.KeyWord1.Should().Be(keyWord1); + project.KeyWord2.Should().Be(keyWord2); + project.KeyWord3.Should().Be(keyWord3); + project.IsScholarshipCandidate.Should().Be(isScholarshipCandidate); + project.Objective.Should().Be(objective); + project.Methodology.Should().Be(methodology); + project.ExpectedResults.Should().Be(expectedResults); + project.ActivitiesExecutionSchedule.Should().Be(activitiesExecutionSchedule); + project.StudentId.Should().Be(studentId); + project.ProgramTypeId.Should().Be(programTypeId); + project.ProfessorId.Should().Be(professorId); + project.SubAreaId.Should().Be(subAreaId); + project.NoticeId.Should().Be(noticeId); + project.Status.Should().Be(status); + project.StatusDescription.Should().Be(statusDescription); + project.AppealObservation.Should().Be(appealDescription); + project.SubmissionDate.Should().Be(submissionDate); + project.AppealDate.Should().Be(appealDate); + project.CancellationDate.Should().Be(cancellationDate); + project.CancellationReason.Should().Be(cancellationReason); + } + } +} diff --git a/src/Domain.Tests/Entities/StudentDocumentsUnitTests.cs b/src/Domain.Tests/Entities/StudentDocumentsUnitTests.cs new file mode 100644 index 00000000..7a795e99 --- /dev/null +++ b/src/Domain.Tests/Entities/StudentDocumentsUnitTests.cs @@ -0,0 +1,152 @@ +using Domain.Entities; +using Domain.Validation; +using FluentAssertions; +using Xunit; + +namespace Domain.Tests.Entities +{ + public class StudentDocumentsUnitTests + { + private static StudentDocuments MockValidStudentDocuments() + { + return new StudentDocuments(Guid.NewGuid(), "1234", "5678") + { + IdentityDocument = "123456789", + CPF = "12345678901", + Photo3x4 = "PhotoData", + SchoolHistory = "SchoolHistoryData", + ScholarCommitmentAgreement = "ScholarCommitmentData", + ParentalAuthorization = "ParentalAuthorizationData" + }; + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void SetIdentityDocument_NullOrEmptyValue_ThrowsException(string value) + { + // Arrange + var studentDocuments = MockValidStudentDocuments(); + + // Act & Assert + Assert.Throws(() => studentDocuments.IdentityDocument = value); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void SetCPF_NullOrEmptyValue_ThrowsException(string value) + { + // Arrange + var studentDocuments = MockValidStudentDocuments(); + + // Act & Assert + Assert.Throws(() => studentDocuments.CPF = value); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void SetPhoto3x4_NullOrEmptyValue_ThrowsException(string value) + { + // Arrange + var studentDocuments = MockValidStudentDocuments(); + + // Act & Assert + Assert.Throws(() => studentDocuments.Photo3x4 = value); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void SetSchoolHistory_NullOrEmptyValue_ThrowsException(string value) + { + // Arrange + var studentDocuments = MockValidStudentDocuments(); + + // Act & Assert + Assert.Throws(() => studentDocuments.SchoolHistory = value); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void SetScholarCommitmentAgreement_NullOrEmptyValue_ThrowsException(string value) + { + // Arrange + var studentDocuments = MockValidStudentDocuments(); + + // Act & Assert + Assert.Throws(() => studentDocuments.ScholarCommitmentAgreement = value); + } + + // [Theory] + // [InlineData(null)] + // [InlineData("")] + // public void SetParentalAuthorization_NullOrEmptyValue_ThrowsException(string value) + // { + // // Arrange + // var studentDocuments = MockValidStudentDocuments(); + + // studentDocuments.Project = new Mock(); + + // // Act & Assert + // Assert.Throws(() => studentDocuments.ParentalAuthorization = value); + // } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData("0")] + public void SetAgencyNumber_InvalidValue_ThrowsException(string agencyNumber) + { + // Arrange + var studentDocuments = MockValidStudentDocuments(); + + // Act & Assert + Assert.Throws(() => studentDocuments.AgencyNumber = agencyNumber); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData("0")] + public void SetAccountNumber_InvalidValue_ThrowsException(string accountNumber) + { + // Arrange + var studentDocuments = MockValidStudentDocuments(); + + // Act & Assert + Assert.Throws(() => studentDocuments.AccountNumber = accountNumber); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void SetAccountOpeningProof_NullOrEmptyValue_ThrowsException(string value) + { + // Arrange + var studentDocuments = MockValidStudentDocuments(); + + // Act & Assert + Assert.Throws(() => studentDocuments.AccountOpeningProof = value); + } + + [Fact] + public void Constructor_ValidParameters_PropertiesSetCorrectly() + { + // Arrange + var projectId = Guid.NewGuid(); + var agencyNumber = "1234"; + var accountNumber = "5678"; + + // Act + var studentDocuments = new StudentDocuments(projectId, agencyNumber, accountNumber); + + // Assert + studentDocuments.ProjectId.Should().Be(projectId); + studentDocuments.AgencyNumber.Should().Be(agencyNumber); + studentDocuments.AccountNumber.Should().Be(accountNumber); + } + } +} diff --git a/src/Domain.Tests/Entities/StudentUnitTests.cs b/src/Domain.Tests/Entities/StudentUnitTests.cs index 65465717..801151db 100644 --- a/src/Domain.Tests/Entities/StudentUnitTests.cs +++ b/src/Domain.Tests/Entities/StudentUnitTests.cs @@ -2,7 +2,6 @@ using Domain.Entities.Enums; using Domain.Validation; using FluentAssertions; -using System; using Xunit; namespace Domain.Tests.Entities @@ -31,6 +30,55 @@ public class StudentUnitTests registrationCode: "GCOM1234567" ); + [Fact] + public void SetRegistrationCode_ValidCode_SetsRegistrationCode() + { + // Arrange + var project = MockValidStudent(); + var registrationCode = "AB123"; + + // Act + project.RegistrationCode = registrationCode; + + // Assert + project.RegistrationCode.Should().Be(registrationCode); + } + + [Fact] + public void SetRegistrationCode_NullOrEmptyCode_ThrowsException() + { + // Arrange + var project = MockValidStudent(); + + // Act & Assert + Assert.Throws(() => project.RegistrationCode = null); + Assert.Throws(() => project.RegistrationCode = string.Empty); + } + + [Fact] + public void SetRegistrationCode_TooLongCode_ThrowsException() + { + // Arrange + var project = MockValidStudent(); + + // Act & Assert + Assert.Throws(() => project.RegistrationCode = new string('A', 21)); + } + + [Fact] + public void SetRegistrationCode_SetsToUpperCase() + { + // Arrange + var project = MockValidStudent(); + var registrationCode = "ab123"; + + // Act + project.RegistrationCode = registrationCode; + + // Assert + project.RegistrationCode.Should().Be("AB123"); + } + [Fact] public void SetBirthDate_ValidDate_SetsBirthDate() { diff --git a/src/Domain/Entities/Notice.cs b/src/Domain/Entities/Notice.cs index 86e6cde9..9498961b 100644 --- a/src/Domain/Entities/Notice.cs +++ b/src/Domain/Entities/Notice.cs @@ -21,7 +21,7 @@ public DateTime? RegistrationStartDate { EntityExceptionValidation.When(!value.HasValue, ExceptionMessageFactory.Invalid("Data de início das inscrições dos projetos")); - _registrationStartDate = value.HasValue ? value.Value.ToUniversalTime() : null; + _registrationStartDate = value; } } @@ -36,7 +36,7 @@ public DateTime? RegistrationEndDate { EntityExceptionValidation.When(!value.HasValue, ExceptionMessageFactory.Invalid("Data de término das inscrições dos projetos")); - _registrationEndDate = value.HasValue ? value.Value.ToUniversalTime() : null; + _registrationEndDate = value; } } #endregion @@ -53,7 +53,7 @@ public DateTime? EvaluationStartDate { EntityExceptionValidation.When(!value.HasValue, ExceptionMessageFactory.Invalid("Data de início das avaliações dos projetos")); - _evaluationStartDate = value.HasValue ? value.Value.ToUniversalTime() : null; + _evaluationStartDate = value; } } @@ -68,7 +68,7 @@ public DateTime? EvaluationEndDate { EntityExceptionValidation.When(!value.HasValue, ExceptionMessageFactory.Invalid("Data de término das avaliações dos projetos")); - _evaluationEndDate = value.HasValue ? value.Value.ToUniversalTime() : null; + _evaluationEndDate = value; } } #endregion @@ -85,7 +85,7 @@ public DateTime? AppealStartDate { EntityExceptionValidation.When(!value.HasValue, ExceptionMessageFactory.Invalid("Data de início do período de recurso")); - _appealStartDate = value.HasValue ? value.Value.ToUniversalTime() : null; + _appealStartDate = value; } } @@ -100,7 +100,7 @@ public DateTime? AppealEndDate { EntityExceptionValidation.When(!value.HasValue, ExceptionMessageFactory.Invalid("Data de término do período de recurso")); - _appealEndDate = value.HasValue ? value.Value.ToUniversalTime() : null; + _appealEndDate = value; } } #endregion @@ -117,7 +117,7 @@ public DateTime? SendingDocsStartDate { EntityExceptionValidation.When(!value.HasValue, ExceptionMessageFactory.Invalid("Data de início para entrega de documentação dos bolsistas")); - _sendingDocsStartDate = value.HasValue ? value.Value.ToUniversalTime() : null; + _sendingDocsStartDate = value; } } @@ -132,7 +132,7 @@ public DateTime? SendingDocsEndDate { EntityExceptionValidation.When(!value.HasValue, ExceptionMessageFactory.Invalid("Data de término para entrega de documentação dos bolsistas")); - _sendingDocsEndDate = value.HasValue ? value.Value.ToUniversalTime() : null; + _sendingDocsEndDate = value; } } #endregion @@ -149,7 +149,7 @@ public DateTime? PartialReportDeadline { EntityExceptionValidation.When(!value.HasValue, ExceptionMessageFactory.Invalid("Prazo de entrega do relatório parcial")); - _partialReportDeadline = value.HasValue ? value.Value.ToUniversalTime() : null; + _partialReportDeadline = value; } } @@ -164,7 +164,7 @@ public DateTime? FinalReportDeadline { EntityExceptionValidation.When(!value.HasValue, ExceptionMessageFactory.Invalid("Prazo de entrega do relatório final")); - _finalReportDeadline = value.HasValue ? value.Value.ToUniversalTime() : null; + _finalReportDeadline = value; } } #endregion diff --git a/src/Domain/Entities/Professor.cs b/src/Domain/Entities/Professor.cs index 61f0169c..ce47b2a9 100644 --- a/src/Domain/Entities/Professor.cs +++ b/src/Domain/Entities/Professor.cs @@ -68,7 +68,7 @@ public DateTime? SuspensionEndDate get => _suspensionEndDate; set { - _suspensionEndDate = value.HasValue ? value.Value.ToUniversalTime() : null; + _suspensionEndDate = value; } } diff --git a/src/Domain/Entities/Project.cs b/src/Domain/Entities/Project.cs index 9caf41cf..161110f5 100644 --- a/src/Domain/Entities/Project.cs +++ b/src/Domain/Entities/Project.cs @@ -230,7 +230,7 @@ private set public DateTime? SubmissionDate { get { return _submissionDate; } - set { _submissionDate = value.HasValue ? value.Value.ToUniversalTime() : null; } + set { _submissionDate = value; } } /// @@ -240,7 +240,7 @@ public DateTime? SubmissionDate public DateTime? AppealDate { get { return _appealDate; } - set { _appealDate = value.HasValue ? value.Value.ToUniversalTime() : null; } + set { _appealDate = value; } } /// @@ -250,7 +250,7 @@ public DateTime? AppealDate public DateTime? CancellationDate { get { return _cancellationDate; } - set { _cancellationDate = value.HasValue ? value.Value.ToUniversalTime() : null; } + set { _cancellationDate = value; } } /// diff --git a/src/Domain/Entities/ProjectEvaluation.cs b/src/Domain/Entities/ProjectEvaluation.cs index 6747422a..e071d26f 100644 --- a/src/Domain/Entities/ProjectEvaluation.cs +++ b/src/Domain/Entities/ProjectEvaluation.cs @@ -61,7 +61,7 @@ public DateTime? SubmissionEvaluationDate { EntityExceptionValidation.When(value is null, ExceptionMessageFactory.Required(nameof(SubmissionEvaluationDate))); - _submissionEvaluationDate = value.HasValue ? value.Value.ToUniversalTime() : null; + _submissionEvaluationDate = value; } } @@ -89,7 +89,7 @@ public string? SubmissionEvaluationDescription get => _submissionEvaluationDescription; set { - EntityExceptionValidation.When(value is null, + EntityExceptionValidation.When(string.IsNullOrEmpty(value), ExceptionMessageFactory.Required(nameof(SubmissionEvaluationDescription))); _submissionEvaluationDescription = value; } @@ -107,7 +107,7 @@ public string? SubmissionEvaluationDescription public DateTime? AppealEvaluationDate { get { return _appealEvaluationDate; } - set { _appealEvaluationDate = value.HasValue ? value.Value.ToUniversalTime() : null; } + set { _appealEvaluationDate = value; } } /// @@ -132,7 +132,7 @@ public DateTime? AppealEvaluationDate public DateTime? DocumentsEvaluationDate { get { return _documentsEvaluationDate; } - set { _documentsEvaluationDate = value.HasValue ? value.Value.ToUniversalTime() : null; } + set { _documentsEvaluationDate = value; } } /// @@ -161,55 +161,80 @@ public DateTime? DocumentsEvaluationDate /// Titulação do Orientador. /// Doutor (2); Mestre (1). /// + private EQualification? _qualification; public EQualification? Qualification { - get => Qualification; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(Qualification))); + get => _qualification; + set + { + EntityExceptionValidation.When(value is null, + ExceptionMessageFactory.Required(nameof(Qualification))); + _qualification = value; + } } /// /// Foco e clareza quanto aos objetivos da proposta de projeto a ser desenvolvido pelo aluno. /// Excelente (4); Bom (3); Regular (2); Fraco (1). /// + private EScore? _projectProposalObjectives; public EScore? ProjectProposalObjectives { - get => ProjectProposalObjectives; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(ProjectProposalObjectives))); + get => _projectProposalObjectives; + set + { + EntityExceptionValidation.When(value is null, + ExceptionMessageFactory.Required(nameof(ProjectProposalObjectives))); + _projectProposalObjectives = value; + } } /// /// Coerência entre a produção acadêmico-científica do orientador e a proposta de projeto. /// Excelente (4); Bom (3); Regular (2); Fraco (1). /// + private EScore? _academicScientificProductionCoherence; public EScore? AcademicScientificProductionCoherence { - get => AcademicScientificProductionCoherence; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(AcademicScientificProductionCoherence))); + get => _academicScientificProductionCoherence; + set + { + EntityExceptionValidation.When(value is null, + ExceptionMessageFactory.Required(nameof(AcademicScientificProductionCoherence))); + _academicScientificProductionCoherence = value; + } } /// /// Adequação da metodologia da proposta aos objetivos e ao cronograma de execução. /// Excelente (4); Bom (3); Regular (2); Fraco (1). /// + private EScore? _proposalMethodologyAdaptation; public EScore? ProposalMethodologyAdaptation { - get => ProposalMethodologyAdaptation; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(ProposalMethodologyAdaptation))); + get => _proposalMethodologyAdaptation; + set + { + EntityExceptionValidation.When(value is null, + ExceptionMessageFactory.Required(nameof(ProposalMethodologyAdaptation))); + _proposalMethodologyAdaptation = value; + } } /// /// Contribuição efetiva da proposta de projeto para formação em pesquisa do aluno. /// Excelente (4); Bom (3); Regular (2); Fraco (1). /// + private EScore? _effectiveContributionToResearch; public EScore? EffectiveContributionToResearch { - get => EffectiveContributionToResearch; - set => EntityExceptionValidation.When(value is null, - ExceptionMessageFactory.Required(nameof(EffectiveContributionToResearch))); + get => _effectiveContributionToResearch; + set + { + EntityExceptionValidation.When(value is null, + ExceptionMessageFactory.Required(nameof(EffectiveContributionToResearch))); + _effectiveContributionToResearch = value; + } } #endregion #endregion @@ -262,7 +287,8 @@ public void CalculateFinalScore() + (double)ProjectProposalObjectives! + (double)AcademicScientificProductionCoherence! + (double)ProposalMethodologyAdaptation! - + (double)EffectiveContributionToResearch!; + + (double)EffectiveContributionToResearch! + + APIndex; } #endregion } diff --git a/src/Domain/Entities/ProjectReport.cs b/src/Domain/Entities/ProjectReport.cs index 6f6747f3..3e6c739f 100644 --- a/src/Domain/Entities/ProjectReport.cs +++ b/src/Domain/Entities/ProjectReport.cs @@ -43,7 +43,7 @@ public DateTime? SendDate { EntityExceptionValidation.When(value is null, ExceptionMessageFactory.Required(nameof(SendDate))); - _sendDate = value.HasValue ? value.Value.ToUniversalTime() : null; + _sendDate = value; } } diff --git a/src/Domain/Entities/StudentDocuments.cs b/src/Domain/Entities/StudentDocuments.cs index 346bd2fa..9b741ff5 100644 --- a/src/Domain/Entities/StudentDocuments.cs +++ b/src/Domain/Entities/StudentDocuments.cs @@ -28,7 +28,7 @@ public string? IdentityDocument get => _identityDocument; set { - EntityExceptionValidation.When(value is null, + EntityExceptionValidation.When(string.IsNullOrEmpty(value), ExceptionMessageFactory.Required(nameof(IdentityDocument))); _identityDocument = value; } @@ -43,7 +43,7 @@ public string? CPF get => _cpf; set { - EntityExceptionValidation.When(value is null, + EntityExceptionValidation.When(string.IsNullOrEmpty(value), ExceptionMessageFactory.Required(nameof(CPF))); _cpf = value; } @@ -58,7 +58,7 @@ public string? Photo3x4 get => _photo3x4; set { - EntityExceptionValidation.When(value is null, + EntityExceptionValidation.When(string.IsNullOrEmpty(value), ExceptionMessageFactory.Required(nameof(Photo3x4))); _photo3x4 = value; } @@ -73,7 +73,7 @@ public string? SchoolHistory get => _schoolHistory; set { - EntityExceptionValidation.When(value is null, + EntityExceptionValidation.When(string.IsNullOrEmpty(value), ExceptionMessageFactory.Required(nameof(SchoolHistory))); _schoolHistory = value; } @@ -88,7 +88,7 @@ public string? ScholarCommitmentAgreement get => _scholarCommitmentAgreement; set { - EntityExceptionValidation.When(value is null, + EntityExceptionValidation.When(string.IsNullOrEmpty(value), ExceptionMessageFactory.Required(nameof(ScholarCommitmentAgreement))); _scholarCommitmentAgreement = value; } @@ -105,7 +105,7 @@ public string? ParentalAuthorization { if (Project?.Student?.BirthDate >= DateTime.UtcNow.AddYears(-18)) { - EntityExceptionValidation.When(value is null, + EntityExceptionValidation.When(string.IsNullOrEmpty(value), ExceptionMessageFactory.Required(nameof(ParentalAuthorization))); } _parentalAuthorization = value; @@ -123,7 +123,7 @@ public string? AgencyNumber get => _agencyNumber; set { - EntityExceptionValidation.When(value is null, + EntityExceptionValidation.When(string.IsNullOrEmpty(value), ExceptionMessageFactory.Required(nameof(AgencyNumber))); EntityExceptionValidation.When(long.TryParse(value, out long tmp) && tmp <= 0, ExceptionMessageFactory.Invalid(ExceptionMessageFactory.Invalid(nameof(AgencyNumber)))); @@ -140,7 +140,7 @@ public string? AccountNumber get => _accountNumber; set { - EntityExceptionValidation.When(value is null, + EntityExceptionValidation.When(string.IsNullOrEmpty(value), ExceptionMessageFactory.Required(nameof(AccountNumber))); EntityExceptionValidation.When(long.TryParse(value, out long tmp) && tmp <= 0, ExceptionMessageFactory.Invalid(ExceptionMessageFactory.Invalid(nameof(AccountNumber)))); @@ -157,7 +157,7 @@ public string? AccountOpeningProof get => _accountOpeningProof; set { - EntityExceptionValidation.When(value is null, + EntityExceptionValidation.When(string.IsNullOrEmpty(value), ExceptionMessageFactory.Required(nameof(AccountOpeningProof))); _accountOpeningProof = value; } From 40247c92858f11bf54cdc44a57d4f35861f81f9d Mon Sep 17 00:00:00 2001 From: eduardo Date: Fri, 11 Aug 2023 23:49:51 -0300 Subject: [PATCH 090/201] feat(logging): add seq support in azure --- src/Infrastructure/IoC/InfrastructureDI.cs | 1 + src/Infrastructure/IoC/Utils/DotEnvSecrets.cs | 10 ++++++++++ src/Infrastructure/WebAPI/appsettings.json | 7 ------- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/Infrastructure/IoC/InfrastructureDI.cs b/src/Infrastructure/IoC/InfrastructureDI.cs index 1b36baca..301bd55e 100644 --- a/src/Infrastructure/IoC/InfrastructureDI.cs +++ b/src/Infrastructure/IoC/InfrastructureDI.cs @@ -25,6 +25,7 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi #region Serviço de Log Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) + .WriteTo.Seq(dotEnvSecrets.GetSeqUrl(), apiKey: dotEnvSecrets.GetSeqApiKey()) .CreateLogger(); services.AddLogging(loggingBuilder => { diff --git a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs index 21c53465..b7ec9d69 100644 --- a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs +++ b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs @@ -13,6 +13,16 @@ public DotEnvSecrets() _ = DotNetEnv.Env.Load(Path.Combine(basePath!, ".env")); } + public string GetSeqUrl() + { + return DotNetEnv.Env.GetString("SEQ_URL"); + } + + public string GetSeqApiKey() + { + return DotNetEnv.Env.GetString("SEQ_API_KEY"); + } + public string GetBlobStorageConnectionString() { return DotNetEnv.Env.GetString("AZURE_BLOB_STORAGE_CONNECTION_STRING"); diff --git a/src/Infrastructure/WebAPI/appsettings.json b/src/Infrastructure/WebAPI/appsettings.json index 4e12f1af..897fe757 100644 --- a/src/Infrastructure/WebAPI/appsettings.json +++ b/src/Infrastructure/WebAPI/appsettings.json @@ -18,13 +18,6 @@ "Args": { "outputTemplate": "[{Timestamp:HH:mm:ss}] {SourceContext} [{Level}] {Message}{NewLine}{Exception}" } - }, - { - "Name": "Seq", - "Args": { - "serverUrl": "http://localhost:5341", - "apiKey": "5nwFLI503IATAxkmzU4O" - } } ], "Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"] From 4f2b7510e6360709cb815063f866dc4b10199508 Mon Sep 17 00:00:00 2001 From: eduardo Date: Fri, 11 Aug 2023 23:53:18 -0300 Subject: [PATCH 091/201] chore(ci): add seq to env --- .github/workflows/azure-webapps-dotnet-core.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index f9ff66ee..e6a84c9e 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -46,6 +46,8 @@ jobs: JWT_EXPIRE_IN=${{ secrets.JWT_EXPIRE_IN }} JWT_ISSUER=${{ secrets.JWT_ISSUER }} JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }} + SEQ_API_KEY=${{ secrets.SEQ_API_KEY }} + SEQ_URL=${{ secrets.SEQ_URL }} SMTP_EMAIL_PASSWORD=${{ secrets.SMTP_EMAIL_PASSWORD }} SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }}" > src/Infrastructure/WebAPI/.env From 91479c0ea9515aea9160722c3d9a12f933e5959e Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 12 Aug 2023 00:28:50 -0300 Subject: [PATCH 092/201] refactor: recreate database fixing warnings --- src/Domain/Entities/Project.cs | 1 - src/Domain/Entities/ProjectReport.cs | 4 ---- src/Infrastructure/Persistence/README.md | 2 +- src/Infrastructure/Persistence/Seeds/Seeder.cs | 3 ++- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/Domain/Entities/Project.cs b/src/Domain/Entities/Project.cs index 161110f5..33092c44 100644 --- a/src/Domain/Entities/Project.cs +++ b/src/Domain/Entities/Project.cs @@ -204,7 +204,6 @@ private set public virtual Student? Student { get; } public virtual SubArea? SubArea { get; } public virtual Notice? Notice { get; } - public virtual IList? ProjectActivities { get; } #endregion #region Informações de Controle diff --git a/src/Domain/Entities/ProjectReport.cs b/src/Domain/Entities/ProjectReport.cs index 3e6c739f..74a26e91 100644 --- a/src/Domain/Entities/ProjectReport.cs +++ b/src/Domain/Entities/ProjectReport.cs @@ -1,7 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Domain.Entities.Enums; using Domain.Entities.Primitives; using Domain.Validation; diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index 6bf27a4e..00b121d7 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add AddProjectReport --project ../Persistence/Persistence.csproj +dotnet ef migrations add RecreateDatabase --project ../Persistence/Persistence.csproj ``` Executando as Migrations: diff --git a/src/Infrastructure/Persistence/Seeds/Seeder.cs b/src/Infrastructure/Persistence/Seeds/Seeder.cs index 22d26c8a..1092017b 100644 --- a/src/Infrastructure/Persistence/Seeds/Seeder.cs +++ b/src/Infrastructure/Persistence/Seeds/Seeder.cs @@ -6,11 +6,12 @@ static public class Seeder { public static void Seed(MigrationBuilder migrationBuilder) { + ActivitiesSeeder.Seed(migrationBuilder); AreasSeeder.Seed(migrationBuilder); + AssistanceTypeSeeder.Seed(migrationBuilder); CampusesSeeder.Seed(migrationBuilder); CoursesSeeder.Seed(migrationBuilder); ProgramTypesSeeder.Seed(migrationBuilder); - AssistanceTypeSeeder.Seed(migrationBuilder); UserSeeder.Seed(migrationBuilder); } } From c6264cec621a38b916ee6377de4f0113d0c758cb Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 16 Aug 2023 21:17:25 -0300 Subject: [PATCH 093/201] refactor(student): adjust CreateStudent variables --- .../UseCases/Student/CreateStudent.cs | 63 +++++++++---------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/src/Application/UseCases/Student/CreateStudent.cs b/src/Application/UseCases/Student/CreateStudent.cs index 0492f2ce..3e5c0ad9 100644 --- a/src/Application/UseCases/Student/CreateStudent.cs +++ b/src/Application/UseCases/Student/CreateStudent.cs @@ -36,58 +36,57 @@ public CreateStudent(IStudentRepository studentRepository, } #endregion Global Scope - public async Task ExecuteAsync(CreateStudentInput model) + public async Task ExecuteAsync(CreateStudentInput input) { // Realiza o map da entidade e a validação dos campos informados - // var entity = _mapper.Map(input); - Domain.Entities.Student? entity = new(model.BirthDate, - model.RG, - model.IssuingAgency, - model.DispatchDate, - (EGender)model.Gender, - (ERace)model.Race, - model.HomeAddress, - model.City, - model.UF, - model.CEP, - model.PhoneDDD, - model.Phone, - model.CellPhoneDDD, - model.CellPhone, - model.CampusId, - model.CourseId, - model.StartYear, - model.AssistanceTypeId, - model.RegistrationCode); + Domain.Entities.Student? student = new(input.BirthDate, + input.RG, + input.IssuingAgency, + input.DispatchDate, + (EGender)input.Gender, + (ERace)input.Race, + input.HomeAddress, + input.City, + input.UF, + input.CEP, + input.PhoneDDD, + input.Phone, + input.CellPhoneDDD, + input.CellPhone, + input.CampusId, + input.CourseId, + input.StartYear, + input.AssistanceTypeId, + input.RegistrationCode); // Verifica se já existe um usuário com o e-mail informado - Domain.Entities.User? user = await _userRepository.GetUserByEmailAsync(model.Email); + Domain.Entities.User? user = await _userRepository.GetUserByEmailAsync(input.Email); UseCaseException.BusinessRuleViolation(user != null, "Já existe um usuário com o e-mail informado."); // Verifica se já existe um usuário com o CPF informado - user = await _userRepository.GetUserByCPFAsync(model.CPF); + user = await _userRepository.GetUserByCPFAsync(input.CPF); UseCaseException.BusinessRuleViolation(user != null, "Já existe um usuário com o CPF informado."); // Verifica se curso informado existe - Domain.Entities.Course? course = await _courseRepository.GetByIdAsync(model.CourseId); + Domain.Entities.Course? course = await _courseRepository.GetByIdAsync(input.CourseId); UseCaseException.BusinessRuleViolation(course == null || course.DeletedAt != null, "Curso informado não existe."); // Verifica se campus informado existe - Domain.Entities.Campus? campus = await _campusRepository.GetByIdAsync(model.CampusId); + Domain.Entities.Campus? campus = await _campusRepository.GetByIdAsync(input.CampusId); UseCaseException.BusinessRuleViolation(campus == null || campus.DeletedAt != null, "Campus informado não existe."); // Verifica se a senha é nula - UseCaseException.NotInformedParam(string.IsNullOrEmpty(model.Password), nameof(model.Password)); + UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Password), nameof(input.Password)); // Gera hash da senha - model.Password = _hashService.HashPassword(model.Password!); + input.Password = _hashService.HashPassword(input.Password!); // Cria usuário - user = new Domain.Entities.User(model.Name, model.Email, model.Password, model.CPF, ERole.STUDENT); + user = new Domain.Entities.User(input.Name, input.Email, input.Password, input.CPF, ERole.STUDENT); // Adiciona usuário no banco user = await _userRepository.CreateAsync(user); @@ -95,16 +94,16 @@ public async Task ExecuteAsync(CreateStudentInput mod "Não foi possível criar o usuário."); // Adiciona estudante no banco - entity.UserId = user?.Id; - entity = await _studentRepository.CreateAsync(entity); - UseCaseException.BusinessRuleViolation(entity == null, + student.UserId = user?.Id; + student = await _studentRepository.CreateAsync(student); + UseCaseException.BusinessRuleViolation(student == null, "Não foi possível criar o estudante."); // Envia e-mail de confirmação await _emailService.SendConfirmationEmailAsync(user?.Email, user?.Name, user?.ValidationCode); // Salva entidade no banco - return _mapper.Map(entity); + return _mapper.Map(student); } } } \ No newline at end of file From e4be59028a8a4e6e595e061e7330ed62edb4d2dd Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 16 Aug 2023 21:17:45 -0300 Subject: [PATCH 094/201] feat: add more info to ReportService --- src/Infrastructure/Services/ReportService.cs | 20 ++++++++++++++----- .../Services/Reports/certificate.html | 4 ++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/Infrastructure/Services/ReportService.cs b/src/Infrastructure/Services/ReportService.cs index ed5116d3..c051c1ff 100644 --- a/src/Infrastructure/Services/ReportService.cs +++ b/src/Infrastructure/Services/ReportService.cs @@ -17,19 +17,29 @@ public async Task GenerateCertificateAsync(Project project, string cordi // Caminho temporário onde será salvo o arquivo string outputPath = ""; + // Obtém o semestre do edital + string noticeDate; + if (project!.Notice!.RegistrationStartDate!.Value.Month > 6) + noticeDate = $"{project.Notice.RegistrationStartDate.Value.Year} / 2"; + else + noticeDate = $"{project.Notice.RegistrationStartDate.Value.Year} / 1"; + + // Obtém a situação do aluno (Bolsista ou Voluntário) + var studentSituation = project.IsScholarshipCandidate ? "Término do Período de Bolsa" : "Término do Período de Voluntariado"; + // Obtém o conteúdo do arquivo HTML string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Reports/certificate.html")); // Substitui as variáveis do HTML pelos valores do projeto template = template .Replace("#NOME_ORIENTADOR#", project?.Professor?.User?.Name) - .Replace("#NOME_DEPARTAMENTO#", "") // TODO: Inserir departamento do professor no Projeto? + .Replace("#SUBAREA_PROJETO#", project?.SubArea?.Name) .Replace("#NOME_ORIENTADO#", project?.Student?.User?.Name) - .Replace("#DATA_EDITAL#", "") // TODO: Verificar como obter a data do edital (Ex.: 2017 / 2) + .Replace("#DATA_EDITAL#", noticeDate) .Replace("#PIBIC_TIPO#", $"{project?.ProgramType?.Name} / CEFET") - .Replace("#INIP_EDITAL#", project?.Notice?.SendingDocsEndDate?.ToString("dd/MM/yyyy")) // TODO: Validar essa informação - .Replace("#FIMP_EDITAL#", project?.Notice?.FinalReportDeadline?.ToString("dd/MM/yyyy")) // TODO: Validar essa informação - .Replace("#SITP_EDITAL#", "") // TODO: Pegar essa informação do Projeto? + .Replace("#INIP_EDITAL#", project?.Notice?.SendingDocsEndDate?.ToString("dd/MM/yyyy")) + .Replace("#FIMP_EDITAL#", project?.Notice?.FinalReportDeadline?.ToString("dd/MM/yyyy")) + .Replace("#SITP_EDITAL#", studentSituation) // TODO: Pegar essa informação do Projeto? .Replace("#TITULO_PROJETO_ALUNO#", project?.Title) .Replace("#TITULO_PROJETO_ORIENTADOR#", "") // TODO: Verificar se esse campo será inserido no Projeto .Replace("#DIA_SEMANA#", DateTime.Now.DayOfWeek.ToString()) diff --git a/src/Infrastructure/Services/Reports/certificate.html b/src/Infrastructure/Services/Reports/certificate.html index b7011980..e078277a 100644 --- a/src/Infrastructure/Services/Reports/certificate.html +++ b/src/Infrastructure/Services/Reports/certificate.html @@ -110,8 +110,8 @@
DADOS DO ORIENTADOR

#NOME_ORIENTADOR#

-

Departamento Acadêmico:

-

#NOME_DEPARTAMENTO#

+

Subárea do Projeto:

+

#SUBAREA_PROJETO#

From d6949548f3dbdf038e039477e467fe5855896bbd Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 17 Aug 2023 14:19:20 -0300 Subject: [PATCH 095/201] feat: add certificate url to project --- src/Domain/Entities/Project.cs | 5 +++++ .../EntitiesConfiguration/ProjectConfiguration.cs | 1 + 2 files changed, 6 insertions(+) diff --git a/src/Domain/Entities/Project.cs b/src/Domain/Entities/Project.cs index 33092c44..4a85c7d4 100644 --- a/src/Domain/Entities/Project.cs +++ b/src/Domain/Entities/Project.cs @@ -256,6 +256,11 @@ public DateTime? CancellationDate /// Razão de cancelamento do projeto, preenchido pelo professor. ///
public string? CancellationReason { get; set; } + + /// + /// URL do certificado do projeto. + /// + public string? CertificateUrl { get; set; } #endregion #endregion diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs index e42b9b73..89b506ef 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectConfiguration.cs @@ -33,6 +33,7 @@ public void Configure(EntityTypeBuilder builder) builder.Property(p => p.AppealDate); builder.Property(p => p.CancellationDate); builder.Property(p => p.CancellationReason); + builder.Property(p => p.CertificateUrl); builder.Property(p => p.DeletedAt); builder.HasOne(a => a.Student) From 6bf3a9a9c06aefcb43e49d2700ddff6221dc085a Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 17 Aug 2023 14:56:48 -0300 Subject: [PATCH 096/201] feat: add MakeCoordinator usecase --- .../UseCases/User/IMakeCoordinator.cs | 12 ++++ .../UseCases/User/MakeCoordinator.cs | 66 +++++++++++++++++++ src/Domain/Entities/User.cs | 2 + .../UserConfiguration.cs | 1 + 4 files changed, 81 insertions(+) create mode 100644 src/Application/Interfaces/UseCases/User/IMakeCoordinator.cs create mode 100644 src/Application/UseCases/User/MakeCoordinator.cs diff --git a/src/Application/Interfaces/UseCases/User/IMakeCoordinator.cs b/src/Application/Interfaces/UseCases/User/IMakeCoordinator.cs new file mode 100644 index 00000000..b4fc73dd --- /dev/null +++ b/src/Application/Interfaces/UseCases/User/IMakeCoordinator.cs @@ -0,0 +1,12 @@ +namespace Application.Interfaces.UseCases.User +{ + public interface IMakeCoordinator + { + /// + /// Torna o usuário um coordenador e faz com que o coordenador anterior seja desativado. + /// + /// Id do usuário que será tornando coordenador. + /// Retorna uma mensagem de sucesso ou erro. + Task ExecuteAsync(Guid? userId); + } +} \ No newline at end of file diff --git a/src/Application/UseCases/User/MakeCoordinator.cs b/src/Application/UseCases/User/MakeCoordinator.cs new file mode 100644 index 00000000..27262fe4 --- /dev/null +++ b/src/Application/UseCases/User/MakeCoordinator.cs @@ -0,0 +1,66 @@ +using Application.Interfaces.UseCases.User; +using Application.Validation; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; + +namespace Application.UseCases.User +{ + public class MakeCoordinator : IMakeCoordinator + { + private readonly IUserRepository _userRepository; + private readonly ITokenAuthenticationService _tokenAuthenticationService; + public MakeCoordinator( + IUserRepository userRepository, + ITokenAuthenticationService tokenAuthenticationService) + { + _userRepository = userRepository; + _tokenAuthenticationService = tokenAuthenticationService; + } + + public async Task ExecuteAsync(Guid? userId) + { + // Verifica se o id foi informado + UseCaseException.NotInformedParam(userId is null, + nameof(userId)); + + // Obtém usuário logado + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + UseCaseException.BusinessRuleViolation(userClaims is null, + "Usuário não autenticado"); + + // Verifica se usuário logado é administrador + UseCaseException.BusinessRuleViolation(userClaims!.Role != Domain.Entities.Enums.ERole.ADMIN, + "Usuário não é administrador"); + + // Verifica se usuário logado realmente existe + var user = await _userRepository.GetByIdAsync(userClaims.Id); + UseCaseException.NotFoundEntityById(user is null, nameof(user)); + + // Verifica se usuário logado é coordenador + UseCaseException.BusinessRuleViolation(user!.IsCoordinator, + "Usuário não é coordenador"); + + // Obtém usuário que será tornado coordenador + var userToMakeCoordinator = await _userRepository.GetByIdAsync(userId); + + // Verifica se usuário que será tornado coordenador existe + UseCaseException.NotFoundEntityById(userToMakeCoordinator is null, + nameof(userToMakeCoordinator)); + + // Remove coordenação do usuário logado + user.IsCoordinator = false; + + // Salva alterações + await _userRepository.UpdateAsync(user); + + // Atualiza usuário + userToMakeCoordinator!.IsCoordinator = true; + + // Salva alterações + await _userRepository.UpdateAsync(userToMakeCoordinator); + + // Retorna mensagem de sucesso + return $"Usuário {user.Id} tornou coordenador o usuário {userToMakeCoordinator.Id}"; + } + } +} \ No newline at end of file diff --git a/src/Domain/Entities/User.cs b/src/Domain/Entities/User.cs index cd213be4..ac3522e5 100644 --- a/src/Domain/Entities/User.cs +++ b/src/Domain/Entities/User.cs @@ -123,6 +123,8 @@ private set _forgotPasswordToken = value; } } + + public bool IsCoordinator { get; set; } #endregion #region Constructors diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/UserConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/UserConfiguration.cs index c298ac76..fa320f01 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/UserConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/UserConfiguration.cs @@ -19,6 +19,7 @@ public void Configure(EntityTypeBuilder builder) builder.Property(p => p.ValidationCode).HasMaxLength(6); builder.Property(p => p.ResetPasswordToken).HasMaxLength(6); builder.Property(p => p.IsConfirmed).IsRequired(); + builder.Property(p => p.IsCoordinator).IsRequired(); builder.Property(p => p.DeletedAt); builder.HasQueryFilter(x => x.DeletedAt == null); From 8a71658b858dd0c8a0b9290f0a99435166324883 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 17 Aug 2023 15:09:00 -0300 Subject: [PATCH 097/201] feat: add MakeAdmin usecase --- .../Interfaces/UseCases/User/IMakeAdmin.cs | 7 ++ src/Application/UseCases/User/MakeAdmin.cs | 64 +++++++++++++++++++ .../Repositories/IProfessorRepository.cs | 1 + 3 files changed, 72 insertions(+) create mode 100644 src/Application/Interfaces/UseCases/User/IMakeAdmin.cs create mode 100644 src/Application/UseCases/User/MakeAdmin.cs diff --git a/src/Application/Interfaces/UseCases/User/IMakeAdmin.cs b/src/Application/Interfaces/UseCases/User/IMakeAdmin.cs new file mode 100644 index 00000000..1ba98137 --- /dev/null +++ b/src/Application/Interfaces/UseCases/User/IMakeAdmin.cs @@ -0,0 +1,7 @@ +namespace Application.Interfaces.UseCases.User +{ + public interface IMakeAdmin + { + Task ExecuteAsync(Guid? userId); + } +} \ No newline at end of file diff --git a/src/Application/UseCases/User/MakeAdmin.cs b/src/Application/UseCases/User/MakeAdmin.cs new file mode 100644 index 00000000..cfcb4929 --- /dev/null +++ b/src/Application/UseCases/User/MakeAdmin.cs @@ -0,0 +1,64 @@ +using Application.Interfaces.UseCases.User; +using Application.Validation; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; + +namespace Application.UseCases.User +{ + public class MakeAdmin : IMakeAdmin + { + private readonly IUserRepository _userRepository; + private readonly IProfessorRepository _professorRepository; + private readonly ITokenAuthenticationService _tokenAuthenticationService; + public MakeAdmin( + IUserRepository userRepository, + IProfessorRepository professorRepository, + ITokenAuthenticationService tokenAuthenticationService) + { + _userRepository = userRepository; + _professorRepository = professorRepository; + _tokenAuthenticationService = tokenAuthenticationService; + } + + public async Task ExecuteAsync(Guid? userId) + { + // Verifica se o id foi informado + UseCaseException.NotInformedParam(userId is null, + nameof(userId)); + + // Obtém usuário logado + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + UseCaseException.BusinessRuleViolation(userClaims is null, + "Usuário não autenticado"); + + // Verifica se usuário logado é administrador + UseCaseException.BusinessRuleViolation(userClaims!.Role != Domain.Entities.Enums.ERole.ADMIN, + "Usuário logado não é administrador"); + + // Verifica se usuário logado realmente existe + var user = await _userRepository.GetByIdAsync(userClaims.Id); + UseCaseException.NotFoundEntityById(user is null, nameof(user)); + + // Obtém usuário que será tornado administrador + var userToMakeAdmin = await _userRepository.GetByIdAsync(userId); + + // Verifica se usuário que será tornado administrador existe + UseCaseException.NotFoundEntityById(userToMakeAdmin is null, + nameof(userToMakeAdmin)); + + /// Verifica se usuário que será tornado administrador é professor, + /// pois apenas um professor pode se tornar administrador + _ = await _professorRepository.GetByUserIdAsync(userId) + ?? throw new UseCaseException("Apenas professores podem se tornar administradores"); + + // Atualiza usuário + userToMakeAdmin!.Role = Domain.Entities.Enums.ERole.ADMIN; + + // Salva alterações + await _userRepository.UpdateAsync(userToMakeAdmin); + + // Retorna mensagem de sucesso + return $"Usuário {user!.Id} tornou administrador o usuário {userToMakeAdmin.Id}"; + } + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs index da84b558..91f65b85 100644 --- a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs @@ -6,5 +6,6 @@ namespace Domain.Interfaces.Repositories public interface IProfessorRepository : IGenericCRUDRepository { Task> GetAllActiveProfessorsAsync(); + Task GetByUserIdAsync(Guid? userId); } } \ No newline at end of file From 1280181c934b8c5b6e4a6a7a749706aaae10ab69 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 17 Aug 2023 15:19:02 -0300 Subject: [PATCH 098/201] feat(repositories): add some implementations --- .../Interfaces/Repositories/INoticeRepository.cs | 6 ++++++ .../Repositories/IProfessorRepository.cs | 11 +++++++++++ .../Repositories/IProjectRepository.cs | 7 +++++++ .../Persistence/Repositories/NoticeRepository.cs | 7 +++++++ .../Repositories/ProfessorRepository.cs | 9 +++++++++ .../Repositories/ProjectRepository.cs | 16 ++++++++++++++++ 6 files changed, 56 insertions(+) diff --git a/src/Domain/Interfaces/Repositories/INoticeRepository.cs b/src/Domain/Interfaces/Repositories/INoticeRepository.cs index 342a4989..83d40f28 100644 --- a/src/Domain/Interfaces/Repositories/INoticeRepository.cs +++ b/src/Domain/Interfaces/Repositories/INoticeRepository.cs @@ -6,5 +6,11 @@ namespace Domain.Interfaces.Repositories public interface INoticeRepository : IGenericCRUDRepository { Task GetNoticeByPeriodAsync(DateTime start, DateTime end); + + /// + /// Busca edital que possui data final de entrega de relatório para o dia anterior. + /// + /// Edital que possui data final de entrega de relatório para o dia anterior. + Task GetNoticeEndingAsync(); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs index 91f65b85..f24723a3 100644 --- a/src/Domain/Interfaces/Repositories/IProfessorRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProfessorRepository.cs @@ -5,7 +5,18 @@ namespace Domain.Interfaces.Repositories { public interface IProfessorRepository : IGenericCRUDRepository { + /// + /// Obtém todos os professores ativos. + /// + /// Lista de professores ativos. + /// Ativo significa que o professor não foi removido. Task> GetAllActiveProfessorsAsync(); + + /// + /// Obtém professor pelo Id do usuário informado. + /// + /// Id do usuário. + /// Professor encontrado. Task GetByUserIdAsync(Guid? userId); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProjectRepository.cs b/src/Domain/Interfaces/Repositories/IProjectRepository.cs index 84a7af06..875a03f7 100644 --- a/src/Domain/Interfaces/Repositories/IProjectRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProjectRepository.cs @@ -60,5 +60,12 @@ public interface IProjectRepository /// Parâmetros de atualização. /// Projeto atualizado. Task UpdateAsync(Project model); + + /// + /// Obtém projeto pelo Id do Edital informado. + /// + /// Id do Edital. + /// Projetos encontrados. + Task> GetProjectByNoticeAsync(Guid? noticeId); } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs b/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs index 9c684d6b..82e2ddf8 100644 --- a/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs @@ -70,6 +70,13 @@ public async Task UpdateAsync(Notice model) .ToListAsync(); return entities.FirstOrDefault(); } + + public async Task GetNoticeEndingAsync() + { + return await _context.Notices + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.FinalReportDeadline!.Value.Date == DateTime.UtcNow.Date.AddDays(-1)); + } #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs b/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs index b4aed51f..4b2a622c 100644 --- a/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProfessorRepository.cs @@ -66,6 +66,15 @@ public async Task> GetAllActiveProfessorsAsync() .Where(x => x.SuspensionEndDate < DateTime.UtcNow || x.SuspensionEndDate == null) .ToListAsync(); } + + public async Task GetByUserIdAsync(Guid? userId) + { + return await _context.Professors + .Include(x => x.User) + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.UserId == userId); + } #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs index c8f41d66..3c6b93af 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs @@ -145,5 +145,21 @@ public async Task> GetStudentProjectsAsync(int skip, int ta .Take(take) .ToListAsync(); } + + public async Task> GetProjectByNoticeAsync(Guid? noticeId) + { + return await _context.Projects + .Include(x => x.Student) + .Include(x => x.Student!.User) + .Include(x => x.Professor) + .Include(x => x.Professor!.User) + .Include(x => x.SubArea) + .Include(x => x.ProgramType) + .Include(x => x.Notice) + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .Where(x => x.NoticeId == noticeId) + .ToListAsync(); + } } } \ No newline at end of file From 9fbfad33c8ad3929f943e751fcb6ee2ce74bb700 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 17 Aug 2023 15:19:38 -0300 Subject: [PATCH 099/201] feat: add ReportService implementation --- src/Domain/Interfaces/Services/IReportService.cs | 2 +- src/Infrastructure/Services/ReportService.cs | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Domain/Interfaces/Services/IReportService.cs b/src/Domain/Interfaces/Services/IReportService.cs index 037b3427..c0892041 100644 --- a/src/Domain/Interfaces/Services/IReportService.cs +++ b/src/Domain/Interfaces/Services/IReportService.cs @@ -4,6 +4,6 @@ namespace Domain.Interfaces.Services { public interface IReportService { - Task GenerateCertificateAsync(Project project, string cordinatorName); + Task GenerateCertificateAsync(Project project, string cordinatorName, string fileName); } } \ No newline at end of file diff --git a/src/Infrastructure/Services/ReportService.cs b/src/Infrastructure/Services/ReportService.cs index c051c1ff..34c41c08 100644 --- a/src/Infrastructure/Services/ReportService.cs +++ b/src/Infrastructure/Services/ReportService.cs @@ -1,5 +1,6 @@ using Domain.Entities; using Domain.Interfaces.Services; +using Microsoft.Extensions.Configuration; using PuppeteerSharp; namespace Services @@ -7,15 +8,17 @@ namespace Services public class ReportService : IReportService { private readonly string? _currentDirectory; - public ReportService() + private readonly string? _outputPath; + public ReportService(IConfiguration configuration) { _currentDirectory = Path.GetDirectoryName(typeof(ReportService).Assembly.Location); + _outputPath = configuration["TempPath"]; } - public async Task GenerateCertificateAsync(Project project, string cordinatorName) + public async Task GenerateCertificateAsync(Project project, string cordinatorName, string fileName) { // Caminho temporário onde será salvo o arquivo - string outputPath = ""; + string outputPath = Path.Combine(_outputPath!, fileName); // Obtém o semestre do edital string noticeDate; @@ -41,7 +44,7 @@ public async Task GenerateCertificateAsync(Project project, string cordi .Replace("#FIMP_EDITAL#", project?.Notice?.FinalReportDeadline?.ToString("dd/MM/yyyy")) .Replace("#SITP_EDITAL#", studentSituation) // TODO: Pegar essa informação do Projeto? .Replace("#TITULO_PROJETO_ALUNO#", project?.Title) - .Replace("#TITULO_PROJETO_ORIENTADOR#", "") // TODO: Verificar se esse campo será inserido no Projeto + // .Replace("#TITULO_PROJETO_ORIENTADOR#", "") // TODO: Verificar se esse campo será inserido no Projeto .Replace("#DIA_SEMANA#", DateTime.Now.DayOfWeek.ToString()) .Replace("#DIA_DATA#", DateTime.Now.Day.ToString()) .Replace("#MES_DATA#", DateTime.Now.ToString("MMMM")) From 6e6efceed5ea671d87148c498ec837b02027be80 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 17 Aug 2023 15:19:51 -0300 Subject: [PATCH 100/201] feat: add GenerateCertificate usecase --- .../UseCases/Project/IGenerateCertificate.cs | 11 +++ .../UseCases/Project/GenerateCertificate.cs | 98 +++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 src/Application/Interfaces/UseCases/Project/IGenerateCertificate.cs create mode 100644 src/Application/UseCases/Project/GenerateCertificate.cs diff --git a/src/Application/Interfaces/UseCases/Project/IGenerateCertificate.cs b/src/Application/Interfaces/UseCases/Project/IGenerateCertificate.cs new file mode 100644 index 00000000..c54e8f70 --- /dev/null +++ b/src/Application/Interfaces/UseCases/Project/IGenerateCertificate.cs @@ -0,0 +1,11 @@ +namespace Application.Interfaces.UseCases.Project +{ + public interface IGenerateCertificate + { + /// + /// Gera o certificado para todos os projetos que estão para ser encerrados. + /// + /// Resultado do processo de geração dos certificados + Task ExecuteAsync(); + } +} \ No newline at end of file diff --git a/src/Application/UseCases/Project/GenerateCertificate.cs b/src/Application/UseCases/Project/GenerateCertificate.cs new file mode 100644 index 00000000..a34cfb33 --- /dev/null +++ b/src/Application/UseCases/Project/GenerateCertificate.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Application.Interfaces.UseCases.Project; +using Application.Validation; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Microsoft.AspNetCore.Http.Internal; + +namespace Application.UseCases.Project +{ + public class GenerateCertificate : IGenerateCertificate + { + private readonly IProjectRepository _projectRepository; + private readonly INoticeRepository _noticeRepository; + private readonly IProjectReportRepository _projectReportRepository; + private readonly IProfessorRepository _professorRepository; + private readonly IReportService _reportService; + private readonly IStorageFileService _storageFileService; + public GenerateCertificate( + IProjectRepository projectRepository, + INoticeRepository noticeRepository, + IProjectReportRepository projectReportRepository, + IProfessorRepository professorRepository, + IReportService reportService, + IStorageFileService storageFileService) + { + _projectRepository = projectRepository; + _noticeRepository = noticeRepository; + _projectReportRepository = projectReportRepository; + _professorRepository = professorRepository; + _reportService = reportService; + _storageFileService = storageFileService; + } + + public async Task ExecuteAsync() + { + // Busca edital que possui data final de entrega de relatório para o dia anterior + var notice = await _noticeRepository.GetNoticeEndingAsync(); + if (notice is null) + return "Nenhum edital em estágio de encerramento encontrado."; + + // Verifica se o há projetos que estejam no status Started ou Pending + var projects = await _projectRepository.GetProjectByNoticeAsync(notice!.Id); + if (!projects.Any()) + return "Nenhum projeto em estágio de encerramento encontrado."; + + // Encerra cada projeto verificando se o mesmo possui relatório final + foreach (var project in projects) + { + + // Verifica se o projeto possui relatório final + var reports = await _projectReportRepository.GetByProjectIdAsync(project.Id); + + // Se não possuir relatório final, não gera certificado e suspende o professor + if (reports is null || !reports.Any()) + { + // Suspende professor + var professor = await _professorRepository.GetByIdAsync(project.ProfessorId); + if (professor is not null) + { + professor.SuspensionEndDate = DateTime.Now.AddYears(notice.SuspensionYears ?? 0); + await _professorRepository.UpdateAsync(professor); + } + + // Encerra projeto + project.Status = EProjectStatus.Closed; + await _projectRepository.UpdateAsync(project); + } + else + { + // Gera nome único para o arquivo + var uniqueName = Guid.NewGuid().ToString() + ".pdf"; + + // Gera certificado + var path = await _reportService.GenerateCertificateAsync(project, "", uniqueName); + + // Converte certificado para IFormFile a fim de enviá-lo para nuvem + var file = new FormFile(new MemoryStream(File.ReadAllBytes(path)), 0, 0, "certificate", uniqueName); + + // Envia certificado para nuvem e salva url no projeto + project.CertificateUrl = await _storageFileService.UploadFileAsync(file); + + // Encerra projeto + project.Status = EProjectStatus.Closed; + await _projectRepository.UpdateAsync(project); + + // Deleta certificado da pasta temporária + File.Delete(path); + } + } + + return "Certificados gerados com sucesso."; + } + } +} \ No newline at end of file From 65958838e2e135d012849d933313c6e43964f84e Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 17 Aug 2023 15:41:53 -0300 Subject: [PATCH 101/201] refactor: update ProjectReport to ProjectFinalReport --- .../ICreateProjectFinalReport.cs | 9 ++++ .../IDeleteProjectFinalReport.cs | 9 ++++ .../IGetProjectFinalReportById.cs | 9 ++++ .../IGetProjectFinalReportByProjectId.cs | 9 ++++ .../IUpdateProjectFinalReport.cs | 9 ++++ .../ProjectReport/ICreateProjectReport.cs | 9 ---- .../ProjectReport/IDeleteProjectReport.cs | 9 ---- .../ProjectReport/IGetProjectReportById.cs | 9 ---- .../IGetProjectReportByProjectId.cs | 9 ---- .../ProjectReport/IUpdateProjectReport.cs | 9 ---- .../Ports/Project/ProjectReportInput.cs | 2 +- .../Ports/Project/ProjectReportOutput.cs | 2 +- .../BaseProjectReportContract.cs | 4 +- .../ProjectReport/CreateProjectReportInput.cs | 6 +-- .../DetailedReadProjectReportOutput.cs | 4 +- .../ProjectReport/UpdateProjectReportInput.cs | 4 +- .../CreateProjectFinalReport.cs} | 23 ++++----- .../DeleteProjectFinalReport.cs | 33 ++++++++++++ .../GetProjectFinalReportById.cs | 28 +++++++++++ .../GetProjectFinalReportByProjectId.cs | 28 +++++++++++ .../UpdateProjectFinalReport.cs} | 24 ++++----- .../ProjectReport/DeleteProjectReport.cs | 33 ------------ .../ProjectReport/GetProjectReportById.cs | 28 ----------- .../GetProjectReportByProjectId.cs | 28 ----------- src/Domain/Entities/Enums/EReportType.cs | 12 ----- ...ProjectReport.cs => ProjectFinalReport.cs} | 23 +-------- ...ry.cs => IProjectFinalReportRepository.cs} | 4 +- .../Context/ApplicationDbContext.cs | 2 +- ....cs => ProjectFinalReportConfiguration.cs} | 8 ++- ...ory.cs => ProjectFinalReportRepository.cs} | 22 ++++---- .../Controllers/ProjectReportController.cs | 50 +++++++++---------- 31 files changed, 210 insertions(+), 248 deletions(-) create mode 100644 src/Application/Interfaces/UseCases/ProjectFinalReport/ICreateProjectFinalReport.cs create mode 100644 src/Application/Interfaces/UseCases/ProjectFinalReport/IDeleteProjectFinalReport.cs create mode 100644 src/Application/Interfaces/UseCases/ProjectFinalReport/IGetProjectFinalReportById.cs create mode 100644 src/Application/Interfaces/UseCases/ProjectFinalReport/IGetProjectFinalReportByProjectId.cs create mode 100644 src/Application/Interfaces/UseCases/ProjectFinalReport/IUpdateProjectFinalReport.cs delete mode 100644 src/Application/Interfaces/UseCases/ProjectReport/ICreateProjectReport.cs delete mode 100644 src/Application/Interfaces/UseCases/ProjectReport/IDeleteProjectReport.cs delete mode 100644 src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportById.cs delete mode 100644 src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportByProjectId.cs delete mode 100644 src/Application/Interfaces/UseCases/ProjectReport/IUpdateProjectReport.cs rename src/Application/UseCases/{ProjectReport/CreateProjectReport.cs => ProjectFinalReport/CreateProjectFinalReport.cs} (78%) create mode 100644 src/Application/UseCases/ProjectFinalReport/DeleteProjectFinalReport.cs create mode 100644 src/Application/UseCases/ProjectFinalReport/GetProjectFinalReportById.cs create mode 100644 src/Application/UseCases/ProjectFinalReport/GetProjectFinalReportByProjectId.cs rename src/Application/UseCases/{ProjectReport/UpdateProjectReport.cs => ProjectFinalReport/UpdateProjectFinalReport.cs} (77%) delete mode 100644 src/Application/UseCases/ProjectReport/DeleteProjectReport.cs delete mode 100644 src/Application/UseCases/ProjectReport/GetProjectReportById.cs delete mode 100644 src/Application/UseCases/ProjectReport/GetProjectReportByProjectId.cs delete mode 100644 src/Domain/Entities/Enums/EReportType.cs rename src/Domain/Entities/{ProjectReport.cs => ProjectFinalReport.cs} (67%) rename src/Domain/Interfaces/Repositories/{IProjectReportRepository.cs => IProjectFinalReportRepository.cs} (67%) rename src/Infrastructure/Persistence/EntitiesConfiguration/{ProjectReportConfiguration.cs => ProjectFinalReportConfiguration.cs} (77%) rename src/Infrastructure/Persistence/Repositories/{ProjectReportRepository.cs => ProjectFinalReportRepository.cs} (62%) diff --git a/src/Application/Interfaces/UseCases/ProjectFinalReport/ICreateProjectFinalReport.cs b/src/Application/Interfaces/UseCases/ProjectFinalReport/ICreateProjectFinalReport.cs new file mode 100644 index 00000000..fd910385 --- /dev/null +++ b/src/Application/Interfaces/UseCases/ProjectFinalReport/ICreateProjectFinalReport.cs @@ -0,0 +1,9 @@ +using Application.Ports.ProjectFinalReport; + +namespace Application.Interfaces.UseCases.ProjectFinalReport +{ + public interface ICreateProjectFinalReport + { + Task ExecuteAsync(CreateProjectFinalReportInput input); + } +} \ No newline at end of file diff --git a/src/Application/Interfaces/UseCases/ProjectFinalReport/IDeleteProjectFinalReport.cs b/src/Application/Interfaces/UseCases/ProjectFinalReport/IDeleteProjectFinalReport.cs new file mode 100644 index 00000000..71f5e9a5 --- /dev/null +++ b/src/Application/Interfaces/UseCases/ProjectFinalReport/IDeleteProjectFinalReport.cs @@ -0,0 +1,9 @@ +using Application.Ports.ProjectFinalReport; + +namespace Application.Interfaces.UseCases.ProjectFinalReport +{ + public interface IDeleteProjectFinalReport + { + Task ExecuteAsync(Guid? id); + } +} \ No newline at end of file diff --git a/src/Application/Interfaces/UseCases/ProjectFinalReport/IGetProjectFinalReportById.cs b/src/Application/Interfaces/UseCases/ProjectFinalReport/IGetProjectFinalReportById.cs new file mode 100644 index 00000000..90622683 --- /dev/null +++ b/src/Application/Interfaces/UseCases/ProjectFinalReport/IGetProjectFinalReportById.cs @@ -0,0 +1,9 @@ +using Application.Ports.ProjectFinalReport; + +namespace Application.Interfaces.UseCases.ProjectFinalReport +{ + public interface IGetProjectFinalReportById + { + Task ExecuteAsync(Guid? id); + } +} \ No newline at end of file diff --git a/src/Application/Interfaces/UseCases/ProjectFinalReport/IGetProjectFinalReportByProjectId.cs b/src/Application/Interfaces/UseCases/ProjectFinalReport/IGetProjectFinalReportByProjectId.cs new file mode 100644 index 00000000..b7926ae2 --- /dev/null +++ b/src/Application/Interfaces/UseCases/ProjectFinalReport/IGetProjectFinalReportByProjectId.cs @@ -0,0 +1,9 @@ +using Application.Ports.ProjectFinalReport; + +namespace Application.Interfaces.UseCases.ProjectFinalReport +{ + public interface IGetProjectFinalReportsByProjectId + { + Task> ExecuteAsync(Guid? projectId); + } +} \ No newline at end of file diff --git a/src/Application/Interfaces/UseCases/ProjectFinalReport/IUpdateProjectFinalReport.cs b/src/Application/Interfaces/UseCases/ProjectFinalReport/IUpdateProjectFinalReport.cs new file mode 100644 index 00000000..ad63c630 --- /dev/null +++ b/src/Application/Interfaces/UseCases/ProjectFinalReport/IUpdateProjectFinalReport.cs @@ -0,0 +1,9 @@ +using Application.Ports.ProjectFinalReport; + +namespace Application.Interfaces.UseCases.ProjectFinalReport +{ + public interface IUpdateProjectFinalReport + { + Task ExecuteAsync(Guid? id, UpdateProjectFinalReportInput input); + } +} \ No newline at end of file diff --git a/src/Application/Interfaces/UseCases/ProjectReport/ICreateProjectReport.cs b/src/Application/Interfaces/UseCases/ProjectReport/ICreateProjectReport.cs deleted file mode 100644 index b06635b5..00000000 --- a/src/Application/Interfaces/UseCases/ProjectReport/ICreateProjectReport.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Application.Ports.ProjectReport; - -namespace Application.Interfaces.UseCases.ProjectReport -{ - public interface ICreateProjectReport - { - Task ExecuteAsync(CreateProjectReportInput input); - } -} \ No newline at end of file diff --git a/src/Application/Interfaces/UseCases/ProjectReport/IDeleteProjectReport.cs b/src/Application/Interfaces/UseCases/ProjectReport/IDeleteProjectReport.cs deleted file mode 100644 index 48bbb7c2..00000000 --- a/src/Application/Interfaces/UseCases/ProjectReport/IDeleteProjectReport.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Application.Ports.ProjectReport; - -namespace Application.Interfaces.UseCases.ProjectReport -{ - public interface IDeleteProjectReport - { - Task ExecuteAsync(Guid? id); - } -} \ No newline at end of file diff --git a/src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportById.cs b/src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportById.cs deleted file mode 100644 index 0f5e6bae..00000000 --- a/src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportById.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Application.Ports.ProjectReport; - -namespace Application.Interfaces.UseCases.ProjectReport -{ - public interface IGetProjectReportById - { - Task ExecuteAsync(Guid? id); - } -} \ No newline at end of file diff --git a/src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportByProjectId.cs b/src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportByProjectId.cs deleted file mode 100644 index 1c0b7770..00000000 --- a/src/Application/Interfaces/UseCases/ProjectReport/IGetProjectReportByProjectId.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Application.Ports.ProjectReport; - -namespace Application.Interfaces.UseCases.ProjectReport -{ - public interface IGetProjectReportsByProjectId - { - Task> ExecuteAsync(Guid? projectId); - } -} \ No newline at end of file diff --git a/src/Application/Interfaces/UseCases/ProjectReport/IUpdateProjectReport.cs b/src/Application/Interfaces/UseCases/ProjectReport/IUpdateProjectReport.cs deleted file mode 100644 index 2e64342e..00000000 --- a/src/Application/Interfaces/UseCases/ProjectReport/IUpdateProjectReport.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Application.Ports.ProjectReport; - -namespace Application.Interfaces.UseCases.ProjectReport -{ - public interface IUpdateProjectReport - { - Task ExecuteAsync(Guid? id, UpdateProjectReportInput input); - } -} \ No newline at end of file diff --git a/src/Application/Ports/Project/ProjectReportInput.cs b/src/Application/Ports/Project/ProjectReportInput.cs index a3b63a7d..d6ae8d43 100644 --- a/src/Application/Ports/Project/ProjectReportInput.cs +++ b/src/Application/Ports/Project/ProjectReportInput.cs @@ -1,6 +1,6 @@ namespace Application.Ports.Project { - public class ProjectReportInput + public class ProjectFinalReportInput { } } \ No newline at end of file diff --git a/src/Application/Ports/Project/ProjectReportOutput.cs b/src/Application/Ports/Project/ProjectReportOutput.cs index 85311707..b654147c 100644 --- a/src/Application/Ports/Project/ProjectReportOutput.cs +++ b/src/Application/Ports/Project/ProjectReportOutput.cs @@ -1,6 +1,6 @@ namespace Application.Ports.Project { - public class ProjectReportOutput + public class ProjectFinalReportOutput { } } \ No newline at end of file diff --git a/src/Application/Ports/ProjectReport/BaseProjectReportContract.cs b/src/Application/Ports/ProjectReport/BaseProjectReportContract.cs index 1db75a3b..ec268a56 100644 --- a/src/Application/Ports/ProjectReport/BaseProjectReportContract.cs +++ b/src/Application/Ports/ProjectReport/BaseProjectReportContract.cs @@ -1,8 +1,8 @@ using System.ComponentModel.DataAnnotations; -namespace Application.Ports.ProjectReport +namespace Application.Ports.ProjectFinalReport { - public abstract class BaseProjectReportContract + public abstract class BaseProjectFinalReportContract { [Required] public int? ReportType { get; set; } diff --git a/src/Application/Ports/ProjectReport/CreateProjectReportInput.cs b/src/Application/Ports/ProjectReport/CreateProjectReportInput.cs index dba802bc..ab249190 100644 --- a/src/Application/Ports/ProjectReport/CreateProjectReportInput.cs +++ b/src/Application/Ports/ProjectReport/CreateProjectReportInput.cs @@ -1,10 +1,10 @@ using System.ComponentModel.DataAnnotations; -using Application.Ports.ProjectReport; +using Application.Ports.ProjectFinalReport; using Microsoft.AspNetCore.Http; -namespace Application.Ports.ProjectReport +namespace Application.Ports.ProjectFinalReport { - public class CreateProjectReportInput : BaseProjectReportContract + public class CreateProjectFinalReportInput : BaseProjectFinalReportContract { [Required] public IFormFile? ReportFile { get; set; } diff --git a/src/Application/Ports/ProjectReport/DetailedReadProjectReportOutput.cs b/src/Application/Ports/ProjectReport/DetailedReadProjectReportOutput.cs index 3ea6d873..0520f905 100644 --- a/src/Application/Ports/ProjectReport/DetailedReadProjectReportOutput.cs +++ b/src/Application/Ports/ProjectReport/DetailedReadProjectReportOutput.cs @@ -1,6 +1,6 @@ -namespace Application.Ports.ProjectReport +namespace Application.Ports.ProjectFinalReport { - public class DetailedReadProjectReportOutput : BaseProjectReportContract + public class DetailedReadProjectFinalReportOutput : BaseProjectFinalReportContract { public Guid? Id { get; set; } public DateTime? DeletedAt { get; set; } diff --git a/src/Application/Ports/ProjectReport/UpdateProjectReportInput.cs b/src/Application/Ports/ProjectReport/UpdateProjectReportInput.cs index 3dd3f356..6a6118e3 100644 --- a/src/Application/Ports/ProjectReport/UpdateProjectReportInput.cs +++ b/src/Application/Ports/ProjectReport/UpdateProjectReportInput.cs @@ -1,9 +1,9 @@ using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Http; -namespace Application.Ports.ProjectReport +namespace Application.Ports.ProjectFinalReport { - public class UpdateProjectReportInput + public class UpdateProjectFinalReportInput { [Required] public IFormFile? ReportFile { get; set; } diff --git a/src/Application/UseCases/ProjectReport/CreateProjectReport.cs b/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs similarity index 78% rename from src/Application/UseCases/ProjectReport/CreateProjectReport.cs rename to src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs index 7cd2e993..bae0f55b 100644 --- a/src/Application/UseCases/ProjectReport/CreateProjectReport.cs +++ b/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs @@ -1,21 +1,21 @@ using AutoMapper; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; -using Application.Ports.ProjectReport; -using Application.Interfaces.UseCases.ProjectReport; +using Application.Ports.ProjectFinalReport; +using Application.Interfaces.UseCases.ProjectFinalReport; using Application.Validation; -namespace Application.UseCases.ProjectReport +namespace Application.UseCases.ProjectFinalReport { - public class CreateProjectReport : ICreateProjectReport + public class CreateProjectFinalReport : ICreateProjectFinalReport { #region Global Scope - private readonly IProjectReportRepository _projectReportRepository; + private readonly IProjectFinalReportRepository _projectReportRepository; private readonly IProjectRepository _projectRepository; private readonly IStorageFileService _storageFileService; private readonly ITokenAuthenticationService _tokenAuthenticationService; private readonly IMapper _mapper; - public CreateProjectReport(IProjectReportRepository projectReportRepository, + public CreateProjectFinalReport(IProjectFinalReportRepository projectReportRepository, IProjectRepository projectRepository, IStorageFileService storageFileService, ITokenAuthenticationService tokenAuthenticationService, @@ -29,11 +29,10 @@ public CreateProjectReport(IProjectReportRepository projectReportRepository, } #endregion Global Scope - public async Task ExecuteAsync(CreateProjectReportInput input) + public async Task ExecuteAsync(CreateProjectFinalReportInput input) { // Cria entidade a partir do modelo - Domain.Entities.ProjectReport report = new( - TryCastEnum(input.ReportType), + Domain.Entities.ProjectFinalReport report = new( input.ProjectId ); @@ -53,9 +52,7 @@ public async Task ExecuteAsync(CreateProjectRep "O projeto informado não está em andamento."); // Verifica se o relatório está sendo enviado dentro do prazo - var isBeforeDeadline = report.ReportType == Domain.Entities.Enums.EReportType.Final - ? project.Notice?.FinalReportDeadline < DateTime.UtcNow - : project.Notice?.PartialReportDeadline < DateTime.UtcNow; + var isBeforeDeadline = project.Notice?.FinalReportDeadline < DateTime.UtcNow; // Lança exceção caso o relatório esteja sendo enviado fora do prazo UseCaseException.BusinessRuleViolation(isBeforeDeadline, @@ -74,7 +71,7 @@ public async Task ExecuteAsync(CreateProjectRep report = await _projectReportRepository.CreateAsync(report); // Salva entidade no banco - return _mapper.Map(report); + return _mapper.Map(report); } /// diff --git a/src/Application/UseCases/ProjectFinalReport/DeleteProjectFinalReport.cs b/src/Application/UseCases/ProjectFinalReport/DeleteProjectFinalReport.cs new file mode 100644 index 00000000..140dfd34 --- /dev/null +++ b/src/Application/UseCases/ProjectFinalReport/DeleteProjectFinalReport.cs @@ -0,0 +1,33 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.ProjectFinalReport; +using Application.Ports.ProjectFinalReport; +using Application.Validation; + +namespace Application.UseCases.ProjectFinalReport +{ + public class DeleteProjectFinalReport : IDeleteProjectFinalReport + { + #region Global Scope + private readonly IProjectFinalReportRepository _repository; + private readonly IMapper _mapper; + public DeleteProjectFinalReport(IProjectFinalReportRepository repository, IMapper mapper) + { + _repository = repository; + _mapper = mapper; + } + #endregion Global Scope + + public async Task ExecuteAsync(Guid? id) + { + // Verifica se o id foi informado + UseCaseException.NotInformedParam(id is null, nameof(id)); + + // Remove a entidade + Domain.Entities.ProjectFinalReport model = await _repository.DeleteAsync(id); + + // Retorna o curso removido + return _mapper.Map(model); + } + } +} \ No newline at end of file diff --git a/src/Application/UseCases/ProjectFinalReport/GetProjectFinalReportById.cs b/src/Application/UseCases/ProjectFinalReport/GetProjectFinalReportById.cs new file mode 100644 index 00000000..6955298a --- /dev/null +++ b/src/Application/UseCases/ProjectFinalReport/GetProjectFinalReportById.cs @@ -0,0 +1,28 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.ProjectFinalReport; +using Application.Ports.ProjectFinalReport; +using Application.Validation; + +namespace Application.UseCases.ProjectFinalReport +{ + public class GetProjectFinalReportById : IGetProjectFinalReportById + { + #region Global Scope + private readonly IProjectFinalReportRepository _repository; + private readonly IMapper _mapper; + public GetProjectFinalReportById(IProjectFinalReportRepository repository, IMapper mapper) + { + _repository = repository; + _mapper = mapper; + } + #endregion Global Scope + + public async Task ExecuteAsync(Guid? id) + { + UseCaseException.NotInformedParam(id is null, nameof(id)); + Domain.Entities.ProjectFinalReport? entity = await _repository.GetByIdAsync(id); + return _mapper.Map(entity); + } + } +} \ No newline at end of file diff --git a/src/Application/UseCases/ProjectFinalReport/GetProjectFinalReportByProjectId.cs b/src/Application/UseCases/ProjectFinalReport/GetProjectFinalReportByProjectId.cs new file mode 100644 index 00000000..ffb5dc58 --- /dev/null +++ b/src/Application/UseCases/ProjectFinalReport/GetProjectFinalReportByProjectId.cs @@ -0,0 +1,28 @@ +using Application.Interfaces.UseCases.ProjectFinalReport; +using Application.Ports.ProjectFinalReport; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; + +namespace Application.UseCases.ProjectFinalReport +{ + public class GetProjectFinalReportByProjectId : IGetProjectFinalReportsByProjectId + { + #region Global Scope + private readonly IProjectFinalReportRepository _repository; + private readonly IMapper _mapper; + public GetProjectFinalReportByProjectId(IProjectFinalReportRepository repository, IMapper mapper) + { + _repository = repository; + _mapper = mapper; + } + #endregion Global Scope + + public async Task> ExecuteAsync(Guid? projectId) + { + UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); + var entities = await _repository.GetByProjectIdAsync(projectId); + return _mapper.Map>(entities); + } + } +} \ No newline at end of file diff --git a/src/Application/UseCases/ProjectReport/UpdateProjectReport.cs b/src/Application/UseCases/ProjectFinalReport/UpdateProjectFinalReport.cs similarity index 77% rename from src/Application/UseCases/ProjectReport/UpdateProjectReport.cs rename to src/Application/UseCases/ProjectFinalReport/UpdateProjectFinalReport.cs index 25c7c84d..b2abc014 100644 --- a/src/Application/UseCases/ProjectReport/UpdateProjectReport.cs +++ b/src/Application/UseCases/ProjectFinalReport/UpdateProjectFinalReport.cs @@ -1,21 +1,21 @@ using AutoMapper; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; -using Application.Interfaces.UseCases.ProjectReport; -using Application.Ports.ProjectReport; +using Application.Interfaces.UseCases.ProjectFinalReport; +using Application.Ports.ProjectFinalReport; using Application.Validation; -namespace Application.UseCases.ProjectReport +namespace Application.UseCases.ProjectFinalReport { - public class UpdateProjectReport : IUpdateProjectReport + public class UpdateProjectFinalReport : IUpdateProjectFinalReport { #region Global Scope - private readonly IProjectReportRepository _projectReportRepository; + private readonly IProjectFinalReportRepository _projectReportRepository; private readonly IProjectRepository _projectRepository; private readonly IStorageFileService _storageFileService; private readonly ITokenAuthenticationService _tokenAuthenticationService; private readonly IMapper _mapper; - public UpdateProjectReport(IProjectReportRepository projectReportRepository, + public UpdateProjectFinalReport(IProjectFinalReportRepository projectReportRepository, IProjectRepository projectRepository, IStorageFileService storageFileService, ITokenAuthenticationService tokenAuthenticationService, @@ -29,7 +29,7 @@ public UpdateProjectReport(IProjectReportRepository projectReportRepository, } #endregion Global Scope - public async Task ExecuteAsync(Guid? id, UpdateProjectReportInput input) + public async Task ExecuteAsync(Guid? id, UpdateProjectFinalReportInput input) { // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); @@ -43,8 +43,8 @@ public async Task ExecuteAsync(Guid? id, Update // TODO: Verifica se usuário logado pode realizar a operação // Recupera entidade que será atualizada - Domain.Entities.ProjectReport report = await _projectReportRepository.GetByIdAsync(id) ?? - throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.ProjectReport)); + Domain.Entities.ProjectFinalReport report = await _projectReportRepository.GetByIdAsync(id) ?? + throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.ProjectFinalReport)); // Verifica se a entidade foi excluída UseCaseException.BusinessRuleViolation(report.DeletedAt != null, @@ -63,9 +63,7 @@ public async Task ExecuteAsync(Guid? id, Update "O projeto informado não está em andamento."); // Verifica se o relatório está sendo enviado dentro do prazo - var isBeforeDeadline = report.ReportType == Domain.Entities.Enums.EReportType.Final - ? project.Notice?.FinalReportDeadline < DateTime.UtcNow - : project.Notice?.PartialReportDeadline < DateTime.UtcNow; + var isBeforeDeadline = project.Notice?.FinalReportDeadline < DateTime.UtcNow; // Lança exceção caso o relatório esteja sendo enviado fora do prazo UseCaseException.BusinessRuleViolation(isBeforeDeadline, @@ -82,7 +80,7 @@ public async Task ExecuteAsync(Guid? id, Update await _projectReportRepository.UpdateAsync(report); // Mapeia entidade para o modelo de saída e retorna - return _mapper.Map(report); + return _mapper.Map(report); } } } \ No newline at end of file diff --git a/src/Application/UseCases/ProjectReport/DeleteProjectReport.cs b/src/Application/UseCases/ProjectReport/DeleteProjectReport.cs deleted file mode 100644 index e4c9a1f7..00000000 --- a/src/Application/UseCases/ProjectReport/DeleteProjectReport.cs +++ /dev/null @@ -1,33 +0,0 @@ -using AutoMapper; -using Domain.Interfaces.Repositories; -using Application.Interfaces.UseCases.ProjectReport; -using Application.Ports.ProjectReport; -using Application.Validation; - -namespace Application.UseCases.ProjectReport -{ - public class DeleteProjectReport : IDeleteProjectReport - { - #region Global Scope - private readonly IProjectReportRepository _repository; - private readonly IMapper _mapper; - public DeleteProjectReport(IProjectReportRepository repository, IMapper mapper) - { - _repository = repository; - _mapper = mapper; - } - #endregion Global Scope - - public async Task ExecuteAsync(Guid? id) - { - // Verifica se o id foi informado - UseCaseException.NotInformedParam(id is null, nameof(id)); - - // Remove a entidade - Domain.Entities.ProjectReport model = await _repository.DeleteAsync(id); - - // Retorna o curso removido - return _mapper.Map(model); - } - } -} \ No newline at end of file diff --git a/src/Application/UseCases/ProjectReport/GetProjectReportById.cs b/src/Application/UseCases/ProjectReport/GetProjectReportById.cs deleted file mode 100644 index 854884d4..00000000 --- a/src/Application/UseCases/ProjectReport/GetProjectReportById.cs +++ /dev/null @@ -1,28 +0,0 @@ -using AutoMapper; -using Domain.Interfaces.Repositories; -using Application.Interfaces.UseCases.ProjectReport; -using Application.Ports.ProjectReport; -using Application.Validation; - -namespace Application.UseCases.ProjectReport -{ - public class GetProjectReportById : IGetProjectReportById - { - #region Global Scope - private readonly IProjectReportRepository _repository; - private readonly IMapper _mapper; - public GetProjectReportById(IProjectReportRepository repository, IMapper mapper) - { - _repository = repository; - _mapper = mapper; - } - #endregion Global Scope - - public async Task ExecuteAsync(Guid? id) - { - UseCaseException.NotInformedParam(id is null, nameof(id)); - Domain.Entities.ProjectReport? entity = await _repository.GetByIdAsync(id); - return _mapper.Map(entity); - } - } -} \ No newline at end of file diff --git a/src/Application/UseCases/ProjectReport/GetProjectReportByProjectId.cs b/src/Application/UseCases/ProjectReport/GetProjectReportByProjectId.cs deleted file mode 100644 index 9ef3a1d7..00000000 --- a/src/Application/UseCases/ProjectReport/GetProjectReportByProjectId.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Application.Interfaces.UseCases.ProjectReport; -using Application.Ports.ProjectReport; -using Application.Validation; -using AutoMapper; -using Domain.Interfaces.Repositories; - -namespace Application.UseCases.ProjectReport -{ - public class GetProjectReportByProjectId : IGetProjectReportsByProjectId - { - #region Global Scope - private readonly IProjectReportRepository _repository; - private readonly IMapper _mapper; - public GetProjectReportByProjectId(IProjectReportRepository repository, IMapper mapper) - { - _repository = repository; - _mapper = mapper; - } - #endregion Global Scope - - public async Task> ExecuteAsync(Guid? projectId) - { - UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); - var entities = await _repository.GetByProjectIdAsync(projectId); - return _mapper.Map>(entities); - } - } -} \ No newline at end of file diff --git a/src/Domain/Entities/Enums/EReportType.cs b/src/Domain/Entities/Enums/EReportType.cs deleted file mode 100644 index 50098cae..00000000 --- a/src/Domain/Entities/Enums/EReportType.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.ComponentModel; - -namespace Domain.Entities.Enums -{ - public enum EReportType - { - [Description("Parcial")] - Partial, - [Description("Final")] - Final - } -} \ No newline at end of file diff --git a/src/Domain/Entities/ProjectReport.cs b/src/Domain/Entities/ProjectFinalReport.cs similarity index 67% rename from src/Domain/Entities/ProjectReport.cs rename to src/Domain/Entities/ProjectFinalReport.cs index 74a26e91..6b9ccdc9 100644 --- a/src/Domain/Entities/ProjectReport.cs +++ b/src/Domain/Entities/ProjectFinalReport.cs @@ -1,33 +1,15 @@ -using Domain.Entities.Enums; using Domain.Entities.Primitives; using Domain.Validation; namespace Domain.Entities { - public class ProjectReport : Entity + public class ProjectFinalReport : Entity { /// /// URL do relatório. /// public string? ReportUrl { get; set; } - private EReportType? _reportType; - /// - /// Tipo do relatório. - /// - public EReportType? ReportType - { - get { return _reportType; } - set - { - EntityExceptionValidation.When(value == null, - ExceptionMessageFactory.Required(nameof(ReportType))); - EntityExceptionValidation.When(!Enum.TryParse(value.ToString(), out var _), - ExceptionMessageFactory.Invalid(nameof(ReportType))); - _reportType = value; - } - } - private DateTime? _sendDate; /// /// Data de envio do relatório. @@ -76,9 +58,8 @@ public Guid? UserId public virtual Project? Project { get; set; } public virtual User? User { get; set; } - public ProjectReport(EReportType? reportType, Guid? projectId) + public ProjectFinalReport(Guid? projectId) { - ReportType = reportType; SendDate = DateTime.UtcNow; ProjectId = projectId; } diff --git a/src/Domain/Interfaces/Repositories/IProjectReportRepository.cs b/src/Domain/Interfaces/Repositories/IProjectFinalReportRepository.cs similarity index 67% rename from src/Domain/Interfaces/Repositories/IProjectReportRepository.cs rename to src/Domain/Interfaces/Repositories/IProjectFinalReportRepository.cs index 5d502c2e..cb66d19f 100644 --- a/src/Domain/Interfaces/Repositories/IProjectReportRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProjectFinalReportRepository.cs @@ -3,13 +3,13 @@ namespace Domain.Interfaces.Repositories { - public interface IProjectReportRepository : IGenericCRUDRepository + public interface IProjectFinalReportRepository : IGenericCRUDRepository { /// /// Busca relatório de projeto pelo Id do projeto informado. /// /// Id do projeto. /// Relatório de projeto encontrado. - Task?> GetByProjectIdAsync(Guid? projectId); + Task?> GetByProjectIdAsync(Guid? projectId); } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs index f942b046..daf6536f 100644 --- a/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs +++ b/src/Infrastructure/Persistence/Context/ApplicationDbContext.cs @@ -29,7 +29,7 @@ public ApplicationDbContext(DbContextOptions options) : ba public DbSet Projects { get; set; } public DbSet ProjectActivities { get; set; } public DbSet ProjectEvaluations { get; set; } - public DbSet ProjectReports { get; set; } + public DbSet ProjectFinalReports { get; set; } public DbSet ProgramTypes { get; set; } public DbSet Students { get; set; } public DbSet StudentDocuments { get; set; } diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectReportConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectFinalReportConfiguration.cs similarity index 77% rename from src/Infrastructure/Persistence/EntitiesConfiguration/ProjectReportConfiguration.cs rename to src/Infrastructure/Persistence/EntitiesConfiguration/ProjectFinalReportConfiguration.cs index 3221b48d..6abadc8a 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectReportConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/ProjectFinalReportConfiguration.cs @@ -4,19 +4,17 @@ namespace Infrastructure.Persistence.EntitiesConfiguration { - public class ProjectReportConfiguration : IEntityTypeConfiguration + public class ProjectFinalReportConfiguration : IEntityTypeConfiguration { - public void Configure(EntityTypeBuilder builder) + public void Configure(EntityTypeBuilder builder) { - builder.ToTable("ProjectReports"); + builder.ToTable("ProjectFinalReports"); builder.HasKey(t => t.Id); builder.Property(p => p.Id) .ValueGeneratedOnAdd(); builder.Property(p => p.ReportUrl) .IsRequired(); - builder.Property(p => p.ReportType) - .IsRequired(); builder.Property(p => p.SendDate) .IsRequired(); builder.Property(p => p.ProjectId) diff --git a/src/Infrastructure/Persistence/Repositories/ProjectReportRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectFinalReportRepository.cs similarity index 62% rename from src/Infrastructure/Persistence/Repositories/ProjectReportRepository.cs rename to src/Infrastructure/Persistence/Repositories/ProjectFinalReportRepository.cs index a052f7f6..00a1fa5f 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectReportRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectFinalReportRepository.cs @@ -6,22 +6,22 @@ namespace Persistence.Repositories { - public class ProjectReportRepository : IProjectReportRepository + public class ProjectFinalReportRepository : IProjectFinalReportRepository { private readonly ApplicationDbContext _context; - public ProjectReportRepository(ApplicationDbContext context) + public ProjectFinalReportRepository(ApplicationDbContext context) { _context = context; } - public async Task CreateAsync(ProjectReport model) + public async Task CreateAsync(ProjectFinalReport model) { _context.Add(model); await _context.SaveChangesAsync(); return model; } - public async Task DeleteAsync(Guid? id) + public async Task DeleteAsync(Guid? id) { var model = await GetByIdAsync(id) ?? throw new Exception($"Nenhum registro encontrado para o id ({id}) informado."); @@ -29,9 +29,9 @@ public async Task DeleteAsync(Guid? id) return await UpdateAsync(model); } - public async Task> GetAllAsync(int skip, int take) + public async Task> GetAllAsync(int skip, int take) { - return await _context.ProjectReports + return await _context.ProjectFinalReports .Skip(skip) .Take(take) .AsAsyncEnumerable() @@ -39,24 +39,24 @@ public async Task> GetAllAsync(int skip, int take) .ToListAsync(); } - public async Task GetByIdAsync(Guid? id) + public async Task GetByIdAsync(Guid? id) { - return await _context.ProjectReports + return await _context.ProjectFinalReports .IgnoreQueryFilters() .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.Id == id); } - public async Task?> GetByProjectIdAsync(Guid? projectId) + public async Task?> GetByProjectIdAsync(Guid? projectId) { - return await _context.ProjectReports + return await _context.ProjectFinalReports .IgnoreQueryFilters() .AsAsyncEnumerable() .Where(x => x.ProjectId == projectId) .ToListAsync(); } - public async Task UpdateAsync(ProjectReport model) + public async Task UpdateAsync(ProjectFinalReport model) { _context.Update(model); await _context.SaveChangesAsync(); diff --git a/src/Infrastructure/WebAPI/Controllers/ProjectReportController.cs b/src/Infrastructure/WebAPI/Controllers/ProjectReportController.cs index dbfd17b4..714c21b3 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProjectReportController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProjectReportController.cs @@ -1,5 +1,5 @@ -using Application.Ports.ProjectReport; -using Application.Interfaces.UseCases.ProjectReport; +using Application.Ports.ProjectFinalReport; +using Application.Interfaces.UseCases.ProjectFinalReport; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -11,15 +11,15 @@ namespace WebAPI.Controllers [ApiController] [Route("api/v1/[controller]")] [Authorize] - public class ProjectReportController : ControllerBase + public class ProjectFinalReportController : ControllerBase { #region Global Scope - private readonly IGetProjectReportById _getById; - private readonly IGetProjectReportsByProjectId _getByProjectId; - private readonly ICreateProjectReport _create; - private readonly IUpdateProjectReport _update; - private readonly IDeleteProjectReport _delete; - private readonly ILogger _logger; + private readonly IGetProjectFinalReportById _getById; + private readonly IGetProjectFinalReportsByProjectId _getByProjectId; + private readonly ICreateProjectFinalReport _create; + private readonly IUpdateProjectFinalReport _update; + private readonly IDeleteProjectFinalReport _delete; + private readonly ILogger _logger; /// /// Construtor do Controller de Relatório de Projeto. @@ -30,12 +30,12 @@ public class ProjectReportController : ControllerBase /// Use Case de atualização de relatório de projeto. /// Use Case de remoção de relatório de projeto. /// Logger. - public ProjectReportController(IGetProjectReportById getById, - IGetProjectReportsByProjectId getByProjectId, - ICreateProjectReport create, - IUpdateProjectReport update, - IDeleteProjectReport delete, - ILogger logger) + public ProjectFinalReportController(IGetProjectFinalReportById getById, + IGetProjectFinalReportsByProjectId getByProjectId, + ICreateProjectFinalReport create, + IUpdateProjectFinalReport update, + IDeleteProjectFinalReport delete, + ILogger logger) { _getById = getById; _getByProjectId = getByProjectId; @@ -56,11 +56,11 @@ public ProjectReportController(IGetProjectReportById getById, /// Usuário não autorizado. /// Relatório de projeto não encontrado. [HttpGet("{id}")] - [ProducesResponseType(typeof(DetailedReadProjectReportOutput), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(DetailedReadProjectFinalReportOutput), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task> GetById(Guid? id) + public async Task> GetById(Guid? id) { if (id == null) { @@ -94,11 +94,11 @@ public async Task> GetById(Guid? i /// Usuário não autorizado. /// Relatórios de projeto não encontrados. [HttpGet("project/{projectId}")] - [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task>> GetByProjectId(Guid? projectId) + public async Task>> GetByProjectId(Guid? projectId) { if (projectId == null) { @@ -131,10 +131,10 @@ public async Task>> Ge /// Dados inválidos. /// Usuário não autorizado. [HttpPost] - [ProducesResponseType(typeof(DetailedReadProjectReportOutput), StatusCodes.Status201Created)] + [ProducesResponseType(typeof(DetailedReadProjectFinalReportOutput), StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] - public async Task> Create([FromBody] CreateProjectReportInput request) + public async Task> Create([FromBody] CreateProjectFinalReportInput request) { try { @@ -160,11 +160,11 @@ public async Task> Create([FromBod /// Usuário não autorizado. /// Relatório de projeto não encontrado. [HttpPut("{id}")] - [ProducesResponseType(typeof(DetailedReadProjectReportOutput), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(DetailedReadProjectFinalReportOutput), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task> Update(Guid? id, [FromBody] UpdateProjectReportInput request) + public async Task> Update(Guid? id, [FromBody] UpdateProjectFinalReportInput request) { if (id == null) { @@ -198,11 +198,11 @@ public async Task> Update(Guid? id /// Usuário não autorizado. /// Relatório de projeto não encontrado. [HttpDelete("{id}")] - [ProducesResponseType(typeof(DetailedReadProjectReportOutput), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(DetailedReadProjectFinalReportOutput), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status404NotFound)] - public async Task> Delete(Guid? id) + public async Task> Delete(Guid? id) { if (id == null) { From fbca60f95a2f36622e774e5030e30b96f72ae4e5 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 17 Aug 2023 16:02:52 -0300 Subject: [PATCH 102/201] feat: add coordinator name to certificate --- .../UseCases/Project/GenerateCertificate.cs | 15 +++++++++++---- .../Interfaces/Repositories/IUserRepository.cs | 6 ++++++ .../Persistence/Repositories/UserRepository.cs | 5 +++++ .../Persistence/Seeds/UserSeeder.cs | 3 ++- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/Application/UseCases/Project/GenerateCertificate.cs b/src/Application/UseCases/Project/GenerateCertificate.cs index a34cfb33..b0f605bb 100644 --- a/src/Application/UseCases/Project/GenerateCertificate.cs +++ b/src/Application/UseCases/Project/GenerateCertificate.cs @@ -15,15 +15,17 @@ public class GenerateCertificate : IGenerateCertificate { private readonly IProjectRepository _projectRepository; private readonly INoticeRepository _noticeRepository; - private readonly IProjectReportRepository _projectReportRepository; + private readonly IProjectFinalReportRepository _projectReportRepository; private readonly IProfessorRepository _professorRepository; + private readonly IUserRepository _userRepository; private readonly IReportService _reportService; private readonly IStorageFileService _storageFileService; public GenerateCertificate( IProjectRepository projectRepository, INoticeRepository noticeRepository, - IProjectReportRepository projectReportRepository, + IProjectFinalReportRepository projectReportRepository, IProfessorRepository professorRepository, + IUserRepository userRepository, IReportService reportService, IStorageFileService storageFileService) { @@ -31,6 +33,7 @@ public GenerateCertificate( _noticeRepository = noticeRepository; _projectReportRepository = projectReportRepository; _professorRepository = professorRepository; + _userRepository = userRepository; _reportService = reportService; _storageFileService = storageFileService; } @@ -47,10 +50,14 @@ public async Task ExecuteAsync() if (!projects.Any()) return "Nenhum projeto em estágio de encerramento encontrado."; + // Obtém informações do coordenador + var coordinator = await _userRepository.GetCoordinatorAsync(); + if (coordinator is null) + return "Nenhum coordenador encontrado."; + // Encerra cada projeto verificando se o mesmo possui relatório final foreach (var project in projects) { - // Verifica se o projeto possui relatório final var reports = await _projectReportRepository.GetByProjectIdAsync(project.Id); @@ -75,7 +82,7 @@ public async Task ExecuteAsync() var uniqueName = Guid.NewGuid().ToString() + ".pdf"; // Gera certificado - var path = await _reportService.GenerateCertificateAsync(project, "", uniqueName); + var path = await _reportService.GenerateCertificateAsync(project, coordinator.Name!, uniqueName); // Converte certificado para IFormFile a fim de enviá-lo para nuvem var file = new FormFile(new MemoryStream(File.ReadAllBytes(path)), 0, 0, "certificate", uniqueName); diff --git a/src/Domain/Interfaces/Repositories/IUserRepository.cs b/src/Domain/Interfaces/Repositories/IUserRepository.cs index 4815110f..7c60f186 100644 --- a/src/Domain/Interfaces/Repositories/IUserRepository.cs +++ b/src/Domain/Interfaces/Repositories/IUserRepository.cs @@ -63,5 +63,11 @@ public interface IUserRepository /// CPF do usuário. /// Usuário encontrado. Task GetUserByCPFAsync(string? cpf); + + /// + /// Retorna usuário com permissão de coordenador. + /// + /// Coordenador encontrado. + Task GetCoordinatorAsync(); } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/UserRepository.cs b/src/Infrastructure/Persistence/Repositories/UserRepository.cs index 6a9db1b5..11059084 100644 --- a/src/Infrastructure/Persistence/Repositories/UserRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/UserRepository.cs @@ -76,6 +76,11 @@ public async Task DeleteAsync(Guid? id) { return await _context.Users.FirstOrDefaultAsync(x => x.CPF == cpf); } + + public async Task GetCoordinatorAsync() + { + return await _context.Users.FirstOrDefaultAsync(x => x.IsCoordinator); + } #endregion Auth Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Seeds/UserSeeder.cs b/src/Infrastructure/Persistence/Seeds/UserSeeder.cs index 0f8a3dc6..e63ae604 100644 --- a/src/Infrastructure/Persistence/Seeds/UserSeeder.cs +++ b/src/Infrastructure/Persistence/Seeds/UserSeeder.cs @@ -8,7 +8,7 @@ public static void Seed(MigrationBuilder builder) { builder.InsertData( table: "Users", - columns: new[] { "Id", "DeletedAt", "Name", "Email", "Password", "CPF", "IsConfirmed", "Role" }, + columns: new[] { "Id", "DeletedAt", "Name", "Email", "Password", "CPF", "IsConfirmed", "IsCoordinator", "Role" }, values: new object[,] { { @@ -19,6 +19,7 @@ public static void Seed(MigrationBuilder builder) "ieSgcgP4w2Am80FsWXlCqg==.4F9CiQ8v2t4Mu62R/DVJILBtQrl8mPh73MlbogRMXkw=", "50806176083", true, + true, 0 }, }, From 6cd2e528b676824869aec0223746c87104d7198e Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 17 Aug 2023 16:05:49 -0300 Subject: [PATCH 103/201] feat: add make admin and coordinator endpoints --- .../WebAPI/Controllers/UserController.cs | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/src/Infrastructure/WebAPI/Controllers/UserController.cs b/src/Infrastructure/WebAPI/Controllers/UserController.cs index 46c8586c..52abeb68 100644 --- a/src/Infrastructure/WebAPI/Controllers/UserController.cs +++ b/src/Infrastructure/WebAPI/Controllers/UserController.cs @@ -20,6 +20,8 @@ public class UserController : ControllerBase private readonly IGetInactiveUsers _getInactiveUsers; private readonly IGetUserById _getUserById; private readonly IUpdateUser _updateUser; + private readonly IMakeAdmin _makeAdmin; + private readonly IMakeCoordinator _makeCoordinator; private readonly ILogger _logger; /// @@ -31,6 +33,8 @@ public class UserController : ControllerBase /// Obtém todos os usuários inativos. /// Obtém usuário pelo id. /// Atualiza usuário. + /// Torna usuário administrador. + /// Torna usuário coordenador. /// Logger. public UserController(IActivateUser activateUser, IDeactivateUser deactivateUser, @@ -38,6 +42,8 @@ public UserController(IActivateUser activateUser, IGetInactiveUsers getInactiveUsers, IGetUserById getUserById, IUpdateUser updateUser, + IMakeAdmin makeAdmin, + IMakeCoordinator makeCoordinator, ILogger logger) { _activateUser = activateUser; @@ -46,6 +52,8 @@ public UserController(IActivateUser activateUser, _getInactiveUsers = getInactiveUsers; _getUserById = getUserById; _updateUser = updateUser; + _makeAdmin = makeAdmin; + _makeCoordinator = makeCoordinator; _logger = logger; } #endregion Global Scope @@ -232,5 +240,71 @@ public async Task> Deactivate(Guid? userId) return BadRequest(ex.Message); } } + + /// + /// Torna usuário administrador pelo Id. + /// + /// Id do usuário. + /// Resultado da operação. + /// Usuário administrador. + /// Id não informado. + /// Usuário não autorizado. + [HttpPut("Admin/{userId}", Name = "MakeAdmin")] + [Authorize(Roles = "ADMIN")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(UserReadOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task> MakeAdmin(Guid? userId) + { + if (userId == null) + { + return BadRequest("O ID informado não pode ser nulo."); + } + + try + { + var result = await _makeAdmin.ExecuteAsync(userId.Value); + _logger.LogInformation("Operação realizada: {Resultado}", result); + return Ok(result); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); + } + } + + /// + /// Torna usuário coordenador pelo Id. + /// + /// Id do usuário. + /// Resultado da operação. + /// Usuário coordenador. + /// Id não informado. + /// Usuário não autorizado. + [HttpPut("Coordinator/{userId}", Name = "MakeCoordinator")] + [Authorize(Roles = "ADMIN")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(UserReadOutput))] + [ProducesResponseType(StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status401Unauthorized)] + public async Task> MakeCoordinator(Guid? userId) + { + if (userId == null) + { + return BadRequest("O ID informado não pode ser nulo."); + } + + try + { + var result = await _makeCoordinator.ExecuteAsync(userId.Value); + _logger.LogInformation("Operação realizada: {Resultado}", result); + return Ok(result); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); + } + } } } From 169d686e1f52512cdcf9a8255f91ef16f9b96ba6 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 17 Aug 2023 16:29:51 -0300 Subject: [PATCH 104/201] feat: add some scoped classes --- src/Infrastructure/IoC/ApplicationDI.cs | 3 +++ src/Infrastructure/IoC/ExternalServicesDI.cs | 1 + 2 files changed, 4 insertions(+) diff --git a/src/Infrastructure/IoC/ApplicationDI.cs b/src/Infrastructure/IoC/ApplicationDI.cs index abf45c06..e4756ca8 100644 --- a/src/Infrastructure/IoC/ApplicationDI.cs +++ b/src/Infrastructure/IoC/ApplicationDI.cs @@ -125,6 +125,7 @@ public static IServiceCollection AddApplication(this IServiceCollection services services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); #endregion Project #region ProjectEvaluation @@ -167,6 +168,8 @@ public static IServiceCollection AddApplication(this IServiceCollection services services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); + services.AddScoped(); #endregion User #endregion UseCases diff --git a/src/Infrastructure/IoC/ExternalServicesDI.cs b/src/Infrastructure/IoC/ExternalServicesDI.cs index 3e88e225..ff78d185 100644 --- a/src/Infrastructure/IoC/ExternalServicesDI.cs +++ b/src/Infrastructure/IoC/ExternalServicesDI.cs @@ -36,6 +36,7 @@ public static IServiceCollection AddExternalServices(this IServiceCollection ser services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); #endregion Demais Serviços return services; From a1883148bb1162e8c88233e28e738ad150d851c6 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 17 Aug 2023 20:24:05 -0300 Subject: [PATCH 105/201] fix: remove ProfessorProjectTitle from certificate --- src/Infrastructure/Services/ReportService.cs | 3 +-- src/Infrastructure/Services/Reports/certificate.html | 6 ------ 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/Infrastructure/Services/ReportService.cs b/src/Infrastructure/Services/ReportService.cs index 34c41c08..270e9182 100644 --- a/src/Infrastructure/Services/ReportService.cs +++ b/src/Infrastructure/Services/ReportService.cs @@ -42,9 +42,8 @@ public async Task GenerateCertificateAsync(Project project, string cordi .Replace("#PIBIC_TIPO#", $"{project?.ProgramType?.Name} / CEFET") .Replace("#INIP_EDITAL#", project?.Notice?.SendingDocsEndDate?.ToString("dd/MM/yyyy")) .Replace("#FIMP_EDITAL#", project?.Notice?.FinalReportDeadline?.ToString("dd/MM/yyyy")) - .Replace("#SITP_EDITAL#", studentSituation) // TODO: Pegar essa informação do Projeto? + .Replace("#SITP_EDITAL#", studentSituation) .Replace("#TITULO_PROJETO_ALUNO#", project?.Title) - // .Replace("#TITULO_PROJETO_ORIENTADOR#", "") // TODO: Verificar se esse campo será inserido no Projeto .Replace("#DIA_SEMANA#", DateTime.Now.DayOfWeek.ToString()) .Replace("#DIA_DATA#", DateTime.Now.Day.ToString()) .Replace("#MES_DATA#", DateTime.Now.ToString("MMMM")) diff --git a/src/Infrastructure/Services/Reports/certificate.html b/src/Infrastructure/Services/Reports/certificate.html index e078277a..bac63c4a 100644 --- a/src/Infrastructure/Services/Reports/certificate.html +++ b/src/Infrastructure/Services/Reports/certificate.html @@ -141,12 +141,6 @@
DADOS DOS ALUNOS
#TITULO_PROJETO_ALUNO#

-
-

- Título do Projeto de Pesquisado Orientador: - #TITULO_PROJETO_ORIENTADOR# -

-
From c8540c102685eadfd994d5e9ab938b1d6c3159d8 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 17 Aug 2023 21:37:05 -0300 Subject: [PATCH 106/201] feat: add web function to generate certificates --- .gitignore | 8 +- .vscode/extensions.json | 5 +- .vscode/launch.json | 8 +- .vscode/settings.json | 8 +- .vscode/tasks.json | 78 ++++++++++++++++++- src/Application/Application.csproj | 4 + .../UseCases/Project/GenerateCertificate.cs | 29 +++++-- src/CopetSystem.API.sln | 7 ++ src/Infrastructure/IoC/InfrastructureDI.cs | 5 +- src/Infrastructure/IoC/PersistenceDI.cs | 1 + .../IoC/Utils/SettingsConfiguration.cs | 33 +++++--- src/Infrastructure/Persistence/README.md | 2 +- src/Infrastructure/Services/ReportService.cs | 55 +++++++++++++ .../Services/Reports/certificate.html | 9 ++- src/Infrastructure/Services/Services.csproj | 13 +--- src/Infrastructure/WebAPI/appsettings.json | 3 +- .../WebFunctions/GenerateCertificate.cs | 32 ++++++++ .../WebFunctions/Models/ScheduleStatus.cs | 9 +++ .../WebFunctions/Models/TimerInfo.cs | 8 ++ src/Infrastructure/WebFunctions/Program.cs | 15 ++++ .../Properties/launchSettings.json | 9 +++ .../WebFunctions/WebFunctions.csproj | 38 +++++++++ .../WebFunctions/appsettings.json | 66 ++++++++++++++++ src/Infrastructure/WebFunctions/host.json | 12 +++ .../WebFunctions/local.settings.json | 7 ++ 25 files changed, 427 insertions(+), 37 deletions(-) create mode 100644 src/Infrastructure/WebFunctions/GenerateCertificate.cs create mode 100644 src/Infrastructure/WebFunctions/Models/ScheduleStatus.cs create mode 100644 src/Infrastructure/WebFunctions/Models/TimerInfo.cs create mode 100644 src/Infrastructure/WebFunctions/Program.cs create mode 100644 src/Infrastructure/WebFunctions/Properties/launchSettings.json create mode 100644 src/Infrastructure/WebFunctions/WebFunctions.csproj create mode 100644 src/Infrastructure/WebFunctions/appsettings.json create mode 100644 src/Infrastructure/WebFunctions/host.json create mode 100644 src/Infrastructure/WebFunctions/local.settings.json diff --git a/.gitignore b/.gitignore index 00ed621c..b83bebb0 100644 --- a/.gitignore +++ b/.gitignore @@ -406,7 +406,13 @@ node_modules certificate certificate/* +storage +storage/* + +temp +temp/* + RemoteFiles RemoteFiles/* -src/Infrastructure/WebAPI/.env +**/.env thunder-tests \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 45c511c0..bb763007 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,3 +1,6 @@ { - "recommendations": [] + "recommendations": [ + "ms-azuretools.vscode-azurefunctions", + "ms-dotnettools.csharp" + ] } \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 635e62d1..1b23f5d7 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -28,6 +28,12 @@ "name": ".NET Core Attach", "type": "coreclr", "request": "attach" + }, + { + "name": "Attach to .NET Functions", + "type": "coreclr", + "request": "attach", + "processId": "${command:azureFunctions.pickProcess}" } ] -} +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index bf9555a2..d78c1a68 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,11 @@ { // "dotnet-test-explorer.testProjectPath": "src/Domain.Tests/Domain.Tests.csproj", "dotnet-test-explorer.testProjectPath": "src/Application.Tests/Application.Tests.csproj", - "dotnet.defaultSolution": "src/CopetSystem.API.sln" + "dotnet.defaultSolution": "src/CopetSystem.API.sln", + "azureFunctions.deploySubpath": "src/Infrastructure/WebFunctions/bin/Release/net7.0/publish", + "azureFunctions.projectLanguage": "C#", + "azureFunctions.projectRuntime": "~4", + "debug.internalConsoleOptions": "neverOpen", + "azureFunctions.projectSubpath": "src/Infrastructure/WebFunctions", + "azureFunctions.preDeployTask": "publish (functions)" } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index c39e443c..3b7307cf 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -36,6 +36,82 @@ "${workspaceFolder}/src/Infrastructure/WebAPI/WebAPI.csproj" ], "problemMatcher": "$msCompile" + }, + { + "label": "clean (functions)", + "command": "dotnet", + "args": [ + "clean", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "type": "process", + "problemMatcher": "$msCompile", + "options": { + "cwd": "${workspaceFolder}/src/Infrastructure/WebFunctions" + } + }, + { + "label": "build (functions)", + "command": "dotnet", + "args": [ + "build", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "type": "process", + "dependsOn": "clean (functions)", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": "$msCompile", + "options": { + "cwd": "${workspaceFolder}/src/Infrastructure/WebFunctions" + } + }, + { + "label": "clean release (functions)", + "command": "dotnet", + "args": [ + "clean", + "--configuration", + "Release", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "type": "process", + "problemMatcher": "$msCompile", + "options": { + "cwd": "${workspaceFolder}/src/Infrastructure/WebFunctions" + } + }, + { + "label": "publish (functions)", + "command": "dotnet", + "args": [ + "publish", + "--configuration", + "Release", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "type": "process", + "dependsOn": "clean release (functions)", + "problemMatcher": "$msCompile", + "options": { + "cwd": "${workspaceFolder}/src/Infrastructure/WebFunctions" + } + }, + { + "type": "func", + "dependsOn": "build (functions)", + "options": { + "cwd": "${workspaceFolder}/src/Infrastructure/WebFunctions/bin/Debug/net7.0" + }, + "command": "host start", + "isBackground": true, + "problemMatcher": "$func-dotnet-watch" } ] -} +} \ No newline at end of file diff --git a/src/Application/Application.csproj b/src/Application/Application.csproj index b2734e62..e0321a88 100644 --- a/src/Application/Application.csproj +++ b/src/Application/Application.csproj @@ -12,6 +12,10 @@ + + + + diff --git a/src/Application/UseCases/Project/GenerateCertificate.cs b/src/Application/UseCases/Project/GenerateCertificate.cs index b0f605bb..f136e232 100644 --- a/src/Application/UseCases/Project/GenerateCertificate.cs +++ b/src/Application/UseCases/Project/GenerateCertificate.cs @@ -1,18 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Application.Interfaces.UseCases.Project; -using Application.Validation; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; -using Microsoft.AspNetCore.Http.Internal; +using Microsoft.AspNetCore.Http; namespace Application.UseCases.Project { public class GenerateCertificate : IGenerateCertificate { + #region Global Scope private readonly IProjectRepository _projectRepository; private readonly INoticeRepository _noticeRepository; private readonly IProjectFinalReportRepository _projectReportRepository; @@ -37,9 +33,12 @@ public GenerateCertificate( _reportService = reportService; _storageFileService = storageFileService; } + #endregion public async Task ExecuteAsync() { + return await TestMethod(); + // Busca edital que possui data final de entrega de relatório para o dia anterior var notice = await _noticeRepository.GetNoticeEndingAsync(); if (notice is null) @@ -101,5 +100,23 @@ public async Task ExecuteAsync() return "Certificados gerados com sucesso."; } + + private async Task TestMethod() + { + var project = new Domain.Entities.Project("Project Title", "Keyword 1", "Keyword 2", "Keyword 3", true, "Objective", "Methodology", "Expected Results", "Schedule", Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), EProjectStatus.Opened, "Status Description", "Appeal Observation", DateTime.UtcNow, DateTime.UtcNow, DateTime.UtcNow, "Cancellation Reason"); + var uniqueName = Guid.NewGuid().ToString() + ".pdf"; + var path = await _reportService.GenerateCertificateAsync(project, "Eduardo Paes", uniqueName); + + // Converte certificado para IFormFile a fim de enviá-lo para nuvem + var file = new FormFile(new MemoryStream(File.ReadAllBytes(path)), 0, 0, "certificate", uniqueName); + + // Envia certificado para nuvem e salva url no projeto + var url = await _storageFileService.UploadFileAsync(file); + + // Mostra URL do certificado + Console.WriteLine(url); + + return "Certificado gerado com sucesso. Url: " + url; + } } } \ No newline at end of file diff --git a/src/CopetSystem.API.sln b/src/CopetSystem.API.sln index 28d98add..f18f223e 100644 --- a/src/CopetSystem.API.sln +++ b/src/CopetSystem.API.sln @@ -23,6 +23,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Application.Tests", "Applic EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain.Tests", "Domain.Tests\Domain.Tests.csproj", "{F72A4B83-7227-4E65-A80D-1D7FB55848FA}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebFunctions", "Infrastructure\WebFunctions\WebFunctions.csproj", "{840822F0-735A-42D8-A4B9-2D771025D3F5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -65,6 +67,10 @@ Global {F72A4B83-7227-4E65-A80D-1D7FB55848FA}.Debug|Any CPU.Build.0 = Debug|Any CPU {F72A4B83-7227-4E65-A80D-1D7FB55848FA}.Release|Any CPU.ActiveCfg = Release|Any CPU {F72A4B83-7227-4E65-A80D-1D7FB55848FA}.Release|Any CPU.Build.0 = Release|Any CPU + {840822F0-735A-42D8-A4B9-2D771025D3F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {840822F0-735A-42D8-A4B9-2D771025D3F5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {840822F0-735A-42D8-A4B9-2D771025D3F5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {840822F0-735A-42D8-A4B9-2D771025D3F5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -74,5 +80,6 @@ Global {DC12A23D-7BF2-4F0A-A317-B9FA8818C9C2} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} {163219BE-A0D2-41A1-A028-501AAB069BD9} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} {7555C53A-BADC-49D9-82BE-C4D8587260EB} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} + {840822F0-735A-42D8-A4B9-2D771025D3F5} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} EndGlobalSection EndGlobal diff --git a/src/Infrastructure/IoC/InfrastructureDI.cs b/src/Infrastructure/IoC/InfrastructureDI.cs index 301bd55e..b4e19211 100644 --- a/src/Infrastructure/IoC/InfrastructureDI.cs +++ b/src/Infrastructure/IoC/InfrastructureDI.cs @@ -2,6 +2,7 @@ using Infrastructure.IoC.Utils; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Serilog; using Services; @@ -10,11 +11,11 @@ namespace Infrastructure.IoC { public static class InfrastructureDI { - public static IServiceCollection AddInfrastructure(this IServiceCollection services) + public static IServiceCollection AddInfrastructure(this IServiceCollection services, HostBuilderContext? hostContext = null) { #region AppSettings e DotEnv // Define valores das propriedades de configuração - IConfiguration configuration = SettingsConfiguration.GetConfiguration(); + IConfiguration configuration = SettingsConfiguration.GetConfiguration(hostContext); services.AddSingleton(configuration); // Carrega informações de ambiente (.env) diff --git a/src/Infrastructure/IoC/PersistenceDI.cs b/src/Infrastructure/IoC/PersistenceDI.cs index cf4dca11..5b4957b0 100644 --- a/src/Infrastructure/IoC/PersistenceDI.cs +++ b/src/Infrastructure/IoC/PersistenceDI.cs @@ -32,6 +32,7 @@ public static IServiceCollection AddPersistence(this IServiceCollection services services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs b/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs index 319604ec..d5fbcd64 100644 --- a/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs +++ b/src/Infrastructure/IoC/Utils/SettingsConfiguration.cs @@ -1,23 +1,38 @@ using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; namespace Infrastructure.IoC.Utils { public static class SettingsConfiguration { - public static IConfiguration GetConfiguration() + public static IConfiguration GetConfiguration(HostBuilderContext? hostContext = null) { // Caminho base para o arquivo appsettings.json - string? basePath = Path.GetDirectoryName(typeof(SettingsConfiguration).Assembly.Location); + string basePath = AppContext.BaseDirectory; // Carrega informações de ambiente (.env) - _ = DotNetEnv.Env.Load(Path.Combine(basePath!, ".env")); + DotNetEnv.Env.Load(Path.Combine(basePath, ".env")); - // Retorna configurações - return new ConfigurationBuilder() - .SetBasePath(basePath!) - .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) - .AddEnvironmentVariables() - .Build(); + // Adiciona o context do host caso exista + if (hostContext != null) + { + // Retorna configurações + return new ConfigurationBuilder() + .SetBasePath(basePath) + .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) + .AddConfiguration(hostContext.Configuration) + .AddEnvironmentVariables() + .Build(); + } + else + { + // Retorna configurações + return new ConfigurationBuilder() + .SetBasePath(basePath) + .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) + .AddEnvironmentVariables() + .Build(); + } } } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index 00b121d7..2a275d75 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add RecreateDatabase --project ../Persistence/Persistence.csproj +dotnet ef migrations add UpdateSomeEntities --project ../Persistence/Persistence.csproj ``` Executando as Migrations: diff --git a/src/Infrastructure/Services/ReportService.cs b/src/Infrastructure/Services/ReportService.cs index 270e9182..2a54bc2d 100644 --- a/src/Infrastructure/Services/ReportService.cs +++ b/src/Infrastructure/Services/ReportService.cs @@ -17,6 +17,8 @@ public ReportService(IConfiguration configuration) public async Task GenerateCertificateAsync(Project project, string cordinatorName, string fileName) { + return await GenerateCertificateTestAsync(fileName); + // Caminho temporário onde será salvo o arquivo string outputPath = Path.Combine(_outputPath!, fileName); @@ -61,5 +63,58 @@ public async Task GenerateCertificateAsync(Project project, string cordi // Retorna caminho onde foi salvo o arquivo return outputPath; } + + public async Task GenerateCertificateTestAsync(string fileName) + { + // Caminho temporário onde será salvo o arquivo + string outputPath = Path.Combine(_outputPath!, fileName); + + // Obtém o conteúdo do arquivo HTML + string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Reports/certificate.html")); + + var logoCefet = ConvertSvgToBase64(Path.Combine(_currentDirectory!, "Reports/logo-cefet.svg")); + var carimboCefet = ConvertSvgToBase64(Path.Combine(_currentDirectory!, "Reports/carimbo.svg")); + + // Substitui as variáveis do HTML pelos valores do projeto + template = template + .Replace("#LOGO_CEFET#", logoCefet) + .Replace("#CARIMBO_CEFET#", carimboCefet) + .Replace("#NOME_ORIENTADOR#", "Luciana Faletti") + .Replace("#SUBAREA_PROJETO#", "Engenharia Elétrica") + .Replace("#NOME_ORIENTADO#", "Eduardo Paes") + .Replace("#DATA_EDITAL#", "2023 / 2") + .Replace("#PIBIC_TIPO#", "PIBIC / CEFET") + .Replace("#INIP_EDITAL#", "01/01/2023") + .Replace("#FIMP_EDITAL#", "01/03/2023") + .Replace("#SITP_EDITAL#", "Término do Período de Bolsa") + .Replace("#TITULO_PROJETO_ALUNO#", "Teste de Projeto") + .Replace("#DIA_SEMANA#", DateTime.Now.DayOfWeek.ToString()) + .Replace("#DIA_DATA#", DateTime.Now.Day.ToString()) + .Replace("#MES_DATA#", DateTime.Now.ToString("MMMM")) + .Replace("#ANO_DATA#", DateTime.Now.Year.ToString()) + .Replace("#NOME_COORDENADOR#", "Diego Haddad"); + + // Transforma HTML em PDF + await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision); + var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true }); + var page = await browser.NewPageAsync(); + await page.SetContentAsync(template); + await page.PdfAsync(outputPath); + await browser.CloseAsync(); + + // Mostra caminho onde foi salvo o arquivo + Console.WriteLine(outputPath); + + // Retorna caminho onde foi salvo o arquivo + return outputPath; + } + + private static string ConvertSvgToBase64(string filePath) + { + byte[] svgBytes = File.ReadAllBytes(filePath); + string base64String = Convert.ToBase64String(svgBytes); + + return base64String; + } } } \ No newline at end of file diff --git a/src/Infrastructure/Services/Reports/certificate.html b/src/Infrastructure/Services/Reports/certificate.html index bac63c4a..6f04298a 100644 --- a/src/Infrastructure/Services/Reports/certificate.html +++ b/src/Infrastructure/Services/Reports/certificate.html @@ -72,7 +72,7 @@
logo-cefet
- carimbo + carimbo
diff --git a/src/Infrastructure/Services/Services.csproj b/src/Infrastructure/Services/Services.csproj index cddfe4f5..b268ce65 100644 --- a/src/Infrastructure/Services/Services.csproj +++ b/src/Infrastructure/Services/Services.csproj @@ -20,19 +20,10 @@ - + PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - + PreserveNewest diff --git a/src/Infrastructure/WebAPI/appsettings.json b/src/Infrastructure/WebAPI/appsettings.json index 897fe757..2015d529 100644 --- a/src/Infrastructure/WebAPI/appsettings.json +++ b/src/Infrastructure/WebAPI/appsettings.json @@ -61,5 +61,6 @@ "SmtpConfiguration": { "Server": "smtp.office365.com", "Port": 587 - } + }, + "TempPath": "/Users/eduardo/Projects/CEFET/CopetSystem/CopetSystem.API/temp" } diff --git a/src/Infrastructure/WebFunctions/GenerateCertificate.cs b/src/Infrastructure/WebFunctions/GenerateCertificate.cs new file mode 100644 index 00000000..77699dbd --- /dev/null +++ b/src/Infrastructure/WebFunctions/GenerateCertificate.cs @@ -0,0 +1,32 @@ +using Application.Interfaces.UseCases.Project; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Extensions.Logging; +using WebFunctions.Models; + +namespace Infrastructure.WebFunctions +{ + public class GenerateCertificate + { + private readonly ILogger _logger; + private readonly IGenerateCertificate _generateCertificate; + + public GenerateCertificate(ILogger logger, IGenerateCertificate generateCertificate) + { + _logger = logger; + _generateCertificate = generateCertificate; + } + + [Function("GenerateCertificate")] + public async Task Run([TimerTrigger("0 * * * * *")] TimerInfo timer) + { + _logger.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}"); + + await _generateCertificate.ExecuteAsync(); + + if (timer is not null) + { + _logger.LogInformation($"Next timer schedule at: {timer.ScheduleStatus?.Next}"); + } + } + } +} diff --git a/src/Infrastructure/WebFunctions/Models/ScheduleStatus.cs b/src/Infrastructure/WebFunctions/Models/ScheduleStatus.cs new file mode 100644 index 00000000..0a63029f --- /dev/null +++ b/src/Infrastructure/WebFunctions/Models/ScheduleStatus.cs @@ -0,0 +1,9 @@ +namespace WebFunctions.Models +{ + public class ScheduleStatus + { + public DateTime Last { get; set; } + public DateTime Next { get; set; } + public DateTime LastUpdated { get; set; } + } +} \ No newline at end of file diff --git a/src/Infrastructure/WebFunctions/Models/TimerInfo.cs b/src/Infrastructure/WebFunctions/Models/TimerInfo.cs new file mode 100644 index 00000000..90bf064e --- /dev/null +++ b/src/Infrastructure/WebFunctions/Models/TimerInfo.cs @@ -0,0 +1,8 @@ +namespace WebFunctions.Models +{ + public class TimerInfo + { + public ScheduleStatus? ScheduleStatus { get; set; } + public bool IsPastDue { get; set; } + } +} \ No newline at end of file diff --git a/src/Infrastructure/WebFunctions/Program.cs b/src/Infrastructure/WebFunctions/Program.cs new file mode 100644 index 00000000..b4b6026d --- /dev/null +++ b/src/Infrastructure/WebFunctions/Program.cs @@ -0,0 +1,15 @@ +using Microsoft.Extensions.Hosting; +using Infrastructure.IoC; + +var host = new HostBuilder() + .ConfigureFunctionsWorkerDefaults() + .ConfigureServices((hostContext, services) => + { + services.AddInfrastructure(hostContext); + services.AddPersistence(); + services.AddExternalServices(); + services.AddApplication(); + }) + .Build(); + +host.Run(); diff --git a/src/Infrastructure/WebFunctions/Properties/launchSettings.json b/src/Infrastructure/WebFunctions/Properties/launchSettings.json new file mode 100644 index 00000000..723a72d4 --- /dev/null +++ b/src/Infrastructure/WebFunctions/Properties/launchSettings.json @@ -0,0 +1,9 @@ +{ + "profiles": { + "WebFunctions": { + "commandName": "Project", + "commandLineArgs": "--port 7055", + "launchBrowser": false + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/WebFunctions/WebFunctions.csproj b/src/Infrastructure/WebFunctions/WebFunctions.csproj new file mode 100644 index 00000000..6b118bd0 --- /dev/null +++ b/src/Infrastructure/WebFunctions/WebFunctions.csproj @@ -0,0 +1,38 @@ + + + net7.0 + v4 + Exe + enable + enable + + + + + + + + + + + PreserveNewest + + + PreserveNewest + Never + + + PreserveNewest + + + PreserveNewest + + + + + + + + + + \ No newline at end of file diff --git a/src/Infrastructure/WebFunctions/appsettings.json b/src/Infrastructure/WebFunctions/appsettings.json new file mode 100644 index 00000000..2015d529 --- /dev/null +++ b/src/Infrastructure/WebFunctions/appsettings.json @@ -0,0 +1,66 @@ +{ + "SiteUrl": "https://localhost:5001", + "ConnectionStrings": { + "DefaultConnection": "Server=localhost;Database=COPET_DB;Port=15432;User ID=copet-admin;password=Copet@123;Include Error Detail=true;" + }, + "Serilog": { + "Using": ["Serilog.Sinks.Console", "Serilog.Sinks.File"], + "MinimumLevel": { + "Default": "Information", + "Override": { + "Microsoft": "Warning", + "System": "Warning" + } + }, + "WriteTo": [ + { + "Name": "Console", + "Args": { + "outputTemplate": "[{Timestamp:HH:mm:ss}] {SourceContext} [{Level}] {Message}{NewLine}{Exception}" + } + } + ], + "Enrich": ["FromLogContext", "WithMachineName", "WithThreadId"] + }, + "IpRateLimiting": { + "EnableEndpointRateLimiting": true, + "StackBlockedRequests": false, + "RealIPHeader": "X-Real-IP", + "ClientIdHeader": "X-ClientId", + "HttpStatusCode": 429, + "GeneralRules": [ + { + "Endpoint": "*", + "Period": "10s", + "Limit": 10 + }, + { + "Endpoint": "*:/api/auth/*", + "Period": "1s", + "Limit": 1 + }, + { + "Endpoint": "(post):/api/professor", + "Period": "1s", + "Limit": 1 + }, + { + "Endpoint": "(post):/api/student", + "Period": "1s", + "Limit": 1 + } + ] + }, + "StorageFile": { + "AllowedExtensions": [".txt", ".pdf", ".doc", ".docx", ".png", ".jpg"], + "MaxFileSizeInBytes": 10485760 + }, + "Jwt": { + "ExpireIn": 60 + }, + "SmtpConfiguration": { + "Server": "smtp.office365.com", + "Port": 587 + }, + "TempPath": "/Users/eduardo/Projects/CEFET/CopetSystem/CopetSystem.API/temp" +} diff --git a/src/Infrastructure/WebFunctions/host.json b/src/Infrastructure/WebFunctions/host.json new file mode 100644 index 00000000..ee5cf5f8 --- /dev/null +++ b/src/Infrastructure/WebFunctions/host.json @@ -0,0 +1,12 @@ +{ + "version": "2.0", + "logging": { + "applicationInsights": { + "samplingSettings": { + "isEnabled": true, + "excludedTypes": "Request" + }, + "enableLiveMetricsFilters": true + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/WebFunctions/local.settings.json b/src/Infrastructure/WebFunctions/local.settings.json new file mode 100644 index 00000000..8eea88f4 --- /dev/null +++ b/src/Infrastructure/WebFunctions/local.settings.json @@ -0,0 +1,7 @@ +{ + "IsEncrypted": false, + "Values": { + "AzureWebJobsStorage": "UseDevelopmentStorage=true", + "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated" + } +} From 1e5d4380ff556a47cfcdd1234ee7a5f419b0a71c Mon Sep 17 00:00:00 2001 From: eduardo Date: Fri, 18 Aug 2023 11:37:56 -0300 Subject: [PATCH 107/201] feat: conclude GenerateCertificate web function --- .../UseCases/Project/GenerateCertificate.cs | 10 +- .../Services/IStorageFileService.cs | 8 + .../Services/AzureStorageService.cs | 26 + src/Infrastructure/Services/ReportService.cs | 127 +- .../Services/Reports/bootstrap.min.css | 11741 ++++++++++++++++ .../Services/Reports/certificate.html | 19 +- .../Services/StorageFileService.cs | 5 + .../WebFunctions/GenerateCertificate.cs | 22 +- ...eduleStatus.cs => CustomScheduleStatus.cs} | 2 +- .../WebFunctions/Models/CustomTimerInfo.cs | 8 + .../WebFunctions/Models/TimerInfo.cs | 8 - 11 files changed, 11904 insertions(+), 72 deletions(-) create mode 100644 src/Infrastructure/Services/Reports/bootstrap.min.css rename src/Infrastructure/WebFunctions/Models/{ScheduleStatus.cs => CustomScheduleStatus.cs} (82%) create mode 100644 src/Infrastructure/WebFunctions/Models/CustomTimerInfo.cs delete mode 100644 src/Infrastructure/WebFunctions/Models/TimerInfo.cs diff --git a/src/Application/UseCases/Project/GenerateCertificate.cs b/src/Application/UseCases/Project/GenerateCertificate.cs index f136e232..bfa886ae 100644 --- a/src/Application/UseCases/Project/GenerateCertificate.cs +++ b/src/Application/UseCases/Project/GenerateCertificate.cs @@ -37,8 +37,6 @@ public GenerateCertificate( public async Task ExecuteAsync() { - return await TestMethod(); - // Busca edital que possui data final de entrega de relatório para o dia anterior var notice = await _noticeRepository.GetNoticeEndingAsync(); if (notice is null) @@ -84,10 +82,10 @@ public async Task ExecuteAsync() var path = await _reportService.GenerateCertificateAsync(project, coordinator.Name!, uniqueName); // Converte certificado para IFormFile a fim de enviá-lo para nuvem - var file = new FormFile(new MemoryStream(File.ReadAllBytes(path)), 0, 0, "certificate", uniqueName); + var bytes = File.ReadAllBytes(path); // Envia certificado para nuvem e salva url no projeto - project.CertificateUrl = await _storageFileService.UploadFileAsync(file); + project.CertificateUrl = await _storageFileService.UploadFileAsync(bytes, path); // Encerra projeto project.Status = EProjectStatus.Closed; @@ -108,10 +106,10 @@ private async Task TestMethod() var path = await _reportService.GenerateCertificateAsync(project, "Eduardo Paes", uniqueName); // Converte certificado para IFormFile a fim de enviá-lo para nuvem - var file = new FormFile(new MemoryStream(File.ReadAllBytes(path)), 0, 0, "certificate", uniqueName); + var bytes = File.ReadAllBytes(path); // Envia certificado para nuvem e salva url no projeto - var url = await _storageFileService.UploadFileAsync(file); + var url = await _storageFileService.UploadFileAsync(bytes, path); // Mostra URL do certificado Console.WriteLine(url); diff --git a/src/Domain/Interfaces/Services/IStorageFileService.cs b/src/Domain/Interfaces/Services/IStorageFileService.cs index 56a50d53..3b6d7708 100644 --- a/src/Domain/Interfaces/Services/IStorageFileService.cs +++ b/src/Domain/Interfaces/Services/IStorageFileService.cs @@ -12,6 +12,14 @@ public interface IStorageFileService /// Caminho final do arquivo Task UploadFileAsync(IFormFile file, string? filePath = null); + /// + /// Realiza o upload de um arquivo de edital + /// + /// Edital em pdf + /// Caminho completo até o arquivo + /// Caminho final do arquivo + Task UploadFileAsync(byte[] file, string? filePath); + /// /// Deleta um arquivo /// diff --git a/src/Infrastructure/Services/AzureStorageService.cs b/src/Infrastructure/Services/AzureStorageService.cs index 33499b33..7089da67 100644 --- a/src/Infrastructure/Services/AzureStorageService.cs +++ b/src/Infrastructure/Services/AzureStorageService.cs @@ -85,6 +85,32 @@ public async Task UploadFileAsync(IFormFile file, string? filePath = nul return blobClient.Uri.AbsoluteUri; } + public async Task UploadFileAsync(byte[] file, string? filePath) + { + // Remove o arquivo anterior caso já exista + if (!string.IsNullOrEmpty(filePath)) + { + // Utiliza o mesmo nome do arquivo anterior para o arquivo atual + filePath = filePath.Split("/").LastOrDefault(); + } + else + { + throw new Exception("O caminho do arquivo não foi informado."); + } + + // Cria o cliente do blob + BlobClient blobClient = new(_connectionString, _container, filePath); + + // Salva o arquivo + using (MemoryStream stream = new(file)) + { + _ = await blobClient.UploadAsync(stream); + } + + // Retorna o caminho do arquivo + return blobClient.Uri.AbsoluteUri; + } + #region Private Methods private string GenerateFileName(IFormFile file, bool onlyPdf = false) { diff --git a/src/Infrastructure/Services/ReportService.cs b/src/Infrastructure/Services/ReportService.cs index 2a54bc2d..edd06ba9 100644 --- a/src/Infrastructure/Services/ReportService.cs +++ b/src/Infrastructure/Services/ReportService.cs @@ -1,24 +1,41 @@ +using System.Globalization; using Domain.Entities; using Domain.Interfaces.Services; using Microsoft.Extensions.Configuration; using PuppeteerSharp; +using PuppeteerSharp.Media; namespace Services { public class ReportService : IReportService { - private readonly string? _currentDirectory; private readonly string? _outputPath; + private readonly CultureInfo _cultureInfo; + private readonly Dictionary _dayOfWeekMap; + private string? _certificateTemplate; public ReportService(IConfiguration configuration) { - _currentDirectory = Path.GetDirectoryName(typeof(ReportService).Assembly.Location); + // Obtém cultura brasileira para formatação de datas + _cultureInfo = new CultureInfo("pt-BR"); + + // Obtém o caminho do diretório temporário _outputPath = configuration["TempPath"]; + + // Mapeamento dos dias da semana em inglês para português + _dayOfWeekMap = new() + { + { DayOfWeek.Sunday, "Domingo" }, + { DayOfWeek.Monday, "Segunda-feira" }, + { DayOfWeek.Tuesday, "Terça-feira" }, + { DayOfWeek.Wednesday, "Quarta-feira" }, + { DayOfWeek.Thursday, "Quinta-feira" }, + { DayOfWeek.Friday, "Sexta-feira" }, + { DayOfWeek.Saturday, "Sábado" } + }; } public async Task GenerateCertificateAsync(Project project, string cordinatorName, string fileName) { - return await GenerateCertificateTestAsync(fileName); - // Caminho temporário onde será salvo o arquivo string outputPath = Path.Combine(_outputPath!, fileName); @@ -32,11 +49,26 @@ public async Task GenerateCertificateAsync(Project project, string cordi // Obtém a situação do aluno (Bolsista ou Voluntário) var studentSituation = project.IsScholarshipCandidate ? "Término do Período de Bolsa" : "Término do Período de Voluntariado"; - // Obtém o conteúdo do arquivo HTML - string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Reports/certificate.html")); + // Preenche o template do certificado + if (string.IsNullOrEmpty(_certificateTemplate)) + { + string basePath = AppContext.BaseDirectory; + + // Obtém conteúdo dos arquivos HTML, CSS e SVG + _certificateTemplate = await File.ReadAllTextAsync(Path.Combine(basePath, "Reports/certificate.html")); + string bootstrapCSS = await File.ReadAllTextAsync(Path.Combine(basePath, "Reports/bootstrap.min.css")); + string logoCefet = Convert.ToBase64String(File.ReadAllBytes(Path.Combine(basePath, "Reports/logo-cefet.svg"))); + string carimboCefet = Convert.ToBase64String(File.ReadAllBytes(Path.Combine(basePath, "Reports/carimbo.svg"))); + + // Substitui as variáveis do HTML pelos valores fixos do template + _certificateTemplate = _certificateTemplate + .Replace("#BOOTSTRAP_CSS#", bootstrapCSS) + .Replace("#LOGO_CEFET#", logoCefet) + .Replace("#CARIMBO_CEFET#", carimboCefet); + } // Substitui as variáveis do HTML pelos valores do projeto - template = template + string template = _certificateTemplate .Replace("#NOME_ORIENTADOR#", project?.Professor?.User?.Name) .Replace("#SUBAREA_PROJETO#", project?.SubArea?.Name) .Replace("#NOME_ORIENTADO#", project?.Student?.User?.Name) @@ -46,18 +78,29 @@ public async Task GenerateCertificateAsync(Project project, string cordi .Replace("#FIMP_EDITAL#", project?.Notice?.FinalReportDeadline?.ToString("dd/MM/yyyy")) .Replace("#SITP_EDITAL#", studentSituation) .Replace("#TITULO_PROJETO_ALUNO#", project?.Title) - .Replace("#DIA_SEMANA#", DateTime.Now.DayOfWeek.ToString()) - .Replace("#DIA_DATA#", DateTime.Now.Day.ToString()) - .Replace("#MES_DATA#", DateTime.Now.ToString("MMMM")) - .Replace("#ANO_DATA#", DateTime.Now.Year.ToString()) + .Replace("#DIA_SEMANA#", _dayOfWeekMap[DateTime.Now.DayOfWeek]) + .Replace("#DIA_DATA#", DateTime.Now.Day.ToString(_cultureInfo)) + .Replace("#MES_DATA#", DateTime.Now.ToString("MMMM", _cultureInfo)) + .Replace("#ANO_DATA#", DateTime.Now.Year.ToString(_cultureInfo)) .Replace("#NOME_COORDENADOR#", cordinatorName); // Transforma HTML em PDF - await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision); + await new BrowserFetcher().DownloadAsync(); var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true }); var page = await browser.NewPageAsync(); await page.SetContentAsync(template); - await page.PdfAsync(outputPath); + await page.PdfAsync(outputPath, new PdfOptions + { + Format = PaperFormat.A4, + PrintBackground = true, + MarginOptions = new MarginOptions + { + Top = "20px", + Bottom = "20px", + Left = "20px", + Right = "20px" + } + }); await browser.CloseAsync(); // Retorna caminho onde foi salvo o arquivo @@ -69,16 +112,26 @@ public async Task GenerateCertificateTestAsync(string fileName) // Caminho temporário onde será salvo o arquivo string outputPath = Path.Combine(_outputPath!, fileName); - // Obtém o conteúdo do arquivo HTML - string template = await File.ReadAllTextAsync(Path.Combine(_currentDirectory!, "Reports/certificate.html")); + // Preenche o template do certificado + if (string.IsNullOrEmpty(_certificateTemplate)) + { + string basePath = AppContext.BaseDirectory; + + // Obtém conteúdo dos arquivos HTML, CSS e SVG + _certificateTemplate = await File.ReadAllTextAsync(Path.Combine(basePath, "Reports/certificate.html")); + string bootstrapCSS = await File.ReadAllTextAsync(Path.Combine(basePath, "Reports/bootstrap.min.css")); + string logoCefet = Convert.ToBase64String(File.ReadAllBytes(Path.Combine(basePath, "Reports/logo-cefet.svg"))); + string carimboCefet = Convert.ToBase64String(File.ReadAllBytes(Path.Combine(basePath, "Reports/carimbo.svg"))); - var logoCefet = ConvertSvgToBase64(Path.Combine(_currentDirectory!, "Reports/logo-cefet.svg")); - var carimboCefet = ConvertSvgToBase64(Path.Combine(_currentDirectory!, "Reports/carimbo.svg")); + // Substitui as variáveis do HTML pelos valores fixos do template + _certificateTemplate = _certificateTemplate + .Replace("#BOOTSTRAP_CSS#", bootstrapCSS) + .Replace("#LOGO_CEFET#", logoCefet) + .Replace("#CARIMBO_CEFET#", carimboCefet); + } // Substitui as variáveis do HTML pelos valores do projeto - template = template - .Replace("#LOGO_CEFET#", logoCefet) - .Replace("#CARIMBO_CEFET#", carimboCefet) + string template = _certificateTemplate .Replace("#NOME_ORIENTADOR#", "Luciana Faletti") .Replace("#SUBAREA_PROJETO#", "Engenharia Elétrica") .Replace("#NOME_ORIENTADO#", "Eduardo Paes") @@ -88,33 +141,33 @@ public async Task GenerateCertificateTestAsync(string fileName) .Replace("#FIMP_EDITAL#", "01/03/2023") .Replace("#SITP_EDITAL#", "Término do Período de Bolsa") .Replace("#TITULO_PROJETO_ALUNO#", "Teste de Projeto") - .Replace("#DIA_SEMANA#", DateTime.Now.DayOfWeek.ToString()) - .Replace("#DIA_DATA#", DateTime.Now.Day.ToString()) - .Replace("#MES_DATA#", DateTime.Now.ToString("MMMM")) - .Replace("#ANO_DATA#", DateTime.Now.Year.ToString()) + .Replace("#DIA_SEMANA#", _dayOfWeekMap[DateTime.Now.DayOfWeek]) + .Replace("#DIA_DATA#", DateTime.Now.Day.ToString(_cultureInfo)) + .Replace("#MES_DATA#", DateTime.Now.ToString("MMMM", _cultureInfo)) + .Replace("#ANO_DATA#", DateTime.Now.Year.ToString(_cultureInfo)) .Replace("#NOME_COORDENADOR#", "Diego Haddad"); // Transforma HTML em PDF - await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision); + await new BrowserFetcher().DownloadAsync(); var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true }); var page = await browser.NewPageAsync(); await page.SetContentAsync(template); - await page.PdfAsync(outputPath); + await page.PdfAsync(outputPath, new PdfOptions + { + Format = PaperFormat.A4, + PrintBackground = true, + MarginOptions = new MarginOptions + { + Top = "20px", + Bottom = "20px", + Left = "20px", + Right = "20px" + } + }); await browser.CloseAsync(); - // Mostra caminho onde foi salvo o arquivo - Console.WriteLine(outputPath); - // Retorna caminho onde foi salvo o arquivo return outputPath; } - - private static string ConvertSvgToBase64(string filePath) - { - byte[] svgBytes = File.ReadAllBytes(filePath); - string base64String = Convert.ToBase64String(svgBytes); - - return base64String; - } } } \ No newline at end of file diff --git a/src/Infrastructure/Services/Reports/bootstrap.min.css b/src/Infrastructure/Services/Reports/bootstrap.min.css new file mode 100644 index 00000000..88387ee9 --- /dev/null +++ b/src/Infrastructure/Services/Reports/bootstrap.min.css @@ -0,0 +1,11741 @@ +@charset "UTF-8"; +:root, +[data-bs-theme="light"] { + --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-black: #000; + --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-primary-text-emphasis: #052c65; + --bs-secondary-text-emphasis: #2b2f32; + --bs-success-text-emphasis: #0a3622; + --bs-info-text-emphasis: #055160; + --bs-warning-text-emphasis: #664d03; + --bs-danger-text-emphasis: #58151c; + --bs-light-text-emphasis: #495057; + --bs-dark-text-emphasis: #495057; + --bs-primary-bg-subtle: #cfe2ff; + --bs-secondary-bg-subtle: #e2e3e5; + --bs-success-bg-subtle: #d1e7dd; + --bs-info-bg-subtle: #cff4fc; + --bs-warning-bg-subtle: #fff3cd; + --bs-danger-bg-subtle: #f8d7da; + --bs-light-bg-subtle: #fcfcfd; + --bs-dark-bg-subtle: #ced4da; + --bs-primary-border-subtle: #9ec5fe; + --bs-secondary-border-subtle: #c4c8cb; + --bs-success-border-subtle: #a3cfbb; + --bs-info-border-subtle: #9eeaf9; + --bs-warning-border-subtle: #ffe69c; + --bs-danger-border-subtle: #f1aeb5; + --bs-light-border-subtle: #e9ecef; + --bs-dark-border-subtle: #adb5bd; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, + "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, 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-color-rgb: 33, 37, 41; + --bs-body-bg: #fff; + --bs-body-bg-rgb: 255, 255, 255; + --bs-emphasis-color: #000; + --bs-emphasis-color-rgb: 0, 0, 0; + --bs-secondary-color: rgba(33, 37, 41, 0.75); + --bs-secondary-color-rgb: 33, 37, 41; + --bs-secondary-bg: #e9ecef; + --bs-secondary-bg-rgb: 233, 236, 239; + --bs-tertiary-color: rgba(33, 37, 41, 0.5); + --bs-tertiary-color-rgb: 33, 37, 41; + --bs-tertiary-bg: #f8f9fa; + --bs-tertiary-bg-rgb: 248, 249, 250; + --bs-heading-color: inherit; + --bs-link-color: #0d6efd; + --bs-link-color-rgb: 13, 110, 253; + --bs-link-decoration: underline; + --bs-link-hover-color: #0a58ca; + --bs-link-hover-color-rgb: 10, 88, 202; + --bs-code-color: #d63384; + --bs-highlight-bg: #fff3cd; + --bs-border-width: 1px; + --bs-border-style: solid; + --bs-border-color: #dee2e6; + --bs-border-color-translucent: rgba(0, 0, 0, 0.175); + --bs-border-radius: 0.375rem; + --bs-border-radius-sm: 0.25rem; + --bs-border-radius-lg: 0.5rem; + --bs-border-radius-xl: 1rem; + --bs-border-radius-xxl: 2rem; + --bs-border-radius-2xl: var(--bs-border-radius-xxl); + --bs-border-radius-pill: 50rem; + --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); + --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); + --bs-focus-ring-width: 0.25rem; + --bs-focus-ring-opacity: 0.25; + --bs-focus-ring-color: rgba(13, 110, 253, 0.25); + --bs-form-valid-color: #198754; + --bs-form-valid-border-color: #198754; + --bs-form-invalid-color: #dc3545; + --bs-form-invalid-border-color: #dc3545; +} +[data-bs-theme="dark"] { + color-scheme: dark; + --bs-body-color: #dee2e6; + --bs-body-color-rgb: 222, 226, 230; + --bs-body-bg: #212529; + --bs-body-bg-rgb: 33, 37, 41; + --bs-emphasis-color: #fff; + --bs-emphasis-color-rgb: 255, 255, 255; + --bs-secondary-color: rgba(222, 226, 230, 0.75); + --bs-secondary-color-rgb: 222, 226, 230; + --bs-secondary-bg: #343a40; + --bs-secondary-bg-rgb: 52, 58, 64; + --bs-tertiary-color: rgba(222, 226, 230, 0.5); + --bs-tertiary-color-rgb: 222, 226, 230; + --bs-tertiary-bg: #2b3035; + --bs-tertiary-bg-rgb: 43, 48, 53; + --bs-primary-text-emphasis: #6ea8fe; + --bs-secondary-text-emphasis: #a7acb1; + --bs-success-text-emphasis: #75b798; + --bs-info-text-emphasis: #6edff6; + --bs-warning-text-emphasis: #ffda6a; + --bs-danger-text-emphasis: #ea868f; + --bs-light-text-emphasis: #f8f9fa; + --bs-dark-text-emphasis: #dee2e6; + --bs-primary-bg-subtle: #031633; + --bs-secondary-bg-subtle: #161719; + --bs-success-bg-subtle: #051b11; + --bs-info-bg-subtle: #032830; + --bs-warning-bg-subtle: #332701; + --bs-danger-bg-subtle: #2c0b0e; + --bs-light-bg-subtle: #343a40; + --bs-dark-bg-subtle: #1a1d20; + --bs-primary-border-subtle: #084298; + --bs-secondary-border-subtle: #41464b; + --bs-success-border-subtle: #0f5132; + --bs-info-border-subtle: #087990; + --bs-warning-border-subtle: #997404; + --bs-danger-border-subtle: #842029; + --bs-light-border-subtle: #495057; + --bs-dark-border-subtle: #343a40; + --bs-heading-color: inherit; + --bs-link-color: #6ea8fe; + --bs-link-hover-color: #8bb9fe; + --bs-link-color-rgb: 110, 168, 254; + --bs-link-hover-color-rgb: 139, 185, 254; + --bs-code-color: #e685b5; + --bs-border-color: #495057; + --bs-border-color-translucent: rgba(255, 255, 255, 0.15); + --bs-form-valid-color: #75b798; + --bs-form-valid-border-color: #75b798; + --bs-form-invalid-color: #ea868f; + --bs-form-invalid-border-color: #ea868f; +} +*, +::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; + border: 0; + border-top: var(--bs-border-width) solid; + opacity: 0.25; +} +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; + color: var(--bs-heading-color); +} +.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 + 0.9vw); +} +@media (min-width: 1200px) { + .h2, + h2 { + font-size: 2rem; + } +} +.h3, +h3 { + font-size: calc(1.3rem + 0.6vw); +} +@media (min-width: 1200px) { + .h3, + h3 { + font-size: 1.75rem; + } +} +.h4, +h4 { + font-size: calc(1.275rem + 0.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[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: 0.5rem; + margin-left: 0; +} +blockquote { + margin: 0 0 1rem; +} +b, +strong { + font-weight: bolder; +} +.small, +small { + font-size: 0.875em; +} +.mark, +mark { + padding: 0.1875em; + background-color: var(--bs-highlight-bg); +} +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +a { + color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); + text-decoration: underline; +} +a:hover { + --bs-link-color-rgb: var(--bs-link-hover-color-rgb); +} +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; +} +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} +code { + font-size: 0.875em; + color: var(--bs-code-color); + word-wrap: break-word; +} +a > code { + color: inherit; +} +kbd { + padding: 0.1875rem 0.375rem; + font-size: 0.875em; + color: var(--bs-body-bg); + background-color: var(--bs-body-color); + border-radius: 0.25rem; +} +kbd kbd { + padding: 0; + font-size: 1em; +} +figure { + margin: 0 0 1rem; +} +img, +svg { + vertical-align: middle; +} +table { + caption-side: bottom; + border-collapse: collapse; +} +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-secondary-color); + 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]:not([type="date"]):not([type="datetime-local"]):not([type="month"]):not( + [type="week"] + ):not([type="time"])::-webkit-calendar-picker-indicator { + display: none !important; +} +[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: 0.5rem; + font-size: calc(1.275rem + 0.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"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} +::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-color-swatch-wrapper { + padding: 0; +} +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} +::file-selector-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: 0.5rem; +} +.initialism { + font-size: 0.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: 0.875em; + color: #6c757d; +} +.blockquote-footer::before { + content: "— "; +} +.img-fluid { + max-width: 100%; + height: auto; +} +.img-thumbnail { + padding: 0.25rem; + background-color: var(--bs-body-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + max-width: 100%; + height: auto; +} +.figure { + display: inline-block; +} +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} +.figure-caption { + font-size: 0.875em; + color: var(--bs-secondary-color); +} +.container, +.container-fluid, +.container-lg, +.container-md, +.container-sm, +.container-xl, +.container-xxl { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + 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; + } +} +:root { + --bs-breakpoint-xs: 0; + --bs-breakpoint-sm: 576px; + --bs-breakpoint-md: 768px; + --bs-breakpoint-lg: 992px; + --bs-breakpoint-xl: 1200px; + --bs-breakpoint-xxl: 1400px; +} +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-0.5 * var(--bs-gutter-x)); + margin-left: calc(-0.5 * var(--bs-gutter-x)); +} +.row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.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-color-type: initial; + --bs-table-bg-type: initial; + --bs-table-color-state: initial; + --bs-table-bg-state: initial; + --bs-table-color: var(--bs-body-color); + --bs-table-bg: var(--bs-body-bg); + --bs-table-border-color: var(--bs-border-color); + --bs-table-accent-bg: transparent; + --bs-table-striped-color: var(--bs-body-color); + --bs-table-striped-bg: rgba(0, 0, 0, 0.05); + --bs-table-active-color: var(--bs-body-color); + --bs-table-active-bg: rgba(0, 0, 0, 0.1); + --bs-table-hover-color: var(--bs-body-color); + --bs-table-hover-bg: rgba(0, 0, 0, 0.075); + width: 100%; + margin-bottom: 1rem; + vertical-align: top; + border-color: var(--bs-table-border-color); +} +.table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + color: var( + --bs-table-color-state, + var(--bs-table-color-type, var(--bs-table-color)) + ); + background-color: var(--bs-table-bg); + border-bottom-width: var(--bs-border-width); + box-shadow: inset 0 0 0 9999px + var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg))); +} +.table > tbody { + vertical-align: inherit; +} +.table > thead { + vertical-align: bottom; +} +.table-group-divider { + border-top: calc(var(--bs-border-width) * 2) solid currentcolor; +} +.caption-top { + caption-side: top; +} +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} +.table-bordered > :not(caption) > * { + border-width: var(--bs-border-width) 0; +} +.table-bordered > :not(caption) > * > * { + border-width: 0 var(--bs-border-width); +} +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} +.table-borderless > :not(:first-child) { + border-top-width: 0; +} +.table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); +} +.table-striped-columns > :not(caption) > tr > :nth-child(2n) { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); +} +.table-active { + --bs-table-color-state: var(--bs-table-active-color); + --bs-table-bg-state: var(--bs-table-active-bg); +} +.table-hover > tbody > tr:hover > * { + --bs-table-color-state: var(--bs-table-hover-color); + --bs-table-bg-state: var(--bs-table-hover-bg); +} +.table-primary { + --bs-table-color: #000; + --bs-table-bg: #cfe2ff; + --bs-table-border-color: #bacbe6; + --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: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-secondary { + --bs-table-color: #000; + --bs-table-bg: #e2e3e5; + --bs-table-border-color: #cbccce; + --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: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-success { + --bs-table-color: #000; + --bs-table-bg: #d1e7dd; + --bs-table-border-color: #bcd0c7; + --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: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-info { + --bs-table-color: #000; + --bs-table-bg: #cff4fc; + --bs-table-border-color: #badce3; + --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: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-warning { + --bs-table-color: #000; + --bs-table-bg: #fff3cd; + --bs-table-border-color: #e6dbb9; + --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: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-danger { + --bs-table-color: #000; + --bs-table-bg: #f8d7da; + --bs-table-border-color: #dfc2c4; + --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: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-light { + --bs-table-color: #000; + --bs-table-bg: #f8f9fa; + --bs-table-border-color: #dfe0e1; + --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: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-dark { + --bs-table-color: #fff; + --bs-table-bg: #212529; + --bs-table-border-color: #373b3e; + --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: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.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: 0.5rem; +} +.col-form-label { + padding-top: calc(0.375rem + var(--bs-border-width)); + padding-bottom: calc(0.375rem + var(--bs-border-width)); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} +.col-form-label-lg { + padding-top: calc(0.5rem + var(--bs-border-width)); + padding-bottom: calc(0.5rem + var(--bs-border-width)); + font-size: 1.25rem; +} +.col-form-label-sm { + padding-top: calc(0.25rem + var(--bs-border-width)); + padding-bottom: calc(0.25rem + var(--bs-border-width)); + font-size: 0.875rem; +} +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-secondary-color); +} +.form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: var(--bs-body-bg); + background-clip: padding-box; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + transition: border-color 0.15s ease-in-out, box-shadow 0.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: var(--bs-body-color); + background-color: var(--bs-body-bg); + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-control::-webkit-date-and-time-value { + min-width: 85px; + height: 1.5em; + margin: 0; +} +.form-control::-webkit-datetime-edit { + display: block; + padding: 0; +} +.form-control::-moz-placeholder { + color: var(--bs-secondary-color); + opacity: 1; +} +.form-control::placeholder { + color: var(--bs-secondary-color); + opacity: 1; +} +.form-control:disabled { + background-color: var(--bs-secondary-bg); + opacity: 1; +} +.form-control::-webkit-file-upload-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: var(--bs-border-width); + border-radius: 0; + -webkit-transition: color 0.15s ease-in-out, + background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +.form-control::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: var(--bs-border-width); + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::-webkit-file-upload-button { + -webkit-transition: none; + transition: none; + } + .form-control::file-selector-button { + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { + background-color: var(--bs-secondary-bg); +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: var(--bs-secondary-bg); +} +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: var(--bs-body-color); + background-color: transparent; + border: solid transparent; + border-width: var(--bs-border-width) 0; +} +.form-control-plaintext:focus { + outline: 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 + 0.5rem + calc(var(--bs-border-width) * 2)); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} +.form-control-sm::-webkit-file-upload-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} +.form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} +.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} +.form-control-lg::-webkit-file-upload-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} +.form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} +textarea.form-control { + min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); +} +textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); +} +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); +} +.form-control-color { + width: 3rem; + height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); + padding: 0.375rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius); +} +.form-control-color::-webkit-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius); +} +.form-control-color.form-control-sm { + height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); +} +.form-control-color.form-control-lg { + height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); +} +.form-select { + --bs-form-select-bg-img: 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 5 6 6 6-6'/%3e%3c/svg%3e"); + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: var(--bs-body-bg); + background-image: var(--bs-form-select-bg-img), + var(--bs-form-select-bg-icon, none); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-select { + transition: none; + } +} +.form-select:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-select[multiple], +.form-select[size]:not([size="1"]) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled { + background-color: var(--bs-secondary-bg); +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 var(--bs-body-color); +} +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} +[data-bs-theme="dark"] .form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); +} +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} +.form-check-reverse { + padding-right: 1.5em; + padding-left: 0; + text-align: right; +} +.form-check-reverse .form-check-input { + float: right; + margin-right: -1.5em; + margin-left: 0; +} +.form-check-input { + --bs-form-check-bg: var(--bs-body-bg); + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: var(--bs-form-check-bg); + background-image: var(--bs-form-check-bg-image); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: var(--bs-border-width) solid var(--bs-border-color); + -webkit-print-color-adjust: exact; + color-adjust: exact; + print-color-adjust: exact; +} +.form-check-input[type="checkbox"] { + border-radius: 0.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 0.25rem rgba(13, 110, 253, 0.25); +} +.form-check-input:checked { + background-color: #0d6efd; + border-color: #0d6efd; +} +.form-check-input:checked[type="checkbox"] { + --bs-form-check-bg-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 10 3 3 6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type="radio"] { + --bs-form-check-bg-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; + --bs-form-check-bg-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: 0.5; +} +.form-check-input:disabled ~ .form-check-label, +.form-check-input[disabled] ~ .form-check-label { + cursor: default; + opacity: 0.5; +} +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + --bs-form-switch-bg: 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"); + width: 2em; + margin-left: -2.5em; + background-image: var(--bs-form-switch-bg); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } +} +.form-switch .form-check-input:focus { + --bs-form-switch-bg: 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; + --bs-form-switch-bg: 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-switch.form-check-reverse { + padding-right: 2.5em; + padding-left: 0; +} +.form-switch.form-check-reverse .form-check-input { + margin-right: -2.5em; + margin-left: 0; +} +.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: 0.65; +} +[data-bs-theme="dark"] + .form-switch + .form-check-input:not(:checked):not(:focus) { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e"); +} +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: transparent; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + -webkit-appearance: none; + appearance: none; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; +} +@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: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-tertiary-bg); + border-color: transparent; + border-radius: 1rem; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + -moz-appearance: none; + appearance: none; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; +} +@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: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-tertiary-bg); + border-color: transparent; + border-radius: 1rem; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: var(--bs-secondary-color); +} +.form-range:disabled::-moz-range-thumb { + background-color: var(--bs-secondary-color); +} +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext, +.form-floating > .form-select { + height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + min-height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + line-height: 1.25; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + z-index: 2; + height: 100%; + padding: 1rem 0.75rem; + overflow: hidden; + text-align: start; + text-overflow: ellipsis; + white-space: nowrap; + pointer-events: none; + border: var(--bs-border-width) solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext { + padding: 1rem 0.75rem; +} +.form-floating > .form-control-plaintext::-moz-placeholder, +.form-floating > .form-control::-moz-placeholder { + color: transparent; +} +.form-floating > .form-control-plaintext::placeholder, +.form-floating > .form-control::placeholder { + color: transparent; +} +.form-floating > .form-control-plaintext:not(:-moz-placeholder-shown), +.form-floating > .form-control:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control-plaintext:focus, +.form-floating > .form-control-plaintext:not(:placeholder-shown), +.form-floating > .form-control:focus, +.form-floating > .form-control:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control-plaintext:-webkit-autofill, +.form-floating > .form-control:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control-plaintext ~ label, +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-select ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius); +} +.form-floating > .form-control-plaintext ~ label::after, +.form-floating > .form-control:focus ~ label::after, +.form-floating > .form-control:not(:placeholder-shown) ~ label::after, +.form-floating > .form-select ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius); +} +.form-floating > .form-control:-webkit-autofill ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control-plaintext ~ label { + border-width: var(--bs-border-width) 0; +} +.form-floating > .form-control:disabled ~ label, +.form-floating > :disabled ~ label { + color: #6c757d; +} +.form-floating > .form-control:disabled ~ label::after, +.form-floating > :disabled ~ label::after { + background-color: var(--bs-secondary-bg); +} +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-floating, +.input-group > .form-select { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-floating:focus-within, +.input-group > .form-select:focus { + z-index: 5; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 5; +} +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-tertiary-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); +} +.input-group-lg > .btn, +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} +.input-group-sm > .btn, +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} +.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) + > .form-floating:not(:last-child) + > .form-control, +.input-group:not(.has-validation) + > .form-floating:not(:last-child) + > .form-select, +.input-group:not(.has-validation) + > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not( + .form-floating + ) { + 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 + > .form-floating:nth-last-child(n + 3) + > .form-control, +.input-group.has-validation + > .form-floating:nth-last-child(n + 3) + > .form-select, +.input-group.has-validation + > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu):not( + .form-floating + ) { + 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: calc(var(--bs-border-width) * -1); + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .form-floating:not(:first-child) > .form-control, +.input-group > .form-floating:not(:first-child) > .form-select { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-valid-color); +} +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-success); + border-radius: var(--bs-border-radius); +} +.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: var(--bs-form-valid-border-color); + padding-right: calc(1.5em + 0.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.73.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(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-control.is-valid:focus, +.was-validated .form-control:valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.was-validated textarea.form-control:valid, +textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right + calc(0.375em + 0.1875rem); +} +.form-select.is-valid, +.was-validated .form-select:valid { + border-color: var(--bs-form-valid-border-color); +} +.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"] { + --bs-form-select-bg-icon: 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.73.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"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-select.is-valid:focus, +.was-validated .form-select:valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.form-control-color.is-valid, +.was-validated .form-control-color:valid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} +.form-check-input.is-valid, +.was-validated .form-check-input:valid { + border-color: var(--bs-form-valid-border-color); +} +.form-check-input.is-valid:checked, +.was-validated .form-check-input:valid:checked { + background-color: var(--bs-form-valid-color); +} +.form-check-input.is-valid:focus, +.was-validated .form-check-input:valid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.form-check-input.is-valid ~ .form-check-label, +.was-validated .form-check-input:valid ~ .form-check-label { + color: var(--bs-form-valid-color); +} +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} +.input-group > .form-control:not(:focus).is-valid, +.input-group > .form-floating:not(:focus-within).is-valid, +.input-group > .form-select:not(:focus).is-valid, +.was-validated .input-group > .form-control:not(:focus):valid, +.was-validated .input-group > .form-floating:not(:focus-within):valid, +.was-validated .input-group > .form-select:not(:focus):valid { + z-index: 3; +} +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-invalid-color); +} +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-danger); + border-radius: var(--bs-border-radius); +} +.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: var(--bs-form-invalid-border-color); + padding-right: calc(1.5em + 0.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(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-control.is-invalid:focus, +.was-validated .form-control:invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.was-validated textarea.form-control:invalid, +textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right + calc(0.375em + 0.1875rem); +} +.form-select.is-invalid, +.was-validated .form-select:invalid { + border-color: var(--bs-form-invalid-border-color); +} +.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"] { + --bs-form-select-bg-icon: 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"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-select.is-invalid:focus, +.was-validated .form-select:invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.form-control-color.is-invalid, +.was-validated .form-control-color:invalid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} +.form-check-input.is-invalid, +.was-validated .form-check-input:invalid { + border-color: var(--bs-form-invalid-border-color); +} +.form-check-input.is-invalid:checked, +.was-validated .form-check-input:invalid:checked { + background-color: var(--bs-form-invalid-color); +} +.form-check-input.is-invalid:focus, +.was-validated .form-check-input:invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.form-check-input.is-invalid ~ .form-check-label, +.was-validated .form-check-input:invalid ~ .form-check-label { + color: var(--bs-form-invalid-color); +} +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} +.input-group > .form-control:not(:focus).is-invalid, +.input-group > .form-floating:not(:focus-within).is-invalid, +.input-group > .form-select:not(:focus).is-invalid, +.was-validated .input-group > .form-control:not(:focus):invalid, +.was-validated .input-group > .form-floating:not(:focus-within):invalid, +.was-validated .input-group > .form-select:not(:focus):invalid { + z-index: 4; +} +.btn { + --bs-btn-padding-x: 0.75rem; + --bs-btn-padding-y: 0.375rem; + --bs-btn-font-family: ; + --bs-btn-font-size: 1rem; + --bs-btn-font-weight: 400; + --bs-btn-line-height: 1.5; + --bs-btn-color: var(--bs-body-color); + --bs-btn-bg: transparent; + --bs-btn-border-width: var(--bs-border-width); + --bs-btn-border-color: transparent; + --bs-btn-border-radius: var(--bs-border-radius); + --bs-btn-hover-border-color: transparent; + --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), + 0 1px 1px rgba(0, 0, 0, 0.075); + --bs-btn-disabled-opacity: 0.65; + --bs-btn-focus-box-shadow: 0 0 0 0.25rem + rgba(var(--bs-btn-focus-shadow-rgb), 0.5); + display: inline-block; + padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); + font-family: var(--bs-btn-font-family); + font-size: var(--bs-btn-font-size); + font-weight: var(--bs-btn-font-weight); + line-height: var(--bs-btn-line-height); + color: var(--bs-btn-color); + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); + border-radius: var(--bs-btn-border-radius); + background-color: var(--bs-btn-bg); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); +} +.btn-check + .btn:hover { + color: var(--bs-btn-color); + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color); +} +.btn:focus-visible { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:focus-visible + .btn { + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:checked + .btn, +.btn.active, +.btn.show, +.btn:first-child:active, +:not(.btn-check) + .btn:active { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); +} +.btn-check:checked + .btn:focus-visible, +.btn.active:focus-visible, +.btn.show:focus-visible, +.btn:first-child:active:focus-visible, +:not(.btn-check) + .btn:active:focus-visible { + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn.disabled, +.btn:disabled, +fieldset:disabled .btn { + color: var(--bs-btn-disabled-color); + pointer-events: none; + background-color: var(--bs-btn-disabled-bg); + border-color: var(--bs-btn-disabled-border-color); + opacity: var(--bs-btn-disabled-opacity); +} +.btn-primary { + --bs-btn-color: #fff; + --bs-btn-bg: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0b5ed7; + --bs-btn-hover-border-color: #0a58ca; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0a58ca; + --bs-btn-active-border-color: #0a53be; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #0d6efd; + --bs-btn-disabled-border-color: #0d6efd; +} +.btn-secondary { + --bs-btn-color: #fff; + --bs-btn-bg: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #5c636a; + --bs-btn-hover-border-color: #565e64; + --bs-btn-focus-shadow-rgb: 130, 138, 145; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #565e64; + --bs-btn-active-border-color: #51585e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #6c757d; + --bs-btn-disabled-border-color: #6c757d; +} +.btn-success { + --bs-btn-color: #fff; + --bs-btn-bg: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #157347; + --bs-btn-hover-border-color: #146c43; + --bs-btn-focus-shadow-rgb: 60, 153, 110; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #146c43; + --bs-btn-active-border-color: #13653f; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #198754; + --bs-btn-disabled-border-color: #198754; +} +.btn-info { + --bs-btn-color: #000; + --bs-btn-bg: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #31d2f2; + --bs-btn-hover-border-color: #25cff2; + --bs-btn-focus-shadow-rgb: 11, 172, 204; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #3dd5f3; + --bs-btn-active-border-color: #25cff2; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #0dcaf0; + --bs-btn-disabled-border-color: #0dcaf0; +} +.btn-warning { + --bs-btn-color: #000; + --bs-btn-bg: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffca2c; + --bs-btn-hover-border-color: #ffc720; + --bs-btn-focus-shadow-rgb: 217, 164, 6; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffcd39; + --bs-btn-active-border-color: #ffc720; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #ffc107; + --bs-btn-disabled-border-color: #ffc107; +} +.btn-danger { + --bs-btn-color: #fff; + --bs-btn-bg: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #bb2d3b; + --bs-btn-hover-border-color: #b02a37; + --bs-btn-focus-shadow-rgb: 225, 83, 97; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #b02a37; + --bs-btn-active-border-color: #a52834; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #dc3545; + --bs-btn-disabled-border-color: #dc3545; +} +.btn-light { + --bs-btn-color: #000; + --bs-btn-bg: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #d3d4d5; + --bs-btn-hover-border-color: #c6c7c8; + --bs-btn-focus-shadow-rgb: 211, 212, 213; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #c6c7c8; + --bs-btn-active-border-color: #babbbc; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #f8f9fa; + --bs-btn-disabled-border-color: #f8f9fa; +} +.btn-dark { + --bs-btn-color: #fff; + --bs-btn-bg: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #424649; + --bs-btn-hover-border-color: #373b3e; + --bs-btn-focus-shadow-rgb: 66, 70, 73; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #4d5154; + --bs-btn-active-border-color: #373b3e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #212529; + --bs-btn-disabled-border-color: #212529; +} +.btn-outline-primary { + --bs-btn-color: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0d6efd; + --bs-btn-hover-border-color: #0d6efd; + --bs-btn-focus-shadow-rgb: 13, 110, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0d6efd; + --bs-btn-active-border-color: #0d6efd; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0d6efd; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0d6efd; + --bs-gradient: none; +} +.btn-outline-secondary { + --bs-btn-color: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #6c757d; + --bs-btn-hover-border-color: #6c757d; + --bs-btn-focus-shadow-rgb: 108, 117, 125; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #6c757d; + --bs-btn-active-border-color: #6c757d; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #6c757d; + --bs-gradient: none; +} +.btn-outline-success { + --bs-btn-color: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #198754; + --bs-btn-hover-border-color: #198754; + --bs-btn-focus-shadow-rgb: 25, 135, 84; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #198754; + --bs-btn-active-border-color: #198754; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #198754; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #198754; + --bs-gradient: none; +} +.btn-outline-info { + --bs-btn-color: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #0dcaf0; + --bs-btn-hover-border-color: #0dcaf0; + --bs-btn-focus-shadow-rgb: 13, 202, 240; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #0dcaf0; + --bs-btn-active-border-color: #0dcaf0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0dcaf0; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0dcaf0; + --bs-gradient: none; +} +.btn-outline-warning { + --bs-btn-color: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffc107; + --bs-btn-hover-border-color: #ffc107; + --bs-btn-focus-shadow-rgb: 255, 193, 7; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffc107; + --bs-btn-active-border-color: #ffc107; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ffc107; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ffc107; + --bs-gradient: none; +} +.btn-outline-danger { + --bs-btn-color: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #dc3545; + --bs-btn-hover-border-color: #dc3545; + --bs-btn-focus-shadow-rgb: 220, 53, 69; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #dc3545; + --bs-btn-active-border-color: #dc3545; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #dc3545; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #dc3545; + --bs-gradient: none; +} +.btn-outline-light { + --bs-btn-color: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f8f9fa; + --bs-btn-hover-border-color: #f8f9fa; + --bs-btn-focus-shadow-rgb: 248, 249, 250; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f8f9fa; + --bs-btn-active-border-color: #f8f9fa; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #f8f9fa; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f8f9fa; + --bs-gradient: none; +} +.btn-outline-dark { + --bs-btn-color: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #212529; + --bs-btn-hover-border-color: #212529; + --bs-btn-focus-shadow-rgb: 33, 37, 41; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #212529; + --bs-btn-active-border-color: #212529; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #212529; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #212529; + --bs-gradient: none; +} +.btn-link { + --bs-btn-font-weight: 400; + --bs-btn-color: var(--bs-link-color); + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-hover-color: var(--bs-link-hover-color); + --bs-btn-hover-border-color: transparent; + --bs-btn-active-color: var(--bs-link-hover-color); + --bs-btn-active-border-color: transparent; + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-border-color: transparent; + --bs-btn-box-shadow: 0 0 0 #000; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + text-decoration: underline; +} +.btn-link:focus-visible { + color: var(--bs-btn-color); +} +.btn-link:hover { + color: var(--bs-btn-hover-color); +} +.btn-group-lg > .btn, +.btn-lg { + --bs-btn-padding-y: 0.5rem; + --bs-btn-padding-x: 1rem; + --bs-btn-font-size: 1.25rem; + --bs-btn-border-radius: var(--bs-border-radius-lg); +} +.btn-group-sm > .btn, +.btn-sm { + --bs-btn-padding-y: 0.25rem; + --bs-btn-padding-x: 0.5rem; + --bs-btn-font-size: 0.875rem; + --bs-btn-border-radius: var(--bs-border-radius-sm); +} +.fade { + transition: opacity 0.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 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} +.collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none; + } +} +.dropdown, +.dropdown-center, +.dropend, +.dropstart, +.dropup, +.dropup-center { + position: relative; +} +.dropdown-toggle { + white-space: nowrap; +} +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} +.dropdown-menu { + --bs-dropdown-zindex: 1000; + --bs-dropdown-min-width: 10rem; + --bs-dropdown-padding-x: 0; + --bs-dropdown-padding-y: 0.5rem; + --bs-dropdown-spacer: 0.125rem; + --bs-dropdown-font-size: 1rem; + --bs-dropdown-color: var(--bs-body-color); + --bs-dropdown-bg: var(--bs-body-bg); + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-border-radius: var(--bs-border-radius); + --bs-dropdown-border-width: var(--bs-border-width); + --bs-dropdown-inner-border-radius: calc( + var(--bs-border-radius) - var(--bs-border-width) + ); + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-divider-margin-y: 0.5rem; + --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-dropdown-link-color: var(--bs-body-color); + --bs-dropdown-link-hover-color: var(--bs-body-color); + --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: var(--bs-tertiary-color); + --bs-dropdown-item-padding-x: 1rem; + --bs-dropdown-item-padding-y: 0.25rem; + --bs-dropdown-header-color: #6c757d; + --bs-dropdown-header-padding-x: 1rem; + --bs-dropdown-header-padding-y: 0.5rem; + position: absolute; + z-index: var(--bs-dropdown-zindex); + display: none; + min-width: var(--bs-dropdown-min-width); + padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); + margin: 0; + font-size: var(--bs-dropdown-font-size); + color: var(--bs-dropdown-color); + text-align: left; + list-style: none; + background-color: var(--bs-dropdown-bg); + background-clip: padding-box; + border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); + border-radius: var(--bs-dropdown-border-radius); +} +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--bs-dropdown-spacer); +} +.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: var(--bs-dropdown-spacer); +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.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: var(--bs-dropdown-spacer); +} +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.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: var(--bs-dropdown-spacer); +} +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropstart .dropdown-toggle::after { + display: none; +} +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropstart .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropstart .dropdown-toggle::before { + vertical-align: 0; +} +.dropdown-divider { + height: 0; + margin: var(--bs-dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--bs-dropdown-divider-bg); + opacity: 1; +} +.dropdown-item { + display: block; + width: 100%; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + clear: both; + font-weight: 400; + color: var(--bs-dropdown-link-color); + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; + border-radius: var(--bs-dropdown-item-border-radius, 0); +} +.dropdown-item:focus, +.dropdown-item:hover { + color: var(--bs-dropdown-link-hover-color); + background-color: var(--bs-dropdown-link-hover-bg); +} +.dropdown-item.active, +.dropdown-item:active { + color: var(--bs-dropdown-link-active-color); + text-decoration: none; + background-color: var(--bs-dropdown-link-active-bg); +} +.dropdown-item.disabled, +.dropdown-item:disabled { + color: var(--bs-dropdown-link-disabled-color); + pointer-events: none; + background-color: transparent; +} +.dropdown-menu.show { + display: block; +} +.dropdown-header { + display: block; + padding: var(--bs-dropdown-header-padding-y) + var(--bs-dropdown-header-padding-x); + margin-bottom: 0; + font-size: 0.875rem; + color: var(--bs-dropdown-header-color); + white-space: nowrap; +} +.dropdown-item-text { + display: block; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + color: var(--bs-dropdown-link-color); +} +.dropdown-menu-dark { + --bs-dropdown-color: #dee2e6; + --bs-dropdown-bg: #343a40; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-box-shadow: ; + --bs-dropdown-link-color: #dee2e6; + --bs-dropdown-link-hover-color: #fff; + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-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 { + border-radius: var(--bs-border-radius); +} +.btn-group > .btn-group:not(:first-child), +.btn-group > :not(.btn-check:first-child) + .btn { + margin-left: calc(var(--bs-border-width) * -1); +} +.btn-group > .btn-group:not(:last-child) > .btn, +.btn-group > .btn.dropdown-toggle-split:first-child, +.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: 0.5625rem; + padding-left: 0.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: 0.375rem; + padding-left: 0.375rem; +} +.btn-group-lg > .btn + .dropdown-toggle-split, +.btn-lg + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.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: calc(var(--bs-border-width) * -1); +} +.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 { + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-link-color); + --bs-nav-link-hover-color: var(--bs-link-hover-color); + --bs-nav-link-disabled-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav-link { + display: block; + padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); + font-size: var(--bs-nav-link-font-size); + font-weight: var(--bs-nav-link-font-weight); + color: var(--bs-nav-link-color); + text-decoration: none; + background: 0 0; + border: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } +} +.nav-link:focus, +.nav-link:hover { + color: var(--bs-nav-link-hover-color); +} +.nav-link:focus-visible { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.nav-link.disabled, +.nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + pointer-events: none; + cursor: default; +} +.nav-tabs { + --bs-nav-tabs-border-width: var(--bs-border-width); + --bs-nav-tabs-border-color: var(--bs-border-color); + --bs-nav-tabs-border-radius: var(--bs-border-radius); + --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) + var(--bs-secondary-bg) var(--bs-border-color); + --bs-nav-tabs-link-active-color: var(--bs-emphasis-color); + --bs-nav-tabs-link-active-bg: var(--bs-body-bg); + --bs-nav-tabs-link-active-border-color: var(--bs-border-color) + var(--bs-border-color) var(--bs-body-bg); + border-bottom: var(--bs-nav-tabs-border-width) solid + var(--bs-nav-tabs-border-color); +} +.nav-tabs .nav-link { + margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); + border: var(--bs-nav-tabs-border-width) solid transparent; + border-top-left-radius: var(--bs-nav-tabs-border-radius); + border-top-right-radius: var(--bs-nav-tabs-border-radius); +} +.nav-tabs .nav-link:focus, +.nav-tabs .nav-link:hover { + isolation: isolate; + border-color: var(--bs-nav-tabs-link-hover-border-color); +} +.nav-tabs .nav-item.show .nav-link, +.nav-tabs .nav-link.active { + color: var(--bs-nav-tabs-link-active-color); + background-color: var(--bs-nav-tabs-link-active-bg); + border-color: var(--bs-nav-tabs-link-active-border-color); +} +.nav-tabs .dropdown-menu { + margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.nav-pills { + --bs-nav-pills-border-radius: var(--bs-border-radius); + --bs-nav-pills-link-active-color: #fff; + --bs-nav-pills-link-active-bg: #0d6efd; +} +.nav-pills .nav-link { + border-radius: var(--bs-nav-pills-border-radius); +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: var(--bs-nav-pills-link-active-color); + background-color: var(--bs-nav-pills-link-active-bg); +} +.nav-underline { + --bs-nav-underline-gap: 1rem; + --bs-nav-underline-border-width: 0.125rem; + --bs-nav-underline-link-active-color: var(--bs-emphasis-color); + gap: var(--bs-nav-underline-gap); +} +.nav-underline .nav-link { + padding-right: 0; + padding-left: 0; + border-bottom: var(--bs-nav-underline-border-width) solid transparent; +} +.nav-underline .nav-link:focus, +.nav-underline .nav-link:hover { + border-bottom-color: currentcolor; +} +.nav-underline .nav-link.active, +.nav-underline .show > .nav-link { + font-weight: 700; + color: var(--bs-nav-underline-link-active-color); + border-bottom-color: currentcolor; +} +.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 { + --bs-navbar-padding-x: 0; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65); + --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8); + --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3); + --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-padding-y: 0.3125rem; + --bs-navbar-brand-margin-end: 1rem; + --bs-navbar-brand-font-size: 1.25rem; + --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-nav-link-padding-x: 0.5rem; + --bs-navbar-toggler-padding-y: 0.25rem; + --bs-navbar-toggler-padding-x: 0.75rem; + --bs-navbar-toggler-font-size: 1.25rem; + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15); + --bs-navbar-toggler-border-radius: var(--bs-border-radius); + --bs-navbar-toggler-focus-width: 0.25rem; + --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); +} +.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: var(--bs-navbar-brand-padding-y); + padding-bottom: var(--bs-navbar-brand-padding-y); + margin-right: var(--bs-navbar-brand-margin-end); + font-size: var(--bs-navbar-brand-font-size); + color: var(--bs-navbar-brand-color); + text-decoration: none; + white-space: nowrap; +} +.navbar-brand:focus, +.navbar-brand:hover { + color: var(--bs-navbar-brand-hover-color); +} +.navbar-nav { + --bs-nav-link-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-navbar-color); + --bs-nav-link-hover-color: var(--bs-navbar-hover-color); + --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link.active, +.navbar-nav .nav-link.show { + color: var(--bs-navbar-active-color); +} +.navbar-nav .dropdown-menu { + position: static; +} +.navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-navbar-color); +} +.navbar-text a, +.navbar-text a:focus, +.navbar-text a:hover { + color: var(--bs-navbar-active-color); +} +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} +.navbar-toggler { + padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); + font-size: var(--bs-navbar-toggler-font-size); + line-height: 1; + color: var(--bs-navbar-color); + background-color: transparent; + border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); + border-radius: var(--bs-navbar-toggler-border-radius); + transition: var(--bs-navbar-toggler-transition); +} +@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 var(--bs-navbar-toggler-focus-width); +} +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-image: var(--bs-navbar-toggler-icon-bg); + 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: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .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 { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-sm .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-sm .offcanvas .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: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .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 { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-md .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-md .offcanvas .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: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .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 { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-lg .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-lg .offcanvas .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: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .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 { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xl .offcanvas .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: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .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 { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xxl .offcanvas .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: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); +} +.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 { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; +} +.navbar-expand .offcanvas .offcanvas-header { + display: none; +} +.navbar-expand .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; +} +.navbar-dark, +.navbar[data-bs-theme="dark"] { + --bs-navbar-color: rgba(255, 255, 255, 0.55); + --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); + --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); + --bs-navbar-active-color: #fff; + --bs-navbar-brand-color: #fff; + --bs-navbar-brand-hover-color: #fff; + --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); + --bs-navbar-toggler-icon-bg: 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"); +} +[data-bs-theme="dark"] .navbar-toggler-icon { + --bs-navbar-toggler-icon-bg: 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"); +} +.card { + --bs-card-spacer-y: 1rem; + --bs-card-spacer-x: 1rem; + --bs-card-title-spacer-y: 0.5rem; + --bs-card-title-color: ; + --bs-card-subtitle-color: ; + --bs-card-border-width: var(--bs-border-width); + --bs-card-border-color: var(--bs-border-color-translucent); + --bs-card-border-radius: var(--bs-border-radius); + --bs-card-box-shadow: ; + --bs-card-inner-border-radius: calc( + var(--bs-border-radius) - (var(--bs-border-width)) + ); + --bs-card-cap-padding-y: 0.5rem; + --bs-card-cap-padding-x: 1rem; + --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03); + --bs-card-cap-color: ; + --bs-card-height: ; + --bs-card-color: ; + --bs-card-bg: var(--bs-body-bg); + --bs-card-img-overlay-padding: 1rem; + --bs-card-group-margin: 0.75rem; + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + height: var(--bs-card-height); + color: var(--bs-body-color); + word-wrap: break-word; + background-color: var(--bs-card-bg); + background-clip: border-box; + border: var(--bs-card-border-width) solid var(--bs-card-border-color); + border-radius: var(--bs-card-border-radius); +} +.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: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} +.card-body { + flex: 1 1 auto; + padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); + color: var(--bs-card-color); +} +.card-title { + margin-bottom: var(--bs-card-title-spacer-y); + color: var(--bs-card-title-color); +} +.card-subtitle { + margin-top: calc(-0.5 * var(--bs-card-title-spacer-y)); + margin-bottom: 0; + color: var(--bs-card-subtitle-color); +} +.card-text:last-child { + margin-bottom: 0; +} +.card-link + .card-link { + margin-left: var(--bs-card-spacer-x); +} +.card-header { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + margin-bottom: 0; + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-header:first-child { + border-radius: var(--bs-card-inner-border-radius) + var(--bs-card-inner-border-radius) 0 0; +} +.card-footer { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-footer:last-child { + border-radius: 0 0 var(--bs-card-inner-border-radius) + var(--bs-card-inner-border-radius); +} +.card-header-tabs { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); + border-bottom: 0; +} +.card-header-tabs .nav-link.active { + background-color: var(--bs-card-bg); + border-bottom-color: var(--bs-card-bg); +} +.card-header-pills { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); +} +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--bs-card-img-overlay-padding); + border-radius: var(--bs-card-inner-border-radius); +} +.card-img, +.card-img-bottom, +.card-img-top { + width: 100%; +} +.card-img, +.card-img-top { + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} +.card-img, +.card-img-bottom { + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} +.card-group > .card { + margin-bottom: var(--bs-card-group-margin); +} +@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 { + --bs-accordion-color: var(--bs-body-color); + --bs-accordion-bg: var(--bs-body-bg); + --bs-accordion-transition: color 0.15s ease-in-out, + background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out, border-radius 0.15s ease; + --bs-accordion-border-color: var(--bs-border-color); + --bs-accordion-border-width: var(--bs-border-width); + --bs-accordion-border-radius: var(--bs-border-radius); + --bs-accordion-inner-border-radius: calc( + var(--bs-border-radius) - (var(--bs-border-width)) + ); + --bs-accordion-btn-padding-x: 1.25rem; + --bs-accordion-btn-padding-y: 1rem; + --bs-accordion-btn-color: var(--bs-body-color); + --bs-accordion-btn-bg: var(--bs-accordion-bg); + --bs-accordion-btn-icon: 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"); + --bs-accordion-btn-icon-width: 1.25rem; + --bs-accordion-btn-icon-transform: rotate(-180deg); + --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%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"); + --bs-accordion-btn-focus-border-color: #86b7fe; + --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-accordion-body-padding-x: 1.25rem; + --bs-accordion-body-padding-y: 1rem; + --bs-accordion-active-color: var(--bs-primary-text-emphasis); + --bs-accordion-active-bg: var(--bs-primary-bg-subtle); +} +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); + font-size: 1rem; + color: var(--bs-accordion-btn-color); + text-align: left; + background-color: var(--bs-accordion-btn-bg); + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: var(--bs-accordion-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: var(--bs-accordion-active-color); + background-color: var(--bs-accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 + var(--bs-accordion-border-color); +} +.accordion-button:not(.collapsed)::after { + background-image: var(--bs-accordion-btn-active-icon); + transform: var(--bs-accordion-btn-icon-transform); +} +.accordion-button::after { + flex-shrink: 0; + width: var(--bs-accordion-btn-icon-width); + height: var(--bs-accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--bs-accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--bs-accordion-btn-icon-width); + transition: var(--bs-accordion-btn-icon-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + border-color: var(--bs-accordion-btn-focus-border-color); + outline: 0; + box-shadow: var(--bs-accordion-btn-focus-box-shadow); +} +.accordion-header { + margin-bottom: 0; +} +.accordion-item { + color: var(--bs-accordion-color); + background-color: var(--bs-accordion-bg); + border: var(--bs-accordion-border-width) solid + var(--bs-accordion-border-color); +} +.accordion-item:first-of-type { + border-top-left-radius: var(--bs-accordion-border-radius); + border-top-right-radius: var(--bs-accordion-border-radius); +} +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: var(--bs-accordion-inner-border-radius); + border-top-right-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-item:last-of-type { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: var(--bs-accordion-inner-border-radius); + border-bottom-left-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} +.accordion-body { + padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x); +} +.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, +.accordion-flush .accordion-item .accordion-button.collapsed { + border-radius: 0; +} +[data-bs-theme="dark"] .accordion-button::after { + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%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"); + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%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"); +} +.breadcrumb { + --bs-breadcrumb-padding-x: 0; + --bs-breadcrumb-padding-y: 0; + --bs-breadcrumb-margin-bottom: 1rem; + --bs-breadcrumb-bg: ; + --bs-breadcrumb-border-radius: ; + --bs-breadcrumb-divider-color: var(--bs-secondary-color); + --bs-breadcrumb-item-padding-x: 0.5rem; + --bs-breadcrumb-item-active-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); + margin-bottom: var(--bs-breadcrumb-margin-bottom); + font-size: var(--bs-breadcrumb-font-size); + list-style: none; + background-color: var(--bs-breadcrumb-bg); + border-radius: var(--bs-breadcrumb-border-radius); +} +.breadcrumb-item + .breadcrumb-item { + padding-left: var(--bs-breadcrumb-item-padding-x); +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: var(--bs-breadcrumb-item-padding-x); + color: var(--bs-breadcrumb-divider-color); + content: var(--bs-breadcrumb-divider, "/"); +} +.breadcrumb-item.active { + color: var(--bs-breadcrumb-item-active-color); +} +.pagination { + --bs-pagination-padding-x: 0.75rem; + --bs-pagination-padding-y: 0.375rem; + --bs-pagination-font-size: 1rem; + --bs-pagination-color: var(--bs-link-color); + --bs-pagination-bg: var(--bs-body-bg); + --bs-pagination-border-width: var(--bs-border-width); + --bs-pagination-border-color: var(--bs-border-color); + --bs-pagination-border-radius: var(--bs-border-radius); + --bs-pagination-hover-color: var(--bs-link-hover-color); + --bs-pagination-hover-bg: var(--bs-tertiary-bg); + --bs-pagination-hover-border-color: var(--bs-border-color); + --bs-pagination-focus-color: var(--bs-link-hover-color); + --bs-pagination-focus-bg: var(--bs-secondary-bg); + --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-pagination-active-color: #fff; + --bs-pagination-active-bg: #0d6efd; + --bs-pagination-active-border-color: #0d6efd; + --bs-pagination-disabled-color: var(--bs-secondary-color); + --bs-pagination-disabled-bg: var(--bs-secondary-bg); + --bs-pagination-disabled-border-color: var(--bs-border-color); + display: flex; + padding-left: 0; + list-style: none; +} +.page-link { + position: relative; + display: block; + padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); + font-size: var(--bs-pagination-font-size); + color: var(--bs-pagination-color); + text-decoration: none; + background-color: var(--bs-pagination-bg); + border: var(--bs-pagination-border-width) solid + var(--bs-pagination-border-color); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none; + } +} +.page-link:hover { + z-index: 2; + color: var(--bs-pagination-hover-color); + background-color: var(--bs-pagination-hover-bg); + border-color: var(--bs-pagination-hover-border-color); +} +.page-link:focus { + z-index: 3; + color: var(--bs-pagination-focus-color); + background-color: var(--bs-pagination-focus-bg); + outline: 0; + box-shadow: var(--bs-pagination-focus-box-shadow); +} +.active > .page-link, +.page-link.active { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); +} +.disabled > .page-link, +.page-link.disabled { + color: var(--bs-pagination-disabled-color); + pointer-events: none; + background-color: var(--bs-pagination-disabled-bg); + border-color: var(--bs-pagination-disabled-border-color); +} +.page-item:not(:first-child) .page-link { + margin-left: calc(var(--bs-border-width) * -1); +} +.page-item:first-child .page-link { + border-top-left-radius: var(--bs-pagination-border-radius); + border-bottom-left-radius: var(--bs-pagination-border-radius); +} +.page-item:last-child .page-link { + border-top-right-radius: var(--bs-pagination-border-radius); + border-bottom-right-radius: var(--bs-pagination-border-radius); +} +.pagination-lg { + --bs-pagination-padding-x: 1.5rem; + --bs-pagination-padding-y: 0.75rem; + --bs-pagination-font-size: 1.25rem; + --bs-pagination-border-radius: var(--bs-border-radius-lg); +} +.pagination-sm { + --bs-pagination-padding-x: 0.5rem; + --bs-pagination-padding-y: 0.25rem; + --bs-pagination-font-size: 0.875rem; + --bs-pagination-border-radius: var(--bs-border-radius-sm); +} +.badge { + --bs-badge-padding-x: 0.65em; + --bs-badge-padding-y: 0.35em; + --bs-badge-font-size: 0.75em; + --bs-badge-font-weight: 700; + --bs-badge-color: #fff; + --bs-badge-border-radius: var(--bs-border-radius); + display: inline-block; + padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); + font-size: var(--bs-badge-font-size); + font-weight: var(--bs-badge-font-weight); + line-height: 1; + color: var(--bs-badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: var(--bs-badge-border-radius); +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.alert { + --bs-alert-bg: transparent; + --bs-alert-padding-x: 1rem; + --bs-alert-padding-y: 1rem; + --bs-alert-margin-bottom: 1rem; + --bs-alert-color: inherit; + --bs-alert-border-color: transparent; + --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color); + --bs-alert-border-radius: var(--bs-border-radius); + --bs-alert-link-color: inherit; + position: relative; + padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); + margin-bottom: var(--bs-alert-margin-bottom); + color: var(--bs-alert-color); + background-color: var(--bs-alert-bg); + border: var(--bs-alert-border); + border-radius: var(--bs-alert-border-radius); +} +.alert-heading { + color: inherit; +} +.alert-link { + font-weight: 700; + color: var(--bs-alert-link-color); +} +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} +.alert-primary { + --bs-alert-color: var(--bs-primary-text-emphasis); + --bs-alert-bg: var(--bs-primary-bg-subtle); + --bs-alert-border-color: var(--bs-primary-border-subtle); + --bs-alert-link-color: var(--bs-primary-text-emphasis); +} +.alert-secondary { + --bs-alert-color: var(--bs-secondary-text-emphasis); + --bs-alert-bg: var(--bs-secondary-bg-subtle); + --bs-alert-border-color: var(--bs-secondary-border-subtle); + --bs-alert-link-color: var(--bs-secondary-text-emphasis); +} +.alert-success { + --bs-alert-color: var(--bs-success-text-emphasis); + --bs-alert-bg: var(--bs-success-bg-subtle); + --bs-alert-border-color: var(--bs-success-border-subtle); + --bs-alert-link-color: var(--bs-success-text-emphasis); +} +.alert-info { + --bs-alert-color: var(--bs-info-text-emphasis); + --bs-alert-bg: var(--bs-info-bg-subtle); + --bs-alert-border-color: var(--bs-info-border-subtle); + --bs-alert-link-color: var(--bs-info-text-emphasis); +} +.alert-warning { + --bs-alert-color: var(--bs-warning-text-emphasis); + --bs-alert-bg: var(--bs-warning-bg-subtle); + --bs-alert-border-color: var(--bs-warning-border-subtle); + --bs-alert-link-color: var(--bs-warning-text-emphasis); +} +.alert-danger { + --bs-alert-color: var(--bs-danger-text-emphasis); + --bs-alert-bg: var(--bs-danger-bg-subtle); + --bs-alert-border-color: var(--bs-danger-border-subtle); + --bs-alert-link-color: var(--bs-danger-text-emphasis); +} +.alert-light { + --bs-alert-color: var(--bs-light-text-emphasis); + --bs-alert-bg: var(--bs-light-bg-subtle); + --bs-alert-border-color: var(--bs-light-border-subtle); + --bs-alert-link-color: var(--bs-light-text-emphasis); +} +.alert-dark { + --bs-alert-color: var(--bs-dark-text-emphasis); + --bs-alert-bg: var(--bs-dark-bg-subtle); + --bs-alert-border-color: var(--bs-dark-border-subtle); + --bs-alert-link-color: var(--bs-dark-text-emphasis); +} +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} +.progress, +.progress-stacked { + --bs-progress-height: 1rem; + --bs-progress-font-size: 0.75rem; + --bs-progress-bg: var(--bs-secondary-bg); + --bs-progress-border-radius: var(--bs-border-radius); + --bs-progress-box-shadow: var(--bs-box-shadow-inset); + --bs-progress-bar-color: #fff; + --bs-progress-bar-bg: #0d6efd; + --bs-progress-bar-transition: width 0.6s ease; + display: flex; + height: var(--bs-progress-height); + overflow: hidden; + font-size: var(--bs-progress-font-size); + background-color: var(--bs-progress-bg); + border-radius: var(--bs-progress-border-radius); +} +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: var(--bs-progress-bar-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-progress-bar-bg); + transition: var(--bs-progress-bar-transition); +} +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} +.progress-bar-striped { + background-image: linear-gradient( + 45deg, + rgba(255, 255, 255, 0.15) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.15) 50%, + rgba(255, 255, 255, 0.15) 75%, + transparent 75%, + transparent + ); + background-size: var(--bs-progress-height) var(--bs-progress-height); +} +.progress-stacked > .progress { + overflow: visible; +} +.progress-stacked > .progress > .progress-bar { + width: 100%; +} +.progress-bar-animated { + animation: 1s linear infinite progress-bar-stripes; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; + } +} +.list-group { + --bs-list-group-color: var(--bs-body-color); + --bs-list-group-bg: var(--bs-body-bg); + --bs-list-group-border-color: var(--bs-border-color); + --bs-list-group-border-width: var(--bs-border-width); + --bs-list-group-border-radius: var(--bs-border-radius); + --bs-list-group-item-padding-x: 1rem; + --bs-list-group-item-padding-y: 0.5rem; + --bs-list-group-action-color: var(--bs-secondary-color); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-tertiary-bg); + --bs-list-group-action-active-color: var(--bs-body-color); + --bs-list-group-action-active-bg: var(--bs-secondary-bg); + --bs-list-group-disabled-color: var(--bs-secondary-color); + --bs-list-group-disabled-bg: var(--bs-body-bg); + --bs-list-group-active-color: #fff; + --bs-list-group-active-bg: #0d6efd; + --bs-list-group-active-border-color: #0d6efd; + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: var(--bs-list-group-border-radius); +} +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > .list-group-item::before { + content: counters(section, ".") ". "; + counter-increment: section; +} +.list-group-item-action { + width: 100%; + color: var(--bs-list-group-action-color); + text-align: inherit; +} +.list-group-item-action:focus, +.list-group-item-action:hover { + z-index: 1; + color: var(--bs-list-group-action-hover-color); + text-decoration: none; + background-color: var(--bs-list-group-action-hover-bg); +} +.list-group-item-action:active { + color: var(--bs-list-group-action-active-color); + background-color: var(--bs-list-group-action-active-bg); +} +.list-group-item { + position: relative; + display: block; + padding: var(--bs-list-group-item-padding-y) + var(--bs-list-group-item-padding-x); + color: var(--bs-list-group-color); + text-decoration: none; + background-color: var(--bs-list-group-bg); + border: var(--bs-list-group-border-width) solid + var(--bs-list-group-border-color); +} +.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: var(--bs-list-group-disabled-color); + pointer-events: none; + background-color: var(--bs-list-group-disabled-bg); +} +.list-group-item.active { + z-index: 2; + color: var(--bs-list-group-active-color); + background-color: var(--bs-list-group-active-bg); + border-color: var(--bs-list-group-active-border-color); +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: calc(-1 * var(--bs-list-group-border-width)); + border-top-width: var(--bs-list-group-border-width); +} +.list-group-horizontal { + flex-direction: row; +} +.list-group-horizontal > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; +} +.list-group-horizontal > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + 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: var(--bs-list-group-border-width); + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); +} +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + 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: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + 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: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + 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: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + 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: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + 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: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 var(--bs-list-group-border-width); +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} +.list-group-item-primary { + --bs-list-group-color: var(--bs-primary-text-emphasis); + --bs-list-group-bg: var(--bs-primary-bg-subtle); + --bs-list-group-border-color: var(--bs-primary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-primary-border-subtle); + --bs-list-group-active-color: var(--bs-primary-bg-subtle); + --bs-list-group-active-bg: var(--bs-primary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-primary-text-emphasis); +} +.list-group-item-secondary { + --bs-list-group-color: var(--bs-secondary-text-emphasis); + --bs-list-group-bg: var(--bs-secondary-bg-subtle); + --bs-list-group-border-color: var(--bs-secondary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle); + --bs-list-group-active-color: var(--bs-secondary-bg-subtle); + --bs-list-group-active-bg: var(--bs-secondary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis); +} +.list-group-item-success { + --bs-list-group-color: var(--bs-success-text-emphasis); + --bs-list-group-bg: var(--bs-success-bg-subtle); + --bs-list-group-border-color: var(--bs-success-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-success-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-success-border-subtle); + --bs-list-group-active-color: var(--bs-success-bg-subtle); + --bs-list-group-active-bg: var(--bs-success-text-emphasis); + --bs-list-group-active-border-color: var(--bs-success-text-emphasis); +} +.list-group-item-info { + --bs-list-group-color: var(--bs-info-text-emphasis); + --bs-list-group-bg: var(--bs-info-bg-subtle); + --bs-list-group-border-color: var(--bs-info-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-info-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-info-border-subtle); + --bs-list-group-active-color: var(--bs-info-bg-subtle); + --bs-list-group-active-bg: var(--bs-info-text-emphasis); + --bs-list-group-active-border-color: var(--bs-info-text-emphasis); +} +.list-group-item-warning { + --bs-list-group-color: var(--bs-warning-text-emphasis); + --bs-list-group-bg: var(--bs-warning-bg-subtle); + --bs-list-group-border-color: var(--bs-warning-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-warning-border-subtle); + --bs-list-group-active-color: var(--bs-warning-bg-subtle); + --bs-list-group-active-bg: var(--bs-warning-text-emphasis); + --bs-list-group-active-border-color: var(--bs-warning-text-emphasis); +} +.list-group-item-danger { + --bs-list-group-color: var(--bs-danger-text-emphasis); + --bs-list-group-bg: var(--bs-danger-bg-subtle); + --bs-list-group-border-color: var(--bs-danger-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-danger-border-subtle); + --bs-list-group-active-color: var(--bs-danger-bg-subtle); + --bs-list-group-active-bg: var(--bs-danger-text-emphasis); + --bs-list-group-active-border-color: var(--bs-danger-text-emphasis); +} +.list-group-item-light { + --bs-list-group-color: var(--bs-light-text-emphasis); + --bs-list-group-bg: var(--bs-light-bg-subtle); + --bs-list-group-border-color: var(--bs-light-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-light-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-light-border-subtle); + --bs-list-group-active-color: var(--bs-light-bg-subtle); + --bs-list-group-active-bg: var(--bs-light-text-emphasis); + --bs-list-group-active-border-color: var(--bs-light-text-emphasis); +} +.list-group-item-dark { + --bs-list-group-color: var(--bs-dark-text-emphasis); + --bs-list-group-bg: var(--bs-dark-bg-subtle); + --bs-list-group-border-color: var(--bs-dark-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-dark-border-subtle); + --bs-list-group-active-color: var(--bs-dark-bg-subtle); + --bs-list-group-active-bg: var(--bs-dark-text-emphasis); + --bs-list-group-active-border-color: var(--bs-dark-text-emphasis); +} +.btn-close { + --bs-btn-close-color: #000; + --bs-btn-close-bg: 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 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e"); + --bs-btn-close-opacity: 0.5; + --bs-btn-close-hover-opacity: 0.75; + --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-btn-close-focus-opacity: 1; + --bs-btn-close-disabled-opacity: 0.25; + --bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%); + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: var(--bs-btn-close-color); + background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; + border: 0; + border-radius: 0.375rem; + opacity: var(--bs-btn-close-opacity); +} +.btn-close:hover { + color: var(--bs-btn-close-color); + text-decoration: none; + opacity: var(--bs-btn-close-hover-opacity); +} +.btn-close:focus { + outline: 0; + box-shadow: var(--bs-btn-close-focus-shadow); + opacity: var(--bs-btn-close-focus-opacity); +} +.btn-close.disabled, +.btn-close:disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + opacity: var(--bs-btn-close-disabled-opacity); +} +.btn-close-white { + filter: var(--bs-btn-close-white-filter); +} +[data-bs-theme="dark"] .btn-close { + filter: var(--bs-btn-close-white-filter); +} +.toast { + --bs-toast-zindex: 1090; + --bs-toast-padding-x: 0.75rem; + --bs-toast-padding-y: 0.5rem; + --bs-toast-spacing: 1.5rem; + --bs-toast-max-width: 350px; + --bs-toast-font-size: 0.875rem; + --bs-toast-color: ; + --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-border-width: var(--bs-border-width); + --bs-toast-border-color: var(--bs-border-color-translucent); + --bs-toast-border-radius: var(--bs-border-radius); + --bs-toast-box-shadow: var(--bs-box-shadow); + --bs-toast-header-color: var(--bs-secondary-color); + --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-header-border-color: var(--bs-border-color-translucent); + width: var(--bs-toast-max-width); + max-width: 100%; + font-size: var(--bs-toast-font-size); + color: var(--bs-toast-color); + pointer-events: auto; + background-color: var(--bs-toast-bg); + background-clip: padding-box; + border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); + box-shadow: var(--bs-toast-box-shadow); + border-radius: var(--bs-toast-border-radius); +} +.toast.showing { + opacity: 0; +} +.toast:not(.show) { + display: none; +} +.toast-container { + --bs-toast-zindex: 1090; + position: absolute; + z-index: var(--bs-toast-zindex); + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none; +} +.toast-container > :not(:last-child) { + margin-bottom: var(--bs-toast-spacing); +} +.toast-header { + display: flex; + align-items: center; + padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); + color: var(--bs-toast-header-color); + background-color: var(--bs-toast-header-bg); + background-clip: padding-box; + border-bottom: var(--bs-toast-border-width) solid + var(--bs-toast-header-border-color); + border-top-left-radius: calc( + var(--bs-toast-border-radius) - var(--bs-toast-border-width) + ); + border-top-right-radius: calc( + var(--bs-toast-border-radius) - var(--bs-toast-border-width) + ); +} +.toast-header .btn-close { + margin-right: calc(-0.5 * var(--bs-toast-padding-x)); + margin-left: var(--bs-toast-padding-x); +} +.toast-body { + padding: var(--bs-toast-padding-x); + word-wrap: break-word; +} +.modal { + --bs-modal-zindex: 1055; + --bs-modal-width: 500px; + --bs-modal-padding: 1rem; + --bs-modal-margin: 0.5rem; + --bs-modal-color: ; + --bs-modal-bg: var(--bs-body-bg); + --bs-modal-border-color: var(--bs-border-color-translucent); + --bs-modal-border-width: var(--bs-border-width); + --bs-modal-border-radius: var(--bs-border-radius-lg); + --bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-modal-inner-border-radius: calc( + var(--bs-border-radius-lg) - (var(--bs-border-width)) + ); + --bs-modal-header-padding-x: 1rem; + --bs-modal-header-padding-y: 1rem; + --bs-modal-header-padding: 1rem 1rem; + --bs-modal-header-border-color: var(--bs-border-color); + --bs-modal-header-border-width: var(--bs-border-width); + --bs-modal-title-line-height: 1.5; + --bs-modal-footer-gap: 0.5rem; + --bs-modal-footer-bg: ; + --bs-modal-footer-border-color: var(--bs-border-color); + --bs-modal-footer-border-width: var(--bs-border-width); + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-modal-zindex); + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; +} +.modal-dialog { + position: relative; + width: auto; + margin: var(--bs-modal-margin); + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.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% - var(--bs-modal-margin) * 2); +} +.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% - var(--bs-modal-margin) * 2); +} +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + color: var(--bs-modal-color); + pointer-events: auto; + background-color: var(--bs-modal-bg); + background-clip: padding-box; + border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); + border-radius: var(--bs-modal-border-radius); + outline: 0; +} +.modal-backdrop { + --bs-backdrop-zindex: 1050; + --bs-backdrop-bg: #000; + --bs-backdrop-opacity: 0.5; + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-backdrop-zindex); + width: 100vw; + height: 100vh; + background-color: var(--bs-backdrop-bg); +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: var(--bs-backdrop-opacity); +} +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: space-between; + padding: var(--bs-modal-header-padding); + border-bottom: var(--bs-modal-header-border-width) solid + var(--bs-modal-header-border-color); + border-top-left-radius: var(--bs-modal-inner-border-radius); + border-top-right-radius: var(--bs-modal-inner-border-radius); +} +.modal-header .btn-close { + padding: calc(var(--bs-modal-header-padding-y) * 0.5) + calc(var(--bs-modal-header-padding-x) * 0.5); + margin: calc(-0.5 * var(--bs-modal-header-padding-y)) + calc(-0.5 * var(--bs-modal-header-padding-x)) + calc(-0.5 * var(--bs-modal-header-padding-y)) auto; +} +.modal-title { + margin-bottom: 0; + line-height: var(--bs-modal-title-line-height); +} +.modal-body { + position: relative; + flex: 1 1 auto; + padding: var(--bs-modal-padding); +} +.modal-footer { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5); + background-color: var(--bs-modal-footer-bg); + border-top: var(--bs-modal-footer-border-width) solid + var(--bs-modal-footer-border-color); + border-bottom-right-radius: var(--bs-modal-inner-border-radius); + border-bottom-left-radius: var(--bs-modal-inner-border-radius); +} +.modal-footer > * { + margin: calc(var(--bs-modal-footer-gap) * 0.5); +} +@media (min-width: 576px) { + .modal { + --bs-modal-margin: 1.75rem; + --bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + } + .modal-dialog { + max-width: var(--bs-modal-width); + margin-right: auto; + margin-left: auto; + } + .modal-sm { + --bs-modal-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + --bs-modal-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + --bs-modal-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-footer, +.modal-fullscreen .modal-header { + border-radius: 0; +} +.modal-fullscreen .modal-body { + overflow-y: auto; +} +@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-footer, + .modal-fullscreen-sm-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } +} +@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-footer, + .modal-fullscreen-md-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } +} +@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-footer, + .modal-fullscreen-lg-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } +} +@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-footer, + .modal-fullscreen-xl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } +} +@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-footer, + .modal-fullscreen-xxl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } +} +.tooltip { + --bs-tooltip-zindex: 1080; + --bs-tooltip-max-width: 200px; + --bs-tooltip-padding-x: 0.5rem; + --bs-tooltip-padding-y: 0.25rem; + --bs-tooltip-margin: ; + --bs-tooltip-font-size: 0.875rem; + --bs-tooltip-color: var(--bs-body-bg); + --bs-tooltip-bg: var(--bs-emphasis-color); + --bs-tooltip-border-radius: var(--bs-border-radius); + --bs-tooltip-opacity: 0.9; + --bs-tooltip-arrow-width: 0.8rem; + --bs-tooltip-arrow-height: 0.4rem; + z-index: var(--bs-tooltip-zindex); + display: block; + margin: var(--bs-tooltip-margin); + 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; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-tooltip-font-size); + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: var(--bs-tooltip-opacity); +} +.tooltip .tooltip-arrow { + display: block; + width: var(--bs-tooltip-arrow-width); + height: var(--bs-tooltip-arrow-height); +} +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} +.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow, +.bs-tooltip-top .tooltip-arrow { + bottom: calc(-1 * var(--bs-tooltip-arrow-height)); +} +.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before, +.bs-tooltip-top .tooltip-arrow::before { + top: -1px; + border-width: var(--bs-tooltip-arrow-height) + calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-top-color: var(--bs-tooltip-bg); +} +.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow, +.bs-tooltip-end .tooltip-arrow { + left: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before, +.bs-tooltip-end .tooltip-arrow::before { + right: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) + var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-right-color: var(--bs-tooltip-bg); +} +.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow, +.bs-tooltip-bottom .tooltip-arrow { + top: calc(-1 * var(--bs-tooltip-arrow-height)); +} +.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before, +.bs-tooltip-bottom .tooltip-arrow::before { + bottom: -1px; + border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) + var(--bs-tooltip-arrow-height); + border-bottom-color: var(--bs-tooltip-bg); +} +.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow, +.bs-tooltip-start .tooltip-arrow { + right: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before, +.bs-tooltip-start .tooltip-arrow::before { + left: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 + calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-left-color: var(--bs-tooltip-bg); +} +.tooltip-inner { + max-width: var(--bs-tooltip-max-width); + padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); + color: var(--bs-tooltip-color); + text-align: center; + background-color: var(--bs-tooltip-bg); + border-radius: var(--bs-tooltip-border-radius); +} +.popover { + --bs-popover-zindex: 1070; + --bs-popover-max-width: 276px; + --bs-popover-font-size: 0.875rem; + --bs-popover-bg: var(--bs-body-bg); + --bs-popover-border-width: var(--bs-border-width); + --bs-popover-border-color: var(--bs-border-color-translucent); + --bs-popover-border-radius: var(--bs-border-radius-lg); + --bs-popover-inner-border-radius: calc( + var(--bs-border-radius-lg) - var(--bs-border-width) + ); + --bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-popover-header-padding-x: 1rem; + --bs-popover-header-padding-y: 0.5rem; + --bs-popover-header-font-size: 1rem; + --bs-popover-header-color: inherit; + --bs-popover-header-bg: var(--bs-secondary-bg); + --bs-popover-body-padding-x: 1rem; + --bs-popover-body-padding-y: 1rem; + --bs-popover-body-color: var(--bs-body-color); + --bs-popover-arrow-width: 1rem; + --bs-popover-arrow-height: 0.5rem; + --bs-popover-arrow-border: var(--bs-popover-border-color); + z-index: var(--bs-popover-zindex); + display: block; + max-width: var(--bs-popover-max-width); + 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; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-popover-font-size); + word-wrap: break-word; + background-color: var(--bs-popover-bg); + background-clip: padding-box; + border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-radius: var(--bs-popover-border-radius); +} +.popover .popover-arrow { + display: block; + width: var(--bs-popover-arrow-width); + height: var(--bs-popover-arrow-height); +} +.popover .popover-arrow::after, +.popover .popover-arrow::before { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; + border-width: 0; +} +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow, +.bs-popover-top > .popover-arrow { + bottom: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); +} +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before, +.bs-popover-top > .popover-arrow::after, +.bs-popover-top > .popover-arrow::before { + border-width: var(--bs-popover-arrow-height) + calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before, +.bs-popover-top > .popover-arrow::before { + bottom: 0; + border-top-color: var(--bs-popover-arrow-border); +} +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after, +.bs-popover-top > .popover-arrow::after { + bottom: var(--bs-popover-border-width); + border-top-color: var(--bs-popover-bg); +} +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow, +.bs-popover-end > .popover-arrow { + left: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before, +.bs-popover-end > .popover-arrow::after, +.bs-popover-end > .popover-arrow::before { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) + var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before, +.bs-popover-end > .popover-arrow::before { + left: 0; + border-right-color: var(--bs-popover-arrow-border); +} +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after, +.bs-popover-end > .popover-arrow::after { + left: var(--bs-popover-border-width); + border-right-color: var(--bs-popover-bg); +} +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow, +.bs-popover-bottom > .popover-arrow { + top: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); +} +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before, +.bs-popover-bottom > .popover-arrow::after, +.bs-popover-bottom > .popover-arrow::before { + border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) + var(--bs-popover-arrow-height); +} +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before, +.bs-popover-bottom > .popover-arrow::before { + top: 0; + border-bottom-color: var(--bs-popover-arrow-border); +} +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after, +.bs-popover-bottom > .popover-arrow::after { + top: var(--bs-popover-border-width); + border-bottom-color: var(--bs-popover-bg); +} +.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: var(--bs-popover-arrow-width); + margin-left: calc(-0.5 * var(--bs-popover-arrow-width)); + content: ""; + border-bottom: var(--bs-popover-border-width) solid + var(--bs-popover-header-bg); +} +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow, +.bs-popover-start > .popover-arrow { + right: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before, +.bs-popover-start > .popover-arrow::after, +.bs-popover-start > .popover-arrow::before { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 + calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +} +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before, +.bs-popover-start > .popover-arrow::before { + right: 0; + border-left-color: var(--bs-popover-arrow-border); +} +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after, +.bs-popover-start > .popover-arrow::after { + right: var(--bs-popover-border-width); + border-left-color: var(--bs-popover-bg); +} +.popover-header { + padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x); + margin-bottom: 0; + font-size: var(--bs-popover-header-font-size); + color: var(--bs-popover-header-color); + background-color: var(--bs-popover-header-bg); + border-bottom: var(--bs-popover-border-width) solid + var(--bs-popover-border-color); + border-top-left-radius: var(--bs-popover-inner-border-radius); + border-top-right-radius: var(--bs-popover-inner-border-radius); +} +.popover-header:empty { + display: none; +} +.popover-body { + padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); + color: var(--bs-popover-body-color); +} +.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 0.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 0.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: 0.5; + transition: opacity 0.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: 0.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%; +} +.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: 0.5; + transition: opacity 0.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; +} +[data-bs-theme="dark"] .carousel .carousel-control-next-icon, +[data-bs-theme="dark"] .carousel .carousel-control-prev-icon, +[data-bs-theme="dark"].carousel .carousel-control-next-icon, +[data-bs-theme="dark"].carousel .carousel-control-prev-icon { + filter: invert(1) grayscale(100); +} +[data-bs-theme="dark"] .carousel .carousel-indicators [data-bs-target], +[data-bs-theme="dark"].carousel .carousel-indicators [data-bs-target] { + background-color: #000; +} +[data-bs-theme="dark"] .carousel .carousel-caption, +[data-bs-theme="dark"].carousel .carousel-caption { + color: #000; +} +.spinner-border, +.spinner-grow { + display: inline-block; + width: var(--bs-spinner-width); + height: var(--bs-spinner-height); + vertical-align: var(--bs-spinner-vertical-align); + border-radius: 50%; + animation: var(--bs-spinner-animation-speed) linear infinite + var(--bs-spinner-animation-name); +} +@keyframes spinner-border { + to { + transform: rotate(360deg); + } +} +.spinner-border { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-border-width: 0.25em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-border; + border: var(--bs-spinner-border-width) solid currentcolor; + border-right-color: transparent; +} +.spinner-border-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; + --bs-spinner-border-width: 0.2em; +} +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} +.spinner-grow { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-grow; + background-color: currentcolor; + opacity: 0; +} +.spinner-grow-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; +} +@media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + --bs-spinner-animation-speed: 1.5s; + } +} +.offcanvas, +.offcanvas-lg, +.offcanvas-md, +.offcanvas-sm, +.offcanvas-xl, +.offcanvas-xxl { + --bs-offcanvas-zindex: 1045; + --bs-offcanvas-width: 400px; + --bs-offcanvas-height: 30vh; + --bs-offcanvas-padding-x: 1rem; + --bs-offcanvas-padding-y: 1rem; + --bs-offcanvas-color: var(--bs-body-color); + --bs-offcanvas-bg: var(--bs-body-bg); + --bs-offcanvas-border-width: var(--bs-border-width); + --bs-offcanvas-border-color: var(--bs-border-color-translucent); + --bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-offcanvas-transition: transform 0.3s ease-in-out; + --bs-offcanvas-title-line-height: 1.5; +} +@media (max-width: 575.98px) { + .offcanvas-sm { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-sm { + transition: none; + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-sm.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-sm.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-sm.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-sm.show:not(.hiding), + .offcanvas-sm.showing { + transform: none; + } + .offcanvas-sm.hiding, + .offcanvas-sm.show, + .offcanvas-sm.showing { + visibility: visible; + } +} +@media (min-width: 576px) { + .offcanvas-sm { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-sm .offcanvas-header { + display: none; + } + .offcanvas-sm .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +@media (max-width: 767.98px) { + .offcanvas-md { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-md { + transition: none; + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-md.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-md.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-md.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-md.show:not(.hiding), + .offcanvas-md.showing { + transform: none; + } + .offcanvas-md.hiding, + .offcanvas-md.show, + .offcanvas-md.showing { + visibility: visible; + } +} +@media (min-width: 768px) { + .offcanvas-md { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-md .offcanvas-header { + display: none; + } + .offcanvas-md .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-lg { + transition: none; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-lg.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-lg.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-lg.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-lg.show:not(.hiding), + .offcanvas-lg.showing { + transform: none; + } + .offcanvas-lg.hiding, + .offcanvas-lg.show, + .offcanvas-lg.showing { + visibility: visible; + } +} +@media (min-width: 992px) { + .offcanvas-lg { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-lg .offcanvas-header { + display: none; + } + .offcanvas-lg .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xl { + transition: none; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-xl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-xl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-xl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-xl.show:not(.hiding), + .offcanvas-xl.showing { + transform: none; + } + .offcanvas-xl.hiding, + .offcanvas-xl.show, + .offcanvas-xl.showing { + visibility: visible; + } +} +@media (min-width: 1200px) { + .offcanvas-xl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xl .offcanvas-header { + display: none; + } + .offcanvas-xl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xxl { + transition: none; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-xxl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-xxl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-xxl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-xxl.show:not(.hiding), + .offcanvas-xxl.showing { + transform: none; + } + .offcanvas-xxl.hiding, + .offcanvas-xxl.show, + .offcanvas-xxl.showing { + visibility: visible; + } +} +@media (min-width: 1400px) { + .offcanvas-xxl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xxl .offcanvas-header { + display: none; + } + .offcanvas-xxl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +.offcanvas { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); +} +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none; + } +} +.offcanvas.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); +} +.offcanvas.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); +} +.offcanvas.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); +} +.offcanvas.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); +} +.offcanvas.show:not(.hiding), +.offcanvas.showing { + transform: none; +} +.offcanvas.hiding, +.offcanvas.show, +.offcanvas.showing { + visibility: visible; +} +.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: 0.5; +} +.offcanvas-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); +} +.offcanvas-header .btn-close { + padding: calc(var(--bs-offcanvas-padding-y) * 0.5) + calc(var(--bs-offcanvas-padding-x) * 0.5); + margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y)); + margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x)); + margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y)); +} +.offcanvas-title { + margin-bottom: 0; + line-height: var(--bs-offcanvas-title-line-height); +} +.offcanvas-body { + flex-grow: 1; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); + overflow-y: auto; +} +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentcolor; + opacity: 0.5; +} +.placeholder.btn::before { + display: inline-block; + content: ""; +} +.placeholder-xs { + min-height: 0.6em; +} +.placeholder-sm { + min-height: 0.8em; +} +.placeholder-lg { + min-height: 1.2em; +} +.placeholder-glow .placeholder { + animation: placeholder-glow 2s ease-in-out infinite; +} +@keyframes placeholder-glow { + 50% { + opacity: 0.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%; + animation: placeholder-wave 2s linear infinite; +} +@keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } +} +.clearfix::after { + display: block; + clear: both; + content: ""; +} +.text-bg-primary { + color: #fff !important; + background-color: RGBA( + var(--bs-primary-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-secondary { + color: #fff !important; + background-color: RGBA( + var(--bs-secondary-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-success { + color: #fff !important; + background-color: RGBA( + var(--bs-success-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-info { + color: #000 !important; + background-color: RGBA( + var(--bs-info-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-warning { + color: #000 !important; + background-color: RGBA( + var(--bs-warning-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-danger { + color: #fff !important; + background-color: RGBA( + var(--bs-danger-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-light { + color: #000 !important; + background-color: RGBA( + var(--bs-light-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-dark { + color: #fff !important; + background-color: RGBA( + var(--bs-dark-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.link-primary { + color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-primary:focus, +.link-primary:hover { + color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 10, + 88, + 202, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 10, + 88, + 202, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-secondary { + color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-secondary:focus, +.link-secondary:hover { + color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 86, + 94, + 100, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 86, + 94, + 100, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-success { + color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-success-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-success-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-success:focus, +.link-success:hover { + color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 20, + 108, + 67, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 20, + 108, + 67, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-info { + color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-info-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-info-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-info:focus, +.link-info:hover { + color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 61, + 213, + 243, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 61, + 213, + 243, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-warning { + color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-warning:focus, +.link-warning:hover { + color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 255, + 205, + 57, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 255, + 205, + 57, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-danger { + color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-danger:focus, +.link-danger:hover { + color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 176, + 42, + 55, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 176, + 42, + 55, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-light { + color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-light-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-light-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-light:focus, +.link-light:hover { + color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 249, + 250, + 251, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 249, + 250, + 251, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-dark { + color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-dark:focus, +.link-dark:hover { + color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 26, + 30, + 33, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 26, + 30, + 33, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-body-emphasis { + color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-opacity, 1) + ) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-body-emphasis:focus, +.link-body-emphasis:hover { + color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-opacity, 0.75) + ) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 0.75) + ) !important; + text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 0.75) + ) !important; +} +.focus-ring:focus { + outline: 0; + box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) + var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) + var(--bs-focus-ring-color); +} +.icon-link { + display: inline-flex; + gap: 0.375rem; + align-items: center; + -webkit-text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-opacity, 0.5) + ); + text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-opacity, 0.5) + ); + text-underline-offset: 0.25em; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +.icon-link > .bi { + flex-shrink: 0; + width: 1em; + height: 1em; + fill: currentcolor; + transition: 0.2s ease-in-out transform; +} +@media (prefers-reduced-motion: reduce) { + .icon-link > .bi { + transition: none; + } +} +.icon-link-hover:focus-visible > .bi, +.icon-link-hover:hover > .bi { + transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0)); +} +.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: 75%; +} +.ratio-16x9 { + --bs-aspect-ratio: 56.25%; +} +.ratio-21x9 { + --bs-aspect-ratio: 42.8571428571%; +} +.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; +} +.sticky-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; +} +@media (min-width: 576px) { + .sticky-sm-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-sm-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 768px) { + .sticky-md-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-md-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 992px) { + .sticky-lg-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-lg-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1200px) { + .sticky-xl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xl-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1400px) { + .sticky-xxl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xxl-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 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) { + 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; +} +.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption), +.visually-hidden:not(caption) { + position: absolute !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: var(--bs-border-width); + min-height: 1em; + background-color: currentcolor; + opacity: 0.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; +} +.object-fit-contain { + -o-object-fit: contain !important; + object-fit: contain !important; +} +.object-fit-cover { + -o-object-fit: cover !important; + object-fit: cover !important; +} +.object-fit-fill { + -o-object-fit: fill !important; + object-fit: fill !important; +} +.object-fit-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; +} +.object-fit-none { + -o-object-fit: none !important; + object-fit: none !important; +} +.opacity-0 { + opacity: 0 !important; +} +.opacity-25 { + opacity: 0.25 !important; +} +.opacity-50 { + opacity: 0.5 !important; +} +.opacity-75 { + opacity: 0.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; +} +.overflow-x-auto { + overflow-x: auto !important; +} +.overflow-x-hidden { + overflow-x: hidden !important; +} +.overflow-x-visible { + overflow-x: visible !important; +} +.overflow-x-scroll { + overflow-x: scroll !important; +} +.overflow-y-auto { + overflow-y: auto !important; +} +.overflow-y-hidden { + overflow-y: hidden !important; +} +.overflow-y-visible { + overflow-y: visible !important; +} +.overflow-y-scroll { + overflow-y: 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-inline-grid { + display: inline-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 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} +.shadow-none { + box-shadow: none !important; +} +.focus-ring-primary { + --bs-focus-ring-color: rgba( + var(--bs-primary-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-secondary { + --bs-focus-ring-color: rgba( + var(--bs-secondary-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-success { + --bs-focus-ring-color: rgba( + var(--bs-success-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-info { + --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity)); +} +.focus-ring-warning { + --bs-focus-ring-color: rgba( + var(--bs-warning-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-danger { + --bs-focus-ring-color: rgba( + var(--bs-danger-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-light { + --bs-focus-ring-color: rgba( + var(--bs-light-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-dark { + --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity)); +} +.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: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} +.border-0 { + border: 0 !important; +} +.border-top { + border-top: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; +} +.border-top-0 { + border-top: 0 !important; +} +.border-end { + border-right: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; +} +.border-end-0 { + border-right: 0 !important; +} +.border-bottom { + border-bottom: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; +} +.border-bottom-0 { + border-bottom: 0 !important; +} +.border-start { + border-left: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; +} +.border-start-0 { + border-left: 0 !important; +} +.border-primary { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-primary-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-secondary { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-secondary-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-success { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-success-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-info { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; +} +.border-warning { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-warning-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-danger { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important; +} +.border-light { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important; +} +.border-dark { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; +} +.border-black { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important; +} +.border-white { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important; +} +.border-primary-subtle { + border-color: var(--bs-primary-border-subtle) !important; +} +.border-secondary-subtle { + border-color: var(--bs-secondary-border-subtle) !important; +} +.border-success-subtle { + border-color: var(--bs-success-border-subtle) !important; +} +.border-info-subtle { + border-color: var(--bs-info-border-subtle) !important; +} +.border-warning-subtle { + border-color: var(--bs-warning-border-subtle) !important; +} +.border-danger-subtle { + border-color: var(--bs-danger-border-subtle) !important; +} +.border-light-subtle { + border-color: var(--bs-light-border-subtle) !important; +} +.border-dark-subtle { + border-color: var(--bs-dark-border-subtle) !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; +} +.border-opacity-10 { + --bs-border-opacity: 0.1; +} +.border-opacity-25 { + --bs-border-opacity: 0.25; +} +.border-opacity-50 { + --bs-border-opacity: 0.5; +} +.border-opacity-75 { + --bs-border-opacity: 0.75; +} +.border-opacity-100 { + --bs-border-opacity: 1; +} +.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; +} +.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: 0.25rem !important; +} +.m-2 { + margin: 0.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: 0.25rem !important; + margin-left: 0.25rem !important; +} +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.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: 0.25rem !important; + margin-bottom: 0.25rem !important; +} +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.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: 0.25rem !important; +} +.mt-2 { + margin-top: 0.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: 0.25rem !important; +} +.me-2 { + margin-right: 0.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: 0.25rem !important; +} +.mb-2 { + margin-bottom: 0.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: 0.25rem !important; +} +.ms-2 { + margin-left: 0.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: 0.25rem !important; +} +.p-2 { + padding: 0.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: 0.25rem !important; + padding-left: 0.25rem !important; +} +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.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: 0.25rem !important; + padding-bottom: 0.25rem !important; +} +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.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: 0.25rem !important; +} +.pt-2 { + padding-top: 0.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: 0.25rem !important; +} +.pe-2 { + padding-right: 0.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: 0.25rem !important; +} +.pb-2 { + padding-bottom: 0.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: 0.25rem !important; +} +.ps-2 { + padding-left: 0.5rem !important; +} +.ps-3 { + padding-left: 1rem !important; +} +.ps-4 { + padding-left: 1.5rem !important; +} +.ps-5 { + padding-left: 3rem !important; +} +.gap-0 { + gap: 0 !important; +} +.gap-1 { + gap: 0.25rem !important; +} +.gap-2 { + gap: 0.5rem !important; +} +.gap-3 { + gap: 1rem !important; +} +.gap-4 { + gap: 1.5rem !important; +} +.gap-5 { + gap: 3rem !important; +} +.row-gap-0 { + row-gap: 0 !important; +} +.row-gap-1 { + row-gap: 0.25rem !important; +} +.row-gap-2 { + row-gap: 0.5rem !important; +} +.row-gap-3 { + row-gap: 1rem !important; +} +.row-gap-4 { + row-gap: 1.5rem !important; +} +.row-gap-5 { + row-gap: 3rem !important; +} +.column-gap-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; +} +.column-gap-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; +} +.column-gap-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; +} +.column-gap-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; +} +.column-gap-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; +} +.column-gap-5 { + -moz-column-gap: 3rem !important; + column-gap: 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 + 0.9vw) !important; +} +.fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; +} +.fs-4 { + font-size: calc(1.275rem + 0.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-lighter { + font-weight: lighter !important; +} +.fw-light { + font-weight: 300 !important; +} +.fw-normal { + font-weight: 400 !important; +} +.fw-medium { + font-weight: 500 !important; +} +.fw-semibold { + font-weight: 600 !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-color-rgb), var(--bs-text-opacity)) !important; +} +.text-muted { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; +} +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; +} +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; +} +.text-body-secondary { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; +} +.text-body-tertiary { + --bs-text-opacity: 1; + color: var(--bs-tertiary-color) !important; +} +.text-body-emphasis { + --bs-text-opacity: 1; + color: var(--bs-emphasis-color) !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; +} +.text-primary-emphasis { + color: var(--bs-primary-text-emphasis) !important; +} +.text-secondary-emphasis { + color: var(--bs-secondary-text-emphasis) !important; +} +.text-success-emphasis { + color: var(--bs-success-text-emphasis) !important; +} +.text-info-emphasis { + color: var(--bs-info-text-emphasis) !important; +} +.text-warning-emphasis { + color: var(--bs-warning-text-emphasis) !important; +} +.text-danger-emphasis { + color: var(--bs-danger-text-emphasis) !important; +} +.text-light-emphasis { + color: var(--bs-light-text-emphasis) !important; +} +.text-dark-emphasis { + color: var(--bs-dark-text-emphasis) !important; +} +.link-opacity-10 { + --bs-link-opacity: 0.1; +} +.link-opacity-10-hover:hover { + --bs-link-opacity: 0.1; +} +.link-opacity-25 { + --bs-link-opacity: 0.25; +} +.link-opacity-25-hover:hover { + --bs-link-opacity: 0.25; +} +.link-opacity-50 { + --bs-link-opacity: 0.5; +} +.link-opacity-50-hover:hover { + --bs-link-opacity: 0.5; +} +.link-opacity-75 { + --bs-link-opacity: 0.75; +} +.link-opacity-75-hover:hover { + --bs-link-opacity: 0.75; +} +.link-opacity-100 { + --bs-link-opacity: 1; +} +.link-opacity-100-hover:hover { + --bs-link-opacity: 1; +} +.link-offset-1 { + text-underline-offset: 0.125em !important; +} +.link-offset-1-hover:hover { + text-underline-offset: 0.125em !important; +} +.link-offset-2 { + text-underline-offset: 0.25em !important; +} +.link-offset-2-hover:hover { + text-underline-offset: 0.25em !important; +} +.link-offset-3 { + text-underline-offset: 0.375em !important; +} +.link-offset-3-hover:hover { + text-underline-offset: 0.375em !important; +} +.link-underline-primary { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-secondary { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-success { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-success-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-success-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-info { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-info-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-info-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-warning { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-danger { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-light { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-light-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-light-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-dark { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-underline-opacity-0 { + --bs-link-underline-opacity: 0; +} +.link-underline-opacity-0-hover:hover { + --bs-link-underline-opacity: 0; +} +.link-underline-opacity-10 { + --bs-link-underline-opacity: 0.1; +} +.link-underline-opacity-10-hover:hover { + --bs-link-underline-opacity: 0.1; +} +.link-underline-opacity-25 { + --bs-link-underline-opacity: 0.25; +} +.link-underline-opacity-25-hover:hover { + --bs-link-underline-opacity: 0.25; +} +.link-underline-opacity-50 { + --bs-link-underline-opacity: 0.5; +} +.link-underline-opacity-50-hover:hover { + --bs-link-underline-opacity: 0.5; +} +.link-underline-opacity-75 { + --bs-link-underline-opacity: 0.75; +} +.link-underline-opacity-75-hover:hover { + --bs-link-underline-opacity: 0.75; +} +.link-underline-opacity-100 { + --bs-link-underline-opacity: 1; +} +.link-underline-opacity-100-hover:hover { + --bs-link-underline-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-bg-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; +} +.bg-body-secondary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-secondary-bg-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-body-tertiary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-tertiary-bg-rgb), + var(--bs-bg-opacity) + ) !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-primary-subtle { + background-color: var(--bs-primary-bg-subtle) !important; +} +.bg-secondary-subtle { + background-color: var(--bs-secondary-bg-subtle) !important; +} +.bg-success-subtle { + background-color: var(--bs-success-bg-subtle) !important; +} +.bg-info-subtle { + background-color: var(--bs-info-bg-subtle) !important; +} +.bg-warning-subtle { + background-color: var(--bs-warning-bg-subtle) !important; +} +.bg-danger-subtle { + background-color: var(--bs-danger-bg-subtle) !important; +} +.bg-light-subtle { + background-color: var(--bs-light-bg-subtle) !important; +} +.bg-dark-subtle { + background-color: var(--bs-dark-bg-subtle) !important; +} +.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: var(--bs-border-radius) !important; +} +.rounded-0 { + border-radius: 0 !important; +} +.rounded-1 { + border-radius: var(--bs-border-radius-sm) !important; +} +.rounded-2 { + border-radius: var(--bs-border-radius) !important; +} +.rounded-3 { + border-radius: var(--bs-border-radius-lg) !important; +} +.rounded-4 { + border-radius: var(--bs-border-radius-xl) !important; +} +.rounded-5 { + border-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-circle { + border-radius: 50% !important; +} +.rounded-pill { + border-radius: var(--bs-border-radius-pill) !important; +} +.rounded-top { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} +.rounded-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} +.rounded-top-1 { + border-top-left-radius: var(--bs-border-radius-sm) !important; + border-top-right-radius: var(--bs-border-radius-sm) !important; +} +.rounded-top-2 { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} +.rounded-top-3 { + border-top-left-radius: var(--bs-border-radius-lg) !important; + border-top-right-radius: var(--bs-border-radius-lg) !important; +} +.rounded-top-4 { + border-top-left-radius: var(--bs-border-radius-xl) !important; + border-top-right-radius: var(--bs-border-radius-xl) !important; +} +.rounded-top-5 { + border-top-left-radius: var(--bs-border-radius-xxl) !important; + border-top-right-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-top-circle { + border-top-left-radius: 50% !important; + border-top-right-radius: 50% !important; +} +.rounded-top-pill { + border-top-left-radius: var(--bs-border-radius-pill) !important; + border-top-right-radius: var(--bs-border-radius-pill) !important; +} +.rounded-end { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} +.rounded-end-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} +.rounded-end-1 { + border-top-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-right-radius: var(--bs-border-radius-sm) !important; +} +.rounded-end-2 { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} +.rounded-end-3 { + border-top-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-right-radius: var(--bs-border-radius-lg) !important; +} +.rounded-end-4 { + border-top-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-right-radius: var(--bs-border-radius-xl) !important; +} +.rounded-end-5 { + border-top-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-end-circle { + border-top-right-radius: 50% !important; + border-bottom-right-radius: 50% !important; +} +.rounded-end-pill { + border-top-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-right-radius: var(--bs-border-radius-pill) !important; +} +.rounded-bottom { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} +.rounded-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} +.rounded-bottom-1 { + border-bottom-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-left-radius: var(--bs-border-radius-sm) !important; +} +.rounded-bottom-2 { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} +.rounded-bottom-3 { + border-bottom-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-left-radius: var(--bs-border-radius-lg) !important; +} +.rounded-bottom-4 { + border-bottom-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-left-radius: var(--bs-border-radius-xl) !important; +} +.rounded-bottom-5 { + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-bottom-circle { + border-bottom-right-radius: 50% !important; + border-bottom-left-radius: 50% !important; +} +.rounded-bottom-pill { + border-bottom-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-left-radius: var(--bs-border-radius-pill) !important; +} +.rounded-start { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} +.rounded-start-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius: 0 !important; +} +.rounded-start-1 { + border-bottom-left-radius: var(--bs-border-radius-sm) !important; + border-top-left-radius: var(--bs-border-radius-sm) !important; +} +.rounded-start-2 { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} +.rounded-start-3 { + border-bottom-left-radius: var(--bs-border-radius-lg) !important; + border-top-left-radius: var(--bs-border-radius-lg) !important; +} +.rounded-start-4 { + border-bottom-left-radius: var(--bs-border-radius-xl) !important; + border-top-left-radius: var(--bs-border-radius-xl) !important; +} +.rounded-start-5 { + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; + border-top-left-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-start-circle { + border-bottom-left-radius: 50% !important; + border-top-left-radius: 50% !important; +} +.rounded-start-pill { + border-bottom-left-radius: var(--bs-border-radius-pill) !important; + border-top-left-radius: var(--bs-border-radius-pill) !important; +} +.visible { + visibility: visible !important; +} +.invisible { + visibility: hidden !important; +} +.z-n1 { + z-index: -1 !important; +} +.z-0 { + z-index: 0 !important; +} +.z-1 { + z-index: 1 !important; +} +.z-2 { + z-index: 2 !important; +} +.z-3 { + z-index: 3 !important; +} +@media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + .float-sm-end { + float: right !important; + } + .float-sm-none { + float: none !important; + } + .object-fit-sm-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-sm-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-sm-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-sm-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-sm-none { + -o-object-fit: none !important; + object-fit: 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-inline-grid { + display: inline-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; + } + .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: 0.25rem !important; + } + .m-sm-2 { + margin: 0.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: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.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: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.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: 0.25rem !important; + } + .mt-sm-2 { + margin-top: 0.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: 0.25rem !important; + } + .me-sm-2 { + margin-right: 0.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: 0.25rem !important; + } + .mb-sm-2 { + margin-bottom: 0.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: 0.25rem !important; + } + .ms-sm-2 { + margin-left: 0.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: 0.25rem !important; + } + .p-sm-2 { + padding: 0.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: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.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: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.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: 0.25rem !important; + } + .pt-sm-2 { + padding-top: 0.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: 0.25rem !important; + } + .pe-sm-2 { + padding-right: 0.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: 0.25rem !important; + } + .pb-sm-2 { + padding-bottom: 0.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: 0.25rem !important; + } + .ps-sm-2 { + padding-left: 0.5rem !important; + } + .ps-sm-3 { + padding-left: 1rem !important; + } + .ps-sm-4 { + padding-left: 1.5rem !important; + } + .ps-sm-5 { + padding-left: 3rem !important; + } + .gap-sm-0 { + gap: 0 !important; + } + .gap-sm-1 { + gap: 0.25rem !important; + } + .gap-sm-2 { + gap: 0.5rem !important; + } + .gap-sm-3 { + gap: 1rem !important; + } + .gap-sm-4 { + gap: 1.5rem !important; + } + .gap-sm-5 { + gap: 3rem !important; + } + .row-gap-sm-0 { + row-gap: 0 !important; + } + .row-gap-sm-1 { + row-gap: 0.25rem !important; + } + .row-gap-sm-2 { + row-gap: 0.5rem !important; + } + .row-gap-sm-3 { + row-gap: 1rem !important; + } + .row-gap-sm-4 { + row-gap: 1.5rem !important; + } + .row-gap-sm-5 { + row-gap: 3rem !important; + } + .column-gap-sm-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-sm-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-sm-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-sm-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-sm-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-sm-5 { + -moz-column-gap: 3rem !important; + column-gap: 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; + } + .object-fit-md-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-md-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-md-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-md-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-md-none { + -o-object-fit: none !important; + object-fit: 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-inline-grid { + display: inline-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; + } + .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: 0.25rem !important; + } + .m-md-2 { + margin: 0.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: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.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: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.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: 0.25rem !important; + } + .mt-md-2 { + margin-top: 0.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: 0.25rem !important; + } + .me-md-2 { + margin-right: 0.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: 0.25rem !important; + } + .mb-md-2 { + margin-bottom: 0.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: 0.25rem !important; + } + .ms-md-2 { + margin-left: 0.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: 0.25rem !important; + } + .p-md-2 { + padding: 0.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: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.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: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.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: 0.25rem !important; + } + .pt-md-2 { + padding-top: 0.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: 0.25rem !important; + } + .pe-md-2 { + padding-right: 0.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: 0.25rem !important; + } + .pb-md-2 { + padding-bottom: 0.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: 0.25rem !important; + } + .ps-md-2 { + padding-left: 0.5rem !important; + } + .ps-md-3 { + padding-left: 1rem !important; + } + .ps-md-4 { + padding-left: 1.5rem !important; + } + .ps-md-5 { + padding-left: 3rem !important; + } + .gap-md-0 { + gap: 0 !important; + } + .gap-md-1 { + gap: 0.25rem !important; + } + .gap-md-2 { + gap: 0.5rem !important; + } + .gap-md-3 { + gap: 1rem !important; + } + .gap-md-4 { + gap: 1.5rem !important; + } + .gap-md-5 { + gap: 3rem !important; + } + .row-gap-md-0 { + row-gap: 0 !important; + } + .row-gap-md-1 { + row-gap: 0.25rem !important; + } + .row-gap-md-2 { + row-gap: 0.5rem !important; + } + .row-gap-md-3 { + row-gap: 1rem !important; + } + .row-gap-md-4 { + row-gap: 1.5rem !important; + } + .row-gap-md-5 { + row-gap: 3rem !important; + } + .column-gap-md-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-md-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-md-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-md-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-md-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-md-5 { + -moz-column-gap: 3rem !important; + column-gap: 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; + } + .object-fit-lg-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-lg-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-lg-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-lg-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-lg-none { + -o-object-fit: none !important; + object-fit: 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-inline-grid { + display: inline-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; + } + .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: 0.25rem !important; + } + .m-lg-2 { + margin: 0.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: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.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: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.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: 0.25rem !important; + } + .mt-lg-2 { + margin-top: 0.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: 0.25rem !important; + } + .me-lg-2 { + margin-right: 0.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: 0.25rem !important; + } + .mb-lg-2 { + margin-bottom: 0.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: 0.25rem !important; + } + .ms-lg-2 { + margin-left: 0.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: 0.25rem !important; + } + .p-lg-2 { + padding: 0.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: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.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: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.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: 0.25rem !important; + } + .pt-lg-2 { + padding-top: 0.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: 0.25rem !important; + } + .pe-lg-2 { + padding-right: 0.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: 0.25rem !important; + } + .pb-lg-2 { + padding-bottom: 0.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: 0.25rem !important; + } + .ps-lg-2 { + padding-left: 0.5rem !important; + } + .ps-lg-3 { + padding-left: 1rem !important; + } + .ps-lg-4 { + padding-left: 1.5rem !important; + } + .ps-lg-5 { + padding-left: 3rem !important; + } + .gap-lg-0 { + gap: 0 !important; + } + .gap-lg-1 { + gap: 0.25rem !important; + } + .gap-lg-2 { + gap: 0.5rem !important; + } + .gap-lg-3 { + gap: 1rem !important; + } + .gap-lg-4 { + gap: 1.5rem !important; + } + .gap-lg-5 { + gap: 3rem !important; + } + .row-gap-lg-0 { + row-gap: 0 !important; + } + .row-gap-lg-1 { + row-gap: 0.25rem !important; + } + .row-gap-lg-2 { + row-gap: 0.5rem !important; + } + .row-gap-lg-3 { + row-gap: 1rem !important; + } + .row-gap-lg-4 { + row-gap: 1.5rem !important; + } + .row-gap-lg-5 { + row-gap: 3rem !important; + } + .column-gap-lg-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-lg-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-lg-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-lg-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-lg-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-lg-5 { + -moz-column-gap: 3rem !important; + column-gap: 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; + } + .object-fit-xl-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-xl-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-xl-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-xl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-xl-none { + -o-object-fit: none !important; + object-fit: 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-inline-grid { + display: inline-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; + } + .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: 0.25rem !important; + } + .m-xl-2 { + margin: 0.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: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.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: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.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: 0.25rem !important; + } + .mt-xl-2 { + margin-top: 0.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: 0.25rem !important; + } + .me-xl-2 { + margin-right: 0.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: 0.25rem !important; + } + .mb-xl-2 { + margin-bottom: 0.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: 0.25rem !important; + } + .ms-xl-2 { + margin-left: 0.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: 0.25rem !important; + } + .p-xl-2 { + padding: 0.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: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.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: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.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: 0.25rem !important; + } + .pt-xl-2 { + padding-top: 0.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: 0.25rem !important; + } + .pe-xl-2 { + padding-right: 0.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: 0.25rem !important; + } + .pb-xl-2 { + padding-bottom: 0.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: 0.25rem !important; + } + .ps-xl-2 { + padding-left: 0.5rem !important; + } + .ps-xl-3 { + padding-left: 1rem !important; + } + .ps-xl-4 { + padding-left: 1.5rem !important; + } + .ps-xl-5 { + padding-left: 3rem !important; + } + .gap-xl-0 { + gap: 0 !important; + } + .gap-xl-1 { + gap: 0.25rem !important; + } + .gap-xl-2 { + gap: 0.5rem !important; + } + .gap-xl-3 { + gap: 1rem !important; + } + .gap-xl-4 { + gap: 1.5rem !important; + } + .gap-xl-5 { + gap: 3rem !important; + } + .row-gap-xl-0 { + row-gap: 0 !important; + } + .row-gap-xl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xl-3 { + row-gap: 1rem !important; + } + .row-gap-xl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xl-5 { + row-gap: 3rem !important; + } + .column-gap-xl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-xl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-xl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-xl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-xl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-xl-5 { + -moz-column-gap: 3rem !important; + column-gap: 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; + } + .object-fit-xxl-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-xxl-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-xxl-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-xxl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-xxl-none { + -o-object-fit: none !important; + object-fit: 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-inline-grid { + display: inline-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; + } + .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: 0.25rem !important; + } + .m-xxl-2 { + margin: 0.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: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.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: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.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: 0.25rem !important; + } + .mt-xxl-2 { + margin-top: 0.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: 0.25rem !important; + } + .me-xxl-2 { + margin-right: 0.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: 0.25rem !important; + } + .mb-xxl-2 { + margin-bottom: 0.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: 0.25rem !important; + } + .ms-xxl-2 { + margin-left: 0.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: 0.25rem !important; + } + .p-xxl-2 { + padding: 0.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: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.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: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.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: 0.25rem !important; + } + .pt-xxl-2 { + padding-top: 0.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: 0.25rem !important; + } + .pe-xxl-2 { + padding-right: 0.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: 0.25rem !important; + } + .pb-xxl-2 { + padding-bottom: 0.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: 0.25rem !important; + } + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + .ps-xxl-3 { + padding-left: 1rem !important; + } + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + .ps-xxl-5 { + padding-left: 3rem !important; + } + .gap-xxl-0 { + gap: 0 !important; + } + .gap-xxl-1 { + gap: 0.25rem !important; + } + .gap-xxl-2 { + gap: 0.5rem !important; + } + .gap-xxl-3 { + gap: 1rem !important; + } + .gap-xxl-4 { + gap: 1.5rem !important; + } + .gap-xxl-5 { + gap: 3rem !important; + } + .row-gap-xxl-0 { + row-gap: 0 !important; + } + .row-gap-xxl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xxl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xxl-3 { + row-gap: 1rem !important; + } + .row-gap-xxl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xxl-5 { + row-gap: 3rem !important; + } + .column-gap-xxl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-xxl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-xxl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-xxl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-xxl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-xxl-5 { + -moz-column-gap: 3rem !important; + column-gap: 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-inline-grid { + display: inline-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; + } +} diff --git a/src/Infrastructure/Services/Reports/certificate.html b/src/Infrastructure/Services/Reports/certificate.html index 6f04298a..3c623c35 100644 --- a/src/Infrastructure/Services/Reports/certificate.html +++ b/src/Infrastructure/Services/Reports/certificate.html @@ -8,28 +8,17 @@ content="width=device-width, initial-scale=1, shrink-to-fit=no" /> - - - + + +
+

Entrega de Relatório Próxima

+

Olá #PROFESSOR_NAME#,

+

+ Informamos que o #REPORT_TYPE# do seu projeto com o + título "#PROJECT_TITLE#" deverá ser entregue até o dia + #REPORT_DEADLINE#. +

+

+ Acesse a plataforma pelo link abaixo e realize o envio do relatório. +

+ + +
Atenciosamente,
+ + +

+ Este e-mail foi enviado automaticamente. Por favor, não responda. + +
Gerenciador de Projetos de Iniciação Científica, CEFET +
+

+
+ + diff --git a/src/Infrastructure/Services/Email/Templates/ProjectStatusChange.html b/src/Infrastructure/Services/Email/Templates/ProjectStatusChange.html index 036336e6..d261eee1 100644 --- a/src/Infrastructure/Services/Email/Templates/ProjectStatusChange.html +++ b/src/Infrastructure/Services/Email/Templates/ProjectStatusChange.html @@ -52,7 +52,10 @@

Status do Projeto Alterado

Para mais detalhes, você pode acessar o projeto na nossa plataforma.

-

Atenciosamente,
G-PIC

+ +
Atenciosamente,
+ +

Este e-mail foi enviado automaticamente. Por favor, não responda. diff --git a/src/Infrastructure/Services/Email/Templates/RequestStudentRegister.html b/src/Infrastructure/Services/Email/Templates/RequestStudentRegister.html index c5e8fb6a..ec10396a 100644 --- a/src/Infrastructure/Services/Email/Templates/RequestStudentRegister.html +++ b/src/Infrastructure/Services/Email/Templates/RequestStudentRegister.html @@ -71,7 +71,10 @@

Solicitação de Cadastro

-

Atenciosamente,
G-PIC

+ +
Atenciosamente,
+ +

Este e-mail foi enviado automaticamente. Por favor, não responda. diff --git a/src/Infrastructure/Services/Email/Templates/ResetPassword.html b/src/Infrastructure/Services/Email/Templates/ResetPassword.html index d03d6e74..c44c31c4 100644 --- a/src/Infrastructure/Services/Email/Templates/ResetPassword.html +++ b/src/Infrastructure/Services/Email/Templates/ResetPassword.html @@ -61,7 +61,10 @@

Recuperação de Senha

Se você não solicitou a recuperação de senha, por favor ignore este e-mail.

-

Atenciosamente,
G-PIC

+ +
Atenciosamente,
+ +

Este e-mail foi enviado automaticamente. Por favor, não responda. diff --git a/src/Infrastructure/Services/Services.csproj b/src/Infrastructure/Services/Services.csproj index b268ce65..72b34083 100644 --- a/src/Infrastructure/Services/Services.csproj +++ b/src/Infrastructure/Services/Services.csproj @@ -23,6 +23,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/src/Infrastructure/WebFunctions/GenerateCertificate.cs b/src/Infrastructure/WebFunctions/Functions/GenerateCertificateFunction.cs similarity index 62% rename from src/Infrastructure/WebFunctions/GenerateCertificate.cs rename to src/Infrastructure/WebFunctions/Functions/GenerateCertificateFunction.cs index 5e2182aa..038df523 100644 --- a/src/Infrastructure/WebFunctions/GenerateCertificate.cs +++ b/src/Infrastructure/WebFunctions/Functions/GenerateCertificateFunction.cs @@ -3,13 +3,13 @@ using Microsoft.Extensions.Logging; using WebFunctions.Models; -namespace Infrastructure.WebFunctions +namespace Infrastructure.Functions.WebFunctions { - public class GenerateCertificate + public class GenerateCertificateFunction { - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly IGenerateCertificate _generateCertificate; - public GenerateCertificate(ILogger logger, IGenerateCertificate generateCertificate) + public GenerateCertificateFunction(ILogger logger, IGenerateCertificate generateCertificate) { _logger = logger; _generateCertificate = generateCertificate; @@ -28,11 +28,18 @@ public async Task Run([TimerTrigger("0 0 4 * * *")] CustomTimerInfo timer) // Informa início da execução _logger.LogInformation("Geração de certificados iniciada."); - // Realiza a geração dos certificados - var result = await _generateCertificate.ExecuteAsync(); + try + { + // Realiza a geração dos certificados + string result = await _generateCertificate.ExecuteAsync(); - // Informa fim da execução - _logger.LogInformation("Geração de certificados finalizada. Resultado: {Result}", result); + // Informa fim da execução + _logger.LogInformation("Geração de certificados finalizada. Resultado: {Result}", result); + } + catch (Exception ex) + { + _logger.LogError("Erro ao executar geração de certificados.", ex); + } // Informa próxima execução if (timer is not null) diff --git a/src/Infrastructure/WebFunctions/Functions/ReportDeadlineNotificationFunction.cs b/src/Infrastructure/WebFunctions/Functions/ReportDeadlineNotificationFunction.cs new file mode 100644 index 00000000..99c0417f --- /dev/null +++ b/src/Infrastructure/WebFunctions/Functions/ReportDeadlineNotificationFunction.cs @@ -0,0 +1,51 @@ +using Application.Interfaces.UseCases.Notice; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Extensions.Logging; +using WebFunctions.Models; + +namespace Infrastructure.Functions.WebFunctions +{ + public class ReportDeadlineNotificationFunction + { + private readonly ILogger _logger; + private readonly IReportDeadlineNotification _reportDeadlineNotification; + public ReportDeadlineNotificationFunction( + ILogger logger, + IReportDeadlineNotification reportDeadlineNotification) + { + _logger = logger; + _reportDeadlineNotification = reportDeadlineNotification; + } + + ///

+ /// Envia notificação para os professores sobre o prazo para entrega dos relatórios. + /// Execução diária às 05:00 UTC, equivalente à 02:00 BRT. + /// + /// Informações do timer. + [Function("ReportDeadlineNotification")] + public async Task Run([TimerTrigger("0 0 5 * * *")] CustomTimerInfo timer) + { + // Informa início da execução + _logger.LogInformation("Notificação de prazo para entrega de relatório iniciada."); + + try + { + // Realiza a notificação dos professores e prazo para entrega dos relatórios + string result = await _reportDeadlineNotification.ExecuteAsync(); + + // Informa fim da execução + _logger.LogInformation("Notificação de prazo para entrega de relatório finalizada. Resultado: {Result}", result); + } + catch (Exception ex) + { + _logger.LogError("Erro ao executar notificação de prazo para entrega de relatório.", ex); + } + + // Informa próxima execução + if (timer is not null) + { + _logger.LogInformation("Próxima notificação de prazo para entrega de relatório: {NextExecutionTime}", timer.ScheduleStatus?.Next.ToString("dd/MM/yyyy HH:mm:ss")); + } + } + } +} \ No newline at end of file From 0ed1b156c6edd68a3ae2dcbaaacb2ad004eb75f7 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 7 Sep 2023 10:55:12 -0300 Subject: [PATCH 128/201] feat(StorageFileService): add UploadFileAsync by bytes --- src/Infrastructure/IoC/ExternalServicesDI.cs | 3 +- .../Services/StorageFileService.cs | 44 ++++++++++++++++++- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/Infrastructure/IoC/ExternalServicesDI.cs b/src/Infrastructure/IoC/ExternalServicesDI.cs index ff78d185..be0d9cc9 100644 --- a/src/Infrastructure/IoC/ExternalServicesDI.cs +++ b/src/Infrastructure/IoC/ExternalServicesDI.cs @@ -35,7 +35,8 @@ public static IServiceCollection AddExternalServices(this IServiceCollection ser services.AddHttpContextAccessor(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); + // services.AddScoped(); + services.AddScoped(); services.AddScoped(); #endregion Demais Serviços diff --git a/src/Infrastructure/Services/StorageFileService.cs b/src/Infrastructure/Services/StorageFileService.cs index fb239427..b991bc79 100644 --- a/src/Infrastructure/Services/StorageFileService.cs +++ b/src/Infrastructure/Services/StorageFileService.cs @@ -69,9 +69,49 @@ public async Task DeleteFileAsync(string filePath) } } - public Task UploadFileAsync(byte[] file, string? filePath) + public async Task UploadFileAsync(byte[] file, string? filePath) { - throw new NotImplementedException(); + // Verifica se caminho do arquivo é vazio + // FilePath representa aqui o caminho completo do arquivo ou o nome do arquivo + // Por exemplo: C:\Users\user\Documents\file.pdf ou file.pdf + if (string.IsNullOrEmpty(filePath)) + { + throw new Exception("O caminho do arquivo não pode ser vazio."); + } + + // Verifica se a extensão do arquivo é permitida + string extension = Path.GetExtension(filePath); + if (!_allowedExtensions.Contains(extension)) + { + throw new Exception($"A extensão {extension} do arquivo não é permitida."); + } + + // Verifica o tamanho do arquivo + if (file.Length > _maxFileSizeInBytes) + { + throw new Exception($"O tamanho do arquivo excede o máximo de {_maxFileSizeInBytes} bytes."); + } + + // Gera um nome único para o arquivo + string fileName = $"{Guid.NewGuid()}{Path.GetExtension(filePath)}"; + + // Cria o diretório caso não exista + string dirPath = Path.Combine(_directory, _folder); + if (!Directory.Exists(dirPath)) + { + _ = Directory.CreateDirectory(dirPath); + } + + // Gera o caminho do arquivo + filePath = Path.Combine(dirPath, fileName); + + // Salva o arquivo + using (FileStream stream = new(filePath, FileMode.Create)) + { + await stream.WriteAsync(file); + } + + return filePath; } #endregion Public Methods From f391532cc089702996f41bb0cee1dcb6397e8e58 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 7 Sep 2023 10:55:30 -0300 Subject: [PATCH 129/201] fix: adjust Notice seeder --- src/Infrastructure/Persistence/README.md | 2 +- src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs | 9 +++++---- src/Infrastructure/Persistence/Seeds/Seeder.cs | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Infrastructure/Persistence/README.md b/src/Infrastructure/Persistence/README.md index 19327daa..f4461473 100644 --- a/src/Infrastructure/Persistence/README.md +++ b/src/Infrastructure/Persistence/README.md @@ -28,7 +28,7 @@ Criando as Migrations para criação e atualização das tabelas do banco de dad ```bash cd src/Infrastructure/WebAPI -dotnet ef migrations add UpdateNoticeDescription --project ../Persistence/Persistence.csproj +dotnet ef migrations add Initialize --project ../Persistence/Persistence.csproj ``` Executando as Migrations: diff --git a/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs b/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs index a619597a..a1b88546 100644 --- a/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs +++ b/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs @@ -61,13 +61,13 @@ private static Guid AddDefaultNotice(MigrationBuilder builder) "AppealStartDate", "AppealEndDate", "SendingDocsStartDate", "SendingDocsEndDate", "PartialReportDeadline", "FinalReportDeadline", - "SuspensionYears", "DocUrl", "CreatedAt" + "SuspensionYears", "DocUrl", "CreatedAt", "Description" }, values: new object[,] { { - newNoticeId, - null!, + newNoticeId, // Id + null!, // Deleted At new DateTime(1990, 8, 1).ToUniversalTime(), // Registration Start Date new DateTime(1990, 8, 31).ToUniversalTime(), // Registration End Date new DateTime(1990, 9, 15).ToUniversalTime(), // Evaluation Start Date @@ -80,7 +80,8 @@ private static Guid AddDefaultNotice(MigrationBuilder builder) new DateTime(1991, 3, 15).ToUniversalTime(), // Final Report Deadline 1, // Suspension Years null!, // Doc URL - DateTime.UtcNow + DateTime.UtcNow, // Created At + "Edital de Inicialização", // Description }, }, schema: "public"); diff --git a/src/Infrastructure/Persistence/Seeds/Seeder.cs b/src/Infrastructure/Persistence/Seeds/Seeder.cs index 1092017b..f99f80ba 100644 --- a/src/Infrastructure/Persistence/Seeds/Seeder.cs +++ b/src/Infrastructure/Persistence/Seeds/Seeder.cs @@ -4,7 +4,7 @@ namespace Persistence.Seeds { static public class Seeder { - public static void Seed(MigrationBuilder migrationBuilder) + public static void Execute(MigrationBuilder migrationBuilder) { ActivitiesSeeder.Seed(migrationBuilder); AreasSeeder.Seed(migrationBuilder); From cf01f294e5fbad09f98b583f303dc944ee19227b Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 7 Sep 2023 10:56:04 -0300 Subject: [PATCH 130/201] chore: adjust appsettings fo development --- .gitignore | 7 ++++--- src/Infrastructure/WebAPI/appsettings.json | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index b83bebb0..e56f82c7 100644 --- a/.gitignore +++ b/.gitignore @@ -412,7 +412,8 @@ storage/* temp temp/* -RemoteFiles -RemoteFiles/* +files +files/* + **/.env -thunder-tests \ No newline at end of file +thunder-tests diff --git a/src/Infrastructure/WebAPI/appsettings.json b/src/Infrastructure/WebAPI/appsettings.json index 1bd83f1a..8e523860 100644 --- a/src/Infrastructure/WebAPI/appsettings.json +++ b/src/Infrastructure/WebAPI/appsettings.json @@ -31,6 +31,8 @@ "GeneralRules": [] }, "StorageFile": { + "Directory": "/Users/eduardo/Projects/CEFET/CopetSystem/CopetSystem.API/files", + "Folder": "blobs", "AllowedExtensions": [".txt", ".pdf", ".doc", ".docx", ".png", ".jpg"], "MaxFileSizeInBytes": 10485760 }, From 4f453742827ea61ee8061c6358ed062207d497f4 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 7 Sep 2023 11:06:09 -0300 Subject: [PATCH 131/201] fix: adjust GetProjectsToEvaluate endpoint returns --- .../UseCases/Project/GetProjectsToEvaluate.cs | 2 +- .../ProjectEvaluationController.cs | 22 +++++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/Application/UseCases/Project/GetProjectsToEvaluate.cs b/src/Application/UseCases/Project/GetProjectsToEvaluate.cs index 526210fb..e4401ad9 100644 --- a/src/Application/UseCases/Project/GetProjectsToEvaluate.cs +++ b/src/Application/UseCases/Project/GetProjectsToEvaluate.cs @@ -28,7 +28,7 @@ public async Task> ExecuteAsync(int skip, int t var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Verifica se o usuário logado é um professor ou administrador - UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN || user.Role != ERole.PROFESSOR, + UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN && user.Role != ERole.PROFESSOR, "Usuário sem permissão para avaliar projetos."); // Obtém todos os projetos que estão na fase de avaliação (Submitted, Evaluation, DocumentAnalysis) diff --git a/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs b/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs index 57b9a323..110a8e3e 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProjectEvaluationController.cs @@ -64,15 +64,23 @@ public ProjectEvaluationController(IEvaluateAppealProject evaluateAppealProject, [Authorize(Roles = "ADMIN, PROFESSOR")] public async Task>> GetProjectsToEvaluate(int skip = 0, int take = 50) { - var projects = await _getProjectsToEvaluate.ExecuteAsync(skip, take); - if (projects == null || !projects.Any()) + try { - const string errorMessage = "Nenhum projeto para avaliação encontrado."; - _logger.LogWarning(errorMessage); - return NotFound(errorMessage); + var projects = await _getProjectsToEvaluate.ExecuteAsync(skip, take); + if (projects == null || !projects.Any()) + { + const string errorMessage = "Nenhum projeto para avaliação encontrado."; + _logger.LogWarning(errorMessage); + return NotFound(errorMessage); + } + _logger.LogInformation("Projetos para avaliação encontrados: {quantidade}", projects.Count); + return Ok(projects); + } + catch (Exception ex) + { + _logger.LogError("Ocorreu um erro ao buscar projetos para avaliação: {ErrorMessage}", ex.Message); + return BadRequest(ex.Message); } - _logger.LogInformation("Projetos para avaliação encontrados: {quantidade}", projects.Count); - return Ok(projects); } /// From ac207c4b34b11ae53b5f3bc226bb3ca16a0858ee Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 7 Sep 2023 11:17:59 -0300 Subject: [PATCH 132/201] fix: adjust oderby to avoid get errors --- .../Persistence/Repositories/ActivityRepository.cs | 2 +- .../Persistence/Repositories/AreaRepository.cs | 2 +- .../Persistence/Repositories/AssistanceTypeRepository.cs | 2 +- .../Persistence/Repositories/CampusRepository.cs | 2 +- .../Persistence/Repositories/CourseRepository.cs | 2 +- .../Persistence/Repositories/MainAreaRepository.cs | 2 +- .../Persistence/Repositories/NoticeRepository.cs | 2 +- .../Persistence/Repositories/ProgramTypeRepository.cs | 2 +- .../Repositories/ProjectFinalReportRepository.cs | 2 +- .../Repositories/ProjectPartialReportRepository.cs | 2 +- .../Persistence/Repositories/StudentDocumentsRepository.cs | 1 + .../Persistence/Repositories/StudentRepository.cs | 4 ++-- .../Persistence/Repositories/SubAreaRepository.cs | 6 +++--- .../Persistence/Repositories/UserRepository.cs | 4 ++-- 14 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs b/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs index e1095dd2..f03fbde3 100644 --- a/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ActivityRepository.cs @@ -23,10 +23,10 @@ public async Task CreateAsync(Activity model) public async Task> GetAllAsync(int skip, int take) { return await _context.Activities + .OrderBy(x => x.Name) .Skip(skip) .Take(take) .AsAsyncEnumerable() - .OrderBy(x => x.Name) .ToListAsync(); } diff --git a/src/Infrastructure/Persistence/Repositories/AreaRepository.cs b/src/Infrastructure/Persistence/Repositories/AreaRepository.cs index b781a077..379e7ef1 100644 --- a/src/Infrastructure/Persistence/Repositories/AreaRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/AreaRepository.cs @@ -35,11 +35,11 @@ public async Task> GetAreasByMainAreaAsync(Guid? mainAreaId, i { return await _context.Areas .Where(x => x.MainAreaId == mainAreaId) + .OrderBy(x => x.Name) .Skip(skip) .Take(take) .Include(x => x.MainArea) .AsAsyncEnumerable() - .OrderBy(x => x.Name) .ToListAsync(); } diff --git a/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs b/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs index 0828f4e4..456280a7 100644 --- a/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/AssistanceTypeRepository.cs @@ -26,10 +26,10 @@ public async Task CreateAsync(AssistanceType model) public async Task> GetAllAsync(int skip, int take) { return await _context.AssistanceTypes + .OrderBy(x => x.Name) .Skip(skip) .Take(take) .AsAsyncEnumerable() - .OrderBy(x => x.Name) .ToListAsync(); } diff --git a/src/Infrastructure/Persistence/Repositories/CampusRepository.cs b/src/Infrastructure/Persistence/Repositories/CampusRepository.cs index 4f369238..7299bc80 100644 --- a/src/Infrastructure/Persistence/Repositories/CampusRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/CampusRepository.cs @@ -27,10 +27,10 @@ public async Task CreateAsync(Campus model) public async Task> GetAllAsync(int skip, int take) { return await _context.Campuses + .OrderBy(x => x.Name) .Skip(skip) .Take(take) .AsAsyncEnumerable() - .OrderBy(x => x.Name) .ToListAsync(); } diff --git a/src/Infrastructure/Persistence/Repositories/CourseRepository.cs b/src/Infrastructure/Persistence/Repositories/CourseRepository.cs index 10912efa..5d4243f2 100644 --- a/src/Infrastructure/Persistence/Repositories/CourseRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/CourseRepository.cs @@ -27,10 +27,10 @@ public async Task CreateAsync(Course model) public async Task> GetAllAsync(int skip, int take) { return await _context.Courses + .OrderBy(x => x.Name) .Skip(skip) .Take(take) .AsAsyncEnumerable() - .OrderBy(x => x.Name) .ToListAsync(); } diff --git a/src/Infrastructure/Persistence/Repositories/MainAreaRepository.cs b/src/Infrastructure/Persistence/Repositories/MainAreaRepository.cs index 924d7829..22318d56 100644 --- a/src/Infrastructure/Persistence/Repositories/MainAreaRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/MainAreaRepository.cs @@ -35,10 +35,10 @@ public async Task CreateAsync(MainArea model) public async Task> GetAllAsync(int skip, int take) { return await _context.MainAreas + .OrderBy(x => x.Name) .Skip(skip) .Take(take) .AsAsyncEnumerable() - .OrderBy(x => x.Name) .ToListAsync(); } diff --git a/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs b/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs index 8d7cfacb..5c8508ee 100644 --- a/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/NoticeRepository.cs @@ -27,10 +27,10 @@ public async Task CreateAsync(Notice model) public async Task> GetAllAsync(int skip, int take) { return await _context.Notices + .OrderByDescending(x => x.RegistrationStartDate) .Skip(skip) .Take(take) .AsAsyncEnumerable() - .OrderByDescending(x => x.RegistrationStartDate) .ToListAsync(); } diff --git a/src/Infrastructure/Persistence/Repositories/ProgramTypeRepository.cs b/src/Infrastructure/Persistence/Repositories/ProgramTypeRepository.cs index f0fc6a6f..ec0b781a 100644 --- a/src/Infrastructure/Persistence/Repositories/ProgramTypeRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProgramTypeRepository.cs @@ -27,10 +27,10 @@ public async Task CreateAsync(ProgramType model) public async Task> GetAllAsync(int skip, int take) { return await _context.ProgramTypes + .OrderBy(x => x.Name) .Skip(skip) .Take(take) .AsAsyncEnumerable() - .OrderBy(x => x.Name) .ToListAsync(); } diff --git a/src/Infrastructure/Persistence/Repositories/ProjectFinalReportRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectFinalReportRepository.cs index 2d6787af..74bfc5de 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectFinalReportRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectFinalReportRepository.cs @@ -32,10 +32,10 @@ public async Task DeleteAsync(Guid? id) public async Task> GetAllAsync(int skip, int take) { return await _context.ProjectFinalReports + .OrderByDescending(x => x.SendDate) .Skip(skip) .Take(take) .AsAsyncEnumerable() - .OrderBy(x => x.Id) .ToListAsync(); } diff --git a/src/Infrastructure/Persistence/Repositories/ProjectPartialReportRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectPartialReportRepository.cs index f6627537..ee0b30e7 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectPartialReportRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectPartialReportRepository.cs @@ -32,10 +32,10 @@ public async Task DeleteAsync(Guid? id) public async Task> GetAllAsync(int skip, int take) { return await _context.ProjectPartialReports + .OrderBy(x => x.ProjectId) .Skip(skip) .Take(take) .AsAsyncEnumerable() - .OrderBy(x => x.Id) .ToListAsync(); } diff --git a/src/Infrastructure/Persistence/Repositories/StudentDocumentsRepository.cs b/src/Infrastructure/Persistence/Repositories/StudentDocumentsRepository.cs index 81c9b771..0abf2259 100644 --- a/src/Infrastructure/Persistence/Repositories/StudentDocumentsRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/StudentDocumentsRepository.cs @@ -33,6 +33,7 @@ public async Task> GetAllAsync(int skip, int take) { return await _context.StudentDocuments .Include(x => x.Project) + .OrderBy(x => x.ProjectId) .IgnoreQueryFilters() .AsAsyncEnumerable() .Skip(skip) diff --git a/src/Infrastructure/Persistence/Repositories/StudentRepository.cs b/src/Infrastructure/Persistence/Repositories/StudentRepository.cs index b6513c6b..b5718990 100644 --- a/src/Infrastructure/Persistence/Repositories/StudentRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/StudentRepository.cs @@ -27,10 +27,10 @@ public async Task> GetAllAsync(int skip, int take) { return await _context.Students .Include(x => x.User) - .Skip(skip) - .Take(take) .AsAsyncEnumerable() .OrderBy(x => x.User?.Name) + .Skip(skip) + .Take(take) .ToListAsync(); } diff --git a/src/Infrastructure/Persistence/Repositories/SubAreaRepository.cs b/src/Infrastructure/Persistence/Repositories/SubAreaRepository.cs index e656c15a..a850b2a1 100644 --- a/src/Infrastructure/Persistence/Repositories/SubAreaRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/SubAreaRepository.cs @@ -37,12 +37,12 @@ public async Task> GetSubAreasByAreaAsync(Guid? areaId, int { return await _context.SubAreas .Where(x => x.AreaId == areaId) - .Skip(skip) - .Take(take) .Include(x => x.Area) .Include(x => x.Area != null ? x.Area.MainArea : null) - .AsAsyncEnumerable() .OrderBy(x => x.Name) + .AsAsyncEnumerable() + .Skip(skip) + .Take(take) .ToListAsync(); } diff --git a/src/Infrastructure/Persistence/Repositories/UserRepository.cs b/src/Infrastructure/Persistence/Repositories/UserRepository.cs index 11059084..e1b1a4dc 100644 --- a/src/Infrastructure/Persistence/Repositories/UserRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/UserRepository.cs @@ -25,9 +25,9 @@ public UserRepository(ApplicationDbContext context) public async Task> GetActiveUsersAsync(int skip, int take) { return await _context.Users + .OrderBy(x => x.Name) .Skip(skip) .Take(take) - .OrderBy(x => x.Name) .ToListAsync(); } @@ -37,9 +37,9 @@ public async Task> GetInactiveUsersAsync(int skip, int take) .IgnoreQueryFilters() .AsAsyncEnumerable() .Where(x => x.DeletedAt != null) + .OrderBy(x => x.Name) .Skip(skip) .Take(take) - .OrderBy(x => x.Name) .ToListAsync(); } From 4b9be7c620fbcd59ddcb6c5906e1cde8c4e6c2b1 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 7 Sep 2023 12:24:59 -0300 Subject: [PATCH 133/201] feat: add manual rate limit --- src/Infrastructure/WebAPI/appsettings.json | 23 +++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/Infrastructure/WebAPI/appsettings.json b/src/Infrastructure/WebAPI/appsettings.json index 8e523860..eca30395 100644 --- a/src/Infrastructure/WebAPI/appsettings.json +++ b/src/Infrastructure/WebAPI/appsettings.json @@ -28,7 +28,28 @@ "RealIPHeader": "X-Real-IP", "ClientIdHeader": "X-ClientId", "HttpStatusCode": 429, - "GeneralRules": [] + "GeneralRules": [ + { + "Endpoint": "*", + "Period": "10s", + "Limit": 10 + }, + { + "Endpoint": "*:/api/auth/*", + "Period": "1s", + "Limit": 1 + }, + { + "Endpoint": "(post):/api/professor", + "Period": "1s", + "Limit": 1 + }, + { + "Endpoint": "(post):/api/student", + "Period": "1s", + "Limit": 1 + } + ] }, "StorageFile": { "Directory": "/Users/eduardo/Projects/CEFET/CopetSystem/CopetSystem.API/files", From 6199e9ef676a1fddd419d2e32b4b2ed969149b54 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 7 Sep 2023 12:27:28 -0300 Subject: [PATCH 134/201] refactor: modify projects to add docker support --- .dockerignore | 25 ------------- .../workflows/azure-functions-app-dotnet.yml | 2 +- .../workflows/azure-webapps-dotnet-core.yml | 2 +- README.md | 23 ++---------- src/CopetSystem.API.sln | 6 ---- src/Docker/Postgres/docker-compose.yml | 35 +++++++++++++++++++ .../docker-compose.yml} | 6 ++++ .../{ => WebAPI}/docker-compose.override.yml | 33 +++++++---------- src/Docker/{ => WebAPI}/docker-compose.yml | 2 +- src/Docker/WebAPI/init-seq.sh | 10 ++++++ src/Docker/WebAPI/sample.env | 20 +++++++++++ src/Docker/docker-compose.dcproj | 18 ---------- src/Dockerfile | 27 -------------- src/Infrastructure/IoC/PersistenceDI.cs | 16 +++++++++ src/Infrastructure/IoC/Utils/DotEnvSecrets.cs | 14 +++++++- src/Infrastructure/WebAPI/Dockerfile | 7 ++-- src/Infrastructure/WebAPI/Startup.cs | 2 +- 17 files changed, 122 insertions(+), 126 deletions(-) delete mode 100644 .dockerignore create mode 100644 src/Docker/Postgres/docker-compose.yml rename src/Docker/{seq.docker-compose.yml => Seq/docker-compose.yml} (68%) rename src/Docker/{ => WebAPI}/docker-compose.override.yml (61%) rename src/Docker/{ => WebAPI}/docker-compose.yml (85%) create mode 100755 src/Docker/WebAPI/init-seq.sh create mode 100644 src/Docker/WebAPI/sample.env delete mode 100644 src/Docker/docker-compose.dcproj delete mode 100644 src/Dockerfile diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 3729ff0c..00000000 --- a/.dockerignore +++ /dev/null @@ -1,25 +0,0 @@ -**/.classpath -**/.dockerignore -**/.env -**/.git -**/.gitignore -**/.project -**/.settings -**/.toolstarget -**/.vs -**/.vscode -**/*.*proj.user -**/*.dbmdl -**/*.jfm -**/azds.yaml -**/bin -**/charts -**/docker-compose* -**/Dockerfile* -**/node_modules -**/npm-debug.log -**/obj -**/secrets.dev.yaml -**/values.dev.yaml -LICENSE -README.md \ No newline at end of file diff --git a/.github/workflows/azure-functions-app-dotnet.yml b/.github/workflows/azure-functions-app-dotnet.yml index 1c1fcd1b..3d530fe9 100644 --- a/.github/workflows/azure-functions-app-dotnet.yml +++ b/.github/workflows/azure-functions-app-dotnet.yml @@ -33,7 +33,7 @@ # run: | # echo "AZURE_BLOB_STORAGE_CONNECTION_STRING=${{ secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING }} # AZURE_BLOB_STORAGE_CONTAINER_NAME=${{ secrets.AZURE_BLOB_STORAGE_CONTAINER_NAME }} -# AZURE_POSTGRES_CONNECTION_STRING=${{ secrets.AZURE_POSTGRES_CONNECTION_STRING }} +# POSTGRES_CONNECTION_STRING=${{ secrets.POSTGRES_CONNECTION_STRING }} # JWT_AUDIENCE=${{ secrets.JWT_AUDIENCE }} # JWT_EXPIRE_IN=${{ secrets.JWT_EXPIRE_IN }} # JWT_ISSUER=${{ secrets.JWT_ISSUER }} diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index e6a84c9e..ff6dd862 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -41,7 +41,7 @@ jobs: run: | echo "AZURE_BLOB_STORAGE_CONNECTION_STRING=${{ secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING }} AZURE_BLOB_STORAGE_CONTAINER_NAME=${{ secrets.AZURE_BLOB_STORAGE_CONTAINER_NAME }} - AZURE_POSTGRES_CONNECTION_STRING=${{ secrets.AZURE_POSTGRES_CONNECTION_STRING }} + POSTGRES_CONNECTION_STRING=${{ secrets.POSTGRES_CONNECTION_STRING }} JWT_AUDIENCE=${{ secrets.JWT_AUDIENCE }} JWT_EXPIRE_IN=${{ secrets.JWT_EXPIRE_IN }} JWT_ISSUER=${{ secrets.JWT_ISSUER }} diff --git a/README.md b/README.md index d09a04b7..0627cd68 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,3 @@ -# Infrastructure.WebAPI +# GPIC WebAPI / WebFunctions -Restful API created in .NET 7.0.0 to support SPA. - -## Execução com Dotnet - -Comandos para execução do projeto .NET utilizando CLI: - -```bash -cd Infrastructure.WebAPI -dotnet build -dotnet run -``` - -## Execucação com Docker - -Comandos para execução do projeto .NET utilizando Docker: - -```bash -docker build . -t copet-system-api:dev -docker run --name copet-system-api -p 8080:80 -d copet-system-api:dev -``` +Restful API created in .NET 7 to centralize the business rules of the GPIC system (Gerenciador de Projetos de Iniciação Científica). diff --git a/src/CopetSystem.API.sln b/src/CopetSystem.API.sln index f18f223e..f076afcb 100644 --- a/src/CopetSystem.API.sln +++ b/src/CopetSystem.API.sln @@ -13,8 +13,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IoC", "Infrastructure\IoC\I EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAPI", "Infrastructure\WebAPI\WebAPI.csproj", "{163219BE-A0D2-41A1-A028-501AAB069BD9}" EndProject -Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "Docker\docker-compose.dcproj", "{58DF51E2-67F0-4740-B20B-8DE70C99FE2B}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Services", "Infrastructure\Services\Services.csproj", "{7555C53A-BADC-49D9-82BE-C4D8587260EB}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Application", "Application\Application.csproj", "{10D17198-CD98-48BF-BEF3-A689B668F5E3}" @@ -47,10 +45,6 @@ Global {163219BE-A0D2-41A1-A028-501AAB069BD9}.Debug|Any CPU.Build.0 = Debug|Any CPU {163219BE-A0D2-41A1-A028-501AAB069BD9}.Release|Any CPU.ActiveCfg = Release|Any CPU {163219BE-A0D2-41A1-A028-501AAB069BD9}.Release|Any CPU.Build.0 = Release|Any CPU - {58DF51E2-67F0-4740-B20B-8DE70C99FE2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {58DF51E2-67F0-4740-B20B-8DE70C99FE2B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {58DF51E2-67F0-4740-B20B-8DE70C99FE2B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {58DF51E2-67F0-4740-B20B-8DE70C99FE2B}.Release|Any CPU.Build.0 = Release|Any CPU {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Debug|Any CPU.Build.0 = Debug|Any CPU {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/src/Docker/Postgres/docker-compose.yml b/src/Docker/Postgres/docker-compose.yml new file mode 100644 index 00000000..c324a677 --- /dev/null +++ b/src/Docker/Postgres/docker-compose.yml @@ -0,0 +1,35 @@ +version: '3.4' + +services: + # PostgreSQL Database + postgres: + image: postgres:latest + container_name: postgres + environment: + POSTGRES_PASSWORD: Copet@123 + POSTGRES_USER: copet-admin + POSTGRES_DB: COPET_DB + ports: + - 15432:5432 + volumes: + - ./volumes/postgresql:/var/lib/postgresql/data + networks: + - gpic-network + + # PostgreAdmin UI + pgadmin: + image: dpage/pgadmin4:latest + container_name: pgadmin + environment: + PGADMIN_DEFAULT_EMAIL: eduardo-paes@outlook.com + PGADMIN_DEFAULT_PASSWORD: CopetSystem!2022 + ports: + - 16543:80 + depends_on: + - postgres + networks: + - gpic-network + +networks: + gpic-network: + driver: bridge diff --git a/src/Docker/seq.docker-compose.yml b/src/Docker/Seq/docker-compose.yml similarity index 68% rename from src/Docker/seq.docker-compose.yml rename to src/Docker/Seq/docker-compose.yml index fe1614e9..c39c8008 100644 --- a/src/Docker/seq.docker-compose.yml +++ b/src/Docker/Seq/docker-compose.yml @@ -8,3 +8,9 @@ services: environment: - ACCEPT_EULA=Y - SEQ_LICENSE_KEY= + networks: + - gpic-network + +networks: + gpic-network: + driver: bridge \ No newline at end of file diff --git a/src/Docker/docker-compose.override.yml b/src/Docker/WebAPI/docker-compose.override.yml similarity index 61% rename from src/Docker/docker-compose.override.yml rename to src/Docker/WebAPI/docker-compose.override.yml index 8d0d72f4..5085227e 100644 --- a/src/Docker/docker-compose.override.yml +++ b/src/Docker/WebAPI/docker-compose.override.yml @@ -1,10 +1,11 @@ version: '3.4' services: + # PostgreSQL Database postgres: + container_name: postgres_gpic image: postgres:latest - container_name: postgres environment: POSTGRES_PASSWORD: Copet@123 POSTGRES_USER: copet-admin @@ -14,39 +15,29 @@ services: volumes: - ./volumes/postgresql:/var/lib/postgresql/data networks: - - postgres-network - - # PostgreAdmin UI - pgadmin: - image: dpage/pgadmin4:latest - container_name: pgadmin - environment: - PGADMIN_DEFAULT_EMAIL: eduardo-paes@outlook.com - PGADMIN_DEFAULT_PASSWORD: CopetSystem!2022 - ports: - - 16543:80 - depends_on: - - postgres - networks: - - postgres-network + - gpic-network + # Seq - Servidor de Logs seq: + container_name: seq_gpic image: datalust/seq:latest ports: - "5341:80" environment: - ACCEPT_EULA=Y - - SEQ_LICENSE_KEY= + - SEQ_API_KEY=vxM2YLukOTgnraaYczDh networks: - - postgres-network + - gpic-network # Web API webapi: + container_name: webapi_gpic environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=https://+:443;http://+:80 ports: - - 5555:443 + - 5051:443 + - 5050:80 volumes: - ~/.aspnet/https:/root/.aspnet/https:ro - ~/.microsoft/usersecrets:/root/.microsoft/usersecrets:ro @@ -54,8 +45,8 @@ services: - postgres - seq networks: - - postgres-network + - gpic-network networks: - postgres-network: + gpic-network: driver: bridge diff --git a/src/Docker/docker-compose.yml b/src/Docker/WebAPI/docker-compose.yml similarity index 85% rename from src/Docker/docker-compose.yml rename to src/Docker/WebAPI/docker-compose.yml index 62c656d2..8bd8fdef 100644 --- a/src/Docker/docker-compose.yml +++ b/src/Docker/WebAPI/docker-compose.yml @@ -4,5 +4,5 @@ services: webapi: image: ${DOCKER_REGISTRY-}webapi build: - context: ../ + context: ../../ dockerfile: Infrastructure/WebAPI/Dockerfile diff --git a/src/Docker/WebAPI/init-seq.sh b/src/Docker/WebAPI/init-seq.sh new file mode 100755 index 00000000..c5d2e543 --- /dev/null +++ b/src/Docker/WebAPI/init-seq.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Gere uma API Key aleatória +api_key=$(openssl rand -hex 32) + +# Defina a API Key como uma variável de ambiente +export SEQ_API_KEY=$api_key + +# Inicie o Seq Logger +exec "$@" diff --git a/src/Docker/WebAPI/sample.env b/src/Docker/WebAPI/sample.env new file mode 100644 index 00000000..2bb33cfa --- /dev/null +++ b/src/Docker/WebAPI/sample.env @@ -0,0 +1,20 @@ +# Email Service +SMTP_EMAIL_USERNAME=EMAIL +SMTP_EMAIL_PASSWORD=SENHA + +# JWT Secrets +JWT_SECRET_KEY=8y/B?E(G+KbPeShVmYq3t6w9z$C&F)J@McQfTjWnZr4u7x!A%D*G-KaPdRgUkXp2 +JWT_EXPIRE_IN=60 +JWT_ISSUER=gpic-webapi +JWT_AUDIENCE=webapi.gpic.server + +# SEQ Logger Service +SEQ_API_KEY=vxM2YLukOTgnraaYczDh +SEQ_URL=http://seq_gpic:5341 + +# Connection String do banco de dados +POSTGRES_CONNECTION_STRING="Server=postgres_gpic;Database=COPET_DB;Port=5432;User Id=copet-admin;Password=Copet@123;" + +# Executa a migração do banco de dados +# deixe como True apenas na inicilização +EXECUTE_MIGRATION=False \ No newline at end of file diff --git a/src/Docker/docker-compose.dcproj b/src/Docker/docker-compose.dcproj deleted file mode 100644 index 61415981..00000000 --- a/src/Docker/docker-compose.dcproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - 2.1 - Linux - {58DF51E2-67F0-4740-B20B-8DE70C99FE2B} - True - {Scheme}://localhost:{ServicePort}/swagger - webapi - - - - docker-compose.yml - - - - - diff --git a/src/Dockerfile b/src/Dockerfile deleted file mode 100644 index 38ddcc8d..00000000 --- a/src/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. - -FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base -WORKDIR /app -EXPOSE 80 -EXPOSE 443 - -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build -WORKDIR /src -COPY ["Domain/Domain.csproj", "Domain/"] -COPY ["Adapters/Adapters.csproj", "Adapters/"] -COPY ["Infrastructure/Services/Services.csproj", "Infrastructure/Services/"] -COPY ["Infrastructure/Persistence/Persistence.csproj", "Infrastructure/Persistence/"] -COPY ["Infrastructure/IoC/IoC.csproj", "Infrastructure/IoC/"] -COPY ["Infrastructure/WebAPI/WebAPI.csproj", "Infrastructure/WebAPI/"] -RUN dotnet restore "Infrastructure/WebAPI/WebAPI.csproj" -COPY . . -WORKDIR "/src/Infrastructure/WebAPI" -RUN dotnet build "WebAPI.csproj" -c Release -o /app/build - -FROM build AS publish -RUN dotnet publish "WebAPI.csproj" -c Release -o /app/publish /p:UseAppHost=false - -FROM base AS final -WORKDIR /app -COPY --from=publish /app/publish . -ENTRYPOINT ["dotnet", "WebAPI.dll"] diff --git a/src/Infrastructure/IoC/PersistenceDI.cs b/src/Infrastructure/IoC/PersistenceDI.cs index ac16e999..e3a4f05a 100644 --- a/src/Infrastructure/IoC/PersistenceDI.cs +++ b/src/Infrastructure/IoC/PersistenceDI.cs @@ -20,6 +20,22 @@ public static IServiceCollection AddPersistence(this IServiceCollection services b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName))); #endregion Inicialização do banco de dados + #region Migração do banco de dados + if (dotEnvSecrets.ExecuteMigration()) + { + try + { + var dbContext = services.BuildServiceProvider().GetService(); + dbContext?.Database.Migrate(); + Console.WriteLine("Migração realizada com sucesso."); + } + catch (Exception ex) + { + Console.WriteLine($"Ocorreu um erro durante a migração do banco de dados. {ex}"); + } + } + #endregion Migração do banco de dados + #region Repositórios services.AddScoped(); services.AddScoped(); diff --git a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs index b7ec9d69..9244906e 100644 --- a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs +++ b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs @@ -35,7 +35,7 @@ public string GetBlobStorageContainerName() public string GetDatabaseConnectionString() { - return DotNetEnv.Env.GetString("AZURE_POSTGRES_CONNECTION_STRING"); + return DotNetEnv.Env.GetString("POSTGRES_CONNECTION_STRING"); } public string GetSmtpUserName() @@ -67,5 +67,17 @@ public string GetJwtExpirationTime() { return DotNetEnv.Env.GetString("JWT_EXPIRE_IN"); } + + public bool ExecuteMigration() + { + try + { + return DotNetEnv.Env.GetBool("EXECUTE_MIGRATION"); + } + catch + { + return false; + } + } } } \ No newline at end of file diff --git a/src/Infrastructure/WebAPI/Dockerfile b/src/Infrastructure/WebAPI/Dockerfile index 30d51704..e023e320 100644 --- a/src/Infrastructure/WebAPI/Dockerfile +++ b/src/Infrastructure/WebAPI/Dockerfile @@ -7,11 +7,12 @@ EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build WORKDIR /src -COPY ["Infrastructure/WebAPI/WebAPI.csproj", "Infrastructure/WebAPI/"] -COPY ["Infrastructure/IoC/IoC.csproj", "Infrastructure/IoC/"] -COPY ["Adapters/Adapters.csproj", "Adapters/"] COPY ["Domain/Domain.csproj", "Domain/"] +COPY ["Application/Application.csproj", "Application/"] +COPY ["Infrastructure/Services/Services.csproj", "Infrastructure/Services/"] COPY ["Infrastructure/Persistence/Persistence.csproj", "Infrastructure/Persistence/"] +COPY ["Infrastructure/IoC/IoC.csproj", "Infrastructure/IoC/"] +COPY ["Infrastructure/WebAPI/WebAPI.csproj", "Infrastructure/WebAPI/"] RUN dotnet restore "Infrastructure/WebAPI/WebAPI.csproj" COPY . . WORKDIR "/src/Infrastructure/WebAPI" diff --git a/src/Infrastructure/WebAPI/Startup.cs b/src/Infrastructure/WebAPI/Startup.cs index be6fb731..8900a94e 100644 --- a/src/Infrastructure/WebAPI/Startup.cs +++ b/src/Infrastructure/WebAPI/Startup.cs @@ -53,7 +53,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseSwaggerUI(); // Show development mode message - Console.WriteLine("Development mode"); + Console.WriteLine("Swagger is up."); } // UseExceptionHandler for non-development environments From ee31f6c2d1487d76e56065d35d6261fc0d9253de Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 7 Sep 2023 16:49:37 -0300 Subject: [PATCH 135/201] refactor: re-create solution --- .../Application.Tests.csproj | 8 +- src/Application/Application.csproj | 4 +- src/CopetSystem.API.sln | 79 ------------------- src/Domain.Tests/Domain.Tests.csproj | 4 +- src/GPIC.BackEnd.sln | 79 +++++++++++++++++++ src/Infrastructure/IoC/IoC.csproj | 16 +++- .../Persistence/Persistence.csproj | 4 +- src/Infrastructure/WebAPI/WebAPI.csproj | 7 +- .../WebFunctions/WebFunctions.csproj | 10 ++- 9 files changed, 120 insertions(+), 91 deletions(-) delete mode 100644 src/CopetSystem.API.sln create mode 100644 src/GPIC.BackEnd.sln diff --git a/src/Application.Tests/Application.Tests.csproj b/src/Application.Tests/Application.Tests.csproj index 9670f4b8..c87d31dd 100644 --- a/src/Application.Tests/Application.Tests.csproj +++ b/src/Application.Tests/Application.Tests.csproj @@ -24,8 +24,12 @@ - - + + + + + + diff --git a/src/Application/Application.csproj b/src/Application/Application.csproj index e0321a88..a65809f6 100644 --- a/src/Application/Application.csproj +++ b/src/Application/Application.csproj @@ -17,7 +17,9 @@ - + + + \ No newline at end of file diff --git a/src/CopetSystem.API.sln b/src/CopetSystem.API.sln deleted file mode 100644 index f076afcb..00000000 --- a/src/CopetSystem.API.sln +++ /dev/null @@ -1,79 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31903.59 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain", "Domain\Domain.csproj", "{60BB6D65-1899-43B7-BD10-986239A3257E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Infrastructure", "Infrastructure", "{CCAE2172-E62F-4440-ABAD-D1A1DC5A234D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Persistence", "Infrastructure\Persistence\Persistence.csproj", "{FCC65F72-7AF9-4940-B07A-E7DDDC7967B7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IoC", "Infrastructure\IoC\IoC.csproj", "{DC12A23D-7BF2-4F0A-A317-B9FA8818C9C2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAPI", "Infrastructure\WebAPI\WebAPI.csproj", "{163219BE-A0D2-41A1-A028-501AAB069BD9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Services", "Infrastructure\Services\Services.csproj", "{7555C53A-BADC-49D9-82BE-C4D8587260EB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Application", "Application\Application.csproj", "{10D17198-CD98-48BF-BEF3-A689B668F5E3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Application.Tests", "Application.Tests\Application.Tests.csproj", "{251887B5-8408-4723-A355-E9F187F66598}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain.Tests", "Domain.Tests\Domain.Tests.csproj", "{F72A4B83-7227-4E65-A80D-1D7FB55848FA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebFunctions", "Infrastructure\WebFunctions\WebFunctions.csproj", "{840822F0-735A-42D8-A4B9-2D771025D3F5}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {60BB6D65-1899-43B7-BD10-986239A3257E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {60BB6D65-1899-43B7-BD10-986239A3257E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {60BB6D65-1899-43B7-BD10-986239A3257E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {60BB6D65-1899-43B7-BD10-986239A3257E}.Release|Any CPU.Build.0 = Release|Any CPU - {FCC65F72-7AF9-4940-B07A-E7DDDC7967B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FCC65F72-7AF9-4940-B07A-E7DDDC7967B7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FCC65F72-7AF9-4940-B07A-E7DDDC7967B7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FCC65F72-7AF9-4940-B07A-E7DDDC7967B7}.Release|Any CPU.Build.0 = Release|Any CPU - {DC12A23D-7BF2-4F0A-A317-B9FA8818C9C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DC12A23D-7BF2-4F0A-A317-B9FA8818C9C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DC12A23D-7BF2-4F0A-A317-B9FA8818C9C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DC12A23D-7BF2-4F0A-A317-B9FA8818C9C2}.Release|Any CPU.Build.0 = Release|Any CPU - {163219BE-A0D2-41A1-A028-501AAB069BD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {163219BE-A0D2-41A1-A028-501AAB069BD9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {163219BE-A0D2-41A1-A028-501AAB069BD9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {163219BE-A0D2-41A1-A028-501AAB069BD9}.Release|Any CPU.Build.0 = Release|Any CPU - {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7555C53A-BADC-49D9-82BE-C4D8587260EB}.Release|Any CPU.Build.0 = Release|Any CPU - {10D17198-CD98-48BF-BEF3-A689B668F5E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {10D17198-CD98-48BF-BEF3-A689B668F5E3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {10D17198-CD98-48BF-BEF3-A689B668F5E3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {10D17198-CD98-48BF-BEF3-A689B668F5E3}.Release|Any CPU.Build.0 = Release|Any CPU - {251887B5-8408-4723-A355-E9F187F66598}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {251887B5-8408-4723-A355-E9F187F66598}.Debug|Any CPU.Build.0 = Debug|Any CPU - {251887B5-8408-4723-A355-E9F187F66598}.Release|Any CPU.ActiveCfg = Release|Any CPU - {251887B5-8408-4723-A355-E9F187F66598}.Release|Any CPU.Build.0 = Release|Any CPU - {F72A4B83-7227-4E65-A80D-1D7FB55848FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F72A4B83-7227-4E65-A80D-1D7FB55848FA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F72A4B83-7227-4E65-A80D-1D7FB55848FA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F72A4B83-7227-4E65-A80D-1D7FB55848FA}.Release|Any CPU.Build.0 = Release|Any CPU - {840822F0-735A-42D8-A4B9-2D771025D3F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {840822F0-735A-42D8-A4B9-2D771025D3F5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {840822F0-735A-42D8-A4B9-2D771025D3F5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {840822F0-735A-42D8-A4B9-2D771025D3F5}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {FCC65F72-7AF9-4940-B07A-E7DDDC7967B7} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} - {DC12A23D-7BF2-4F0A-A317-B9FA8818C9C2} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} - {163219BE-A0D2-41A1-A028-501AAB069BD9} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} - {7555C53A-BADC-49D9-82BE-C4D8587260EB} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} - {840822F0-735A-42D8-A4B9-2D771025D3F5} = {CCAE2172-E62F-4440-ABAD-D1A1DC5A234D} - EndGlobalSection -EndGlobal diff --git a/src/Domain.Tests/Domain.Tests.csproj b/src/Domain.Tests/Domain.Tests.csproj index baaa5c4b..ebc8cb55 100644 --- a/src/Domain.Tests/Domain.Tests.csproj +++ b/src/Domain.Tests/Domain.Tests.csproj @@ -24,7 +24,9 @@ - + + + diff --git a/src/GPIC.BackEnd.sln b/src/GPIC.BackEnd.sln new file mode 100644 index 00000000..0d3489a8 --- /dev/null +++ b/src/GPIC.BackEnd.sln @@ -0,0 +1,79 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain", "Domain\Domain.csproj", "{A5928034-02D5-427D-B83C-10F8F249CA1C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Application", "Application\Application.csproj", "{C7DC5551-8325-461D-9710-05EEC9EF8791}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Infrastructure", "Infrastructure", "{6CC50902-ECC4-4A3A-A03D-115DD1378038}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Persistence", "Infrastructure\Persistence\Persistence.csproj", "{03F5DBCF-08FA-46A4-ACBB-F933C3C1B520}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Services", "Infrastructure\Services\Services.csproj", "{3236030B-AD8F-4FAB-AAF6-3808D7B3F8E8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IoC", "Infrastructure\IoC\IoC.csproj", "{92667C72-14F6-44A5-9152-8B512ED249DA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAPI", "Infrastructure\WebAPI\WebAPI.csproj", "{BE5B727D-878C-4E0E-AD3B-60B32781DFFF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebFunctions", "Infrastructure\WebFunctions\WebFunctions.csproj", "{A994F6CD-1C40-4C27-8BDF-85AFF7543A03}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain.Tests", "Domain.Tests\Domain.Tests.csproj", "{4E50EC16-4163-4B66-BA9A-33BB45E99035}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Application.Tests", "Application.Tests\Application.Tests.csproj", "{682499DF-F2AE-429A-B48D-CBE55C09F223}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A5928034-02D5-427D-B83C-10F8F249CA1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5928034-02D5-427D-B83C-10F8F249CA1C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5928034-02D5-427D-B83C-10F8F249CA1C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5928034-02D5-427D-B83C-10F8F249CA1C}.Release|Any CPU.Build.0 = Release|Any CPU + {C7DC5551-8325-461D-9710-05EEC9EF8791}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7DC5551-8325-461D-9710-05EEC9EF8791}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7DC5551-8325-461D-9710-05EEC9EF8791}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7DC5551-8325-461D-9710-05EEC9EF8791}.Release|Any CPU.Build.0 = Release|Any CPU + {03F5DBCF-08FA-46A4-ACBB-F933C3C1B520}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03F5DBCF-08FA-46A4-ACBB-F933C3C1B520}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03F5DBCF-08FA-46A4-ACBB-F933C3C1B520}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03F5DBCF-08FA-46A4-ACBB-F933C3C1B520}.Release|Any CPU.Build.0 = Release|Any CPU + {3236030B-AD8F-4FAB-AAF6-3808D7B3F8E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3236030B-AD8F-4FAB-AAF6-3808D7B3F8E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3236030B-AD8F-4FAB-AAF6-3808D7B3F8E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3236030B-AD8F-4FAB-AAF6-3808D7B3F8E8}.Release|Any CPU.Build.0 = Release|Any CPU + {92667C72-14F6-44A5-9152-8B512ED249DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {92667C72-14F6-44A5-9152-8B512ED249DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92667C72-14F6-44A5-9152-8B512ED249DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {92667C72-14F6-44A5-9152-8B512ED249DA}.Release|Any CPU.Build.0 = Release|Any CPU + {BE5B727D-878C-4E0E-AD3B-60B32781DFFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BE5B727D-878C-4E0E-AD3B-60B32781DFFF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE5B727D-878C-4E0E-AD3B-60B32781DFFF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BE5B727D-878C-4E0E-AD3B-60B32781DFFF}.Release|Any CPU.Build.0 = Release|Any CPU + {A994F6CD-1C40-4C27-8BDF-85AFF7543A03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A994F6CD-1C40-4C27-8BDF-85AFF7543A03}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A994F6CD-1C40-4C27-8BDF-85AFF7543A03}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A994F6CD-1C40-4C27-8BDF-85AFF7543A03}.Release|Any CPU.Build.0 = Release|Any CPU + {4E50EC16-4163-4B66-BA9A-33BB45E99035}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4E50EC16-4163-4B66-BA9A-33BB45E99035}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E50EC16-4163-4B66-BA9A-33BB45E99035}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4E50EC16-4163-4B66-BA9A-33BB45E99035}.Release|Any CPU.Build.0 = Release|Any CPU + {682499DF-F2AE-429A-B48D-CBE55C09F223}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {682499DF-F2AE-429A-B48D-CBE55C09F223}.Debug|Any CPU.Build.0 = Debug|Any CPU + {682499DF-F2AE-429A-B48D-CBE55C09F223}.Release|Any CPU.ActiveCfg = Release|Any CPU + {682499DF-F2AE-429A-B48D-CBE55C09F223}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {03F5DBCF-08FA-46A4-ACBB-F933C3C1B520} = {6CC50902-ECC4-4A3A-A03D-115DD1378038} + {3236030B-AD8F-4FAB-AAF6-3808D7B3F8E8} = {6CC50902-ECC4-4A3A-A03D-115DD1378038} + {92667C72-14F6-44A5-9152-8B512ED249DA} = {6CC50902-ECC4-4A3A-A03D-115DD1378038} + {BE5B727D-878C-4E0E-AD3B-60B32781DFFF} = {6CC50902-ECC4-4A3A-A03D-115DD1378038} + {A994F6CD-1C40-4C27-8BDF-85AFF7543A03} = {6CC50902-ECC4-4A3A-A03D-115DD1378038} + EndGlobalSection +EndGlobal diff --git a/src/Infrastructure/IoC/IoC.csproj b/src/Infrastructure/IoC/IoC.csproj index 05746d9a..02c414af 100644 --- a/src/Infrastructure/IoC/IoC.csproj +++ b/src/Infrastructure/IoC/IoC.csproj @@ -6,10 +6,18 @@ 0.0.1 - - - - + + + + + + + + + + + + diff --git a/src/Infrastructure/Persistence/Persistence.csproj b/src/Infrastructure/Persistence/Persistence.csproj index 4e6f34ec..c7219c04 100644 --- a/src/Infrastructure/Persistence/Persistence.csproj +++ b/src/Infrastructure/Persistence/Persistence.csproj @@ -29,7 +29,9 @@ - + + + diff --git a/src/Infrastructure/WebAPI/WebAPI.csproj b/src/Infrastructure/WebAPI/WebAPI.csproj index 465ff16e..5aff8fab 100644 --- a/src/Infrastructure/WebAPI/WebAPI.csproj +++ b/src/Infrastructure/WebAPI/WebAPI.csproj @@ -6,6 +6,7 @@ ../../docker-compose.dcproj ef326666-1cfa-4625-aae3-41ea85c01828 0.0.1 + true @@ -27,8 +28,12 @@ + + + + + - diff --git a/src/Infrastructure/WebFunctions/WebFunctions.csproj b/src/Infrastructure/WebFunctions/WebFunctions.csproj index 6b118bd0..2ffc0c2e 100644 --- a/src/Infrastructure/WebFunctions/WebFunctions.csproj +++ b/src/Infrastructure/WebFunctions/WebFunctions.csproj @@ -32,7 +32,13 @@ - - + + + + + + + + \ No newline at end of file From 6ca37e93a496ac2ad7f9bb6da5e3d6d9cd59193a Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 7 Sep 2023 16:50:35 -0300 Subject: [PATCH 136/201] fix: add space before logo on email templates --- src/Infrastructure/Services/Email/Templates/ConfirmEmail.html | 1 + src/Infrastructure/Services/Email/Templates/NewEdital.html | 1 + .../Services/Email/Templates/NotifyOfReportDeadline.html | 1 + .../Services/Email/Templates/ProjectStatusChange.html | 1 + .../Services/Email/Templates/RequestStudentRegister.html | 1 + .../Services/Email/Templates/ResetPassword.html | 1 + src/Infrastructure/Services/Services.csproj | 4 +++- 7 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Infrastructure/Services/Email/Templates/ConfirmEmail.html b/src/Infrastructure/Services/Email/Templates/ConfirmEmail.html index 3ae43037..a0d143f9 100644 --- a/src/Infrastructure/Services/Email/Templates/ConfirmEmail.html +++ b/src/Infrastructure/Services/Email/Templates/ConfirmEmail.html @@ -64,6 +64,7 @@

Confirmação de Cadastro

#USER_TOKEN#

+
Atenciosamente,
diff --git a/src/Infrastructure/Services/Email/Templates/NewEdital.html b/src/Infrastructure/Services/Email/Templates/NewEdital.html index 7235d015..65e969c8 100644 --- a/src/Infrastructure/Services/Email/Templates/NewEdital.html +++ b/src/Infrastructure/Services/Email/Templates/NewEdital.html @@ -76,6 +76,7 @@

Novo Edital Disponível

Acessar Edital +
Atenciosamente,
diff --git a/src/Infrastructure/Services/Email/Templates/NotifyOfReportDeadline.html b/src/Infrastructure/Services/Email/Templates/NotifyOfReportDeadline.html index 245099bf..fc7c45dc 100644 --- a/src/Infrastructure/Services/Email/Templates/NotifyOfReportDeadline.html +++ b/src/Infrastructure/Services/Email/Templates/NotifyOfReportDeadline.html @@ -72,6 +72,7 @@

Entrega de Relatório Próxima

Acesse a Aqui +
Atenciosamente,
diff --git a/src/Infrastructure/Services/Email/Templates/ProjectStatusChange.html b/src/Infrastructure/Services/Email/Templates/ProjectStatusChange.html index d261eee1..fd7fb4be 100644 --- a/src/Infrastructure/Services/Email/Templates/ProjectStatusChange.html +++ b/src/Infrastructure/Services/Email/Templates/ProjectStatusChange.html @@ -53,6 +53,7 @@

Status do Projeto Alterado

Para mais detalhes, você pode acessar o projeto na nossa plataforma.

+
Atenciosamente,
diff --git a/src/Infrastructure/Services/Email/Templates/RequestStudentRegister.html b/src/Infrastructure/Services/Email/Templates/RequestStudentRegister.html index ec10396a..28a81d92 100644 --- a/src/Infrastructure/Services/Email/Templates/RequestStudentRegister.html +++ b/src/Infrastructure/Services/Email/Templates/RequestStudentRegister.html @@ -72,6 +72,7 @@

Solicitação de Cadastro

Realizar Cadastro +
Atenciosamente,
diff --git a/src/Infrastructure/Services/Email/Templates/ResetPassword.html b/src/Infrastructure/Services/Email/Templates/ResetPassword.html index c44c31c4..953044bb 100644 --- a/src/Infrastructure/Services/Email/Templates/ResetPassword.html +++ b/src/Infrastructure/Services/Email/Templates/ResetPassword.html @@ -62,6 +62,7 @@

Recuperação de Senha

e-mail.

+
Atenciosamente,
diff --git a/src/Infrastructure/Services/Services.csproj b/src/Infrastructure/Services/Services.csproj index 72b34083..cf011a87 100644 --- a/src/Infrastructure/Services/Services.csproj +++ b/src/Infrastructure/Services/Services.csproj @@ -6,7 +6,9 @@ 0.0.1
- + + + From 73351b9be2287f57700449e2f8ad4ccb83a28ade Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 7 Sep 2023 18:41:53 -0300 Subject: [PATCH 137/201] feat: add migrations to git --- src/Docker/.dockerignore => .dockerignore | 0 .gitignore | 1 - .vscode/settings.json | 2 +- src/Docker/WebAPI/docker-compose.override.yml | 52 - src/Docker/WebAPI/docker-compose.yml | 82 ++ src/Docker/WebAPI/init-seq.sh | 10 - .../20230907134628_Initialize.Designer.cs | 1105 +++++++++++++++++ .../Migrations/20230907134628_Initialize.cs | 806 ++++++++++++ .../ApplicationDbContextModelSnapshot.cs | 1102 ++++++++++++++++ src/Infrastructure/WebAPI/WebAPI.csproj | 2 +- .../WebAPI/appsettings.development.json | 1 - src/Infrastructure/WebAPI/appsettings.json | 7 +- src/Infrastructure/WebFunctions/Dockerfile | 34 + .../WebFunctions/appsettings.json | 7 +- 14 files changed, 3136 insertions(+), 75 deletions(-) rename src/Docker/.dockerignore => .dockerignore (100%) delete mode 100644 src/Docker/WebAPI/docker-compose.override.yml delete mode 100755 src/Docker/WebAPI/init-seq.sh create mode 100644 src/Infrastructure/Persistence/Migrations/20230907134628_Initialize.Designer.cs create mode 100644 src/Infrastructure/Persistence/Migrations/20230907134628_Initialize.cs create mode 100644 src/Infrastructure/Persistence/Migrations/ApplicationDbContextModelSnapshot.cs delete mode 100644 src/Infrastructure/WebAPI/appsettings.development.json create mode 100644 src/Infrastructure/WebFunctions/Dockerfile diff --git a/src/Docker/.dockerignore b/.dockerignore similarity index 100% rename from src/Docker/.dockerignore rename to .dockerignore diff --git a/.gitignore b/.gitignore index e56f82c7..28cdfd4f 100644 --- a/.gitignore +++ b/.gitignore @@ -398,7 +398,6 @@ FodyWeavers.xsd *.sln.iml volumes -Migrations node_modules .DS_Store diff --git a/.vscode/settings.json b/.vscode/settings.json index d78c1a68..7181dee0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,7 @@ { // "dotnet-test-explorer.testProjectPath": "src/Domain.Tests/Domain.Tests.csproj", "dotnet-test-explorer.testProjectPath": "src/Application.Tests/Application.Tests.csproj", - "dotnet.defaultSolution": "src/CopetSystem.API.sln", + "dotnet.defaultSolution": "src/GPIC.BackEnd.sln", "azureFunctions.deploySubpath": "src/Infrastructure/WebFunctions/bin/Release/net7.0/publish", "azureFunctions.projectLanguage": "C#", "azureFunctions.projectRuntime": "~4", diff --git a/src/Docker/WebAPI/docker-compose.override.yml b/src/Docker/WebAPI/docker-compose.override.yml deleted file mode 100644 index 5085227e..00000000 --- a/src/Docker/WebAPI/docker-compose.override.yml +++ /dev/null @@ -1,52 +0,0 @@ -version: '3.4' - -services: - - # PostgreSQL Database - postgres: - container_name: postgres_gpic - image: postgres:latest - environment: - POSTGRES_PASSWORD: Copet@123 - POSTGRES_USER: copet-admin - POSTGRES_DB: COPET_DB - ports: - - 15432:5432 - volumes: - - ./volumes/postgresql:/var/lib/postgresql/data - networks: - - gpic-network - - # Seq - Servidor de Logs - seq: - container_name: seq_gpic - image: datalust/seq:latest - ports: - - "5341:80" - environment: - - ACCEPT_EULA=Y - - SEQ_API_KEY=vxM2YLukOTgnraaYczDh - networks: - - gpic-network - - # Web API - webapi: - container_name: webapi_gpic - environment: - - ASPNETCORE_ENVIRONMENT=Development - - ASPNETCORE_URLS=https://+:443;http://+:80 - ports: - - 5051:443 - - 5050:80 - volumes: - - ~/.aspnet/https:/root/.aspnet/https:ro - - ~/.microsoft/usersecrets:/root/.microsoft/usersecrets:ro - depends_on: - - postgres - - seq - networks: - - gpic-network - -networks: - gpic-network: - driver: bridge diff --git a/src/Docker/WebAPI/docker-compose.yml b/src/Docker/WebAPI/docker-compose.yml index 8bd8fdef..288d5fda 100644 --- a/src/Docker/WebAPI/docker-compose.yml +++ b/src/Docker/WebAPI/docker-compose.yml @@ -1,8 +1,90 @@ version: '3.4' services: + + # PostgreSQL Database + postgres: + container_name: postgres_gpic + image: postgres:latest + environment: + POSTGRES_PASSWORD: Copet@123 + POSTGRES_USER: copet-admin + POSTGRES_DB: COPET_DB + ports: + - 15432:5432 + volumes: + - ./volumes/postgresql:/var/lib/postgresql/data + networks: + - gpic-network + + # Seq - Servidor de Logs + seq: + container_name: seq_gpic + image: datalust/seq:latest + ports: + - "5341:80" + environment: + - ACCEPT_EULA=Y + - SEQ_API_KEY=vxM2YLukOTgnraaYczDh + networks: + - gpic-network + + # Web API webapi: + container_name: webapi_gpic + environment: + - ASPNETCORE_ENVIRONMENT=Development + - ASPNETCORE_URLS=https://+:443;http://+:80 image: ${DOCKER_REGISTRY-}webapi build: context: ../../ dockerfile: Infrastructure/WebAPI/Dockerfile + ports: + - 5051:443 + - 5050:80 + volumes: + - ~/.aspnet/https:/root/.aspnet/https:ro + - ~/.microsoft/usersecrets:/root/.microsoft/usersecrets:ro + depends_on: + - postgres + - seq + networks: + - gpic-network + + # Web Functions + webfunctions: + container_name: webfunctions_gpic + image: ${DOCKER_REGISTRY-}webfunctions + build: + context: ../../ + dockerfile: Infrastructure/WebFunctions/Dockerfile + ports: + - "7071:80" + volumes: + - ~/.microsoft/usersecrets:/root/.microsoft/usersecrets:ro + environment: + - AzureWebJobsStorage=UseDevelopmentStorage=true + - AzureFunctionsJobHost__Logging__Console__IsEnabled=true + depends_on: + - azurite + - postgres + - seq + networks: + - gpic-network + + # Azurite - Storage Emulator (Blob, Queue, Table) + azurite: + container_name: azurite_gpic + image: mcr.microsoft.com/azure-storage/azurite + ports: + - "10000:10000" + - "10001:10001" + - "10002:10002" + environment: + - AZURITE_ACCOUNTS=devstoreaccount1:devstoreaccount1Key + networks: + - gpic-network + +networks: + gpic-network: + driver: bridge diff --git a/src/Docker/WebAPI/init-seq.sh b/src/Docker/WebAPI/init-seq.sh deleted file mode 100755 index c5d2e543..00000000 --- a/src/Docker/WebAPI/init-seq.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -# Gere uma API Key aleatória -api_key=$(openssl rand -hex 32) - -# Defina a API Key como uma variável de ambiente -export SEQ_API_KEY=$api_key - -# Inicie o Seq Logger -exec "$@" diff --git a/src/Infrastructure/Persistence/Migrations/20230907134628_Initialize.Designer.cs b/src/Infrastructure/Persistence/Migrations/20230907134628_Initialize.Designer.cs new file mode 100644 index 00000000..4a83de71 --- /dev/null +++ b/src/Infrastructure/Persistence/Migrations/20230907134628_Initialize.Designer.cs @@ -0,0 +1,1105 @@ +// +using System; +using Infrastructure.Persistence.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Persistence.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20230907134628_Initialize")] + partial class Initialize + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("public") + .HasAnnotation("ProductVersion", "7.0.9") + .HasAnnotation("Proxies:ChangeTracking", false) + .HasAnnotation("Proxies:CheckEquality", false) + .HasAnnotation("Proxies:LazyLoading", true) + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Domain.Entities.Activity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ActivityTypeId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Limits") + .HasColumnType("double precision"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Points") + .IsRequired() + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.HasIndex("ActivityTypeId"); + + b.ToTable("Activities", "public"); + }); + + modelBuilder.Entity("Domain.Entities.ActivityType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("NoticeId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("Unity") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.HasKey("Id"); + + b.HasIndex("NoticeId"); + + b.ToTable("ActivityTypes", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Area", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("MainAreaId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("MainAreaId"); + + b.ToTable("Areas", "public"); + }); + + modelBuilder.Entity("Domain.Entities.AssistanceType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.HasKey("Id"); + + b.ToTable("AssistanceTypes", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Campus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.HasKey("Id"); + + b.ToTable("Campuses", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Course", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.HasKey("Id"); + + b.ToTable("Courses", "public"); + }); + + modelBuilder.Entity("Domain.Entities.MainArea", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.ToTable("MainAreas", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Notice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AppealEndDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("AppealStartDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedAt") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now() at time zone 'utc'"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("DocUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("EvaluationEndDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("EvaluationStartDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("FinalReportDeadline") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("PartialReportDeadline") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("RegistrationEndDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("RegistrationStartDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("SendingDocsEndDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("SendingDocsStartDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("SuspensionYears") + .IsRequired() + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Notices", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Professor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IdentifyLattes") + .HasColumnType("bigint"); + + b.Property("SIAPEEnrollment") + .IsRequired() + .HasMaxLength(7) + .HasColumnType("character varying(7)"); + + b.Property("SuspensionEndDate") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Professors", "public"); + }); + + modelBuilder.Entity("Domain.Entities.ProgramType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.HasKey("Id"); + + b.ToTable("ProgramTypes", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ActivitiesExecutionSchedule") + .HasMaxLength(1500) + .HasColumnType("character varying(1500)"); + + b.Property("AppealDate") + .HasColumnType("timestamp with time zone"); + + b.Property("AppealObservation") + .HasColumnType("text"); + + b.Property("CancellationDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CancellationReason") + .HasColumnType("text"); + + b.Property("CertificateUrl") + .HasColumnType("text"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpectedResults") + .HasMaxLength(1500) + .HasColumnType("character varying(1500)"); + + b.Property("IsScholarshipCandidate") + .HasColumnType("boolean"); + + b.Property("KeyWord1") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("KeyWord2") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("KeyWord3") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Methodology") + .HasMaxLength(1500) + .HasColumnType("character varying(1500)"); + + b.Property("NoticeId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("Objective") + .HasMaxLength(1500) + .HasColumnType("character varying(1500)"); + + b.Property("ProfessorId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("ProgramTypeId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StatusDescription") + .IsRequired() + .HasColumnType("text"); + + b.Property("StudentId") + .HasColumnType("uuid"); + + b.Property("SubAreaId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("SubmissionDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("NoticeId"); + + b.HasIndex("ProfessorId"); + + b.HasIndex("ProgramTypeId"); + + b.HasIndex("StudentId"); + + b.HasIndex("SubAreaId"); + + b.ToTable("Projects", "public"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectActivity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ActivityId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("FoundActivities") + .HasColumnType("integer"); + + b.Property("InformedActivities") + .IsRequired() + .HasColumnType("integer"); + + b.Property("ProjectId") + .IsRequired() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ActivityId"); + + b.HasIndex("ProjectId"); + + b.ToTable("ProjectActivities", "public"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectEvaluation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("APIndex") + .ValueGeneratedOnAdd() + .HasColumnType("double precision") + .HasDefaultValue(0.0); + + b.Property("AcademicScientificProductionCoherence") + .HasColumnType("integer"); + + b.Property("AppealEvaluationDate") + .HasColumnType("timestamp with time zone"); + + b.Property("AppealEvaluationDescription") + .HasColumnType("text"); + + b.Property("AppealEvaluationStatus") + .HasColumnType("integer"); + + b.Property("AppealEvaluatorId") + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentsEvaluationDate") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentsEvaluationDescription") + .HasColumnType("text"); + + b.Property("DocumentsEvaluatorId") + .HasColumnType("uuid"); + + b.Property("EffectiveContributionToResearch") + .HasColumnType("integer"); + + b.Property("FinalScore") + .ValueGeneratedOnAdd() + .HasColumnType("double precision") + .HasDefaultValue(0.0); + + b.Property("IsProductivityFellow") + .IsRequired() + .HasColumnType("boolean"); + + b.Property("ProjectId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("ProjectProposalObjectives") + .HasColumnType("integer"); + + b.Property("ProposalMethodologyAdaptation") + .HasColumnType("integer"); + + b.Property("Qualification") + .HasColumnType("integer"); + + b.Property("SubmissionEvaluationDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("SubmissionEvaluationDescription") + .IsRequired() + .HasColumnType("text"); + + b.Property("SubmissionEvaluationStatus") + .HasColumnType("integer"); + + b.Property("SubmissionEvaluatorId") + .IsRequired() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("AppealEvaluatorId"); + + b.HasIndex("DocumentsEvaluatorId"); + + b.HasIndex("ProjectId") + .IsUnique(); + + b.HasIndex("SubmissionEvaluatorId"); + + b.ToTable("ProjectEvaluations", "public"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectFinalReport", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ProjectId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("ReportUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("SendDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectFinalReports", "public"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectPartialReport", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AdditionalInfo") + .HasColumnType("text"); + + b.Property("CurrentDevelopmentStage") + .HasColumnType("integer"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ProjectId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("ScholarPerformance") + .HasColumnType("integer"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPartialReports", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Student", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AssistanceTypeId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CEP") + .HasColumnType("bigint"); + + b.Property("CampusId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("CellPhone") + .HasColumnType("bigint"); + + b.Property("CellPhoneDDD") + .HasColumnType("integer"); + + b.Property("City") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CourseId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DispatchDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("HomeAddress") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IssuingAgency") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Phone") + .HasColumnType("bigint"); + + b.Property("PhoneDDD") + .HasColumnType("integer"); + + b.Property("RG") + .HasColumnType("bigint"); + + b.Property("Race") + .HasColumnType("integer"); + + b.Property("RegistrationCode") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("StartYear") + .IsRequired() + .HasColumnType("text"); + + b.Property("UF") + .IsRequired() + .HasMaxLength(2) + .HasColumnType("character(2)") + .IsFixedLength(); + + b.Property("UserId") + .IsRequired() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("AssistanceTypeId"); + + b.HasIndex("CampusId"); + + b.HasIndex("CourseId"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Students", "public"); + }); + + modelBuilder.Entity("Domain.Entities.StudentDocuments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AccountNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("AccountOpeningProof") + .IsRequired() + .HasColumnType("text"); + + b.Property("AgencyNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("CPF") + .IsRequired() + .HasColumnType("text"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IdentityDocument") + .IsRequired() + .HasColumnType("text"); + + b.Property("ParentalAuthorization") + .HasColumnType("text"); + + b.Property("Photo3x4") + .IsRequired() + .HasColumnType("text"); + + b.Property("ProjectId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("ScholarCommitmentAgreement") + .IsRequired() + .HasColumnType("text"); + + b.Property("SchoolHistory") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId") + .IsUnique(); + + b.ToTable("StudentDocuments", "public"); + }); + + modelBuilder.Entity("Domain.Entities.SubArea", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AreaId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AreaId"); + + b.ToTable("SubAreas", "public"); + }); + + modelBuilder.Entity("Domain.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CPF") + .IsRequired() + .HasMaxLength(15) + .HasColumnType("character varying(15)"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IsConfirmed") + .HasColumnType("boolean"); + + b.Property("IsCoordinator") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Password") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("ResetPasswordToken") + .HasMaxLength(6) + .HasColumnType("character varying(6)"); + + b.Property("Role") + .HasColumnType("integer"); + + b.Property("ValidationCode") + .HasMaxLength(6) + .HasColumnType("character varying(6)"); + + b.HasKey("Id"); + + b.ToTable("Users", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Activity", b => + { + b.HasOne("Domain.Entities.ActivityType", "ActivityType") + .WithMany("Activities") + .HasForeignKey("ActivityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ActivityType"); + }); + + modelBuilder.Entity("Domain.Entities.ActivityType", b => + { + b.HasOne("Domain.Entities.Notice", "Notice") + .WithMany() + .HasForeignKey("NoticeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Notice"); + }); + + modelBuilder.Entity("Domain.Entities.Area", b => + { + b.HasOne("Domain.Entities.MainArea", "MainArea") + .WithMany() + .HasForeignKey("MainAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MainArea"); + }); + + modelBuilder.Entity("Domain.Entities.Professor", b => + { + b.HasOne("Domain.Entities.User", "User") + .WithOne() + .HasForeignKey("Domain.Entities.Professor", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Domain.Entities.Project", b => + { + b.HasOne("Domain.Entities.Notice", "Notice") + .WithMany() + .HasForeignKey("NoticeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.Professor", "Professor") + .WithMany() + .HasForeignKey("ProfessorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.ProgramType", "ProgramType") + .WithMany() + .HasForeignKey("ProgramTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.Student", "Student") + .WithMany() + .HasForeignKey("StudentId"); + + b.HasOne("Domain.Entities.SubArea", "SubArea") + .WithMany() + .HasForeignKey("SubAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Notice"); + + b.Navigation("Professor"); + + b.Navigation("ProgramType"); + + b.Navigation("Student"); + + b.Navigation("SubArea"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectActivity", b => + { + b.HasOne("Domain.Entities.Activity", "Activity") + .WithMany() + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Activity"); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectEvaluation", b => + { + b.HasOne("Domain.Entities.User", "AppealEvaluator") + .WithMany() + .HasForeignKey("AppealEvaluatorId"); + + b.HasOne("Domain.Entities.User", "DocumentsEvaluator") + .WithMany() + .HasForeignKey("DocumentsEvaluatorId"); + + b.HasOne("Domain.Entities.Project", "Project") + .WithOne() + .HasForeignKey("Domain.Entities.ProjectEvaluation", "ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.User", "SubmissionEvaluator") + .WithMany() + .HasForeignKey("SubmissionEvaluatorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AppealEvaluator"); + + b.Navigation("DocumentsEvaluator"); + + b.Navigation("Project"); + + b.Navigation("SubmissionEvaluator"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectFinalReport", b => + { + b.HasOne("Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectPartialReport", b => + { + b.HasOne("Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Domain.Entities.Student", b => + { + b.HasOne("Domain.Entities.AssistanceType", "AssistanceType") + .WithMany() + .HasForeignKey("AssistanceTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.Campus", "Campus") + .WithMany() + .HasForeignKey("CampusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.Course", "Course") + .WithMany() + .HasForeignKey("CourseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.User", "User") + .WithOne() + .HasForeignKey("Domain.Entities.Student", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssistanceType"); + + b.Navigation("Campus"); + + b.Navigation("Course"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Domain.Entities.StudentDocuments", b => + { + b.HasOne("Domain.Entities.Project", "Project") + .WithOne() + .HasForeignKey("Domain.Entities.StudentDocuments", "ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("Domain.Entities.SubArea", b => + { + b.HasOne("Domain.Entities.Area", "Area") + .WithMany() + .HasForeignKey("AreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Area"); + }); + + modelBuilder.Entity("Domain.Entities.ActivityType", b => + { + b.Navigation("Activities"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Infrastructure/Persistence/Migrations/20230907134628_Initialize.cs b/src/Infrastructure/Persistence/Migrations/20230907134628_Initialize.cs new file mode 100644 index 00000000..7d653390 --- /dev/null +++ b/src/Infrastructure/Persistence/Migrations/20230907134628_Initialize.cs @@ -0,0 +1,806 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Persistence.Migrations +{ + /// + public partial class Initialize : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.EnsureSchema( + name: "public"); + + migrationBuilder.CreateTable( + name: "AssistanceTypes", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(300)", maxLength: 300, nullable: false), + Description = table.Column(type: "character varying(300)", maxLength: 300, nullable: true), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AssistanceTypes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Campuses", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(300)", maxLength: 300, nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Campuses", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Courses", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(300)", maxLength: 300, nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Courses", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "MainAreas", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Code = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), + Name = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_MainAreas", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Notices", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + RegistrationStartDate = table.Column(type: "timestamp with time zone", nullable: false), + RegistrationEndDate = table.Column(type: "timestamp with time zone", nullable: false), + EvaluationStartDate = table.Column(type: "timestamp with time zone", nullable: false), + EvaluationEndDate = table.Column(type: "timestamp with time zone", nullable: false), + AppealStartDate = table.Column(type: "timestamp with time zone", nullable: false), + AppealEndDate = table.Column(type: "timestamp with time zone", nullable: false), + SendingDocsStartDate = table.Column(type: "timestamp with time zone", nullable: false), + SendingDocsEndDate = table.Column(type: "timestamp with time zone", nullable: false), + PartialReportDeadline = table.Column(type: "timestamp with time zone", nullable: false), + FinalReportDeadline = table.Column(type: "timestamp with time zone", nullable: false), + SuspensionYears = table.Column(type: "integer", nullable: false), + DocUrl = table.Column(type: "character varying(300)", maxLength: 300, nullable: true), + Description = table.Column(type: "character varying(300)", maxLength: 300, nullable: true), + CreatedAt = table.Column(type: "timestamp with time zone", nullable: false, defaultValueSql: "now() at time zone 'utc'"), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Notices", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "ProgramTypes", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(300)", maxLength: 300, nullable: false), + Description = table.Column(type: "character varying(300)", maxLength: 300, nullable: true), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ProgramTypes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Users", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(300)", maxLength: 300, nullable: false), + Email = table.Column(type: "character varying(300)", maxLength: 300, nullable: false), + Password = table.Column(type: "character varying(300)", maxLength: 300, nullable: false), + CPF = table.Column(type: "character varying(15)", maxLength: 15, nullable: false), + Role = table.Column(type: "integer", nullable: false), + IsConfirmed = table.Column(type: "boolean", nullable: false), + ValidationCode = table.Column(type: "character varying(6)", maxLength: 6, nullable: true), + ResetPasswordToken = table.Column(type: "character varying(6)", maxLength: 6, nullable: true), + IsCoordinator = table.Column(type: "boolean", nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Users", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Areas", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + MainAreaId = table.Column(type: "uuid", nullable: false), + Code = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), + Name = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Areas", x => x.Id); + table.ForeignKey( + name: "FK_Areas_MainAreas_MainAreaId", + column: x => x.MainAreaId, + principalSchema: "public", + principalTable: "MainAreas", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "ActivityTypes", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(300)", maxLength: 300, nullable: false), + Unity = table.Column(type: "character varying(300)", maxLength: 300, nullable: false), + NoticeId = table.Column(type: "uuid", nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ActivityTypes", x => x.Id); + table.ForeignKey( + name: "FK_ActivityTypes_Notices_NoticeId", + column: x => x.NoticeId, + principalSchema: "public", + principalTable: "Notices", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Professors", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + SIAPEEnrollment = table.Column(type: "character varying(7)", maxLength: 7, nullable: false), + IdentifyLattes = table.Column(type: "bigint", nullable: false), + UserId = table.Column(type: "uuid", nullable: false), + SuspensionEndDate = table.Column(type: "timestamp with time zone", nullable: true), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Professors", x => x.Id); + table.ForeignKey( + name: "FK_Professors_Users_UserId", + column: x => x.UserId, + principalSchema: "public", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Students", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + RegistrationCode = table.Column(type: "character varying(20)", maxLength: 20, nullable: false), + BirthDate = table.Column(type: "timestamp with time zone", nullable: false), + RG = table.Column(type: "bigint", nullable: false), + IssuingAgency = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), + DispatchDate = table.Column(type: "timestamp with time zone", nullable: false), + Gender = table.Column(type: "integer", nullable: false), + Race = table.Column(type: "integer", nullable: false), + HomeAddress = table.Column(type: "character varying(300)", maxLength: 300, nullable: false), + City = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), + UF = table.Column(type: "character(2)", fixedLength: true, maxLength: 2, nullable: false), + CEP = table.Column(type: "bigint", nullable: false), + PhoneDDD = table.Column(type: "integer", nullable: true), + Phone = table.Column(type: "bigint", nullable: true), + CellPhoneDDD = table.Column(type: "integer", nullable: true), + CellPhone = table.Column(type: "bigint", nullable: true), + CampusId = table.Column(type: "uuid", nullable: false), + CourseId = table.Column(type: "uuid", nullable: false), + StartYear = table.Column(type: "text", nullable: false), + AssistanceTypeId = table.Column(type: "uuid", nullable: false), + UserId = table.Column(type: "uuid", nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Students", x => x.Id); + table.ForeignKey( + name: "FK_Students_AssistanceTypes_AssistanceTypeId", + column: x => x.AssistanceTypeId, + principalSchema: "public", + principalTable: "AssistanceTypes", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Students_Campuses_CampusId", + column: x => x.CampusId, + principalSchema: "public", + principalTable: "Campuses", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Students_Courses_CourseId", + column: x => x.CourseId, + principalSchema: "public", + principalTable: "Courses", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Students_Users_UserId", + column: x => x.UserId, + principalSchema: "public", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "SubAreas", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + AreaId = table.Column(type: "uuid", nullable: false), + Code = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), + Name = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_SubAreas", x => x.Id); + table.ForeignKey( + name: "FK_SubAreas_Areas_AreaId", + column: x => x.AreaId, + principalSchema: "public", + principalTable: "Areas", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Activities", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "character varying(300)", maxLength: 300, nullable: false), + Points = table.Column(type: "double precision", nullable: false), + Limits = table.Column(type: "double precision", nullable: true), + ActivityTypeId = table.Column(type: "uuid", nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Activities", x => x.Id); + table.ForeignKey( + name: "FK_Activities_ActivityTypes_ActivityTypeId", + column: x => x.ActivityTypeId, + principalSchema: "public", + principalTable: "ActivityTypes", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Projects", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Title = table.Column(type: "text", nullable: true), + KeyWord1 = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + KeyWord2 = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + KeyWord3 = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), + IsScholarshipCandidate = table.Column(type: "boolean", nullable: false), + Objective = table.Column(type: "character varying(1500)", maxLength: 1500, nullable: true), + Methodology = table.Column(type: "character varying(1500)", maxLength: 1500, nullable: true), + ExpectedResults = table.Column(type: "character varying(1500)", maxLength: 1500, nullable: true), + ActivitiesExecutionSchedule = table.Column(type: "character varying(1500)", maxLength: 1500, nullable: true), + ProgramTypeId = table.Column(type: "uuid", nullable: false), + ProfessorId = table.Column(type: "uuid", nullable: false), + SubAreaId = table.Column(type: "uuid", nullable: false), + NoticeId = table.Column(type: "uuid", nullable: false), + StudentId = table.Column(type: "uuid", nullable: true), + Status = table.Column(type: "integer", nullable: false), + StatusDescription = table.Column(type: "text", nullable: false), + AppealObservation = table.Column(type: "text", nullable: true), + SubmissionDate = table.Column(type: "timestamp with time zone", nullable: true), + AppealDate = table.Column(type: "timestamp with time zone", nullable: true), + CancellationDate = table.Column(type: "timestamp with time zone", nullable: true), + CancellationReason = table.Column(type: "text", nullable: true), + CertificateUrl = table.Column(type: "text", nullable: true), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Projects", x => x.Id); + table.ForeignKey( + name: "FK_Projects_Notices_NoticeId", + column: x => x.NoticeId, + principalSchema: "public", + principalTable: "Notices", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Projects_Professors_ProfessorId", + column: x => x.ProfessorId, + principalSchema: "public", + principalTable: "Professors", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Projects_ProgramTypes_ProgramTypeId", + column: x => x.ProgramTypeId, + principalSchema: "public", + principalTable: "ProgramTypes", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Projects_Students_StudentId", + column: x => x.StudentId, + principalSchema: "public", + principalTable: "Students", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_Projects_SubAreas_SubAreaId", + column: x => x.SubAreaId, + principalSchema: "public", + principalTable: "SubAreas", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "ProjectActivities", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + InformedActivities = table.Column(type: "integer", nullable: false), + FoundActivities = table.Column(type: "integer", nullable: true), + ProjectId = table.Column(type: "uuid", nullable: false), + ActivityId = table.Column(type: "uuid", nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ProjectActivities", x => x.Id); + table.ForeignKey( + name: "FK_ProjectActivities_Activities_ActivityId", + column: x => x.ActivityId, + principalSchema: "public", + principalTable: "Activities", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ProjectActivities_Projects_ProjectId", + column: x => x.ProjectId, + principalSchema: "public", + principalTable: "Projects", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "ProjectEvaluations", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + ProjectId = table.Column(type: "uuid", nullable: false), + IsProductivityFellow = table.Column(type: "boolean", nullable: false), + SubmissionEvaluatorId = table.Column(type: "uuid", nullable: false), + SubmissionEvaluationDate = table.Column(type: "timestamp with time zone", nullable: false), + SubmissionEvaluationStatus = table.Column(type: "integer", nullable: false), + SubmissionEvaluationDescription = table.Column(type: "text", nullable: false), + AppealEvaluatorId = table.Column(type: "uuid", nullable: true), + AppealEvaluationDate = table.Column(type: "timestamp with time zone", nullable: true), + AppealEvaluationStatus = table.Column(type: "integer", nullable: true), + AppealEvaluationDescription = table.Column(type: "text", nullable: true), + DocumentsEvaluatorId = table.Column(type: "uuid", nullable: true), + DocumentsEvaluationDate = table.Column(type: "timestamp with time zone", nullable: true), + DocumentsEvaluationDescription = table.Column(type: "text", nullable: true), + APIndex = table.Column(type: "double precision", nullable: false, defaultValue: 0.0), + FinalScore = table.Column(type: "double precision", nullable: false, defaultValue: 0.0), + Qualification = table.Column(type: "integer", nullable: false), + ProjectProposalObjectives = table.Column(type: "integer", nullable: false), + AcademicScientificProductionCoherence = table.Column(type: "integer", nullable: false), + ProposalMethodologyAdaptation = table.Column(type: "integer", nullable: false), + EffectiveContributionToResearch = table.Column(type: "integer", nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ProjectEvaluations", x => x.Id); + table.ForeignKey( + name: "FK_ProjectEvaluations_Projects_ProjectId", + column: x => x.ProjectId, + principalSchema: "public", + principalTable: "Projects", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ProjectEvaluations_Users_AppealEvaluatorId", + column: x => x.AppealEvaluatorId, + principalSchema: "public", + principalTable: "Users", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_ProjectEvaluations_Users_DocumentsEvaluatorId", + column: x => x.DocumentsEvaluatorId, + principalSchema: "public", + principalTable: "Users", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_ProjectEvaluations_Users_SubmissionEvaluatorId", + column: x => x.SubmissionEvaluatorId, + principalSchema: "public", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "ProjectFinalReports", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + ReportUrl = table.Column(type: "text", nullable: false), + SendDate = table.Column(type: "timestamp with time zone", nullable: false), + ProjectId = table.Column(type: "uuid", nullable: false), + UserId = table.Column(type: "uuid", nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ProjectFinalReports", x => x.Id); + table.ForeignKey( + name: "FK_ProjectFinalReports_Projects_ProjectId", + column: x => x.ProjectId, + principalSchema: "public", + principalTable: "Projects", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ProjectFinalReports_Users_UserId", + column: x => x.UserId, + principalSchema: "public", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "ProjectPartialReports", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + CurrentDevelopmentStage = table.Column(type: "integer", nullable: false), + ScholarPerformance = table.Column(type: "integer", nullable: false), + AdditionalInfo = table.Column(type: "text", nullable: true), + ProjectId = table.Column(type: "uuid", nullable: false), + UserId = table.Column(type: "uuid", nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ProjectPartialReports", x => x.Id); + table.ForeignKey( + name: "FK_ProjectPartialReports_Projects_ProjectId", + column: x => x.ProjectId, + principalSchema: "public", + principalTable: "Projects", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ProjectPartialReports_Users_UserId", + column: x => x.UserId, + principalSchema: "public", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "StudentDocuments", + schema: "public", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + ProjectId = table.Column(type: "uuid", nullable: false), + IdentityDocument = table.Column(type: "text", nullable: false), + CPF = table.Column(type: "text", nullable: false), + Photo3x4 = table.Column(type: "text", nullable: false), + SchoolHistory = table.Column(type: "text", nullable: false), + ScholarCommitmentAgreement = table.Column(type: "text", nullable: false), + ParentalAuthorization = table.Column(type: "text", nullable: true), + AgencyNumber = table.Column(type: "text", nullable: false), + AccountNumber = table.Column(type: "text", nullable: false), + AccountOpeningProof = table.Column(type: "text", nullable: false), + DeletedAt = table.Column(type: "timestamp with time zone", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_StudentDocuments", x => x.Id); + table.ForeignKey( + name: "FK_StudentDocuments_Projects_ProjectId", + column: x => x.ProjectId, + principalSchema: "public", + principalTable: "Projects", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Activities_ActivityTypeId", + schema: "public", + table: "Activities", + column: "ActivityTypeId"); + + migrationBuilder.CreateIndex( + name: "IX_ActivityTypes_NoticeId", + schema: "public", + table: "ActivityTypes", + column: "NoticeId"); + + migrationBuilder.CreateIndex( + name: "IX_Areas_MainAreaId", + schema: "public", + table: "Areas", + column: "MainAreaId"); + + migrationBuilder.CreateIndex( + name: "IX_Professors_UserId", + schema: "public", + table: "Professors", + column: "UserId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ProjectActivities_ActivityId", + schema: "public", + table: "ProjectActivities", + column: "ActivityId"); + + migrationBuilder.CreateIndex( + name: "IX_ProjectActivities_ProjectId", + schema: "public", + table: "ProjectActivities", + column: "ProjectId"); + + migrationBuilder.CreateIndex( + name: "IX_ProjectEvaluations_AppealEvaluatorId", + schema: "public", + table: "ProjectEvaluations", + column: "AppealEvaluatorId"); + + migrationBuilder.CreateIndex( + name: "IX_ProjectEvaluations_DocumentsEvaluatorId", + schema: "public", + table: "ProjectEvaluations", + column: "DocumentsEvaluatorId"); + + migrationBuilder.CreateIndex( + name: "IX_ProjectEvaluations_ProjectId", + schema: "public", + table: "ProjectEvaluations", + column: "ProjectId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ProjectEvaluations_SubmissionEvaluatorId", + schema: "public", + table: "ProjectEvaluations", + column: "SubmissionEvaluatorId"); + + migrationBuilder.CreateIndex( + name: "IX_ProjectFinalReports_ProjectId", + schema: "public", + table: "ProjectFinalReports", + column: "ProjectId"); + + migrationBuilder.CreateIndex( + name: "IX_ProjectFinalReports_UserId", + schema: "public", + table: "ProjectFinalReports", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_ProjectPartialReports_ProjectId", + schema: "public", + table: "ProjectPartialReports", + column: "ProjectId"); + + migrationBuilder.CreateIndex( + name: "IX_ProjectPartialReports_UserId", + schema: "public", + table: "ProjectPartialReports", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_Projects_NoticeId", + schema: "public", + table: "Projects", + column: "NoticeId"); + + migrationBuilder.CreateIndex( + name: "IX_Projects_ProfessorId", + schema: "public", + table: "Projects", + column: "ProfessorId"); + + migrationBuilder.CreateIndex( + name: "IX_Projects_ProgramTypeId", + schema: "public", + table: "Projects", + column: "ProgramTypeId"); + + migrationBuilder.CreateIndex( + name: "IX_Projects_StudentId", + schema: "public", + table: "Projects", + column: "StudentId"); + + migrationBuilder.CreateIndex( + name: "IX_Projects_SubAreaId", + schema: "public", + table: "Projects", + column: "SubAreaId"); + + migrationBuilder.CreateIndex( + name: "IX_StudentDocuments_ProjectId", + schema: "public", + table: "StudentDocuments", + column: "ProjectId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Students_AssistanceTypeId", + schema: "public", + table: "Students", + column: "AssistanceTypeId"); + + migrationBuilder.CreateIndex( + name: "IX_Students_CampusId", + schema: "public", + table: "Students", + column: "CampusId"); + + migrationBuilder.CreateIndex( + name: "IX_Students_CourseId", + schema: "public", + table: "Students", + column: "CourseId"); + + migrationBuilder.CreateIndex( + name: "IX_Students_UserId", + schema: "public", + table: "Students", + column: "UserId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_SubAreas_AreaId", + schema: "public", + table: "SubAreas", + column: "AreaId"); + + Persistence.Seeds.Seeder.Execute(migrationBuilder); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ProjectActivities", + schema: "public"); + + migrationBuilder.DropTable( + name: "ProjectEvaluations", + schema: "public"); + + migrationBuilder.DropTable( + name: "ProjectFinalReports", + schema: "public"); + + migrationBuilder.DropTable( + name: "ProjectPartialReports", + schema: "public"); + + migrationBuilder.DropTable( + name: "StudentDocuments", + schema: "public"); + + migrationBuilder.DropTable( + name: "Activities", + schema: "public"); + + migrationBuilder.DropTable( + name: "Projects", + schema: "public"); + + migrationBuilder.DropTable( + name: "ActivityTypes", + schema: "public"); + + migrationBuilder.DropTable( + name: "Professors", + schema: "public"); + + migrationBuilder.DropTable( + name: "ProgramTypes", + schema: "public"); + + migrationBuilder.DropTable( + name: "Students", + schema: "public"); + + migrationBuilder.DropTable( + name: "SubAreas", + schema: "public"); + + migrationBuilder.DropTable( + name: "Notices", + schema: "public"); + + migrationBuilder.DropTable( + name: "AssistanceTypes", + schema: "public"); + + migrationBuilder.DropTable( + name: "Campuses", + schema: "public"); + + migrationBuilder.DropTable( + name: "Courses", + schema: "public"); + + migrationBuilder.DropTable( + name: "Users", + schema: "public"); + + migrationBuilder.DropTable( + name: "Areas", + schema: "public"); + + migrationBuilder.DropTable( + name: "MainAreas", + schema: "public"); + } + } +} diff --git a/src/Infrastructure/Persistence/Migrations/ApplicationDbContextModelSnapshot.cs b/src/Infrastructure/Persistence/Migrations/ApplicationDbContextModelSnapshot.cs new file mode 100644 index 00000000..166ad00b --- /dev/null +++ b/src/Infrastructure/Persistence/Migrations/ApplicationDbContextModelSnapshot.cs @@ -0,0 +1,1102 @@ +// +using System; +using Infrastructure.Persistence.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Persistence.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + partial class ApplicationDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("public") + .HasAnnotation("ProductVersion", "7.0.9") + .HasAnnotation("Proxies:ChangeTracking", false) + .HasAnnotation("Proxies:CheckEquality", false) + .HasAnnotation("Proxies:LazyLoading", true) + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Domain.Entities.Activity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ActivityTypeId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Limits") + .HasColumnType("double precision"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Points") + .IsRequired() + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.HasIndex("ActivityTypeId"); + + b.ToTable("Activities", "public"); + }); + + modelBuilder.Entity("Domain.Entities.ActivityType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("NoticeId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("Unity") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.HasKey("Id"); + + b.HasIndex("NoticeId"); + + b.ToTable("ActivityTypes", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Area", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("MainAreaId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("MainAreaId"); + + b.ToTable("Areas", "public"); + }); + + modelBuilder.Entity("Domain.Entities.AssistanceType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.HasKey("Id"); + + b.ToTable("AssistanceTypes", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Campus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.HasKey("Id"); + + b.ToTable("Campuses", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Course", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.HasKey("Id"); + + b.ToTable("Courses", "public"); + }); + + modelBuilder.Entity("Domain.Entities.MainArea", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.ToTable("MainAreas", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Notice", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AppealEndDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("AppealStartDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("CreatedAt") + .IsRequired() + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValueSql("now() at time zone 'utc'"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("DocUrl") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("EvaluationEndDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("EvaluationStartDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("FinalReportDeadline") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("PartialReportDeadline") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("RegistrationEndDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("RegistrationStartDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("SendingDocsEndDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("SendingDocsStartDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("SuspensionYears") + .IsRequired() + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Notices", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Professor", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IdentifyLattes") + .HasColumnType("bigint"); + + b.Property("SIAPEEnrollment") + .IsRequired() + .HasMaxLength(7) + .HasColumnType("character varying(7)"); + + b.Property("SuspensionEndDate") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Professors", "public"); + }); + + modelBuilder.Entity("Domain.Entities.ProgramType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.HasKey("Id"); + + b.ToTable("ProgramTypes", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ActivitiesExecutionSchedule") + .HasMaxLength(1500) + .HasColumnType("character varying(1500)"); + + b.Property("AppealDate") + .HasColumnType("timestamp with time zone"); + + b.Property("AppealObservation") + .HasColumnType("text"); + + b.Property("CancellationDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CancellationReason") + .HasColumnType("text"); + + b.Property("CertificateUrl") + .HasColumnType("text"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpectedResults") + .HasMaxLength(1500) + .HasColumnType("character varying(1500)"); + + b.Property("IsScholarshipCandidate") + .HasColumnType("boolean"); + + b.Property("KeyWord1") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("KeyWord2") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("KeyWord3") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Methodology") + .HasMaxLength(1500) + .HasColumnType("character varying(1500)"); + + b.Property("NoticeId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("Objective") + .HasMaxLength(1500) + .HasColumnType("character varying(1500)"); + + b.Property("ProfessorId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("ProgramTypeId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StatusDescription") + .IsRequired() + .HasColumnType("text"); + + b.Property("StudentId") + .HasColumnType("uuid"); + + b.Property("SubAreaId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("SubmissionDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Title") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("NoticeId"); + + b.HasIndex("ProfessorId"); + + b.HasIndex("ProgramTypeId"); + + b.HasIndex("StudentId"); + + b.HasIndex("SubAreaId"); + + b.ToTable("Projects", "public"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectActivity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ActivityId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("FoundActivities") + .HasColumnType("integer"); + + b.Property("InformedActivities") + .IsRequired() + .HasColumnType("integer"); + + b.Property("ProjectId") + .IsRequired() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ActivityId"); + + b.HasIndex("ProjectId"); + + b.ToTable("ProjectActivities", "public"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectEvaluation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("APIndex") + .ValueGeneratedOnAdd() + .HasColumnType("double precision") + .HasDefaultValue(0.0); + + b.Property("AcademicScientificProductionCoherence") + .HasColumnType("integer"); + + b.Property("AppealEvaluationDate") + .HasColumnType("timestamp with time zone"); + + b.Property("AppealEvaluationDescription") + .HasColumnType("text"); + + b.Property("AppealEvaluationStatus") + .HasColumnType("integer"); + + b.Property("AppealEvaluatorId") + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentsEvaluationDate") + .HasColumnType("timestamp with time zone"); + + b.Property("DocumentsEvaluationDescription") + .HasColumnType("text"); + + b.Property("DocumentsEvaluatorId") + .HasColumnType("uuid"); + + b.Property("EffectiveContributionToResearch") + .HasColumnType("integer"); + + b.Property("FinalScore") + .ValueGeneratedOnAdd() + .HasColumnType("double precision") + .HasDefaultValue(0.0); + + b.Property("IsProductivityFellow") + .IsRequired() + .HasColumnType("boolean"); + + b.Property("ProjectId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("ProjectProposalObjectives") + .HasColumnType("integer"); + + b.Property("ProposalMethodologyAdaptation") + .HasColumnType("integer"); + + b.Property("Qualification") + .HasColumnType("integer"); + + b.Property("SubmissionEvaluationDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("SubmissionEvaluationDescription") + .IsRequired() + .HasColumnType("text"); + + b.Property("SubmissionEvaluationStatus") + .HasColumnType("integer"); + + b.Property("SubmissionEvaluatorId") + .IsRequired() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("AppealEvaluatorId"); + + b.HasIndex("DocumentsEvaluatorId"); + + b.HasIndex("ProjectId") + .IsUnique(); + + b.HasIndex("SubmissionEvaluatorId"); + + b.ToTable("ProjectEvaluations", "public"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectFinalReport", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ProjectId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("ReportUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("SendDate") + .IsRequired() + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectFinalReports", "public"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectPartialReport", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AdditionalInfo") + .HasColumnType("text"); + + b.Property("CurrentDevelopmentStage") + .HasColumnType("integer"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ProjectId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("ScholarPerformance") + .HasColumnType("integer"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("UserId"); + + b.ToTable("ProjectPartialReports", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Student", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AssistanceTypeId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("BirthDate") + .HasColumnType("timestamp with time zone"); + + b.Property("CEP") + .HasColumnType("bigint"); + + b.Property("CampusId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("CellPhone") + .HasColumnType("bigint"); + + b.Property("CellPhoneDDD") + .HasColumnType("integer"); + + b.Property("City") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("CourseId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("DispatchDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Gender") + .HasColumnType("integer"); + + b.Property("HomeAddress") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IssuingAgency") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("character varying(50)"); + + b.Property("Phone") + .HasColumnType("bigint"); + + b.Property("PhoneDDD") + .HasColumnType("integer"); + + b.Property("RG") + .HasColumnType("bigint"); + + b.Property("Race") + .HasColumnType("integer"); + + b.Property("RegistrationCode") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("character varying(20)"); + + b.Property("StartYear") + .IsRequired() + .HasColumnType("text"); + + b.Property("UF") + .IsRequired() + .HasMaxLength(2) + .HasColumnType("character(2)") + .IsFixedLength(); + + b.Property("UserId") + .IsRequired() + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("AssistanceTypeId"); + + b.HasIndex("CampusId"); + + b.HasIndex("CourseId"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Students", "public"); + }); + + modelBuilder.Entity("Domain.Entities.StudentDocuments", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AccountNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("AccountOpeningProof") + .IsRequired() + .HasColumnType("text"); + + b.Property("AgencyNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("CPF") + .IsRequired() + .HasColumnType("text"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("IdentityDocument") + .IsRequired() + .HasColumnType("text"); + + b.Property("ParentalAuthorization") + .HasColumnType("text"); + + b.Property("Photo3x4") + .IsRequired() + .HasColumnType("text"); + + b.Property("ProjectId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("ScholarCommitmentAgreement") + .IsRequired() + .HasColumnType("text"); + + b.Property("SchoolHistory") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId") + .IsUnique(); + + b.ToTable("StudentDocuments", "public"); + }); + + modelBuilder.Entity("Domain.Entities.SubArea", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("AreaId") + .IsRequired() + .HasColumnType("uuid"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.HasKey("Id"); + + b.HasIndex("AreaId"); + + b.ToTable("SubAreas", "public"); + }); + + modelBuilder.Entity("Domain.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CPF") + .IsRequired() + .HasMaxLength(15) + .HasColumnType("character varying(15)"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("IsConfirmed") + .HasColumnType("boolean"); + + b.Property("IsCoordinator") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("Password") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("character varying(300)"); + + b.Property("ResetPasswordToken") + .HasMaxLength(6) + .HasColumnType("character varying(6)"); + + b.Property("Role") + .HasColumnType("integer"); + + b.Property("ValidationCode") + .HasMaxLength(6) + .HasColumnType("character varying(6)"); + + b.HasKey("Id"); + + b.ToTable("Users", "public"); + }); + + modelBuilder.Entity("Domain.Entities.Activity", b => + { + b.HasOne("Domain.Entities.ActivityType", "ActivityType") + .WithMany("Activities") + .HasForeignKey("ActivityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ActivityType"); + }); + + modelBuilder.Entity("Domain.Entities.ActivityType", b => + { + b.HasOne("Domain.Entities.Notice", "Notice") + .WithMany() + .HasForeignKey("NoticeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Notice"); + }); + + modelBuilder.Entity("Domain.Entities.Area", b => + { + b.HasOne("Domain.Entities.MainArea", "MainArea") + .WithMany() + .HasForeignKey("MainAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MainArea"); + }); + + modelBuilder.Entity("Domain.Entities.Professor", b => + { + b.HasOne("Domain.Entities.User", "User") + .WithOne() + .HasForeignKey("Domain.Entities.Professor", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Domain.Entities.Project", b => + { + b.HasOne("Domain.Entities.Notice", "Notice") + .WithMany() + .HasForeignKey("NoticeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.Professor", "Professor") + .WithMany() + .HasForeignKey("ProfessorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.ProgramType", "ProgramType") + .WithMany() + .HasForeignKey("ProgramTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.Student", "Student") + .WithMany() + .HasForeignKey("StudentId"); + + b.HasOne("Domain.Entities.SubArea", "SubArea") + .WithMany() + .HasForeignKey("SubAreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Notice"); + + b.Navigation("Professor"); + + b.Navigation("ProgramType"); + + b.Navigation("Student"); + + b.Navigation("SubArea"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectActivity", b => + { + b.HasOne("Domain.Entities.Activity", "Activity") + .WithMany() + .HasForeignKey("ActivityId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Activity"); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectEvaluation", b => + { + b.HasOne("Domain.Entities.User", "AppealEvaluator") + .WithMany() + .HasForeignKey("AppealEvaluatorId"); + + b.HasOne("Domain.Entities.User", "DocumentsEvaluator") + .WithMany() + .HasForeignKey("DocumentsEvaluatorId"); + + b.HasOne("Domain.Entities.Project", "Project") + .WithOne() + .HasForeignKey("Domain.Entities.ProjectEvaluation", "ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.User", "SubmissionEvaluator") + .WithMany() + .HasForeignKey("SubmissionEvaluatorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AppealEvaluator"); + + b.Navigation("DocumentsEvaluator"); + + b.Navigation("Project"); + + b.Navigation("SubmissionEvaluator"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectFinalReport", b => + { + b.HasOne("Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Domain.Entities.ProjectPartialReport", b => + { + b.HasOne("Domain.Entities.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Domain.Entities.Student", b => + { + b.HasOne("Domain.Entities.AssistanceType", "AssistanceType") + .WithMany() + .HasForeignKey("AssistanceTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.Campus", "Campus") + .WithMany() + .HasForeignKey("CampusId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.Course", "Course") + .WithMany() + .HasForeignKey("CourseId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Domain.Entities.User", "User") + .WithOne() + .HasForeignKey("Domain.Entities.Student", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AssistanceType"); + + b.Navigation("Campus"); + + b.Navigation("Course"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Domain.Entities.StudentDocuments", b => + { + b.HasOne("Domain.Entities.Project", "Project") + .WithOne() + .HasForeignKey("Domain.Entities.StudentDocuments", "ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("Domain.Entities.SubArea", b => + { + b.HasOne("Domain.Entities.Area", "Area") + .WithMany() + .HasForeignKey("AreaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Area"); + }); + + modelBuilder.Entity("Domain.Entities.ActivityType", b => + { + b.Navigation("Activities"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Infrastructure/WebAPI/WebAPI.csproj b/src/Infrastructure/WebAPI/WebAPI.csproj index 5aff8fab..4d76cc9a 100644 --- a/src/Infrastructure/WebAPI/WebAPI.csproj +++ b/src/Infrastructure/WebAPI/WebAPI.csproj @@ -6,7 +6,7 @@ ../../docker-compose.dcproj ef326666-1cfa-4625-aae3-41ea85c01828 0.0.1 - true + false diff --git a/src/Infrastructure/WebAPI/appsettings.development.json b/src/Infrastructure/WebAPI/appsettings.development.json deleted file mode 100644 index 0967ef42..00000000 --- a/src/Infrastructure/WebAPI/appsettings.development.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/src/Infrastructure/WebAPI/appsettings.json b/src/Infrastructure/WebAPI/appsettings.json index eca30395..2f4822eb 100644 --- a/src/Infrastructure/WebAPI/appsettings.json +++ b/src/Infrastructure/WebAPI/appsettings.json @@ -1,8 +1,5 @@ { "SiteUrl": "https://localhost:5001", - "ConnectionStrings": { - "DefaultConnection": "Server=localhost;Database=COPET_DB;Port=15432;User ID=copet-admin;password=Copet@123;Include Error Detail=true;" - }, "Serilog": { "Using": ["Serilog.Sinks.Console", "Serilog.Sinks.File"], "MinimumLevel": { @@ -52,7 +49,7 @@ ] }, "StorageFile": { - "Directory": "/Users/eduardo/Projects/CEFET/CopetSystem/CopetSystem.API/files", + "Directory": "/Users/eduardo/Projects/CEFET/CopetSystem/GPIC.WebAPI/files", "Folder": "blobs", "AllowedExtensions": [".txt", ".pdf", ".doc", ".docx", ".png", ".jpg"], "MaxFileSizeInBytes": 10485760 @@ -64,5 +61,5 @@ "Server": "smtp.office365.com", "Port": 587 }, - "TempPath": "/Users/eduardo/Projects/CEFET/CopetSystem/CopetSystem.API/temp" + "TempPath": "/Users/eduardo/Projects/CEFET/CopetSystem/GPIC.WebAPI/temp" } diff --git a/src/Infrastructure/WebFunctions/Dockerfile b/src/Infrastructure/WebFunctions/Dockerfile new file mode 100644 index 00000000..6d709e89 --- /dev/null +++ b/src/Infrastructure/WebFunctions/Dockerfile @@ -0,0 +1,34 @@ +#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. + +# FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated7.0 AS base +FROM mohsinonxrm/azure-functions-dotnet:4-isolated7.0-arm64v8 AS base +WORKDIR /app +EXPOSE 80 + +FROM mcr.microsoft.com/dotnet/runtime:7.0 as runtime7.0 +FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build + +COPY --from=runtime7.0 /usr/share/dotnet/host /usr/share/dotnet/host +COPY --from=runtime7.0 /usr/share/dotnet/shared /usr/share/dotnet/shared + +ENV AzureWebJobsStorage="UseDevelopmentStorage=true" +ENV AzureFunctionsJobHost__Logging__Console__IsEnabled=true + +WORKDIR /src +COPY ["Domain/Domain.csproj", "Domain/"] +COPY ["Application/Application.csproj", "Application/"] +COPY ["Infrastructure/Services/Services.csproj", "Infrastructure/Services/"] +COPY ["Infrastructure/Persistence/Persistence.csproj", "Infrastructure/Persistence/"] +COPY ["Infrastructure/IoC/IoC.csproj", "Infrastructure/IoC/"] +COPY ["Infrastructure/WebFunctions/WebFunctions.csproj", "Infrastructure/WebFunctions/"] +RUN dotnet restore "Infrastructure/WebFunctions/WebFunctions.csproj" +COPY . . +WORKDIR "/src/Infrastructure/WebFunctions" +RUN dotnet build "WebFunctions.csproj" -c Release -o /app/build + +FROM build AS publish +RUN dotnet publish "WebFunctions.csproj" -c Release -o /app/publish /p:UseAppHost=false + +FROM base AS final +WORKDIR /app +COPY --from=publish /app/publish . diff --git a/src/Infrastructure/WebFunctions/appsettings.json b/src/Infrastructure/WebFunctions/appsettings.json index 2015d529..2f4822eb 100644 --- a/src/Infrastructure/WebFunctions/appsettings.json +++ b/src/Infrastructure/WebFunctions/appsettings.json @@ -1,8 +1,5 @@ { "SiteUrl": "https://localhost:5001", - "ConnectionStrings": { - "DefaultConnection": "Server=localhost;Database=COPET_DB;Port=15432;User ID=copet-admin;password=Copet@123;Include Error Detail=true;" - }, "Serilog": { "Using": ["Serilog.Sinks.Console", "Serilog.Sinks.File"], "MinimumLevel": { @@ -52,6 +49,8 @@ ] }, "StorageFile": { + "Directory": "/Users/eduardo/Projects/CEFET/CopetSystem/GPIC.WebAPI/files", + "Folder": "blobs", "AllowedExtensions": [".txt", ".pdf", ".doc", ".docx", ".png", ".jpg"], "MaxFileSizeInBytes": 10485760 }, @@ -62,5 +61,5 @@ "Server": "smtp.office365.com", "Port": 587 }, - "TempPath": "/Users/eduardo/Projects/CEFET/CopetSystem/CopetSystem.API/temp" + "TempPath": "/Users/eduardo/Projects/CEFET/CopetSystem/GPIC.WebAPI/temp" } From ce77ec716e1685f30bd2f9132cf846b45369948a Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 7 Sep 2023 19:04:14 -0300 Subject: [PATCH 138/201] chore: adjust webfunctions dockerfile --- src/Infrastructure/WebAPI/WebAPI.csproj | 1 - src/Infrastructure/WebFunctions/Dockerfile | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Infrastructure/WebAPI/WebAPI.csproj b/src/Infrastructure/WebAPI/WebAPI.csproj index 4d76cc9a..f5598dd2 100644 --- a/src/Infrastructure/WebAPI/WebAPI.csproj +++ b/src/Infrastructure/WebAPI/WebAPI.csproj @@ -3,7 +3,6 @@ net7.0 enable enable - ../../docker-compose.dcproj ef326666-1cfa-4625-aae3-41ea85c01828 0.0.1 false diff --git a/src/Infrastructure/WebFunctions/Dockerfile b/src/Infrastructure/WebFunctions/Dockerfile index 6d709e89..b82b47ca 100644 --- a/src/Infrastructure/WebFunctions/Dockerfile +++ b/src/Infrastructure/WebFunctions/Dockerfile @@ -31,4 +31,4 @@ RUN dotnet publish "WebFunctions.csproj" -c Release -o /app/publish /p:UseAppHos FROM base AS final WORKDIR /app -COPY --from=publish /app/publish . +COPY --from=publish /app/publish . \ No newline at end of file From b55803d5cf4648fbe0612d1d0c018dc4a0ffe02a Mon Sep 17 00:00:00 2001 From: eduardo Date: Mon, 11 Sep 2023 19:05:46 -0300 Subject: [PATCH 139/201] feat: add temporary folder creation --- src/Infrastructure/Services/ReportService.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Infrastructure/Services/ReportService.cs b/src/Infrastructure/Services/ReportService.cs index edd06ba9..be591147 100644 --- a/src/Infrastructure/Services/ReportService.cs +++ b/src/Infrastructure/Services/ReportService.cs @@ -32,6 +32,10 @@ public ReportService(IConfiguration configuration) { DayOfWeek.Friday, "Sexta-feira" }, { DayOfWeek.Saturday, "Sábado" } }; + + // Verifica se o caminho temporário existe, não existindo cria + if (!Directory.Exists(_outputPath)) + Directory.CreateDirectory(_outputPath); } public async Task GenerateCertificateAsync(Project project, string cordinatorName, string fileName) From 883b58b3e0d47bbd95cbf80002f4dae9081d5f5d Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 14:29:07 -0300 Subject: [PATCH 140/201] feat: create directory for local storage if doesn't exist --- src/Infrastructure/Services/StorageFileService.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Infrastructure/Services/StorageFileService.cs b/src/Infrastructure/Services/StorageFileService.cs index b991bc79..a2c90930 100644 --- a/src/Infrastructure/Services/StorageFileService.cs +++ b/src/Infrastructure/Services/StorageFileService.cs @@ -33,6 +33,12 @@ public StorageFileService(IConfiguration configuration) // Verifica se o diretório de armazenamento de arquivos dos editais foi configurado _folder = configuration["StorageFile:Folder"] ?? throw new Exception("O diretório de armazenamento de arquivos não foi configurado."); + + // Cria diretório de arquivos caso não exista + if (!Directory.Exists(_directory)) + { + _ = Directory.CreateDirectory(_directory); + } } #endregion Global Scope @@ -116,7 +122,7 @@ public async Task UploadFileAsync(byte[] file, string? filePath) #endregion Public Methods #region Private Methods - private async Task GenerateFilePath(IFormFile file, string custom_directory, string? filePath = null, bool onlyPdf = false) + private async Task GenerateFilePath(IFormFile file, string customDirectory, string? filePath = null, bool onlyPdf = false) { // Verifica se a extensão do arquivo é permitida string extension = Path.GetExtension(file.FileName); @@ -138,7 +144,7 @@ private async Task GenerateFilePath(IFormFile file, string custom_direct if (string.IsNullOrEmpty(filePath)) { // Cria o diretório caso não exista - string dirPath = Path.Combine(_directory, custom_directory); + string dirPath = Path.Combine(_directory, customDirectory); if (!Directory.Exists(dirPath)) { _ = Directory.CreateDirectory(dirPath); From 37ba74e7c82799a0b16820ac73934cf444443d93 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 14:29:42 -0300 Subject: [PATCH 141/201] chore: add docker-compose for webfunction --- src/Docker/WebFunction/docker-compose.yml | 35 +++++++++++++++++++ .../WebFunctions/WebFunctions.csproj | 7 ++-- .../WebFunctions/appsettings.json | 4 +-- src/Infrastructure/WebFunctions/function.json | 0 4 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 src/Docker/WebFunction/docker-compose.yml create mode 100644 src/Infrastructure/WebFunctions/function.json diff --git a/src/Docker/WebFunction/docker-compose.yml b/src/Docker/WebFunction/docker-compose.yml new file mode 100644 index 00000000..b9924fdb --- /dev/null +++ b/src/Docker/WebFunction/docker-compose.yml @@ -0,0 +1,35 @@ +version: '3.4' + +services: + + # Web Functions + webfunctions: + container_name: webfunctions_gpic + image: ${DOCKER_REGISTRY-}webfunctions + build: + context: ../../ + dockerfile: Infrastructure/WebFunctions/Dockerfile + ports: + - "7071:80" + volumes: + - ~/.microsoft/usersecrets:/root/.microsoft/usersecrets:ro + environment: + - AzureWebJobsStorage=UseDevelopmentStorage=true + - AzureFunctionsJobHost__Logging__Console__IsEnabled=true + depends_on: + - azurite + networks: + - gpic-network + + # Azurite - Storage Emulator (Blob, Queue, Table) + azurite: + container_name: azurite_gpic + image: mcr.microsoft.com/azure-storage/azurite + ports: + - "10000:10000" + - "10001:10001" + - "10002:10002" + environment: + - AZURITE_ACCOUNTS=devstoreaccount1:devstoreaccount1Key + networks: + - gpic-network diff --git a/src/Infrastructure/WebFunctions/WebFunctions.csproj b/src/Infrastructure/WebFunctions/WebFunctions.csproj index 2ffc0c2e..77225487 100644 --- a/src/Infrastructure/WebFunctions/WebFunctions.csproj +++ b/src/Infrastructure/WebFunctions/WebFunctions.csproj @@ -1,10 +1,11 @@ - net7.0 - v4 Exe - enable enable + enable + net7.0 + v4 + 1.0.0 diff --git a/src/Infrastructure/WebFunctions/appsettings.json b/src/Infrastructure/WebFunctions/appsettings.json index 2f4822eb..556a4742 100644 --- a/src/Infrastructure/WebFunctions/appsettings.json +++ b/src/Infrastructure/WebFunctions/appsettings.json @@ -49,7 +49,7 @@ ] }, "StorageFile": { - "Directory": "/Users/eduardo/Projects/CEFET/CopetSystem/GPIC.WebAPI/files", + "Directory": "./files", "Folder": "blobs", "AllowedExtensions": [".txt", ".pdf", ".doc", ".docx", ".png", ".jpg"], "MaxFileSizeInBytes": 10485760 @@ -61,5 +61,5 @@ "Server": "smtp.office365.com", "Port": 587 }, - "TempPath": "/Users/eduardo/Projects/CEFET/CopetSystem/GPIC.WebAPI/temp" + "TempPath": "./temp" } diff --git a/src/Infrastructure/WebFunctions/function.json b/src/Infrastructure/WebFunctions/function.json new file mode 100644 index 00000000..e69de29b From 7f8401fc3135032b174c5fb5586e7aa538108d6a Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 15:08:38 -0300 Subject: [PATCH 142/201] feat: add ClosePendingProjects web function --- .../UseCases/Project/IClosePendingProjects.cs | 11 +++++ .../UseCases/Project/ClosePendingProjects.cs | 28 +++++++++++ .../Repositories/IProjectRepository.cs | 6 +++ src/Infrastructure/IoC/ApplicationDI.cs | 1 + .../Repositories/ProjectRepository.cs | 39 +++++++++++++++ .../Functions/ClosePendingProjectsFunction.cs | 49 +++++++++++++++++++ 6 files changed, 134 insertions(+) create mode 100644 src/Application/Interfaces/UseCases/Project/IClosePendingProjects.cs create mode 100644 src/Application/UseCases/Project/ClosePendingProjects.cs create mode 100644 src/Infrastructure/WebFunctions/Functions/ClosePendingProjectsFunction.cs diff --git a/src/Application/Interfaces/UseCases/Project/IClosePendingProjects.cs b/src/Application/Interfaces/UseCases/Project/IClosePendingProjects.cs new file mode 100644 index 00000000..5ce83eab --- /dev/null +++ b/src/Application/Interfaces/UseCases/Project/IClosePendingProjects.cs @@ -0,0 +1,11 @@ +namespace Application.Interfaces.UseCases.Project +{ + public interface IClosePendingProjects + { + /// + /// Encerra todos os projetos que estão com alguma pendência e cujo prazo de resolução da pendência já tenha expirado. + /// + /// Resultado do processo de encerramento dos projetos + Task ExecuteAsync(); + } +} \ No newline at end of file diff --git a/src/Application/UseCases/Project/ClosePendingProjects.cs b/src/Application/UseCases/Project/ClosePendingProjects.cs new file mode 100644 index 00000000..8557f7cf --- /dev/null +++ b/src/Application/UseCases/Project/ClosePendingProjects.cs @@ -0,0 +1,28 @@ +using Application.Interfaces.UseCases.Project; +using Domain.Interfaces.Repositories; + +namespace Application.UseCases.Project +{ + public class ClosePendingProjects : IClosePendingProjects + { + #region Global Scope + private readonly IProjectRepository _projectRepository; + public ClosePendingProjects( + IProjectRepository projectRepository) + { + _projectRepository = projectRepository; + } + #endregion + + public async Task ExecuteAsync() + { + /// Realiza o cancelamento de todos os projetos pendentes e com o prazo de resolução vendido. + /// Casos: + /// - Projetos abertos e com o prazo de submissão vencido; + // - Projetos rejeitados e com o prazo de recurso vencido; + // - Projetos aprovados e com entrega de documentação do aluno vencida; + // - Projetos pendentes de documentação e com o prazo de entrega vencido. + return await _projectRepository.ClosePendingAndOverdueProjectsAsync(); + } + } +} \ No newline at end of file diff --git a/src/Domain/Interfaces/Repositories/IProjectRepository.cs b/src/Domain/Interfaces/Repositories/IProjectRepository.cs index f7697674..7be2dd1a 100644 --- a/src/Domain/Interfaces/Repositories/IProjectRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProjectRepository.cs @@ -85,5 +85,11 @@ public interface IProjectRepository /// A data de entrega de relatório parcial ou final é considerada próxima quando a mesma está a um mês ou 7 dias de distância. /// Task> GetProjectsWithCloseReportDueDateAsync(); + + /// + /// Obtém projetos com alguma pendência e cujo prazo de resolução da pendência esteja vencido. + /// + /// Resultado do processo de encerramento dos projetos. + Task ClosePendingAndOverdueProjectsAsync(); } } \ No newline at end of file diff --git a/src/Infrastructure/IoC/ApplicationDI.cs b/src/Infrastructure/IoC/ApplicationDI.cs index 7aa30200..62d83a33 100644 --- a/src/Infrastructure/IoC/ApplicationDI.cs +++ b/src/Infrastructure/IoC/ApplicationDI.cs @@ -132,6 +132,7 @@ public static IServiceCollection AddApplication(this IServiceCollection services services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); #endregion Project #region ProjectEvaluation diff --git a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs index 709af464..382a052e 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs @@ -216,5 +216,44 @@ x.Status is EProjectStatus.Started )) .ToListAsync(); } + + public async Task ClosePendingAndOverdueProjectsAsync() + { + // Obtém data atual em UTC para comparação + DateTime currentDate = DateTime.UtcNow; + + // Obtém projetos pendentes e com o prazo de resolução vencido + var projects = await _context.Projects + .Include(x => x.Notice) + .AsAsyncEnumerable() + .Where(x => + // Projetos abertos e com o prazo de submissão vencido + (x.Status is EProjectStatus.Opened && x.Notice!.RegistrationEndDate < currentDate) || + // Projetos rejeitados e com o prazo de recurso vencido + (x.Status is EProjectStatus.Rejected && x.Notice!.AppealEndDate < currentDate) || + // Projetos aprovados e com entrega de documentação do aluno vencida + (x.Status is EProjectStatus.Accepted && x.Notice!.SendingDocsEndDate < currentDate) || + // Projetos pendentes de documentação e com o prazo de entrega vencido + (x.Status is EProjectStatus.Pending && x.Notice!.SendingDocsEndDate < currentDate)) + .ToListAsync(); + + // Verifica se existem projetos pendentes e com prazo vencido + if (projects.Count == 0) + return "Nenhum projeto pendente e com prazo vencido foi encontrado."; + + // Atualiza status dos projetos + projects.ForEach(x => + { + x.Status = EProjectStatus.Canceled; + x.StatusDescription = "Projeto cancelado automaticamente por falta de ação dentro do prazo estipulado."; + }); + + // Atualiza modificações realizadas no banco + _context.UpdateRange(projects); + _ = await _context.SaveChangesAsync(); + + // Retorna mensagem de sucesso + return $"{projects.Count} projetos pendentes e com prazo de resolução vencido foram cancelados com sucesso."; + } } } \ No newline at end of file diff --git a/src/Infrastructure/WebFunctions/Functions/ClosePendingProjectsFunction.cs b/src/Infrastructure/WebFunctions/Functions/ClosePendingProjectsFunction.cs new file mode 100644 index 00000000..3ce6483d --- /dev/null +++ b/src/Infrastructure/WebFunctions/Functions/ClosePendingProjectsFunction.cs @@ -0,0 +1,49 @@ +using Application.Interfaces.UseCases.Project; +using Microsoft.Azure.Functions.Worker; +using Microsoft.Extensions.Logging; +using WebFunctions.Models; + +namespace WebFunctions.Functions +{ + public class ClosePendingProjectsFunction + { + private readonly ILogger _logger; + private readonly IClosePendingProjects _closePendingProjects; + public ClosePendingProjectsFunction(ILogger logger, IClosePendingProjects closePendingProjects) + { + _logger = logger; + _closePendingProjects = closePendingProjects; + } + + /// + /// Encerra todos os projetos que estão com alguma pendência e que a data de expiração já passou. + /// Execução diária às 06:00 UTC, equivalente à 03:00 BRT. + /// + /// Informações do timer. + [Function("ClosePendingProjects")] + public async Task Run([TimerTrigger("0 0 6 * * *")] CustomTimerInfo timer) + { + // Informa início da execução + _logger.LogInformation("Encerramento de projetos com pendência e fora do prazo iniciada."); + + try + { + // Realiza o encerramento dos projetos + string result = await _closePendingProjects.ExecuteAsync(); + + // Informa fim da execução + _logger.LogInformation("Encerramento de projetos com pendência e fora do prazo finalizada. Resultado: {Result}", result); + } + catch (Exception ex) + { + _logger.LogError("Erro ao executar encerramento de projetos com pendência e fora do prazo.", ex); + } + + // Informa próxima execução + if (timer is not null) + { + _logger.LogInformation("Próxima encerramento de projetos com pendência e fora do prazo: {NextExecutionTime}", timer.ScheduleStatus?.Next.ToString("dd/MM/yyyy HH:mm:ss")); + } + } + } +} \ No newline at end of file From 7cedd17541557ee920ba06c69cd58da8aacbe7a9 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 16:54:53 -0300 Subject: [PATCH 143/201] feat: add front-end url to emails --- src/Infrastructure/IoC/ExternalServicesDI.cs | 2 +- src/Infrastructure/IoC/Utils/DotEnvSecrets.cs | 5 +++++ src/Infrastructure/Services/Email/EmailService.cs | 4 ++-- .../Services/Email/Factories/EmailServiceFactory.cs | 5 ++--- .../Services/Email/Factories/IEmailServiceFactory.cs | 3 +-- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/Infrastructure/IoC/ExternalServicesDI.cs b/src/Infrastructure/IoC/ExternalServicesDI.cs index be0d9cc9..6a20c625 100644 --- a/src/Infrastructure/IoC/ExternalServicesDI.cs +++ b/src/Infrastructure/IoC/ExternalServicesDI.cs @@ -27,7 +27,7 @@ public static IServiceCollection AddExternalServices(this IServiceCollection ser services.AddSingleton(sp => { IEmailServiceFactory factory = sp.GetRequiredService(); - return factory.Create(smtpConfig, configuration); + return factory.Create(smtpConfig, dotEnvSecrets.GetFrontEndUrl()); }); #endregion Serviço de E-mail diff --git a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs index 9244906e..7d536db0 100644 --- a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs +++ b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs @@ -13,6 +13,11 @@ public DotEnvSecrets() _ = DotNetEnv.Env.Load(Path.Combine(basePath!, ".env")); } + public string GetFrontEndUrl() + { + return DotNetEnv.Env.GetString("FRONTEND_URL"); + } + public string GetSeqUrl() { return DotNetEnv.Env.GetString("SEQ_URL"); diff --git a/src/Infrastructure/Services/Email/EmailService.cs b/src/Infrastructure/Services/Email/EmailService.cs index c779c746..29b2858e 100644 --- a/src/Infrastructure/Services/Email/EmailService.cs +++ b/src/Infrastructure/Services/Email/EmailService.cs @@ -16,14 +16,14 @@ public class EmailService : IEmailService private readonly string? _siteUrl; private readonly string? _logoGpic; - public EmailService(string? smtpServer, int smtpPort, string? smtpUsername, string? smtpPassword, IConfiguration configuration) + public EmailService(string? smtpServer, int smtpPort, string? smtpUsername, string? smtpPassword, string frontEndUrl) { _smtpServer = smtpServer; _smtpPort = smtpPort; _smtpUsername = smtpUsername; _smtpPassword = smtpPassword; _currentDirectory = AppContext.BaseDirectory; - _siteUrl = configuration.GetSection("SiteUrl").Value; + _siteUrl = frontEndUrl; _logoGpic = Convert.ToBase64String(File.ReadAllBytes(Path.Combine(_currentDirectory, "Email/Templates/Imgs/logo-gpic-original.svg"))); } #endregion Global Scope diff --git a/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs b/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs index c59a00f9..572f6073 100644 --- a/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs +++ b/src/Infrastructure/Services/Email/Factories/EmailServiceFactory.cs @@ -1,19 +1,18 @@ using Domain.Interfaces.Services; using Services.Email.Configs; -using Microsoft.Extensions.Configuration; namespace Services.Email.Factories { public class EmailServiceFactory : IEmailServiceFactory { - public IEmailService Create(SmtpConfiguration settings, IConfiguration configuration) + public IEmailService Create(SmtpConfiguration settings, string frontEndUrl) { return new EmailService( settings.Server, settings.Port, settings.Username, settings.Password, - configuration); + frontEndUrl); } } } \ No newline at end of file diff --git a/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs b/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs index c0ceb9cd..ba686c90 100644 --- a/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs +++ b/src/Infrastructure/Services/Email/Factories/IEmailServiceFactory.cs @@ -1,11 +1,10 @@ using Domain.Interfaces.Services; -using Microsoft.Extensions.Configuration; using Services.Email.Configs; namespace Services.Email.Factories { public interface IEmailServiceFactory { - IEmailService Create(SmtpConfiguration settings, IConfiguration configuration); + IEmailService Create(SmtpConfiguration settings, string frontEndUrl); } } \ No newline at end of file From f6a516b3caa794f108d0d883dcccf41979b16897 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 18:13:58 -0300 Subject: [PATCH 144/201] tests: add more project unit tests --- .../Entities/ProjectActivityUnitTests.cs | 159 ++++++++++++++++++ .../Entities/ProjectFinalReportUnitTests.cs | 121 +++++++++++++ .../Entities/ProjectPartialReportUnitTests.cs | 155 +++++++++++++++++ src/Domain/Entities/ProjectActivity.cs | 5 - 4 files changed, 435 insertions(+), 5 deletions(-) create mode 100644 src/Domain.Tests/Entities/ProjectActivityUnitTests.cs create mode 100644 src/Domain.Tests/Entities/ProjectFinalReportUnitTests.cs create mode 100644 src/Domain.Tests/Entities/ProjectPartialReportUnitTests.cs diff --git a/src/Domain.Tests/Entities/ProjectActivityUnitTests.cs b/src/Domain.Tests/Entities/ProjectActivityUnitTests.cs new file mode 100644 index 00000000..cffda1e0 --- /dev/null +++ b/src/Domain.Tests/Entities/ProjectActivityUnitTests.cs @@ -0,0 +1,159 @@ +using Domain.Entities; +using Domain.Validation; +using FluentAssertions; +using System; +using Xunit; + +namespace Domain.Tests.Entities +{ + public class ProjectActivityUnitTests + { + private static ProjectActivity MockValidProjectActivity() => new(Guid.NewGuid(), Guid.NewGuid(), 5, 3); + + [Fact] + public void ProjectId_SetValidProjectId_PropertyIsSet() + { + // Arrange + var projectActivity = MockValidProjectActivity(); + + // Act + projectActivity.ProjectId = Guid.NewGuid(); + + // Assert + projectActivity.ProjectId.Should().NotBeNull(); + } + + [Fact] + public void ActivityId_SetValidActivityId_PropertyIsSet() + { + // Arrange + var projectActivity = MockValidProjectActivity(); + + // Act + projectActivity.ActivityId = Guid.NewGuid(); + + // Assert + projectActivity.ActivityId.Should().NotBeNull(); + } + + [Fact] + public void InformedActivities_SetValidInformedActivities_PropertyIsSet() + { + // Arrange + var projectActivity = MockValidProjectActivity(); + + // Act + projectActivity.InformedActivities = 5; + + // Assert + projectActivity.InformedActivities.Should().Be(5); + } + + [Fact] + public void FoundActivities_SetValidFoundActivities_PropertyIsSet() + { + // Arrange + var projectActivity = MockValidProjectActivity(); + + // Act + projectActivity.FoundActivities = 3; + + // Assert + projectActivity.FoundActivities.Should().Be(3); + } + + [Fact] + public void Constructor_ValidParameters_PropertiesSetCorrectly() + { + // Arrange + var projectId = Guid.NewGuid(); + var activityId = Guid.NewGuid(); + var informedActivities = 5; + var foundActivities = 3; + + // Act + var projectActivity = new ProjectActivity(projectId, activityId, informedActivities, foundActivities); + + // Assert + projectActivity.ProjectId.Should().Be(projectId); + projectActivity.ActivityId.Should().Be(activityId); + projectActivity.InformedActivities.Should().Be(informedActivities); + projectActivity.FoundActivities.Should().Be(foundActivities); + } + + [Fact] + public void Constructor_NullProjectId_ThrowsException() + { + // Act & Assert + Assert.Throws(() => + new ProjectActivity(null, Guid.NewGuid(), 5, 3)); + } + + [Fact] + public void Constructor_NullActivityId_ThrowsException() + { + // Act & Assert + Assert.Throws(() => + new ProjectActivity(Guid.NewGuid(), null, 5, 3)); + } + + [Fact] + public void Constructor_NullInformedActivities_ThrowsException() + { + // Act & Assert + Assert.Throws(() => + new ProjectActivity(Guid.NewGuid(), Guid.NewGuid(), null, 3)); + } + + [Fact] + public void Constructor_NullFoundActivities_ThrowsException() + { + // Act & Assert + Assert.Throws(() => + new ProjectActivity(Guid.NewGuid(), Guid.NewGuid(), 5, null)); + } + + [Fact] + public void CalculatePoints_ActivityIsNull_ThrowsException() + { + // Arrange + var projectActivity = new ProjectActivity(Guid.NewGuid(), Guid.NewGuid(), 5, 3); + + // Act & Assert + Assert.Throws(() => + projectActivity.CalculatePoints()); + } + + [Fact] + public void CalculatePoints_ActivityHasNoLimits_ReturnsCorrectPoints() + { + // Arrange + var activity = new Activity("Activity", 2, null, Guid.NewGuid()); + + var projectActivity = new ProjectActivity(Guid.NewGuid(), Guid.NewGuid(), 5, 3); + projectActivity.Activity = activity; + + // Act + var points = projectActivity.CalculatePoints(); + + // Assert + points.Should().Be(6); // 2 points * 3 found activities + } + + [Fact] + public void CalculatePoints_ActivityHasLimits_ReturnsCorrectPoints() + { + // Arrange + var activity = new Activity("Activity", 2, 5, Guid.NewGuid()); + + var projectActivity = new ProjectActivity(Guid.NewGuid(), Guid.NewGuid(), 5, 3); + projectActivity.Activity = activity; + + // Act + var points = projectActivity.CalculatePoints(); + + // Assert + points.Should().Be(5); // Limited to 5 points + } + } +} diff --git a/src/Domain.Tests/Entities/ProjectFinalReportUnitTests.cs b/src/Domain.Tests/Entities/ProjectFinalReportUnitTests.cs new file mode 100644 index 00000000..3a6185d4 --- /dev/null +++ b/src/Domain.Tests/Entities/ProjectFinalReportUnitTests.cs @@ -0,0 +1,121 @@ +using Domain.Entities; +using Domain.Validation; +using FluentAssertions; +using Xunit; + +namespace Domain.Tests.Entities +{ + public class ProjectFinalReportUnitTests + { + private static ProjectFinalReport MockValidProjectFinalReport() + { + return new ProjectFinalReport(Guid.NewGuid()) + { + ReportUrl = "https://example.com/report", + UserId = Guid.NewGuid(), + SendDate = DateTime.UtcNow + }; + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void SetReportUrl_NullOrEmptyValue_PropertyIsSet(string value) + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + + // Act + projectFinalReport.ReportUrl = value; + + // Assert + projectFinalReport.ReportUrl.Should().Be(value); + } + + [Fact] + public void SetSendDate_ValidValue_PropertyIsSet() + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + var sendDate = DateTime.UtcNow; + + // Act + projectFinalReport.SendDate = sendDate; + + // Assert + projectFinalReport.SendDate.Should().Be(sendDate); + } + + [Fact] + public void SetSendDate_NullValue_ThrowsException() + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + + // Act & Assert + Assert.Throws(() => projectFinalReport.SendDate = null); + } + + [Fact] + public void SetProjectId_ValidValue_PropertyIsSet() + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + var projectId = Guid.NewGuid(); + + // Act + projectFinalReport.ProjectId = projectId; + + // Assert + projectFinalReport.ProjectId.Should().Be(projectId); + } + + [Fact] + public void SetProjectId_NullValue_ThrowsException() + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + + // Act & Assert + Assert.Throws(() => projectFinalReport.ProjectId = null); + } + + [Fact] + public void SetUserId_ValidValue_PropertyIsSet() + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + var userId = Guid.NewGuid(); + + // Act + projectFinalReport.UserId = userId; + + // Assert + projectFinalReport.UserId.Should().Be(userId); + } + + [Fact] + public void SetUserId_NullValue_ThrowsException() + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + + // Act & Assert + Assert.Throws(() => projectFinalReport.UserId = null); + } + + [Fact] + public void Constructor_ValidParameters_PropertiesSetCorrectly() + { + // Arrange + var projectId = Guid.NewGuid(); + + // Act + var projectFinalReport = new ProjectFinalReport(projectId); + + // Assert + projectFinalReport.ProjectId.Should().Be(projectId); + projectFinalReport.SendDate.Should().BeCloseTo(DateTime.UtcNow, TimeSpan.FromSeconds(1)); + } + } +} diff --git a/src/Domain.Tests/Entities/ProjectPartialReportUnitTests.cs b/src/Domain.Tests/Entities/ProjectPartialReportUnitTests.cs new file mode 100644 index 00000000..864641a6 --- /dev/null +++ b/src/Domain.Tests/Entities/ProjectPartialReportUnitTests.cs @@ -0,0 +1,155 @@ +using Domain.Entities; +using Domain.Entities.Enums; +using Domain.Validation; +using FluentAssertions; +using Xunit; +using System; + +namespace Domain.Tests.Entities +{ + public class ProjectPartialReportUnitTests + { + private static ProjectPartialReport MockValidProjectPartialReport() + { + return new ProjectPartialReport(Guid.NewGuid(), 50, EScholarPerformance.Good, "AdditionalInfo", Guid.NewGuid()); + } + + [Fact] + public void SetCurrentDevelopmentStage_ValidValue_PropertyIsSet() + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + var currentDevelopmentStage = 75; + + // Act + projectPartialReport.CurrentDevelopmentStage = currentDevelopmentStage; + + // Assert + projectPartialReport.CurrentDevelopmentStage.Should().Be(currentDevelopmentStage); + } + + [Theory] + [InlineData(-1)] + [InlineData(101)] + public void SetCurrentDevelopmentStage_InvalidValue_ThrowsException(int value) + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + + // Act & Assert + Assert.Throws(() => projectPartialReport.CurrentDevelopmentStage = value); + } + + [Theory] + [InlineData(EScholarPerformance.Bad)] + [InlineData(EScholarPerformance.Regular)] + [InlineData(EScholarPerformance.Good)] + [InlineData(EScholarPerformance.VeryGood)] + [InlineData(EScholarPerformance.Excellent)] + public void SetScholarPerformance_ValidValue_PropertyIsSet(EScholarPerformance value) + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + + // Act + projectPartialReport.ScholarPerformance = value; + + // Assert + projectPartialReport.ScholarPerformance.Should().Be(value); + } + + [Fact] + public void SetScholarPerformance_NullValue_ThrowsException() + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + + // Act & Assert + Assert.Throws(() => projectPartialReport.ScholarPerformance = null); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void SetAdditionalInfo_NullOrEmptyValue_PropertyIsSet(string value) + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + + // Act + projectPartialReport.AdditionalInfo = value; + + // Assert + projectPartialReport.AdditionalInfo.Should().Be(value); + } + + [Fact] + public void SetProjectId_ValidValue_PropertyIsSet() + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + var projectId = Guid.NewGuid(); + + // Act + projectPartialReport.ProjectId = projectId; + + // Assert + projectPartialReport.ProjectId.Should().Be(projectId); + } + + [Fact] + public void SetProjectId_NullValue_ThrowsException() + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + + // Act & Assert + Assert.Throws(() => projectPartialReport.ProjectId = null); + } + + [Fact] + public void SetUserId_ValidValue_PropertyIsSet() + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + var userId = Guid.NewGuid(); + + // Act + projectPartialReport.UserId = userId; + + // Assert + projectPartialReport.UserId.Should().Be(userId); + } + + [Fact] + public void SetUserId_NullValue_ThrowsException() + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + + // Act & Assert + Assert.Throws(() => projectPartialReport.UserId = null); + } + + [Fact] + public void Constructor_ValidParameters_PropertiesSetCorrectly() + { + // Arrange + var projectId = Guid.NewGuid(); + var currentDevelopmentStage = 50; + var scholarPerformance = EScholarPerformance.Good; + var additionalInfo = "AdditionalInfo"; + var userId = Guid.NewGuid(); + + // Act + var projectPartialReport = new ProjectPartialReport(projectId, currentDevelopmentStage, scholarPerformance, additionalInfo, userId); + + // Assert + projectPartialReport.ProjectId.Should().Be(projectId); + projectPartialReport.CurrentDevelopmentStage.Should().Be(currentDevelopmentStage); + projectPartialReport.ScholarPerformance.Should().Be(scholarPerformance); + projectPartialReport.AdditionalInfo.Should().Be(additionalInfo); + projectPartialReport.UserId.Should().Be(userId); + } + } +} diff --git a/src/Domain/Entities/ProjectActivity.cs b/src/Domain/Entities/ProjectActivity.cs index 1b727797..d43b0f71 100644 --- a/src/Domain/Entities/ProjectActivity.cs +++ b/src/Domain/Entities/ProjectActivity.cs @@ -1,8 +1,3 @@ -using System.Diagnostics; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Domain.Entities.Primitives; using Domain.Validation; From bddec37b556939dcff54ac1d081e1ab26fe1a9a6 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 18:29:19 -0300 Subject: [PATCH 145/201] test: add more project unit tests --- .../Entities/ProjectActivityUnitTests.cs | 159 ++++++++++++++++++ .../Entities/ProjectFinalReportUnitTests.cs | 121 +++++++++++++ .../Entities/ProjectPartialReportUnitTests.cs | 155 +++++++++++++++++ src/Domain/Entities/ProjectActivity.cs | 5 - 4 files changed, 435 insertions(+), 5 deletions(-) create mode 100644 src/Domain.Tests/Entities/ProjectActivityUnitTests.cs create mode 100644 src/Domain.Tests/Entities/ProjectFinalReportUnitTests.cs create mode 100644 src/Domain.Tests/Entities/ProjectPartialReportUnitTests.cs diff --git a/src/Domain.Tests/Entities/ProjectActivityUnitTests.cs b/src/Domain.Tests/Entities/ProjectActivityUnitTests.cs new file mode 100644 index 00000000..cffda1e0 --- /dev/null +++ b/src/Domain.Tests/Entities/ProjectActivityUnitTests.cs @@ -0,0 +1,159 @@ +using Domain.Entities; +using Domain.Validation; +using FluentAssertions; +using System; +using Xunit; + +namespace Domain.Tests.Entities +{ + public class ProjectActivityUnitTests + { + private static ProjectActivity MockValidProjectActivity() => new(Guid.NewGuid(), Guid.NewGuid(), 5, 3); + + [Fact] + public void ProjectId_SetValidProjectId_PropertyIsSet() + { + // Arrange + var projectActivity = MockValidProjectActivity(); + + // Act + projectActivity.ProjectId = Guid.NewGuid(); + + // Assert + projectActivity.ProjectId.Should().NotBeNull(); + } + + [Fact] + public void ActivityId_SetValidActivityId_PropertyIsSet() + { + // Arrange + var projectActivity = MockValidProjectActivity(); + + // Act + projectActivity.ActivityId = Guid.NewGuid(); + + // Assert + projectActivity.ActivityId.Should().NotBeNull(); + } + + [Fact] + public void InformedActivities_SetValidInformedActivities_PropertyIsSet() + { + // Arrange + var projectActivity = MockValidProjectActivity(); + + // Act + projectActivity.InformedActivities = 5; + + // Assert + projectActivity.InformedActivities.Should().Be(5); + } + + [Fact] + public void FoundActivities_SetValidFoundActivities_PropertyIsSet() + { + // Arrange + var projectActivity = MockValidProjectActivity(); + + // Act + projectActivity.FoundActivities = 3; + + // Assert + projectActivity.FoundActivities.Should().Be(3); + } + + [Fact] + public void Constructor_ValidParameters_PropertiesSetCorrectly() + { + // Arrange + var projectId = Guid.NewGuid(); + var activityId = Guid.NewGuid(); + var informedActivities = 5; + var foundActivities = 3; + + // Act + var projectActivity = new ProjectActivity(projectId, activityId, informedActivities, foundActivities); + + // Assert + projectActivity.ProjectId.Should().Be(projectId); + projectActivity.ActivityId.Should().Be(activityId); + projectActivity.InformedActivities.Should().Be(informedActivities); + projectActivity.FoundActivities.Should().Be(foundActivities); + } + + [Fact] + public void Constructor_NullProjectId_ThrowsException() + { + // Act & Assert + Assert.Throws(() => + new ProjectActivity(null, Guid.NewGuid(), 5, 3)); + } + + [Fact] + public void Constructor_NullActivityId_ThrowsException() + { + // Act & Assert + Assert.Throws(() => + new ProjectActivity(Guid.NewGuid(), null, 5, 3)); + } + + [Fact] + public void Constructor_NullInformedActivities_ThrowsException() + { + // Act & Assert + Assert.Throws(() => + new ProjectActivity(Guid.NewGuid(), Guid.NewGuid(), null, 3)); + } + + [Fact] + public void Constructor_NullFoundActivities_ThrowsException() + { + // Act & Assert + Assert.Throws(() => + new ProjectActivity(Guid.NewGuid(), Guid.NewGuid(), 5, null)); + } + + [Fact] + public void CalculatePoints_ActivityIsNull_ThrowsException() + { + // Arrange + var projectActivity = new ProjectActivity(Guid.NewGuid(), Guid.NewGuid(), 5, 3); + + // Act & Assert + Assert.Throws(() => + projectActivity.CalculatePoints()); + } + + [Fact] + public void CalculatePoints_ActivityHasNoLimits_ReturnsCorrectPoints() + { + // Arrange + var activity = new Activity("Activity", 2, null, Guid.NewGuid()); + + var projectActivity = new ProjectActivity(Guid.NewGuid(), Guid.NewGuid(), 5, 3); + projectActivity.Activity = activity; + + // Act + var points = projectActivity.CalculatePoints(); + + // Assert + points.Should().Be(6); // 2 points * 3 found activities + } + + [Fact] + public void CalculatePoints_ActivityHasLimits_ReturnsCorrectPoints() + { + // Arrange + var activity = new Activity("Activity", 2, 5, Guid.NewGuid()); + + var projectActivity = new ProjectActivity(Guid.NewGuid(), Guid.NewGuid(), 5, 3); + projectActivity.Activity = activity; + + // Act + var points = projectActivity.CalculatePoints(); + + // Assert + points.Should().Be(5); // Limited to 5 points + } + } +} diff --git a/src/Domain.Tests/Entities/ProjectFinalReportUnitTests.cs b/src/Domain.Tests/Entities/ProjectFinalReportUnitTests.cs new file mode 100644 index 00000000..3a6185d4 --- /dev/null +++ b/src/Domain.Tests/Entities/ProjectFinalReportUnitTests.cs @@ -0,0 +1,121 @@ +using Domain.Entities; +using Domain.Validation; +using FluentAssertions; +using Xunit; + +namespace Domain.Tests.Entities +{ + public class ProjectFinalReportUnitTests + { + private static ProjectFinalReport MockValidProjectFinalReport() + { + return new ProjectFinalReport(Guid.NewGuid()) + { + ReportUrl = "https://example.com/report", + UserId = Guid.NewGuid(), + SendDate = DateTime.UtcNow + }; + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void SetReportUrl_NullOrEmptyValue_PropertyIsSet(string value) + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + + // Act + projectFinalReport.ReportUrl = value; + + // Assert + projectFinalReport.ReportUrl.Should().Be(value); + } + + [Fact] + public void SetSendDate_ValidValue_PropertyIsSet() + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + var sendDate = DateTime.UtcNow; + + // Act + projectFinalReport.SendDate = sendDate; + + // Assert + projectFinalReport.SendDate.Should().Be(sendDate); + } + + [Fact] + public void SetSendDate_NullValue_ThrowsException() + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + + // Act & Assert + Assert.Throws(() => projectFinalReport.SendDate = null); + } + + [Fact] + public void SetProjectId_ValidValue_PropertyIsSet() + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + var projectId = Guid.NewGuid(); + + // Act + projectFinalReport.ProjectId = projectId; + + // Assert + projectFinalReport.ProjectId.Should().Be(projectId); + } + + [Fact] + public void SetProjectId_NullValue_ThrowsException() + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + + // Act & Assert + Assert.Throws(() => projectFinalReport.ProjectId = null); + } + + [Fact] + public void SetUserId_ValidValue_PropertyIsSet() + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + var userId = Guid.NewGuid(); + + // Act + projectFinalReport.UserId = userId; + + // Assert + projectFinalReport.UserId.Should().Be(userId); + } + + [Fact] + public void SetUserId_NullValue_ThrowsException() + { + // Arrange + var projectFinalReport = MockValidProjectFinalReport(); + + // Act & Assert + Assert.Throws(() => projectFinalReport.UserId = null); + } + + [Fact] + public void Constructor_ValidParameters_PropertiesSetCorrectly() + { + // Arrange + var projectId = Guid.NewGuid(); + + // Act + var projectFinalReport = new ProjectFinalReport(projectId); + + // Assert + projectFinalReport.ProjectId.Should().Be(projectId); + projectFinalReport.SendDate.Should().BeCloseTo(DateTime.UtcNow, TimeSpan.FromSeconds(1)); + } + } +} diff --git a/src/Domain.Tests/Entities/ProjectPartialReportUnitTests.cs b/src/Domain.Tests/Entities/ProjectPartialReportUnitTests.cs new file mode 100644 index 00000000..864641a6 --- /dev/null +++ b/src/Domain.Tests/Entities/ProjectPartialReportUnitTests.cs @@ -0,0 +1,155 @@ +using Domain.Entities; +using Domain.Entities.Enums; +using Domain.Validation; +using FluentAssertions; +using Xunit; +using System; + +namespace Domain.Tests.Entities +{ + public class ProjectPartialReportUnitTests + { + private static ProjectPartialReport MockValidProjectPartialReport() + { + return new ProjectPartialReport(Guid.NewGuid(), 50, EScholarPerformance.Good, "AdditionalInfo", Guid.NewGuid()); + } + + [Fact] + public void SetCurrentDevelopmentStage_ValidValue_PropertyIsSet() + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + var currentDevelopmentStage = 75; + + // Act + projectPartialReport.CurrentDevelopmentStage = currentDevelopmentStage; + + // Assert + projectPartialReport.CurrentDevelopmentStage.Should().Be(currentDevelopmentStage); + } + + [Theory] + [InlineData(-1)] + [InlineData(101)] + public void SetCurrentDevelopmentStage_InvalidValue_ThrowsException(int value) + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + + // Act & Assert + Assert.Throws(() => projectPartialReport.CurrentDevelopmentStage = value); + } + + [Theory] + [InlineData(EScholarPerformance.Bad)] + [InlineData(EScholarPerformance.Regular)] + [InlineData(EScholarPerformance.Good)] + [InlineData(EScholarPerformance.VeryGood)] + [InlineData(EScholarPerformance.Excellent)] + public void SetScholarPerformance_ValidValue_PropertyIsSet(EScholarPerformance value) + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + + // Act + projectPartialReport.ScholarPerformance = value; + + // Assert + projectPartialReport.ScholarPerformance.Should().Be(value); + } + + [Fact] + public void SetScholarPerformance_NullValue_ThrowsException() + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + + // Act & Assert + Assert.Throws(() => projectPartialReport.ScholarPerformance = null); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + public void SetAdditionalInfo_NullOrEmptyValue_PropertyIsSet(string value) + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + + // Act + projectPartialReport.AdditionalInfo = value; + + // Assert + projectPartialReport.AdditionalInfo.Should().Be(value); + } + + [Fact] + public void SetProjectId_ValidValue_PropertyIsSet() + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + var projectId = Guid.NewGuid(); + + // Act + projectPartialReport.ProjectId = projectId; + + // Assert + projectPartialReport.ProjectId.Should().Be(projectId); + } + + [Fact] + public void SetProjectId_NullValue_ThrowsException() + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + + // Act & Assert + Assert.Throws(() => projectPartialReport.ProjectId = null); + } + + [Fact] + public void SetUserId_ValidValue_PropertyIsSet() + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + var userId = Guid.NewGuid(); + + // Act + projectPartialReport.UserId = userId; + + // Assert + projectPartialReport.UserId.Should().Be(userId); + } + + [Fact] + public void SetUserId_NullValue_ThrowsException() + { + // Arrange + var projectPartialReport = MockValidProjectPartialReport(); + + // Act & Assert + Assert.Throws(() => projectPartialReport.UserId = null); + } + + [Fact] + public void Constructor_ValidParameters_PropertiesSetCorrectly() + { + // Arrange + var projectId = Guid.NewGuid(); + var currentDevelopmentStage = 50; + var scholarPerformance = EScholarPerformance.Good; + var additionalInfo = "AdditionalInfo"; + var userId = Guid.NewGuid(); + + // Act + var projectPartialReport = new ProjectPartialReport(projectId, currentDevelopmentStage, scholarPerformance, additionalInfo, userId); + + // Assert + projectPartialReport.ProjectId.Should().Be(projectId); + projectPartialReport.CurrentDevelopmentStage.Should().Be(currentDevelopmentStage); + projectPartialReport.ScholarPerformance.Should().Be(scholarPerformance); + projectPartialReport.AdditionalInfo.Should().Be(additionalInfo); + projectPartialReport.UserId.Should().Be(userId); + } + } +} diff --git a/src/Domain/Entities/ProjectActivity.cs b/src/Domain/Entities/ProjectActivity.cs index 1b727797..d43b0f71 100644 --- a/src/Domain/Entities/ProjectActivity.cs +++ b/src/Domain/Entities/ProjectActivity.cs @@ -1,8 +1,3 @@ -using System.Diagnostics; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Domain.Entities.Primitives; using Domain.Validation; From f58863bfcc5d9ef9e2fabce73d9cbad42ce22746 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 18:29:25 -0300 Subject: [PATCH 146/201] test: add GetActivitiesByNoticeIdTests --- .../GetActivitiesByNoticeIdTests.cs | 63 +++++++++++++++++++ .../ActivityType/GetActivitiesByNoticeId.cs | 8 ++- src/Domain/Entities/ActivityType.cs | 1 + 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/Application.Tests/UseCases/ActivityType/GetActivitiesByNoticeIdTests.cs diff --git a/src/Application.Tests/UseCases/ActivityType/GetActivitiesByNoticeIdTests.cs b/src/Application.Tests/UseCases/ActivityType/GetActivitiesByNoticeIdTests.cs new file mode 100644 index 00000000..aea231d6 --- /dev/null +++ b/src/Application.Tests/UseCases/ActivityType/GetActivitiesByNoticeIdTests.cs @@ -0,0 +1,63 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Ports.Activity; +using Application.Interfaces.UseCases.ActivityType; +using Application.UseCases.ActivityType; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.ActivityType +{ + public class GetActivitiesByNoticeIdTests + { + private readonly Mock _activityTypeRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetActivitiesByNoticeId CreateUseCase() + { + return new GetActivitiesByNoticeId(_activityTypeRepositoryMock.Object, _mapperMock.Object); + } + + private static Domain.Entities.ActivityType MockValidActivityType() => new("Type 1", "Unity 1", Guid.NewGuid()); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsListOfActivityTypeOutput() + { + // Arrange + var useCase = CreateUseCase(); + var noticeId = Guid.NewGuid(); + var activityTypes = new List + { + MockValidActivityType() + }; + + _activityTypeRepositoryMock.Setup(repo => repo.GetByNoticeIdAsync(noticeId)).ReturnsAsync(activityTypes); + _mapperMock.Setup(mapper => mapper.Map>(activityTypes)).Returns(new List()); + + // Act + var result = await useCase.ExecuteAsync(noticeId); + + // Assert + Assert.NotNull(result); + _activityTypeRepositoryMock.Verify(repo => repo.GetByNoticeIdAsync(noticeId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(activityTypes), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_InvalidId_ReturnsEmptyList() + { + // Arrange + var useCase = CreateUseCase(); + var invalidNoticeId = Guid.Empty; + + // Act + var result = await useCase.ExecuteAsync(invalidNoticeId); + + // Assert + Assert.NotNull(result); + Assert.Empty(result); + _activityTypeRepositoryMock.Verify(repo => repo.GetByNoticeIdAsync(invalidNoticeId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Never); + } + } +} diff --git a/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs b/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs index 74dd9b39..428dec70 100644 --- a/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs +++ b/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs @@ -20,11 +20,17 @@ async Task> IGetActivitiesByNoticeId.ExecuteAsyn // Obtém os tipos de atividades do edital var activityTypes = await _activityTypeRepository.GetByNoticeIdAsync(id); + // Lista de tipos de atividades para o output + List activityTypesOutput = new(); + + // Se não houver tipos de atividades, retorna a lista vazia + if (activityTypes == null) + return activityTypesOutput; + // Mapeia os tipos de atividades para o output _ = _mapper.Map>(activityTypes); // Mapeia os tipos de atividades para o output - List activityTypesOutput = new(); foreach (var activityType in activityTypes) { // Mapeia as atividades para o output diff --git a/src/Domain/Entities/ActivityType.cs b/src/Domain/Entities/ActivityType.cs index 2b63c440..4cf50d63 100644 --- a/src/Domain/Entities/ActivityType.cs +++ b/src/Domain/Entities/ActivityType.cs @@ -62,6 +62,7 @@ public ActivityType(string? name, string? unity, Guid? noticeId) Name = name; Unity = unity; NoticeId = noticeId; + Activities = new List(); } /// From a77fe0eca3f6b25ff8e19b09c7200975cde57411 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 18:34:37 -0300 Subject: [PATCH 147/201] test: add GetLastNoticeActivitiesTests --- .../GetActivitiesByNoticeIdTests.cs | 6 +- .../GetLastNoticeActivitiesTests.cs | 65 +++++++++++++++++++ .../ActivityType/GetLastNoticeActivities.cs | 8 ++- 3 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 src/Application.Tests/UseCases/ActivityType/GetLastNoticeActivitiesTests.cs diff --git a/src/Application.Tests/UseCases/ActivityType/GetActivitiesByNoticeIdTests.cs b/src/Application.Tests/UseCases/ActivityType/GetActivitiesByNoticeIdTests.cs index aea231d6..bb7b3a6e 100644 --- a/src/Application.Tests/UseCases/ActivityType/GetActivitiesByNoticeIdTests.cs +++ b/src/Application.Tests/UseCases/ActivityType/GetActivitiesByNoticeIdTests.cs @@ -13,10 +13,8 @@ public class GetActivitiesByNoticeIdTests private readonly Mock _activityTypeRepositoryMock = new(); private readonly Mock _mapperMock = new(); - private IGetActivitiesByNoticeId CreateUseCase() - { - return new GetActivitiesByNoticeId(_activityTypeRepositoryMock.Object, _mapperMock.Object); - } + private IGetActivitiesByNoticeId CreateUseCase() => + new GetActivitiesByNoticeId(_activityTypeRepositoryMock.Object, _mapperMock.Object); private static Domain.Entities.ActivityType MockValidActivityType() => new("Type 1", "Unity 1", Guid.NewGuid()); diff --git a/src/Application.Tests/UseCases/ActivityType/GetLastNoticeActivitiesTests.cs b/src/Application.Tests/UseCases/ActivityType/GetLastNoticeActivitiesTests.cs new file mode 100644 index 00000000..29ce99ff --- /dev/null +++ b/src/Application.Tests/UseCases/ActivityType/GetLastNoticeActivitiesTests.cs @@ -0,0 +1,65 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Ports.Activity; +using Application.Interfaces.UseCases.ActivityType; +using Application.UseCases.ActivityType; +using Moq; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Xunit; + +namespace Application.Tests.UseCases.ActivityType +{ + public class GetLastNoticeActivitiesTests + { + private readonly Mock _activityTypeRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetLastNoticeActivities CreateUseCase() => + new GetLastNoticeActivities(_activityTypeRepositoryMock.Object, _mapperMock.Object); + + private static Domain.Entities.ActivityType MockValidActivityType() => new("Type 1", "Unity 1", Guid.NewGuid()); + + [Fact] + public async Task ExecuteAsync_ValidData_ReturnsListOfActivityTypeOutput() + { + // Arrange + var useCase = CreateUseCase(); + var activityTypes = new List + { + MockValidActivityType() + }; + + _activityTypeRepositoryMock.Setup(repo => repo.GetLastNoticeActivitiesAsync()).ReturnsAsync(activityTypes); + _mapperMock.Setup(mapper => mapper.Map>(activityTypes)).Returns(new List()); + + // Act + var result = await useCase.ExecuteAsync(); + + // Assert + Assert.NotNull(result); + _activityTypeRepositoryMock.Verify(repo => repo.GetLastNoticeActivitiesAsync(), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(activityTypes), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NoData_ReturnsEmptyList() + { + // Arrange + var useCase = CreateUseCase(); + List activityTypes = null; + + _activityTypeRepositoryMock.Setup(repo => repo.GetLastNoticeActivitiesAsync()).ReturnsAsync(activityTypes); + + // Act + var result = await useCase.ExecuteAsync(); + + // Assert + Assert.NotNull(result); + Assert.Empty(result); + _activityTypeRepositoryMock.Verify(repo => repo.GetLastNoticeActivitiesAsync(), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Never); + } + } +} diff --git a/src/Application/UseCases/ActivityType/GetLastNoticeActivities.cs b/src/Application/UseCases/ActivityType/GetLastNoticeActivities.cs index 0198e9d8..8a713e53 100644 --- a/src/Application/UseCases/ActivityType/GetLastNoticeActivities.cs +++ b/src/Application/UseCases/ActivityType/GetLastNoticeActivities.cs @@ -19,11 +19,17 @@ async Task> IGetLastNoticeActivities.ExecuteAsyn // Obtém os tipos de atividades do último edital var activityTypes = await _activityTypeRepository.GetLastNoticeActivitiesAsync(); + // Lista de tipos de atividades para o output + List activityTypesOutput = new(); + + // Se não houver tipos de atividades, retorna a lista vazia + if (activityTypes == null) + return activityTypesOutput; + // Mapeia os tipos de atividades para o output _ = _mapper.Map>(activityTypes); // Mapeia os tipos de atividades para o output - List activityTypesOutput = new(); foreach (var type in activityTypes) { // Mapeia as atividades para o output From 5785b6994b3a9a455ce4bd5e7796fa9bde529215 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 19:08:58 -0300 Subject: [PATCH 148/201] test: add AssistanceType tests --- .../Application.Tests.csproj | 1 + .../CreateAssistanceTypeTests.cs | 84 +++++++++++ .../DeleteAssistanceTypeTests.cs | 52 +++++++ .../GetAssistanceTypeByIdTests.cs | 58 ++++++++ .../AssistanceType/GetAssistanceTypesTests.cs | 49 +++++++ .../UpdateAssistanceTypeTests.cs | 134 ++++++++++++++++++ 6 files changed, 378 insertions(+) create mode 100644 src/Application.Tests/UseCases/AssistanceType/CreateAssistanceTypeTests.cs create mode 100644 src/Application.Tests/UseCases/AssistanceType/DeleteAssistanceTypeTests.cs create mode 100644 src/Application.Tests/UseCases/AssistanceType/GetAssistanceTypeByIdTests.cs create mode 100644 src/Application.Tests/UseCases/AssistanceType/GetAssistanceTypesTests.cs create mode 100644 src/Application.Tests/UseCases/AssistanceType/UpdateAssistanceTypeTests.cs diff --git a/src/Application.Tests/Application.Tests.csproj b/src/Application.Tests/Application.Tests.csproj index c87d31dd..2d8f129b 100644 --- a/src/Application.Tests/Application.Tests.csproj +++ b/src/Application.Tests/Application.Tests.csproj @@ -4,6 +4,7 @@ enable enable false + true diff --git a/src/Application.Tests/UseCases/AssistanceType/CreateAssistanceTypeTests.cs b/src/Application.Tests/UseCases/AssistanceType/CreateAssistanceTypeTests.cs new file mode 100644 index 00000000..136b9772 --- /dev/null +++ b/src/Application.Tests/UseCases/AssistanceType/CreateAssistanceTypeTests.cs @@ -0,0 +1,84 @@ +using Application.Interfaces.UseCases.AssistanceType; +using Application.Ports.AssistanceType; +using Application.UseCases.AssistanceType; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.AssistanceType +{ + public class CreateAssistanceTypeTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private ICreateAssistanceType CreateUseCase() => new CreateAssistanceType(_repositoryMock.Object, _mapperMock.Object); + + private Domain.Entities.AssistanceType MockValidAssistanceType() => new("AssistanceTypeName", "AssistanceTypeDescription"); + private CreateAssistanceTypeInput MockValidAssistanceTypeInput() => new() + { + Name = "AssistanceTypeName", + Description = "AssistanceTypeDescription" + }; + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadAssistanceTypeOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = MockValidAssistanceTypeInput(); + + _repositoryMock.Setup(repo => repo.GetAssistanceTypeByNameAsync(input.Name)).ReturnsAsync((Domain.Entities.AssistanceType)null); + _mapperMock.Setup(mapper => mapper.Map(input)).Returns(MockValidAssistanceType()); + _repositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(MockValidAssistanceType()); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadAssistanceTypeOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetAssistanceTypeByNameAsync(input.Name), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(input), Times.Once); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public void ExecuteAsync_NameIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateAssistanceTypeInput + { + Name = null + }; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _repositoryMock.Verify(repo => repo.GetAssistanceTypeByNameAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_AssistanceTypeWithNameExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = MockValidAssistanceTypeInput(); + + _repositoryMock.Setup(repo => repo.GetAssistanceTypeByNameAsync(input.Name)).ReturnsAsync(MockValidAssistanceType()); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _repositoryMock.Verify(repo => repo.GetAssistanceTypeByNameAsync(input.Name), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/AssistanceType/DeleteAssistanceTypeTests.cs b/src/Application.Tests/UseCases/AssistanceType/DeleteAssistanceTypeTests.cs new file mode 100644 index 00000000..46b4563d --- /dev/null +++ b/src/Application.Tests/UseCases/AssistanceType/DeleteAssistanceTypeTests.cs @@ -0,0 +1,52 @@ +using Application.Interfaces.UseCases.AssistanceType; +using Application.Ports.AssistanceType; +using Application.UseCases.AssistanceType; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.AssistanceType +{ + public class DeleteAssistanceTypeTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IDeleteAssistanceType CreateUseCase() => new DeleteAssistanceType(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadAssistanceTypeOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var assistanceType = new Domain.Entities.AssistanceType(id, "AssistanceTypeName", "AssistanceTypeDescription"); + + _repositoryMock.Setup(repo => repo.DeleteAsync(id)).ReturnsAsync(assistanceType); + _mapperMock.Setup(mapper => mapper.Map(assistanceType)).Returns(new DetailedReadAssistanceTypeOutput()); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.DeleteAsync(id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(assistanceType), Times.Once); + } + + [Fact] + public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id)); + _repositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/AssistanceType/GetAssistanceTypeByIdTests.cs b/src/Application.Tests/UseCases/AssistanceType/GetAssistanceTypeByIdTests.cs new file mode 100644 index 00000000..8d96a633 --- /dev/null +++ b/src/Application.Tests/UseCases/AssistanceType/GetAssistanceTypeByIdTests.cs @@ -0,0 +1,58 @@ +using Application.Interfaces.UseCases.AssistanceType; +using Application.Ports.AssistanceType; +using Application.UseCases.AssistanceType; +using Application.Validation; +using AutoMapper; +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Moq; +using System; +using System.Threading.Tasks; +using Xunit; + +namespace Application.Tests.UseCases.AssistanceType +{ + public class GetAssistanceTypeByIdTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetAssistanceTypeById CreateUseCase() + { + return new GetAssistanceTypeById(_repositoryMock.Object, _mapperMock.Object); + } + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadAssistanceTypeOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var assistanceType = new Domain.Entities.AssistanceType(id, "AssistanceTypeName", "AssistanceTypeDescription"); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(assistanceType); + _mapperMock.Setup(mapper => mapper.Map(assistanceType)).Returns(new DetailedReadAssistanceTypeOutput()); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(assistanceType), Times.Once); + } + + [Fact] + public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/AssistanceType/GetAssistanceTypesTests.cs b/src/Application.Tests/UseCases/AssistanceType/GetAssistanceTypesTests.cs new file mode 100644 index 00000000..b4adb951 --- /dev/null +++ b/src/Application.Tests/UseCases/AssistanceType/GetAssistanceTypesTests.cs @@ -0,0 +1,49 @@ +using Application.Interfaces.UseCases.AssistanceType; +using Application.Ports.AssistanceType; +using Application.UseCases.AssistanceType; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.AssistanceType +{ + public class GetAssistanceTypesTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetAssistanceTypes CreateUseCase() + { + return new GetAssistanceTypes(_repositoryMock.Object, _mapperMock.Object); + } + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsQueryableOfResumedReadAssistanceTypeOutput() + { + // Arrange + var useCase = CreateUseCase(); + var skip = 0; + var take = 10; + var assistanceTypes = new List + { + new(Guid.NewGuid(), "AssistanceType1", "Description"), + new(Guid.NewGuid(), "AssistanceType2", "Description"), + new(Guid.NewGuid(), "AssistanceType3", "Description") + }; + + _repositoryMock.Setup(repo => repo.GetAllAsync(skip, take)).ReturnsAsync(assistanceTypes); + _mapperMock.Setup(mapper => mapper.Map>(assistanceTypes)).Returns(assistanceTypes.Select(at => new ResumedReadAssistanceTypeOutput { Id = at.Id, Name = at.Name })); + + // Act + var result = await useCase.ExecuteAsync(skip, take); + + // Assert + Assert.NotNull(result); + Assert.IsAssignableFrom>(result); + Assert.Equal(3, result.Count()); + _repositoryMock.Verify(repo => repo.GetAllAsync(skip, take), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(assistanceTypes), Times.Once); + } + } +} diff --git a/src/Application.Tests/UseCases/AssistanceType/UpdateAssistanceTypeTests.cs b/src/Application.Tests/UseCases/AssistanceType/UpdateAssistanceTypeTests.cs new file mode 100644 index 00000000..b97cdda7 --- /dev/null +++ b/src/Application.Tests/UseCases/AssistanceType/UpdateAssistanceTypeTests.cs @@ -0,0 +1,134 @@ +using Application.Interfaces.UseCases.AssistanceType; +using Application.Ports.AssistanceType; +using Application.UseCases.AssistanceType; +using Application.Validation; +using AutoMapper; +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Moq; +using System; +using System.Threading.Tasks; +using Xunit; + +namespace Application.Tests.UseCases.AssistanceType +{ + public class UpdateAssistanceTypeTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IUpdateAssistanceType CreateUseCase() + { + return new UpdateAssistanceType(_repositoryMock.Object, _mapperMock.Object); + } + + private Domain.Entities.AssistanceType MockValidAssistanceType() => new("AssistanceTypeName1", "AssistanceTypeDescription"); + private UpdateAssistanceTypeInput MockValidAssistanceTypeInput() => new UpdateAssistanceTypeInput + { + Name = "AssistanceTypeName2", + Description = "AssistanceTypeDescription" + }; + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadAssistanceTypeOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = MockValidAssistanceTypeInput(); + var existingAssistanceType = MockValidAssistanceType(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingAssistanceType); + _repositoryMock.Setup(repo => repo.GetAssistanceTypeByNameAsync(input.Name)).ReturnsAsync((Domain.Entities.AssistanceType)null); + _repositoryMock.Setup(repo => repo.UpdateAsync(existingAssistanceType)).ReturnsAsync(existingAssistanceType); + _mapperMock.Setup(mapper => mapper.Map(existingAssistanceType)).Returns(new DetailedReadAssistanceTypeOutput()); + + // Act + var result = await useCase.ExecuteAsync(id, input); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.GetAssistanceTypeByNameAsync(input.Name), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(existingAssistanceType), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(existingAssistanceType), Times.Once); + } + + [Fact] + public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = MockValidAssistanceTypeInput(); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(null, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.GetAssistanceTypeByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_NameIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateAssistanceTypeInput + { + Name = null + }; + var existingAssistanceType = MockValidAssistanceType(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingAssistanceType); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Never); + _repositoryMock.Verify(repo => repo.GetAssistanceTypeByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_AssistanceTypeWithNameExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = MockValidAssistanceTypeInput(); + var existingAssistanceType = MockValidAssistanceType(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingAssistanceType); + _repositoryMock.Setup(repo => repo.GetAssistanceTypeByNameAsync(input.Name)).ReturnsAsync(MockValidAssistanceType()); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.GetAssistanceTypeByNameAsync(input.Name), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_AssistanceTypeIsDeleted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = MockValidAssistanceTypeInput(); + var existingAssistanceType = MockValidAssistanceType(); + existingAssistanceType.DeactivateEntity(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingAssistanceType); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.GetAssistanceTypeByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} From c9e9f16054f5087b2fd93e390dfa0a08f383121e Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 19:50:23 -0300 Subject: [PATCH 149/201] test: add Auth tests --- .../UseCases/Auth/ConfirmEmailTests.cs | 120 ++++++++++++++ .../UseCases/Auth/ForgotPasswordTests.cs | 73 +++++++++ .../UseCases/Auth/LoginTests.cs | 155 ++++++++++++++++++ .../UseCases/Auth/ResetPasswordTests.cs | 154 +++++++++++++++++ .../UseCases/Auth/ForgotPassword.cs | 6 - src/Application/UseCases/Auth/Login.cs | 4 +- 6 files changed, 504 insertions(+), 8 deletions(-) create mode 100644 src/Application.Tests/UseCases/Auth/ConfirmEmailTests.cs create mode 100644 src/Application.Tests/UseCases/Auth/ForgotPasswordTests.cs create mode 100644 src/Application.Tests/UseCases/Auth/LoginTests.cs create mode 100644 src/Application.Tests/UseCases/Auth/ResetPasswordTests.cs diff --git a/src/Application.Tests/UseCases/Auth/ConfirmEmailTests.cs b/src/Application.Tests/UseCases/Auth/ConfirmEmailTests.cs new file mode 100644 index 00000000..ff23b292 --- /dev/null +++ b/src/Application.Tests/UseCases/Auth/ConfirmEmailTests.cs @@ -0,0 +1,120 @@ +using Application.Interfaces.UseCases.Auth; +using Application.UseCases.Auth; +using Application.Validation; +using Domain.Entities; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Auth +{ + public class ConfirmEmailTests + { + private readonly Mock _userRepositoryMock = new Mock(); + + private IConfirmEmail CreateUseCase() => new ConfirmEmail(_userRepositoryMock.Object); + + private static User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsSuccessMessage() + { + // Arrange + var useCase = CreateUseCase(); + var user = MockValidUser(); + var email = user.Email; + var token = user.ValidationCode; + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(email)).ReturnsAsync(user); + + // Act + var result = await useCase.ExecuteAsync(email, token); + + // Assert + Assert.Equal("Usuário confirmado com sucesso.", result); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(email), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(user), Times.Once); + Assert.True(user.IsConfirmed); + } + + [Fact] + public void ExecuteAsync_EmailIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + string email = null; + var token = "validtoken"; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email, token)); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_TokenIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var email = "test@example.com"; + string token = null; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email, token)); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var email = "test@example.com"; + var token = "validtoken"; + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(email)).ReturnsAsync((User)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email, token)); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(email), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_InvalidToken_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var user = MockValidUser(); + var email = user.Email; + var token = "invalidtoken"; + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(email)).ReturnsAsync(user); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email, token)); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(email), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserAlreadyConfirmed_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var user = MockValidUser(); + var token = user.ValidationCode; + var email = user.Email; + user.ConfirmUserEmail(token); + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(email)).ReturnsAsync(user); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email, token)); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(email), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Auth/ForgotPasswordTests.cs b/src/Application.Tests/UseCases/Auth/ForgotPasswordTests.cs new file mode 100644 index 00000000..8c6c0092 --- /dev/null +++ b/src/Application.Tests/UseCases/Auth/ForgotPasswordTests.cs @@ -0,0 +1,73 @@ +using Application.Interfaces.UseCases.Auth; +using Application.UseCases.Auth; +using Application.Validation; +using Domain.Entities; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Auth +{ + public class ForgotPasswordTests + { + private readonly Mock _userRepositoryMock = new Mock(); + private readonly Mock _emailServiceMock = new Mock(); + + private IForgotPassword CreateUseCase() => new ForgotPassword(_userRepositoryMock.Object, _emailServiceMock.Object); + + private static User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsSuccessMessage() + { + // Arrange + var useCase = CreateUseCase(); + var user = MockValidUser(); + var email = user.Email; + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(email)).ReturnsAsync(user); + + // Act + var result = await useCase.ExecuteAsync(email); + + // Assert + Assert.Equal("Token de recuperação gerado e enviado por e-mail com sucesso.", result); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(email), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(user), Times.Once); + Assert.NotNull(user.ResetPasswordToken); // Verifica se o token foi gerado + _emailServiceMock.Verify(service => service.SendResetPasswordEmailAsync(user.Email, user.Name, user.ResetPasswordToken), Times.Once); + } + + [Fact] + public void ExecuteAsync_EmailIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + string email = null; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email)); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _emailServiceMock.Verify(service => service.SendResetPasswordEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var email = "test@example.com"; + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(email)).ReturnsAsync((User)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email)); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(email), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _emailServiceMock.Verify(service => service.SendResetPasswordEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Auth/LoginTests.cs b/src/Application.Tests/UseCases/Auth/LoginTests.cs new file mode 100644 index 00000000..3f5489dd --- /dev/null +++ b/src/Application.Tests/UseCases/Auth/LoginTests.cs @@ -0,0 +1,155 @@ +using Application.Interfaces.UseCases.Auth; +using Application.Ports.Auth; +using Application.UseCases.Auth; +using Application.Validation; +using Domain.Entities; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using System.Threading.Tasks; +using Xunit; + +namespace Application.Tests.UseCases.Auth +{ + public class LoginTests + { + private readonly Mock _tokenServiceMock = new Mock(); + private readonly Mock _userRepositoryMock = new Mock(); + private readonly Mock _hashServiceMock = new Mock(); + + private ILogin CreateUseCase() => new Login(_tokenServiceMock.Object, _userRepositoryMock.Object, _hashServiceMock.Object); + private static User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); + private static User MockValidUserWithId() => new(Guid.NewGuid(), "John Doe", "ADMIN"); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsUserLoginOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = new UserLoginInput + { + Email = "test@example.com", + Password = "password" + }; + var user = MockValidUserWithId(); + user.Password = "hashed_password"; + user.Email = input.Email; + user.ConfirmUserEmail(user.ValidationCode); + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(input.Email)).ReturnsAsync(user); + _hashServiceMock.Setup(hashService => hashService.VerifyPassword(input.Password, user.Password)).Returns(true); + _tokenServiceMock.Setup(tokenService => tokenService.GenerateToken(user.Id, user.Name, user.Role.ToString())).Returns("token"); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + Assert.Equal("token", result.Token); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(input.Email), Times.Once); + _hashServiceMock.Verify(hashService => hashService.VerifyPassword(input.Password, user.Password), Times.Once); + _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(user.Id, user.Name, user.Role.ToString()), Times.Once); + } + + [Fact] + public void ExecuteAsync_EmailIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new UserLoginInput + { + Email = null, + Password = "password" + }; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Never); + _hashServiceMock.Verify(hashService => hashService.VerifyPassword(It.IsAny(), It.IsAny()), Times.Never); + _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_PasswordIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new UserLoginInput + { + Email = "test@example.com", + Password = null + }; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Never); + _hashServiceMock.Verify(hashService => hashService.VerifyPassword(It.IsAny(), It.IsAny()), Times.Never); + _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new UserLoginInput + { + Email = "test@example.com", + Password = "password" + }; + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(input.Email)).ReturnsAsync((User)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(input.Email), Times.Once); + _hashServiceMock.Verify(hashService => hashService.VerifyPassword(It.IsAny(), It.IsAny()), Times.Never); + _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserNotConfirmed_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var user = MockValidUser(); + var input = new UserLoginInput + { + Email = user.Email, + Password = user.Password + }; + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(input.Email)).ReturnsAsync(user); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(input.Email), Times.Once); + _hashServiceMock.Verify(hashService => hashService.VerifyPassword(It.IsAny(), It.IsAny()), Times.Never); + _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_InvalidPassword_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var user = MockValidUser(); + var input = new UserLoginInput + { + Email = user.Email, + Password = user.Password + }; + user.ConfirmUserEmail(user.ValidationCode); + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(input.Email)).ReturnsAsync(user); + _hashServiceMock.Setup(hashService => hashService.VerifyPassword(input.Password, user.Password)).Returns(false); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(input.Email), Times.Once); + _hashServiceMock.Verify(hashService => hashService.VerifyPassword(input.Password, user.Password), Times.Once); + _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Auth/ResetPasswordTests.cs b/src/Application.Tests/UseCases/Auth/ResetPasswordTests.cs new file mode 100644 index 00000000..5eb67123 --- /dev/null +++ b/src/Application.Tests/UseCases/Auth/ResetPasswordTests.cs @@ -0,0 +1,154 @@ +using Application.Interfaces.UseCases.Auth; +using Application.Ports.Auth; +using Application.UseCases.Auth; +using Application.Validation; +using Domain.Entities; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Auth +{ + public class ResetPasswordTests + { + private readonly Mock _userRepositoryMock = new Mock(); + private readonly Mock _hashServiceMock = new Mock(); + + private IResetPassword CreateUseCase() => new ResetPassword(_userRepositoryMock.Object, _hashServiceMock.Object); + private static User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); + private static User MockValidUserWithId() => new(Guid.NewGuid(), "John Doe", "ADMIN"); + + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsSuccessMessage() + { + // Arrange + var useCase = CreateUseCase(); + var user = MockValidUserWithId(); + user.GenerateResetPasswordToken(); + user.Password = "hashed_password"; + var input = new UserResetPasswordInput + { + Id = user.Id, + Password = "new_password", + Token = user.ResetPasswordToken + }; + + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(input.Id.Value)).ReturnsAsync(user); + _hashServiceMock.Setup(hashService => hashService.HashPassword(input.Password)).Returns("hashed_password"); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + Assert.Equal("Senha atualizada com sucesso.", result); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(input.Id.Value), Times.Once); + _hashServiceMock.Verify(hashService => hashService.HashPassword("new_password"), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(user), Times.Once); + } + + [Fact] + public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new UserResetPasswordInput + { + Id = null, + Password = "new_password", + Token = "reset_token" + }; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_PasswordIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new UserResetPasswordInput + { + Id = Guid.NewGuid(), + Password = null, + Token = "reset_token" + }; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_TokenIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new UserResetPasswordInput + { + Id = Guid.NewGuid(), + Password = "new_password", + Token = null + }; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new UserResetPasswordInput + { + Id = Guid.NewGuid(), + Password = "new_password", + Token = "reset_token" + }; + + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(input.Id.Value)).ReturnsAsync((User)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(input.Id.Value), Times.Once); + _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_InvalidToken_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var user = MockValidUserWithId(); + user.GenerateResetPasswordToken(); + var input = new UserResetPasswordInput + { + Id = user.Id, + Password = "new_password", + Token = "different_token" + }; + + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(input.Id.Value)).ReturnsAsync(user); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(input.Id.Value), Times.Once); + _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application/UseCases/Auth/ForgotPassword.cs b/src/Application/UseCases/Auth/ForgotPassword.cs index be134dc9..486c36c8 100644 --- a/src/Application/UseCases/Auth/ForgotPassword.cs +++ b/src/Application/UseCases/Auth/ForgotPassword.cs @@ -35,12 +35,6 @@ public async Task ExecuteAsync(string? email) // Envia email de recuperação de senha await _emailService.SendResetPasswordEmailAsync(user.Email, user.Name, user.ResetPasswordToken); - // Verifica se o token foi gerado - if (string.IsNullOrEmpty(user.ResetPasswordToken)) - { - throw UseCaseException.BusinessRuleViolation("Token não gerado."); - } - // Retorna token return "Token de recuperação gerado e enviado por e-mail com sucesso."; } diff --git a/src/Application/UseCases/Auth/Login.cs b/src/Application/UseCases/Auth/Login.cs index 912830ec..79d593a5 100644 --- a/src/Application/UseCases/Auth/Login.cs +++ b/src/Application/UseCases/Auth/Login.cs @@ -33,10 +33,10 @@ public async Task ExecuteAsync(UserLoginInput input) ?? throw UseCaseException.NotFoundEntityByParams(nameof(Domain.Entities.User)); // Verifica se o usuário está confirmado - UseCaseException.BusinessRuleViolation(!entity.IsConfirmed, "User's email has not yet been confirmed."); + UseCaseException.BusinessRuleViolation(!entity.IsConfirmed, "O e-mail do usuário ainda não foi confirmado."); // Verifica se a senha é válida - UseCaseException.BusinessRuleViolation(!_hashService.VerifyPassword(input.Password!, entity.Password), "Invalid credentials."); + UseCaseException.BusinessRuleViolation(!_hashService.VerifyPassword(input.Password!, entity.Password), "Credenciais inválidas."); // Gera o token de autenticação e retorna o resultado return new UserLoginOutput From db9a34267cfcffe550d7601300d778cd4e052b1d Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 20:12:28 -0300 Subject: [PATCH 150/201] test: add Campus tests --- .../UpdateAssistanceTypeTests.cs | 3 - .../UseCases/Campus/CreateCampusTests.cs | 48 +++++++ .../UseCases/Campus/DeleteCampusTests.cs | 59 ++++++++ .../UseCases/Campus/GetCampusByIdTests.cs | 59 ++++++++ .../UseCases/Campus/GetCampusesTests.cs | 41 ++++++ .../UseCases/Campus/UpdateCampusTests.cs | 134 ++++++++++++++++++ 6 files changed, 341 insertions(+), 3 deletions(-) create mode 100644 src/Application.Tests/UseCases/Campus/CreateCampusTests.cs create mode 100644 src/Application.Tests/UseCases/Campus/DeleteCampusTests.cs create mode 100644 src/Application.Tests/UseCases/Campus/GetCampusByIdTests.cs create mode 100644 src/Application.Tests/UseCases/Campus/GetCampusesTests.cs create mode 100644 src/Application.Tests/UseCases/Campus/UpdateCampusTests.cs diff --git a/src/Application.Tests/UseCases/AssistanceType/UpdateAssistanceTypeTests.cs b/src/Application.Tests/UseCases/AssistanceType/UpdateAssistanceTypeTests.cs index b97cdda7..960fa78b 100644 --- a/src/Application.Tests/UseCases/AssistanceType/UpdateAssistanceTypeTests.cs +++ b/src/Application.Tests/UseCases/AssistanceType/UpdateAssistanceTypeTests.cs @@ -3,11 +3,8 @@ using Application.UseCases.AssistanceType; using Application.Validation; using AutoMapper; -using Domain.Entities; using Domain.Interfaces.Repositories; using Moq; -using System; -using System.Threading.Tasks; using Xunit; namespace Application.Tests.UseCases.AssistanceType diff --git a/src/Application.Tests/UseCases/Campus/CreateCampusTests.cs b/src/Application.Tests/UseCases/Campus/CreateCampusTests.cs new file mode 100644 index 00000000..47fcb3d1 --- /dev/null +++ b/src/Application.Tests/UseCases/Campus/CreateCampusTests.cs @@ -0,0 +1,48 @@ +using Application.Ports.Campus; +using Application.UseCases.Campus; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Campus +{ + public class CreateCampusTests + { + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadCampusOutput() + { + // Arrange + var repositoryMock = new Mock(); + var mapperMock = new Mock(); + + var useCase = new CreateCampus(repositoryMock.Object, mapperMock.Object); + + var input = new CreateCampusInput + { + Name = "Test Campus" + }; + + // Simule o retorno do repositório quando GetCampusByNameAsync é chamado + repositoryMock.Setup(repo => repo.GetCampusByNameAsync(input.Name)).ReturnsAsync((Domain.Entities.Campus)null); + + // Simule o retorno do repositório quando CreateAsync é chamado + var createdCampus = new Domain.Entities.Campus(input.Name); + repositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(createdCampus); + + // Simule o mapeamento do AutoMapper + var detailedReadCampusOutput = new DetailedReadCampusOutput(); // Você pode preencher com dados relevantes + mapperMock.Setup(mapper => mapper.Map(createdCampus)).Returns(detailedReadCampusOutput); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + Assert.Same(detailedReadCampusOutput, result); + repositoryMock.Verify(repo => repo.GetCampusByNameAsync(input.Name), Times.Once); + repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Once); + mapperMock.Verify(mapper => mapper.Map(createdCampus), Times.Once); + } + } +} diff --git a/src/Application.Tests/UseCases/Campus/DeleteCampusTests.cs b/src/Application.Tests/UseCases/Campus/DeleteCampusTests.cs new file mode 100644 index 00000000..215b6d45 --- /dev/null +++ b/src/Application.Tests/UseCases/Campus/DeleteCampusTests.cs @@ -0,0 +1,59 @@ +using Application.Ports.Campus; +using Application.UseCases.Campus; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Campus +{ + public class DeleteCampusTests + { + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadCampusOutput() + { + // Arrange + var repositoryMock = new Mock(); + var mapperMock = new Mock(); + + var useCase = new DeleteCampus(repositoryMock.Object, mapperMock.Object); + + var campusId = Guid.NewGuid(); // Simule um ID válido + + // Simule o retorno do repositório quando DeleteAsync é chamado + var deletedCampus = new Domain.Entities.Campus("Deleted Campus"); + repositoryMock.Setup(repo => repo.DeleteAsync(campusId)).ReturnsAsync(deletedCampus); + + // Simule o mapeamento do AutoMapper + var detailedReadCampusOutput = new DetailedReadCampusOutput(); // Você pode preencher com dados relevantes + mapperMock.Setup(mapper => mapper.Map(deletedCampus)).Returns(detailedReadCampusOutput); + + // Act + var result = await useCase.ExecuteAsync(campusId); + + // Assert + Assert.NotNull(result); + Assert.Same(detailedReadCampusOutput, result); + repositoryMock.Verify(repo => repo.DeleteAsync(campusId), Times.Once); + mapperMock.Verify(mapper => mapper.Map(deletedCampus), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_InvalidInput_ThrowsUseCaseException() + { + // Arrange + var repositoryMock = new Mock(); + var mapperMock = new Mock(); + + var useCase = new DeleteCampus(repositoryMock.Object, mapperMock.Object); + + Guid? campusId = null; + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(campusId)); + repositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Campus/GetCampusByIdTests.cs b/src/Application.Tests/UseCases/Campus/GetCampusByIdTests.cs new file mode 100644 index 00000000..edc17e9b --- /dev/null +++ b/src/Application.Tests/UseCases/Campus/GetCampusByIdTests.cs @@ -0,0 +1,59 @@ +using Application.Ports.Campus; +using Application.UseCases.Campus; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Campus +{ + public class GetCampusByIdTests + { + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadCampusOutput() + { + // Arrange + var repositoryMock = new Mock(); + var mapperMock = new Mock(); + + var useCase = new GetCampusById(repositoryMock.Object, mapperMock.Object); + + var campusId = Guid.NewGuid(); + + // Simule o retorno do repositório quando GetByIdAsync é chamado + var campus = new Domain.Entities.Campus("Campus Name"); + repositoryMock.Setup(repo => repo.GetByIdAsync(campusId)).ReturnsAsync(campus); + + // Simule o mapeamento do AutoMapper + var detailedReadCampusOutput = new DetailedReadCampusOutput(); // Você pode preencher com dados relevantes + mapperMock.Setup(mapper => mapper.Map(campus)).Returns(detailedReadCampusOutput); + + // Act + var result = await useCase.ExecuteAsync(campusId); + + // Assert + Assert.NotNull(result); + Assert.Same(detailedReadCampusOutput, result); + repositoryMock.Verify(repo => repo.GetByIdAsync(campusId), Times.Once); + mapperMock.Verify(mapper => mapper.Map(campus), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_InvalidInput_ThrowsUseCaseException() + { + // Arrange + var repositoryMock = new Mock(); + var mapperMock = new Mock(); + + var useCase = new GetCampusById(repositoryMock.Object, mapperMock.Object); + + Guid? campusId = null; + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(campusId)); + repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Campus/GetCampusesTests.cs b/src/Application.Tests/UseCases/Campus/GetCampusesTests.cs new file mode 100644 index 00000000..4331e4b1 --- /dev/null +++ b/src/Application.Tests/UseCases/Campus/GetCampusesTests.cs @@ -0,0 +1,41 @@ +using Application.Ports.Campus; +using Application.UseCases.Campus; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Campus +{ + public class GetCampusesTests + { + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsQueryableOfResumedReadCampusOutput() + { + // Arrange + var repositoryMock = new Mock(); + var mapperMock = new Mock(); + var useCase = new GetCampuses(repositoryMock.Object, mapperMock.Object); + int skip = 0; + int take = 10; + var campuses = new List + { + new("Campus 1"), + new("Campus 2"), + new("Campus 3") + }; + repositoryMock.Setup(repo => repo.GetAllAsync(skip, take)).ReturnsAsync(campuses); + var resumedReadCampusOutputs = campuses.Select(campus => new ResumedReadCampusOutput { Name = campus.Name }).ToList(); + mapperMock.Setup(mapper => mapper.Map>(campuses)).Returns(resumedReadCampusOutputs); + + // Act + var result = await useCase.ExecuteAsync(skip, take); + + // Assert + Assert.NotNull(result); + Assert.Equal(campuses.Count, result.Count()); + repositoryMock.Verify(repo => repo.GetAllAsync(skip, take), Times.Once); + mapperMock.Verify(mapper => mapper.Map>(campuses), Times.Once); + } + } +} diff --git a/src/Application.Tests/UseCases/Campus/UpdateCampusTests.cs b/src/Application.Tests/UseCases/Campus/UpdateCampusTests.cs new file mode 100644 index 00000000..dbfb3084 --- /dev/null +++ b/src/Application.Tests/UseCases/Campus/UpdateCampusTests.cs @@ -0,0 +1,134 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.Campus; +using Application.Ports.Campus; +using Application.Validation; +using Moq; +using Xunit; +using Application.UseCases.Campus; + +namespace Application.Tests.UseCases.Campus +{ + public class UpdateCampusTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IUpdateCampus CreateUseCase() => new UpdateCampus(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadCampusOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateCampusInput + { + Name = "Updated Campus Name" + }; + var existingCampus = new Domain.Entities.Campus("Initial Campus Name"); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingCampus); + _repositoryMock.Setup(repo => repo.GetCampusByNameAsync(input.Name)).ReturnsAsync((Domain.Entities.Campus)null); + _repositoryMock.Setup(repo => repo.UpdateAsync(existingCampus)).ReturnsAsync(existingCampus); + _mapperMock.Setup(mapper => mapper.Map(existingCampus)).Returns(new DetailedReadCampusOutput()); + + // Act + var result = await useCase.ExecuteAsync(id, input); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.GetCampusByNameAsync(input.Name), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(existingCampus), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(existingCampus), Times.Once); + } + + [Fact] + public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new UpdateCampusInput + { + Name = "Updated Campus Name" + }; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(null, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.GetCampusByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_NameIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateCampusInput + { + Name = null + }; + var existingCampus = new Domain.Entities.Campus("Initial Campus Name"); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingCampus); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Never); + _repositoryMock.Verify(repo => repo.GetCampusByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_CampusWithNameExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateCampusInput + { + Name = "Existing Campus Name" + }; + var existingCampus = new Domain.Entities.Campus("Existing Campus Name"); + var anotherCampus = new Domain.Entities.Campus("Another Campus Name"); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(anotherCampus); + _repositoryMock.Setup(repo => repo.GetCampusByNameAsync(input.Name)).ReturnsAsync(existingCampus); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.GetCampusByNameAsync(input.Name), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_CampusIsDeleted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateCampusInput + { + Name = "Updated Campus Name" + }; + var existingCampus = new Domain.Entities.Campus("Initial Campus Name"); + existingCampus.DeactivateEntity(); // Marcando como excluído + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingCampus); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.GetCampusByNameAsync(input.Name), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} From 13ef2e2780be1c3a1167b681a43c95576a288746 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 20:29:39 -0300 Subject: [PATCH 151/201] test: add Course tests --- .../UseCases/Campus/DeleteCampusTests.cs | 10 +- .../UseCases/Course/CreateCourseTests.cs | 80 +++++++++ .../UseCases/Course/DeleteCourseTests.cs | 52 ++++++ .../UseCases/Course/GetCourseByIdTests.cs | 50 ++++++ .../UseCases/Course/GetCoursesTests.cs | 50 ++++++ .../UseCases/Course/UpdateCourseTests.cs | 155 ++++++++++++++++++ 6 files changed, 389 insertions(+), 8 deletions(-) create mode 100644 src/Application.Tests/UseCases/Course/CreateCourseTests.cs create mode 100644 src/Application.Tests/UseCases/Course/DeleteCourseTests.cs create mode 100644 src/Application.Tests/UseCases/Course/GetCourseByIdTests.cs create mode 100644 src/Application.Tests/UseCases/Course/GetCoursesTests.cs create mode 100644 src/Application.Tests/UseCases/Course/UpdateCourseTests.cs diff --git a/src/Application.Tests/UseCases/Campus/DeleteCampusTests.cs b/src/Application.Tests/UseCases/Campus/DeleteCampusTests.cs index 215b6d45..051186bd 100644 --- a/src/Application.Tests/UseCases/Campus/DeleteCampusTests.cs +++ b/src/Application.Tests/UseCases/Campus/DeleteCampusTests.cs @@ -16,17 +16,13 @@ public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadCampusOutput() // Arrange var repositoryMock = new Mock(); var mapperMock = new Mock(); - var useCase = new DeleteCampus(repositoryMock.Object, mapperMock.Object); + var campusId = Guid.NewGuid(); - var campusId = Guid.NewGuid(); // Simule um ID válido - - // Simule o retorno do repositório quando DeleteAsync é chamado var deletedCampus = new Domain.Entities.Campus("Deleted Campus"); repositoryMock.Setup(repo => repo.DeleteAsync(campusId)).ReturnsAsync(deletedCampus); - // Simule o mapeamento do AutoMapper - var detailedReadCampusOutput = new DetailedReadCampusOutput(); // Você pode preencher com dados relevantes + var detailedReadCampusOutput = new DetailedReadCampusOutput(); mapperMock.Setup(mapper => mapper.Map(deletedCampus)).Returns(detailedReadCampusOutput); // Act @@ -45,9 +41,7 @@ public async Task ExecuteAsync_InvalidInput_ThrowsUseCaseException() // Arrange var repositoryMock = new Mock(); var mapperMock = new Mock(); - var useCase = new DeleteCampus(repositoryMock.Object, mapperMock.Object); - Guid? campusId = null; // Act & Assert diff --git a/src/Application.Tests/UseCases/Course/CreateCourseTests.cs b/src/Application.Tests/UseCases/Course/CreateCourseTests.cs new file mode 100644 index 00000000..1fb07f57 --- /dev/null +++ b/src/Application.Tests/UseCases/Course/CreateCourseTests.cs @@ -0,0 +1,80 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Ports.Course; +using Application.Interfaces.UseCases.Course; +using Application.Validation; +using Moq; +using Xunit; +using Application.UseCases.Course; + +namespace Application.Tests.UseCases.Course +{ + public class CreateCourseTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private ICreateCourse CreateUseCase() => new CreateCourse(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadCourseOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateCourseInput + { + Name = "New Course Name" + }; + Domain.Entities.Course createdCourse = new("New Course Name"); + + _repositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(createdCourse); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadCourseOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetCourseByNameAsync(input.Name), Times.Once); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public void ExecuteAsync_NameIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateCourseInput + { + Name = null + }; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _repositoryMock.Verify(repo => repo.GetCourseByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_CourseWithNameExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateCourseInput + { + Name = "Existing Course Name" + }; + var existingCourse = new Domain.Entities.Course("Existing Course Name"); + + _repositoryMock.Setup(repo => repo.GetCourseByNameAsync(input.Name)).ReturnsAsync(existingCourse); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _repositoryMock.Verify(repo => repo.GetCourseByNameAsync(input.Name), Times.Once); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Course/DeleteCourseTests.cs b/src/Application.Tests/UseCases/Course/DeleteCourseTests.cs new file mode 100644 index 00000000..38f3dd3b --- /dev/null +++ b/src/Application.Tests/UseCases/Course/DeleteCourseTests.cs @@ -0,0 +1,52 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Ports.Course; +using Application.Interfaces.UseCases.Course; +using Application.Validation; +using Moq; +using System; +using System.Threading.Tasks; +using Xunit; +using Application.UseCases.Course; + +namespace Application.Tests.UseCases.Course +{ + public class DeleteCourseTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IDeleteCourse CreateUseCase() => new DeleteCourse(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadCourseOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var deletedCourse = new Domain.Entities.Course("Deleted Course"); + _repositoryMock.Setup(repo => repo.DeleteAsync(id)).ReturnsAsync(deletedCourse); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadCourseOutput()); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.DeleteAsync(id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(null)); + _repositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Course/GetCourseByIdTests.cs b/src/Application.Tests/UseCases/Course/GetCourseByIdTests.cs new file mode 100644 index 00000000..fe14f177 --- /dev/null +++ b/src/Application.Tests/UseCases/Course/GetCourseByIdTests.cs @@ -0,0 +1,50 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.Course; +using Application.Ports.Course; +using Application.Validation; +using Moq; +using Xunit; +using Application.UseCases.Course; + +namespace Application.Tests.UseCases.Course +{ + public class GetCourseByIdTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetCourseById CreateUseCase() => new GetCourseById(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadCourseOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var expectedCourse = new Domain.Entities.Course("Course Name"); + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(expectedCourse); + _mapperMock.Setup(mapper => mapper.Map(expectedCourse)).Returns(new DetailedReadCourseOutput()); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(expectedCourse), Times.Once); + } + + [Fact] + public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(null)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Course/GetCoursesTests.cs b/src/Application.Tests/UseCases/Course/GetCoursesTests.cs new file mode 100644 index 00000000..3bc8be75 --- /dev/null +++ b/src/Application.Tests/UseCases/Course/GetCoursesTests.cs @@ -0,0 +1,50 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.Course; +using Application.Ports.Course; +using Application.UseCases.Course; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Course +{ + public class GetCoursesTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetCourses CreateUseCase() => new GetCourses(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsQueryableResumedReadCourseOutput() + { + // Arrange + var useCase = CreateUseCase(); + var skip = 0; + var take = 10; + var expectedCourses = new List + { + new Domain.Entities.Course("Course 1"), + new Domain.Entities.Course("Course 2"), + new Domain.Entities.Course("Course 3") + }; + _repositoryMock.Setup(repo => repo.GetAllAsync(skip, take)).ReturnsAsync(expectedCourses); + _mapperMock.Setup(mapper => mapper.Map>(expectedCourses)).Returns( + new List + { + new ResumedReadCourseOutput(), + new ResumedReadCourseOutput(), + new ResumedReadCourseOutput() + }); + + // Act + var result = await useCase.ExecuteAsync(skip, take); + + // Assert + Assert.NotNull(result); + Assert.Equal(3, result.Count()); + _repositoryMock.Verify(repo => repo.GetAllAsync(skip, take), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(expectedCourses), Times.Once); + } + } +} diff --git a/src/Application.Tests/UseCases/Course/UpdateCourseTests.cs b/src/Application.Tests/UseCases/Course/UpdateCourseTests.cs new file mode 100644 index 00000000..f77eecc6 --- /dev/null +++ b/src/Application.Tests/UseCases/Course/UpdateCourseTests.cs @@ -0,0 +1,155 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.Course; +using Application.Ports.Course; +using Application.UseCases.Course; +using Moq; +using Xunit; +using Application.Validation; + +namespace Application.Tests.UseCases.Course +{ + public class UpdateCourseTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IUpdateCourse CreateUseCase() => new UpdateCourse(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadCourseOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateCourseInput + { + Name = "Updated Course Name" + }; + var existingCourse = new Domain.Entities.Course("Existing Course Name"); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingCourse); + _repositoryMock.Setup(repo => repo.GetCourseByNameAsync(input.Name)).ReturnsAsync((Domain.Entities.Course)null); + _repositoryMock.Setup(repo => repo.UpdateAsync(existingCourse)).ReturnsAsync(existingCourse); + _mapperMock.Setup(mapper => mapper.Map(existingCourse)).Returns(new DetailedReadCourseOutput()); + + // Act + var result = await useCase.ExecuteAsync(id, input); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.GetCourseByNameAsync(input.Name), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(existingCourse), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(existingCourse), Times.Once); + } + + [Fact] + public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new UpdateCourseInput + { + Name = "Updated Course Name" + }; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(null, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.GetCourseByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_NameIsNullOrEmpty_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateCourseInput + { + Name = null + }; + var existingCourse = new Domain.Entities.Course("Existing Course Name"); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingCourse); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Never); + _repositoryMock.Verify(repo => repo.GetCourseByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_CourseNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateCourseInput + { + Name = "Updated Course Name" + }; + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync((Domain.Entities.Course)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.GetCourseByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_CourseIsDeleted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateCourseInput + { + Name = "Updated Course Name" + }; + var existingCourse = new Domain.Entities.Course("Existing Course Name"); + existingCourse.DeactivateEntity(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingCourse); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.GetCourseByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_CourseWithSameNameExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateCourseInput + { + Name = "Updated Course Name" + }; + var existingCourse = new Domain.Entities.Course("Existing Course Name"); + var existingCourseWithSameName = new Domain.Entities.Course("Updated Course Name"); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingCourse); + _repositoryMock.Setup(repo => repo.GetCourseByNameAsync(input.Name)).ReturnsAsync(existingCourseWithSameName); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.GetCourseByNameAsync(input.Name), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} From 0d5070dcea4ee47fc14666f4018ed7d0a8211742 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 20:39:32 -0300 Subject: [PATCH 152/201] test: add MainArea tests --- .../UseCases/MainArea/CreateMainAreaTests.cs | 66 ++++++++++++++ .../UseCases/MainArea/DeleteMainAreaTests.cs | 52 +++++++++++ .../UseCases/MainArea/GetMainAreaByIdTests.cs | 52 +++++++++++ .../UseCases/MainArea/GetMainAreasTests.cs | 39 +++++++++ .../UseCases/MainArea/UpdateMainAreaTests.cs | 87 +++++++++++++++++++ 5 files changed, 296 insertions(+) create mode 100644 src/Application.Tests/UseCases/MainArea/CreateMainAreaTests.cs create mode 100644 src/Application.Tests/UseCases/MainArea/DeleteMainAreaTests.cs create mode 100644 src/Application.Tests/UseCases/MainArea/GetMainAreaByIdTests.cs create mode 100644 src/Application.Tests/UseCases/MainArea/GetMainAreasTests.cs create mode 100644 src/Application.Tests/UseCases/MainArea/UpdateMainAreaTests.cs diff --git a/src/Application.Tests/UseCases/MainArea/CreateMainAreaTests.cs b/src/Application.Tests/UseCases/MainArea/CreateMainAreaTests.cs new file mode 100644 index 00000000..0cd9dd4d --- /dev/null +++ b/src/Application.Tests/UseCases/MainArea/CreateMainAreaTests.cs @@ -0,0 +1,66 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.MainArea; +using Application.Ports.MainArea; +using Application.UseCases.MainArea; +using Moq; +using Xunit; +using Application.Validation; + +namespace Application.Tests.UseCases.MainArea +{ + public class CreateMainAreaTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private ICreateMainArea CreateUseCase() => new CreateMainArea(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedMainAreaOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateMainAreaInput + { + Code = "NewCode", + Name = "NewName" + }; + Domain.Entities.MainArea existingMainArea = null; + + _repositoryMock.Setup(repo => repo.GetByCodeAsync(input.Code)).ReturnsAsync(existingMainArea); + _repositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(new Domain.Entities.MainArea(input.Code, input.Name)); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedMainAreaOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByCodeAsync(input.Code), Times.Once); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public void ExecuteAsync_CodeAlreadyExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateMainAreaInput + { + Code = "ExistingCode", + Name = "NewName" + }; + var existingMainArea = new Domain.Entities.MainArea("ExistingCode", "ExistingName"); + + _repositoryMock.Setup(repo => repo.GetByCodeAsync(input.Code)).ReturnsAsync(existingMainArea); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _repositoryMock.Verify(repo => repo.GetByCodeAsync(input.Code), Times.Once); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/MainArea/DeleteMainAreaTests.cs b/src/Application.Tests/UseCases/MainArea/DeleteMainAreaTests.cs new file mode 100644 index 00000000..b891b8a3 --- /dev/null +++ b/src/Application.Tests/UseCases/MainArea/DeleteMainAreaTests.cs @@ -0,0 +1,52 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.MainArea; +using Application.Ports.MainArea; +using Application.UseCases.MainArea; +using Application.Validation; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.MainArea +{ + public class DeleteMainAreaTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IDeleteMainArea CreateUseCase() => new DeleteMainArea(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsDetailedMainAreaOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); // Set the ID to a valid one + Domain.Entities.MainArea deletedMainArea = new(id, "Code", "Name"); // Create a deleted main area object + + _repositoryMock.Setup(repo => repo.DeleteAsync(id)).ReturnsAsync(deletedMainArea); + _mapperMock.Setup(mapper => mapper.Map(deletedMainArea)).Returns(new DetailedMainAreaOutput()); // You can create a new instance here. + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.DeleteAsync(id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(deletedMainArea), Times.Once); + } + + [Fact] + public void ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; // Set the ID to null + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id)); + _repositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/MainArea/GetMainAreaByIdTests.cs b/src/Application.Tests/UseCases/MainArea/GetMainAreaByIdTests.cs new file mode 100644 index 00000000..58b991b6 --- /dev/null +++ b/src/Application.Tests/UseCases/MainArea/GetMainAreaByIdTests.cs @@ -0,0 +1,52 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.MainArea; +using Application.Ports.MainArea; +using Application.UseCases.MainArea; +using Moq; +using Xunit; +using Application.Validation; + +namespace Application.Tests.UseCases.MainArea +{ + public class GetMainAreaByIdTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetMainAreaById CreateUseCase() => new GetMainAreaById(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsDetailedMainAreaOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var mainAreaEntity = new Domain.Entities.MainArea(id, "Code", "Name"); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(mainAreaEntity); + _mapperMock.Setup(mapper => mapper.Map(mainAreaEntity)).Returns(new DetailedMainAreaOutput()); // You can create a new instance here. + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(mainAreaEntity), Times.Once); + } + + [Fact] + public void ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/MainArea/GetMainAreasTests.cs b/src/Application.Tests/UseCases/MainArea/GetMainAreasTests.cs new file mode 100644 index 00000000..527aefeb --- /dev/null +++ b/src/Application.Tests/UseCases/MainArea/GetMainAreasTests.cs @@ -0,0 +1,39 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.MainArea; +using Application.Ports.MainArea; +using Application.UseCases.MainArea; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.MainArea +{ + public class GetMainAreasTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetMainAreas CreateUseCase() => new GetMainAreas(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsResumedReadMainAreaOutputQueryable() + { + // Arrange + var useCase = CreateUseCase(); + var skip = 0; + var take = 10; + var mainAreaEntities = new List(); + + _repositoryMock.Setup(repo => repo.GetAllAsync(skip, take)).ReturnsAsync(mainAreaEntities); + _mapperMock.Setup(mapper => mapper.Map>(mainAreaEntities)).Returns(new List()); // You can create a new list here. + + // Act + var result = await useCase.ExecuteAsync(skip, take); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetAllAsync(skip, take), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(mainAreaEntities), Times.Once); + } + } +} diff --git a/src/Application.Tests/UseCases/MainArea/UpdateMainAreaTests.cs b/src/Application.Tests/UseCases/MainArea/UpdateMainAreaTests.cs new file mode 100644 index 00000000..92c64dc5 --- /dev/null +++ b/src/Application.Tests/UseCases/MainArea/UpdateMainAreaTests.cs @@ -0,0 +1,87 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.MainArea; +using Application.Ports.MainArea; +using Application.UseCases.MainArea; +using Moq; +using Xunit; +using Application.Validation; + +namespace Application.Tests.UseCases.MainArea +{ + public class UpdateMainAreaTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IUpdateMainArea CreateUseCase() => new UpdateMainArea(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedMainAreaOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); // Set the ID to an existing main area + var input = new UpdateMainAreaInput + { + Name = "Updated Name", + Code = "Updated Code" + }; + var existingMainArea = new Domain.Entities.MainArea(id, "Existing Name", "Existing Code"); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingMainArea); + _repositoryMock.Setup(repo => repo.UpdateAsync(It.IsAny())).ReturnsAsync(existingMainArea); // You can modify this to return the updated main area + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedMainAreaOutput()); + + // Act + var result = await useCase.ExecuteAsync(id, input); + + // Assert + Assert.NotNull(result); + // Add assertions for the updated main area if necessary + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = (Guid?)null; + var input = new UpdateMainAreaInput + { + Name = "Updated Name", + Code = "Updated Code" + }; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_MainAreaNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); // Set the ID to a non-existing main area + var input = new UpdateMainAreaInput + { + Name = "Updated Name", + Code = "Updated Code" + }; + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync((Domain.Entities.MainArea)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} From ea9b4ff7a4af71105245ff6a114e2703159a05d0 Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 14 Sep 2023 21:23:57 -0300 Subject: [PATCH 153/201] test: add CreateNoticeTests --- .../UseCases/Notice/CreateNoticeTests.cs | 202 ++++++++++++++++++ .../UseCases/Notice/CreateNotice.cs | 27 ++- .../Entities/ProfessorUnitTests.cs | 2 +- src/Domain/Entities/Activity.cs | 9 + src/Domain/Entities/ActivityType.cs | 9 + src/Domain/Entities/Notice.cs | 31 +++ src/Domain/Entities/Professor.cs | 2 +- 7 files changed, 272 insertions(+), 10 deletions(-) create mode 100644 src/Application.Tests/UseCases/Notice/CreateNoticeTests.cs diff --git a/src/Application.Tests/UseCases/Notice/CreateNoticeTests.cs b/src/Application.Tests/UseCases/Notice/CreateNoticeTests.cs new file mode 100644 index 00000000..3b2dfcb4 --- /dev/null +++ b/src/Application.Tests/UseCases/Notice/CreateNoticeTests.cs @@ -0,0 +1,202 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Application.Interfaces.UseCases.Notice; +using Application.Ports.Notice; +using Application.UseCases.Notice; +using Moq; +using Xunit; +using Application.Validation; +using Application.Ports.Activity; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; + +namespace Application.Tests.UseCases.Notice +{ + public class CreateNoticeTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _storageFileServiceMock = new(); + private readonly Mock _activityTypeRepositoryMock = new(); + private readonly Mock _activityRepositoryMock = new(); + private readonly Mock _professorRepositoryMock = new(); + private readonly Mock _emailServiceMock = new(); + private readonly Mock _mapperMock = new(); + private readonly Mock> _loggerMock = new(); + + private ICreateNotice CreateUseCase() => new CreateNotice( + _repositoryMock.Object, + _storageFileServiceMock.Object, + _activityTypeRepositoryMock.Object, + _activityRepositoryMock.Object, + _professorRepositoryMock.Object, + _emailServiceMock.Object, + _mapperMock.Object, + _loggerMock.Object); + + private CreateNoticeInput MockValidNoticeInput() => new CreateNoticeInput + { + RegistrationStartDate = DateTime.UtcNow, + RegistrationEndDate = DateTime.UtcNow.AddDays(7), + EvaluationStartDate = DateTime.UtcNow.AddDays(8), + EvaluationEndDate = DateTime.UtcNow.AddDays(14), + AppealStartDate = DateTime.UtcNow.AddDays(15), + AppealEndDate = DateTime.UtcNow.AddDays(21), + SendingDocsStartDate = DateTime.UtcNow.AddDays(22), + SendingDocsEndDate = DateTime.UtcNow.AddDays(28), + PartialReportDeadline = DateTime.UtcNow.AddDays(29), + FinalReportDeadline = DateTime.UtcNow.AddDays(35), + Description = "Description", + SuspensionYears = 1, + File = new Mock().Object, + Activities = new List + { + new() { + Name = "Activity Type 1", + Unity = "Unity 1", + Activities = new List + { + new() { + Name = "Activity 1", + Points = 10, + Limits = 100 + } + } + } + } + }; + + private Domain.Entities.Notice MockValidNotice() => new( + id: Guid.NewGuid(), + registrationStartDate: DateTime.UtcNow, + registrationEndDate: DateTime.UtcNow.AddDays(7), + evaluationStartDate: DateTime.UtcNow.AddDays(8), + evaluationEndDate: DateTime.UtcNow.AddDays(14), + appealStartDate: DateTime.UtcNow.AddDays(15), + appealFinalDate: DateTime.UtcNow.AddDays(21), + sendingDocsStartDate: DateTime.UtcNow.AddDays(22), + sendingDocsEndDate: DateTime.UtcNow.AddDays(28), + partialReportDeadline: DateTime.UtcNow.AddDays(29), + finalReportDeadline: DateTime.UtcNow.AddDays(35), + description: "Description", + suspensionYears: 1 + ); + + private static Domain.Entities.ActivityType MockValidActivityType() => + new(Guid.NewGuid(), "Activity Type 1", "Unity 1", Guid.NewGuid()); + + private static Domain.Entities.Activity MockValidActivity() => + new(Guid.NewGuid(), "Activity 1", 10, 100, Guid.NewGuid()); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadNoticeOutput() + { + // Arrange + var useCase = CreateUseCase(); + var notice = MockValidNotice(); + notice.DocUrl = "FileUrl"; + var activityType = MockValidActivityType(); + var activity = MockValidActivity(); + var input = MockValidNoticeInput(); + var professors = new List() + { + new Domain.Entities.Professor("1234567", 12345) + }; + + _repositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(notice); + _repositoryMock.Setup(repo => repo.GetNoticeByPeriodAsync(It.IsAny(), It.IsAny())).ReturnsAsync((Domain.Entities.Notice)null); + _storageFileServiceMock.Setup(service => service.UploadFileAsync(input.File, null)).ReturnsAsync("FileUrl"); + _activityTypeRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(activityType); + _activityRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(activity); + _professorRepositoryMock.Setup(repo => repo.GetAllActiveProfessorsAsync()).ReturnsAsync(professors); + _emailServiceMock.Setup(service => service.SendNoticeEmailAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(Task.CompletedTask); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadNoticeOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Once); + _repositoryMock.Verify(repo => repo.GetNoticeByPeriodAsync(It.IsAny(), It.IsAny()), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(input.File, null), Times.Once); + _activityTypeRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Exactly(1)); + _activityRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Exactly(1)); + _professorRepositoryMock.Verify(repo => repo.GetAllActiveProfessorsAsync(), Times.Once); + _emailServiceMock.Verify(service => service.SendNoticeEmailAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Exactly(1)); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public void ExecuteAsync_NoActivitiesProvided_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var notice = MockValidNotice(); + var input = MockValidNoticeInput(); + input.Activities = null; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_NoticeForPeriodAlreadyExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var notice = MockValidNotice(); + var input = MockValidNoticeInput(); + + _repositoryMock.Setup(repo => repo.GetNoticeByPeriodAsync((DateTime)input.RegistrationStartDate, (DateTime)input.RegistrationEndDate)) + .ReturnsAsync(notice); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_FileUploadFails_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var notice = MockValidNotice(); + var input = MockValidNoticeInput(); + + _repositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(notice); + _repositoryMock.Setup(repo => repo.GetNoticeByPeriodAsync(It.IsAny(), It.IsAny())).ReturnsAsync((Domain.Entities.Notice)null); + _storageFileServiceMock.Setup(service => service.UploadFileAsync(input.File, null)) + .ThrowsAsync(new Exception(It.IsAny())); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_ActivityValidationFails_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var notice = MockValidNotice(); + notice.DocUrl = "FileUrl"; + var activityType = MockValidActivityType(); + var activity = MockValidActivity(); + var input = MockValidNoticeInput(); + + input.Activities![0].Name = null; + input.Activities![0].Activities![0].Name = null; + + _repositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(notice); + _repositoryMock.Setup(repo => repo.GetNoticeByPeriodAsync(It.IsAny(), It.IsAny())).ReturnsAsync((Domain.Entities.Notice)null); + _storageFileServiceMock.Setup(service => service.UploadFileAsync(input.File, null)).ReturnsAsync("FileUrl"); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application/UseCases/Notice/CreateNotice.cs b/src/Application/UseCases/Notice/CreateNotice.cs index fc18a126..cca48f1a 100644 --- a/src/Application/UseCases/Notice/CreateNotice.cs +++ b/src/Application/UseCases/Notice/CreateNotice.cs @@ -4,6 +4,7 @@ using Application.Interfaces.UseCases.Notice; using Application.Ports.Notice; using Application.Validation; +using Microsoft.Extensions.Logging; namespace Application.UseCases.Notice { @@ -17,6 +18,7 @@ public class CreateNotice : ICreateNotice private readonly IProfessorRepository _professorRepository; private readonly IEmailService _emailService; private readonly IMapper _mapper; + private readonly ILogger _logger; public CreateNotice( INoticeRepository repository, IStorageFileService storageFileService, @@ -24,7 +26,8 @@ public CreateNotice( IActivityRepository activityRepository, IProfessorRepository professorRepository, IEmailService emailService, - IMapper mapper) + IMapper mapper, + ILogger logger) { _repository = repository; _storageFileService = storageFileService; @@ -33,6 +36,7 @@ public CreateNotice( _professorRepository = professorRepository; _emailService = emailService; _mapper = mapper; + _logger = logger; } #endregion @@ -102,13 +106,20 @@ public async Task ExecuteAsync(CreateNoticeInput input // Envia email de notificação para todos os professores ativos foreach (var professor in professors) { - // Envia email de notificação - await _emailService.SendNoticeEmailAsync( - professor.User!.Email, - professor.User!.Name, - notice.RegistrationStartDate, - notice.RegistrationEndDate, - notice.DocUrl); + try + { + // Envia email de notificação + await _emailService.SendNoticeEmailAsync( + professor.User?.Email, + professor.User?.Name, + notice.RegistrationStartDate, + notice.RegistrationEndDate, + notice.DocUrl); + } + catch (Exception ex) + { + _logger.LogError("Erro ao enviar email de notificação para o professor {0}. Detalhes: {Details}", professor?.User!.Name, ex); + } } // Salva entidade no banco diff --git a/src/Domain.Tests/Entities/ProfessorUnitTests.cs b/src/Domain.Tests/Entities/ProfessorUnitTests.cs index a18b6893..d5b20644 100644 --- a/src/Domain.Tests/Entities/ProfessorUnitTests.cs +++ b/src/Domain.Tests/Entities/ProfessorUnitTests.cs @@ -8,7 +8,7 @@ namespace Domain.Tests.Entities { public class ProfessorUnitTests { - private static Professor MockValidProfessor() => new(); + private static Professor MockValidProfessor() => new("1234567", 12345); [Fact] public void SetSIAPEEnrollment_ValidSIAPEEnrollment_SetsSIAPEEnrollment() diff --git a/src/Domain/Entities/Activity.cs b/src/Domain/Entities/Activity.cs index 2575ecf4..37051c63 100644 --- a/src/Domain/Entities/Activity.cs +++ b/src/Domain/Entities/Activity.cs @@ -79,6 +79,15 @@ public Activity(string? name, double? points, double? limits, Guid? activityType ActivityTypeId = activityTypeId; } + public Activity(Guid? id, string? name, double? points, double? limits, Guid? activityTypeId) + { + Id = id; + Name = name; + Points = points; + Limits = limits; + ActivityTypeId = activityTypeId; + } + /// /// Constructor to dbcontext EF instancing. /// diff --git a/src/Domain/Entities/ActivityType.cs b/src/Domain/Entities/ActivityType.cs index 4cf50d63..5a796561 100644 --- a/src/Domain/Entities/ActivityType.cs +++ b/src/Domain/Entities/ActivityType.cs @@ -65,6 +65,15 @@ public ActivityType(string? name, string? unity, Guid? noticeId) Activities = new List(); } + public ActivityType(Guid? id, string? name, string? unity, Guid? noticeId) + { + Id = id; + Name = name; + Unity = unity; + NoticeId = noticeId; + Activities = new List(); + } + /// /// Constructor to dbcontext EF instancing. /// diff --git a/src/Domain/Entities/Notice.cs b/src/Domain/Entities/Notice.cs index f6867d1c..402b0b70 100644 --- a/src/Domain/Entities/Notice.cs +++ b/src/Domain/Entities/Notice.cs @@ -231,6 +231,37 @@ public Notice(DateTime? registrationStartDate, CreatedAt = DateTime.UtcNow; } + public Notice( + Guid? id, + DateTime? registrationStartDate, + DateTime? registrationEndDate, + DateTime? evaluationStartDate, + DateTime? evaluationEndDate, + DateTime? appealStartDate, + DateTime? appealFinalDate, + DateTime? sendingDocsStartDate, + DateTime? sendingDocsEndDate, + DateTime? partialReportDeadline, + DateTime? finalReportDeadline, + string? description, + int? suspensionYears) + { + Id = id; + RegistrationStartDate = registrationStartDate; + RegistrationEndDate = registrationEndDate; + EvaluationStartDate = evaluationStartDate; + EvaluationEndDate = evaluationEndDate; + AppealStartDate = appealStartDate; + AppealEndDate = appealFinalDate; + SendingDocsStartDate = sendingDocsStartDate; + SendingDocsEndDate = sendingDocsEndDate; + SuspensionYears = suspensionYears; + PartialReportDeadline = partialReportDeadline; + FinalReportDeadline = finalReportDeadline; + Description = description; + CreatedAt = DateTime.UtcNow; + } + /// /// Constructor to dbcontext EF instancing. /// diff --git a/src/Domain/Entities/Professor.cs b/src/Domain/Entities/Professor.cs index ce47b2a9..8b312b7d 100644 --- a/src/Domain/Entities/Professor.cs +++ b/src/Domain/Entities/Professor.cs @@ -85,7 +85,7 @@ public Professor(string? siapeEnrollment, long identifyLattes) /// /// Constructor to dbcontext EF instancing. /// - public Professor() { } + protected Professor() { } #endregion } } \ No newline at end of file From 0d47a93abaa316ce091d71147b6d4faf9594e330 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 16 Sep 2023 14:07:13 -0300 Subject: [PATCH 154/201] feat: add skip/take validations for usecases --- .../UseCases/ActivityType/GetActivitiesByNoticeId.cs | 2 +- .../UseCases/ActivityType/GetLastNoticeActivities.cs | 3 ++- src/Application/UseCases/Area/GetAreasByMainArea.cs | 4 ++++ .../UseCases/AssistanceType/GetAssistanceTypes.cs | 4 ++++ src/Application/UseCases/Campus/GetCampuses.cs | 4 ++++ src/Application/UseCases/Course/GetCourses.cs | 4 ++++ src/Application/UseCases/MainArea/GetMainAreas.cs | 4 ++++ src/Application/UseCases/Notice/GetNotices.cs | 6 ++++++ src/Application/UseCases/Professor/GetProfessors.cs | 4 ++++ src/Application/UseCases/ProgramType/GetProgramTypes.cs | 4 ++++ src/Application/UseCases/Project/GetClosedProjects.cs | 4 ++++ src/Application/UseCases/Project/GetOpenProjects.cs | 4 ++++ src/Application/UseCases/Project/GetProjectsToEvaluate.cs | 4 ++++ src/Application/UseCases/Student/GetStudents.cs | 4 ++++ src/Application/UseCases/SubArea/GetSubAreasByArea.cs | 4 ++++ src/Application/UseCases/User/GetActiveUsers.cs | 4 ++++ src/Application/UseCases/User/GetInactiveUsers.cs | 4 ++++ src/Application/Validation/UseCaseException.cs | 6 ++++++ 18 files changed, 71 insertions(+), 2 deletions(-) diff --git a/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs b/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs index 428dec70..39215f7e 100644 --- a/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs +++ b/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs @@ -15,7 +15,7 @@ public GetActivitiesByNoticeId(IActivityTypeRepository activityTypeRepository, I _mapper = mapper; } - async Task> IGetActivitiesByNoticeId.ExecuteAsync(Guid? id) + public async Task> ExecuteAsync(Guid? id) { // Obtém os tipos de atividades do edital var activityTypes = await _activityTypeRepository.GetByNoticeIdAsync(id); diff --git a/src/Application/UseCases/ActivityType/GetLastNoticeActivities.cs b/src/Application/UseCases/ActivityType/GetLastNoticeActivities.cs index 8a713e53..048943b9 100644 --- a/src/Application/UseCases/ActivityType/GetLastNoticeActivities.cs +++ b/src/Application/UseCases/ActivityType/GetLastNoticeActivities.cs @@ -14,7 +14,8 @@ public GetLastNoticeActivities(IActivityTypeRepository activityTypeRepository, I _activityTypeRepository = activityTypeRepository; _mapper = mapper; } - async Task> IGetLastNoticeActivities.ExecuteAsync() + + public async Task> ExecuteAsync() { // Obtém os tipos de atividades do último edital var activityTypes = await _activityTypeRepository.GetLastNoticeActivitiesAsync(); diff --git a/src/Application/UseCases/Area/GetAreasByMainArea.cs b/src/Application/UseCases/Area/GetAreasByMainArea.cs index e1832d06..c9d5c69d 100644 --- a/src/Application/UseCases/Area/GetAreasByMainArea.cs +++ b/src/Application/UseCases/Area/GetAreasByMainArea.cs @@ -20,6 +20,10 @@ public GetAreasByMainArea(IAreaRepository repository, IMapper mapper) public async Task> ExecuteAsync(Guid? mainAreaId, int skip, int take) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + UseCaseException.NotInformedParam(mainAreaId is null, nameof(mainAreaId)); var entities = await _repository.GetAreasByMainAreaAsync(mainAreaId, skip, take); return _mapper.Map>(entities).AsQueryable(); diff --git a/src/Application/UseCases/AssistanceType/GetAssistanceTypes.cs b/src/Application/UseCases/AssistanceType/GetAssistanceTypes.cs index 3cad4a67..d0d1b565 100644 --- a/src/Application/UseCases/AssistanceType/GetAssistanceTypes.cs +++ b/src/Application/UseCases/AssistanceType/GetAssistanceTypes.cs @@ -19,6 +19,10 @@ public GetAssistanceTypes(IAssistanceTypeRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } diff --git a/src/Application/UseCases/Campus/GetCampuses.cs b/src/Application/UseCases/Campus/GetCampuses.cs index 0ed94989..932a1017 100644 --- a/src/Application/UseCases/Campus/GetCampuses.cs +++ b/src/Application/UseCases/Campus/GetCampuses.cs @@ -19,6 +19,10 @@ public GetCampuses(ICampusRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } diff --git a/src/Application/UseCases/Course/GetCourses.cs b/src/Application/UseCases/Course/GetCourses.cs index 92f7bf27..e00fd449 100644 --- a/src/Application/UseCases/Course/GetCourses.cs +++ b/src/Application/UseCases/Course/GetCourses.cs @@ -19,6 +19,10 @@ public GetCourses(ICourseRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } diff --git a/src/Application/UseCases/MainArea/GetMainAreas.cs b/src/Application/UseCases/MainArea/GetMainAreas.cs index 1e1f3cac..1a8b5be0 100644 --- a/src/Application/UseCases/MainArea/GetMainAreas.cs +++ b/src/Application/UseCases/MainArea/GetMainAreas.cs @@ -19,6 +19,10 @@ public GetMainAreas(IMainAreaRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } diff --git a/src/Application/UseCases/Notice/GetNotices.cs b/src/Application/UseCases/Notice/GetNotices.cs index 0d4f9212..204d5215 100644 --- a/src/Application/UseCases/Notice/GetNotices.cs +++ b/src/Application/UseCases/Notice/GetNotices.cs @@ -19,6 +19,12 @@ public GetNotices(INoticeRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + { + throw new ArgumentException("Parâmetros inválidos."); + } + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities); } diff --git a/src/Application/UseCases/Professor/GetProfessors.cs b/src/Application/UseCases/Professor/GetProfessors.cs index 8c3b0a55..5bea7372 100644 --- a/src/Application/UseCases/Professor/GetProfessors.cs +++ b/src/Application/UseCases/Professor/GetProfessors.cs @@ -19,6 +19,10 @@ public GetProfessors(IProfessorRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } diff --git a/src/Application/UseCases/ProgramType/GetProgramTypes.cs b/src/Application/UseCases/ProgramType/GetProgramTypes.cs index eab38a74..2c08e34c 100644 --- a/src/Application/UseCases/ProgramType/GetProgramTypes.cs +++ b/src/Application/UseCases/ProgramType/GetProgramTypes.cs @@ -19,6 +19,10 @@ public GetProgramTypes(IProgramTypeRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + var entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } diff --git a/src/Application/UseCases/Project/GetClosedProjects.cs b/src/Application/UseCases/Project/GetClosedProjects.cs index b6a72d72..32599d95 100644 --- a/src/Application/UseCases/Project/GetClosedProjects.cs +++ b/src/Application/UseCases/Project/GetClosedProjects.cs @@ -26,6 +26,10 @@ public GetClosedProjects(IProjectRepository projectRepository, public async Task> ExecuteAsync(int skip, int take, bool onlyMyProjects = true) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + // Obtém as claims do usuário autenticado. var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); diff --git a/src/Application/UseCases/Project/GetOpenProjects.cs b/src/Application/UseCases/Project/GetOpenProjects.cs index 6942c436..e7976a1e 100644 --- a/src/Application/UseCases/Project/GetOpenProjects.cs +++ b/src/Application/UseCases/Project/GetOpenProjects.cs @@ -26,6 +26,10 @@ public GetOpenProjects(IProjectRepository projectRepository, public async Task> ExecuteAsync(int skip, int take, bool onlyMyProjects = true) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + // Obtém as claims do usuário autenticado. var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); diff --git a/src/Application/UseCases/Project/GetProjectsToEvaluate.cs b/src/Application/UseCases/Project/GetProjectsToEvaluate.cs index e4401ad9..d8f91aa3 100644 --- a/src/Application/UseCases/Project/GetProjectsToEvaluate.cs +++ b/src/Application/UseCases/Project/GetProjectsToEvaluate.cs @@ -24,6 +24,10 @@ public GetProjectsToEvaluate(ITokenAuthenticationService tokenAuthenticationServ public async Task> ExecuteAsync(int skip, int take) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + // Obtém o usuário logado var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); diff --git a/src/Application/UseCases/Student/GetStudents.cs b/src/Application/UseCases/Student/GetStudents.cs index 8952bfe2..f14beb58 100644 --- a/src/Application/UseCases/Student/GetStudents.cs +++ b/src/Application/UseCases/Student/GetStudents.cs @@ -19,6 +19,10 @@ public GetStudents(IStudentRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + IEnumerable entities = await _repository.GetAllAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } diff --git a/src/Application/UseCases/SubArea/GetSubAreasByArea.cs b/src/Application/UseCases/SubArea/GetSubAreasByArea.cs index ba5750ae..fd5ba7c1 100644 --- a/src/Application/UseCases/SubArea/GetSubAreasByArea.cs +++ b/src/Application/UseCases/SubArea/GetSubAreasByArea.cs @@ -20,6 +20,10 @@ public GetSubAreasByArea(ISubAreaRepository subAreaRepository, IMapper mapper) public async Task> ExecuteAsync(Guid? areaId, int skip, int take) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + UseCaseException.NotInformedParam(areaId is null, nameof(areaId)); IEnumerable entities = await _subAreaRepository.GetSubAreasByAreaAsync(areaId, skip, take); return _mapper.Map>(entities).AsQueryable(); diff --git a/src/Application/UseCases/User/GetActiveUsers.cs b/src/Application/UseCases/User/GetActiveUsers.cs index 6d20b153..2d51ad4e 100644 --- a/src/Application/UseCases/User/GetActiveUsers.cs +++ b/src/Application/UseCases/User/GetActiveUsers.cs @@ -19,6 +19,10 @@ public GetActiveUsers(IUserRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + IEnumerable entities = await _repository.GetActiveUsersAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } diff --git a/src/Application/UseCases/User/GetInactiveUsers.cs b/src/Application/UseCases/User/GetInactiveUsers.cs index 0d2316d6..834cefb3 100644 --- a/src/Application/UseCases/User/GetInactiveUsers.cs +++ b/src/Application/UseCases/User/GetInactiveUsers.cs @@ -19,6 +19,10 @@ public GetInactiveUsers(IUserRepository repository, IMapper mapper) public async Task> ExecuteAsync(int skip, int take) { + // Valida valores de skip e take + if (skip < 0 || take < 1) + throw new ArgumentException("Parâmetros inválidos."); + IEnumerable entities = await _repository.GetInactiveUsersAsync(skip, take); return _mapper.Map>(entities).AsQueryable(); } diff --git a/src/Application/Validation/UseCaseException.cs b/src/Application/Validation/UseCaseException.cs index 3c33a296..c838d5ec 100644 --- a/src/Application/Validation/UseCaseException.cs +++ b/src/Application/Validation/UseCaseException.cs @@ -6,6 +6,7 @@ public UseCaseException() : base() { } public UseCaseException(string? message, Exception? innerException) : base(message, innerException) { } public static Exception BusinessRuleViolation(string message) => new UseCaseException(message); + public static Exception NotValidParam(string message) => new UseCaseException(message); public static Exception NotFoundEntityById(string entityName) => new UseCaseException($"Entidade ({entityName}) não encontrada através do Id informado."); public static Exception NotFoundEntityByParams(string entityName) => new UseCaseException($"Entidade ({entityName}) não encontrada através dos parâmetros informados."); @@ -28,4 +29,9 @@ public static void NotInformedParam(bool hasError, string paramName) { if (hasError) throw new UseCaseException($"Parâmetro ({paramName}) é obrigatório."); } + + public static void NotValidParam(bool hasError, string paramName) + { + if (hasError) throw new UseCaseException($"Parâmetro ({paramName}) é inválido."); + } } From f8023f573db0b698a38b0ad3d83cabb12db216bf Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 16 Sep 2023 14:23:00 -0300 Subject: [PATCH 155/201] test: add Notice tests --- .../UseCases/Notice/DeleteNoticeTests.cs | 103 ++++++++++++++ .../UseCases/Notice/GetNoticeByIdTests.cs | 81 +++++++++++ .../UseCases/Notice/GetNoticesTests.cs | 107 +++++++++++++++ .../Notice/ReportDeadlineNotificationTests.cs | 128 ++++++++++++++++++ src/Domain.Tests/Entities/ProjectUnitTests.cs | 26 +++- src/Domain/Entities/Professor.cs | 2 +- src/Domain/Entities/Project.cs | 10 +- 7 files changed, 447 insertions(+), 10 deletions(-) create mode 100644 src/Application.Tests/UseCases/Notice/DeleteNoticeTests.cs create mode 100644 src/Application.Tests/UseCases/Notice/GetNoticeByIdTests.cs create mode 100644 src/Application.Tests/UseCases/Notice/GetNoticesTests.cs create mode 100644 src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs diff --git a/src/Application.Tests/UseCases/Notice/DeleteNoticeTests.cs b/src/Application.Tests/UseCases/Notice/DeleteNoticeTests.cs new file mode 100644 index 00000000..aecc27af --- /dev/null +++ b/src/Application.Tests/UseCases/Notice/DeleteNoticeTests.cs @@ -0,0 +1,103 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Application.Interfaces.UseCases.Notice; +using Application.Ports.Notice; +using Application.Validation; +using Moq; +using Xunit; +using Application.UseCases.Notice; + +namespace Application.Tests.UseCases.Notice +{ + public class DeleteNoticeTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _storageFileServiceMock = new(); + private readonly Mock _mapperMock = new(); + + private IDeleteNotice CreateUseCase() => new DeleteNotice(_repositoryMock.Object, _storageFileServiceMock.Object, _mapperMock.Object); + private static Domain.Entities.Notice MockValidNotice() => new( + id: Guid.NewGuid(), + registrationStartDate: DateTime.UtcNow, + registrationEndDate: DateTime.UtcNow.AddDays(7), + evaluationStartDate: DateTime.UtcNow.AddDays(8), + evaluationEndDate: DateTime.UtcNow.AddDays(14), + appealStartDate: DateTime.UtcNow.AddDays(15), + appealFinalDate: DateTime.UtcNow.AddDays(21), + sendingDocsStartDate: DateTime.UtcNow.AddDays(22), + sendingDocsEndDate: DateTime.UtcNow.AddDays(28), + partialReportDeadline: DateTime.UtcNow.AddDays(29), + finalReportDeadline: DateTime.UtcNow.AddDays(35), + description: "Edital de teste", + suspensionYears: 1 + ); + + [Fact] + public async Task ExecuteAsync_ValidId_DeletesNoticeAndFile() + { + // Arrange + var useCase = CreateUseCase(); + var noticeToDelete = MockValidNotice(); + var idToDelete = noticeToDelete.Id; + noticeToDelete.DocUrl = "file-url"; + + _repositoryMock.Setup(repo => repo.DeleteAsync(idToDelete)).ReturnsAsync(noticeToDelete); + _storageFileServiceMock.Setup(service => service.DeleteFileAsync(noticeToDelete.DocUrl)); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadNoticeOutput()); + + // Act + var result = await useCase.ExecuteAsync(idToDelete); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.DeleteAsync(idToDelete), Times.Once); + _storageFileServiceMock.Verify(service => service.DeleteFileAsync(noticeToDelete.DocUrl), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NoticeNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var idToDelete = Guid.NewGuid(); + + _repositoryMock.Setup(repo => repo.DeleteAsync(idToDelete)).ReturnsAsync((Domain.Entities.Notice)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(idToDelete)); + _repositoryMock.Verify(repo => repo.DeleteAsync(idToDelete), Times.Once); + _storageFileServiceMock.Verify(service => service.DeleteFileAsync(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_FileDeletionFails_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var noticeToDelete = MockValidNotice(); + var idToDelete = noticeToDelete.Id; + noticeToDelete.DocUrl = "file-url"; + + _repositoryMock.Setup(repo => repo.DeleteAsync(idToDelete)).ReturnsAsync(noticeToDelete); + _storageFileServiceMock.Setup(service => service.DeleteFileAsync(noticeToDelete.DocUrl)); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(idToDelete)); + _repositoryMock.Verify(repo => repo.DeleteAsync(idToDelete), Times.Once); + _storageFileServiceMock.Verify(service => service.DeleteFileAsync(noticeToDelete.DocUrl), Times.Once); + } + + [Fact] + public void ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(null)); + _repositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _storageFileServiceMock.Verify(service => service.DeleteFileAsync(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Notice/GetNoticeByIdTests.cs b/src/Application.Tests/UseCases/Notice/GetNoticeByIdTests.cs new file mode 100644 index 00000000..e6cabf49 --- /dev/null +++ b/src/Application.Tests/UseCases/Notice/GetNoticeByIdTests.cs @@ -0,0 +1,81 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.Notice; +using Application.Ports.Notice; +using Application.Validation; +using Moq; +using Xunit; +using Application.UseCases.Notice; + +namespace Application.Tests.UseCases.Notice +{ + public class GetNoticeByIdTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetNoticeById CreateUseCase() => new GetNoticeById(_repositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.Notice MockValidNotice() => new( + id: Guid.NewGuid(), + registrationStartDate: DateTime.UtcNow, + registrationEndDate: DateTime.UtcNow.AddDays(7), + evaluationStartDate: DateTime.UtcNow.AddDays(8), + evaluationEndDate: DateTime.UtcNow.AddDays(14), + appealStartDate: DateTime.UtcNow.AddDays(15), + appealFinalDate: DateTime.UtcNow.AddDays(21), + sendingDocsStartDate: DateTime.UtcNow.AddDays(22), + sendingDocsEndDate: DateTime.UtcNow.AddDays(28), + partialReportDeadline: DateTime.UtcNow.AddDays(29), + finalReportDeadline: DateTime.UtcNow.AddDays(35), + description: "Edital de teste", + suspensionYears: 1 + ); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsDetailedReadNoticeOutput() + { + // Arrange + var useCase = CreateUseCase(); + var noticeToRetrieve = MockValidNotice(); + var idToRetrieve = noticeToRetrieve.Id; + + _repositoryMock.Setup(repo => repo.GetByIdAsync(idToRetrieve)).ReturnsAsync(noticeToRetrieve); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadNoticeOutput()); + + // Act + var result = await useCase.ExecuteAsync(idToRetrieve); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(idToRetrieve), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NoticeNotFound_ReturnsNull() + { + // Arrange + var useCase = CreateUseCase(); + var idToRetrieve = Guid.NewGuid(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(idToRetrieve)).ReturnsAsync((Domain.Entities.Notice)null); + + // Act + var result = await useCase.ExecuteAsync(idToRetrieve); + + // Assert + Assert.Null(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(idToRetrieve), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(null)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Notice/GetNoticesTests.cs b/src/Application.Tests/UseCases/Notice/GetNoticesTests.cs new file mode 100644 index 00000000..c9eb0f7c --- /dev/null +++ b/src/Application.Tests/UseCases/Notice/GetNoticesTests.cs @@ -0,0 +1,107 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.Notice; +using Application.Ports.Notice; +using Moq; +using Xunit; +using Application.UseCases.Notice; + +namespace Application.Tests.UseCases.Notice +{ + public class GetNoticesTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetNotices CreateUseCase() => new GetNotices(_repositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.Notice MockValidNotice() => new( + id: Guid.NewGuid(), + registrationStartDate: DateTime.UtcNow, + registrationEndDate: DateTime.UtcNow.AddDays(7), + evaluationStartDate: DateTime.UtcNow.AddDays(8), + evaluationEndDate: DateTime.UtcNow.AddDays(14), + appealStartDate: DateTime.UtcNow.AddDays(15), + appealFinalDate: DateTime.UtcNow.AddDays(21), + sendingDocsStartDate: DateTime.UtcNow.AddDays(22), + sendingDocsEndDate: DateTime.UtcNow.AddDays(28), + partialReportDeadline: DateTime.UtcNow.AddDays(29), + finalReportDeadline: DateTime.UtcNow.AddDays(35), + description: "Edital de teste", + suspensionYears: 1 + ); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsResumedReadNoticeOutputList() + { + // Arrange + var useCase = CreateUseCase(); + var skip = 0; + var take = 10; + var notices = new List + { + MockValidNotice(), + MockValidNotice(), + MockValidNotice() + }; + + _repositoryMock.Setup(repo => repo.GetAllAsync(skip, take)).ReturnsAsync(notices); + _mapperMock.Setup(mapper => mapper.Map>(notices)).Returns(new List()); + + // Act + var result = await useCase.ExecuteAsync(skip, take); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetAllAsync(skip, take), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(notices), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_RepositoryReturnsEmptyList_ReturnsEmptyList() + { + // Arrange + var useCase = CreateUseCase(); + var skip = 0; + var take = 10; + var notices = new List(); + + _repositoryMock.Setup(repo => repo.GetAllAsync(skip, take)).ReturnsAsync(notices); + + // Act + var result = await useCase.ExecuteAsync(skip, take); + + // Assert + Assert.Empty(result); + _repositoryMock.Verify(repo => repo.GetAllAsync(skip, take), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NegativeSkipValue_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + var skip = -1; + var take = 10; + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(skip, take)); + _repositoryMock.Verify(repo => repo.GetAllAsync(It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_NegativeTakeValue_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + var skip = 0; + var take = -1; + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(skip, take)); + _repositoryMock.Verify(repo => repo.GetAllAsync(It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs b/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs new file mode 100644 index 00000000..92152eb2 --- /dev/null +++ b/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs @@ -0,0 +1,128 @@ +using Application.Interfaces.UseCases.Notice; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; +using Application.UseCases.Notice; +using Domain.Entities; + +namespace Application.Tests.UseCases.Notice +{ + public class ReportDeadlineNotificationTests + { + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _emailServiceMock = new(); + + private IReportDeadlineNotification CreateUseCase() => new ReportDeadlineNotification(_projectRepositoryMock.Object, _emailServiceMock.Object); + private static Project MockValidProject() + { + return new( + "Project Title", + "Keyword 1", + "Keyword 2", + "Keyword 3", + true, + "Objective", + "Methodology", + "Expected Results", + "Schedule", + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Domain.Entities.Enums.EProjectStatus.Opened, + "Status Description", + "Appeal Observation", + DateTime.UtcNow, + DateTime.UtcNow, + DateTime.UtcNow, + "Cancellation Reason") + { + Professor = new Professor("1234567", 1234567) + { + User = new User("Name", "professor@email.com", "Password", "58411338029", Domain.Entities.Enums.ERole.ADMIN) + }, + Notice = new( + registrationStartDate: DateTime.UtcNow, + registrationEndDate: DateTime.UtcNow.AddDays(7), + evaluationStartDate: DateTime.UtcNow.AddDays(8), + evaluationEndDate: DateTime.UtcNow.AddDays(14), + appealStartDate: DateTime.UtcNow.AddDays(15), + appealFinalDate: DateTime.UtcNow.AddDays(21), + sendingDocsStartDate: DateTime.UtcNow.AddDays(22), + sendingDocsEndDate: DateTime.UtcNow.AddDays(28), + partialReportDeadline: DateTime.UtcNow.AddDays(29), + finalReportDeadline: DateTime.UtcNow.AddDays(35), + description: "Edital de teste", + suspensionYears: 1 + ) + }; + } + + [Fact] + public async Task ExecuteAsync_ProjectsWithCloseReportDueDate_ReturnsSuccessMessage() + { + // Arrange + var useCase = CreateUseCase(); + var nextWeek = DateTime.UtcNow.AddDays(7).Date; + var nextMonth = DateTime.UtcNow.AddMonths(1).Date; + + var projects = new List + { + MockValidProject(), + MockValidProject() + }; + + _projectRepositoryMock.Setup(repo => repo.GetProjectsWithCloseReportDueDateAsync()).ReturnsAsync(projects); + _emailServiceMock + .Setup(service => service.SendNotificationOfReportDeadlineEmailAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Returns(Task.CompletedTask); + + // Act + var result = await useCase.ExecuteAsync(); + + // Assert + Assert.Equal("Notificação de prazo de entrega de relatório enviada com sucesso.", result); + _projectRepositoryMock.Verify(repo => repo.GetProjectsWithCloseReportDueDateAsync(), Times.Once); + _emailServiceMock.Verify( + service => service.SendNotificationOfReportDeadlineEmailAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny()), + Times.Exactly(2)); + } + + [Fact] + public async Task ExecuteAsync_NoProjects_ReturnsNoProjectsMessage() + { + // Arrange + var useCase = CreateUseCase(); + var projects = new List(); + + _projectRepositoryMock.Setup(repo => repo.GetProjectsWithCloseReportDueDateAsync()).ReturnsAsync(projects); + + // Act + var result = await useCase.ExecuteAsync(); + + // Assert + Assert.Equal("Nenhum projeto com prazo de entrega de relatório próxima.", result); + _projectRepositoryMock.Verify(repo => repo.GetProjectsWithCloseReportDueDateAsync(), Times.Once); + _emailServiceMock.Verify( + service => service.SendNotificationOfReportDeadlineEmailAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny()), + Times.Never); + } + } +} diff --git a/src/Domain.Tests/Entities/ProjectUnitTests.cs b/src/Domain.Tests/Entities/ProjectUnitTests.cs index 87d9166d..8e4c2961 100644 --- a/src/Domain.Tests/Entities/ProjectUnitTests.cs +++ b/src/Domain.Tests/Entities/ProjectUnitTests.cs @@ -8,10 +8,28 @@ namespace Domain.Tests.Entities { public class ProjectUnitTests { - private static Project MockValidProject() - { - return new Project("Project Title", "Keyword 1", "Keyword 2", "Keyword 3", true, "Objective", "Methodology", "Expected Results", "Schedule", Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), EProjectStatus.Opened, "Status Description", "Appeal Observation", DateTime.UtcNow, DateTime.UtcNow, DateTime.UtcNow, "Cancellation Reason"); - } + private static Project MockValidProject() => new Project( + "Project Title", + "Keyword 1", + "Keyword 2", + "Keyword 3", + true, + "Objective", + "Methodology", + "Expected Results", + "Schedule", + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + EProjectStatus.Opened, + "Status Description", + "Appeal Observation", + DateTime.UtcNow, + DateTime.UtcNow, + DateTime.UtcNow, + "Cancellation Reason"); [Fact] public void SetTitle_ValidTitle_SetsTitle() diff --git a/src/Domain/Entities/Professor.cs b/src/Domain/Entities/Professor.cs index 8b312b7d..307ced41 100644 --- a/src/Domain/Entities/Professor.cs +++ b/src/Domain/Entities/Professor.cs @@ -72,7 +72,7 @@ public DateTime? SuspensionEndDate } } - public virtual User? User { get; } + public virtual User? User { get; set; } #endregion #region Constructors diff --git a/src/Domain/Entities/Project.cs b/src/Domain/Entities/Project.cs index 4a85c7d4..2823940b 100644 --- a/src/Domain/Entities/Project.cs +++ b/src/Domain/Entities/Project.cs @@ -199,11 +199,11 @@ private set } } - public virtual ProgramType? ProgramType { get; } - public virtual Professor? Professor { get; } - public virtual Student? Student { get; } - public virtual SubArea? SubArea { get; } - public virtual Notice? Notice { get; } + public virtual ProgramType? ProgramType { get; set; } + public virtual Professor? Professor { get; set; } + public virtual Student? Student { get; set; } + public virtual SubArea? SubArea { get; set; } + public virtual Notice? Notice { get; set; } #endregion #region Informações de Controle From 9e5bd6fcb6e9cd406f7b753225ee1c0c7f624849 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 16 Sep 2023 15:04:12 -0300 Subject: [PATCH 156/201] test: add CreateProfessorTests --- .../Notice/ReportDeadlineNotificationTests.cs | 2 +- .../Professor/CreateProfessorTests.cs | 150 ++++++++++++++++++ src/Domain/Entities/User.cs | 12 ++ 3 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 src/Application.Tests/UseCases/Professor/CreateProfessorTests.cs diff --git a/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs b/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs index 92152eb2..4be3fb94 100644 --- a/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs +++ b/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs @@ -39,7 +39,7 @@ private static Project MockValidProject() DateTime.UtcNow, "Cancellation Reason") { - Professor = new Professor("1234567", 1234567) + Professor = new Domain.Entities.Professor("1234567", 1234567) { User = new User("Name", "professor@email.com", "Password", "58411338029", Domain.Entities.Enums.ERole.ADMIN) }, diff --git a/src/Application.Tests/UseCases/Professor/CreateProfessorTests.cs b/src/Application.Tests/UseCases/Professor/CreateProfessorTests.cs new file mode 100644 index 00000000..3a892801 --- /dev/null +++ b/src/Application.Tests/UseCases/Professor/CreateProfessorTests.cs @@ -0,0 +1,150 @@ +using Application.Interfaces.UseCases.Professor; +using Application.Ports.Professor; +using Application.UseCases.Professor; +using Application.Validation; +using AutoMapper; +using Domain.Entities; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Professor +{ + public class CreateProfessorTests + { + private readonly Mock _professorRepositoryMock = new(); + private readonly Mock _userRepositoryMock = new(); + private readonly Mock _emailServiceMock = new(); + private readonly Mock _hashServiceMock = new(); + private readonly Mock _mapperMock = new(); + + private ICreateProfessor CreateUseCase() => new CreateProfessor( + _professorRepositoryMock.Object, + _userRepositoryMock.Object, + _emailServiceMock.Object, + _hashServiceMock.Object, + _mapperMock.Object); + private static User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProfessorOutput() + { + // Arrange + var useCase = CreateUseCase(); + var password = "Password123"; + var input = new CreateProfessorInput + { + SIAPEEnrollment = "1234567", + IdentifyLattes = 1234567, + Password = password, + Name = "Professor Name", + Email = "professor@example.com", + CPF = "58411338029" + }; + var hashedPassword = "HashedPassword123"; + var user = new User(Guid.NewGuid(), input.Name, input.Email, hashedPassword, input.CPF, ERole.PROFESSOR); + var professor = new Domain.Entities.Professor(input.SIAPEEnrollment, input.IdentifyLattes); + professor.UserId = user.Id; + + _hashServiceMock.Setup(hashService => hashService.HashPassword(input.Password)).Returns(hashedPassword); + _userRepositoryMock.Setup(userRepository => userRepository.GetUserByEmailAsync(input.Email)).ReturnsAsync((User)null); + _userRepositoryMock.Setup(userRepository => userRepository.GetUserByCPFAsync(input.CPF)).ReturnsAsync((User)null); + _userRepositoryMock.Setup(userRepository => userRepository.CreateAsync(It.IsAny())).ReturnsAsync(user); + _professorRepositoryMock.Setup(professorRepository => professorRepository.CreateAsync(It.IsAny())).ReturnsAsync(professor); + _emailServiceMock.Setup(emailService => emailService.SendConfirmationEmailAsync(user.Email, user.Name, user.ValidationCode)).Returns(Task.CompletedTask); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadProfessorOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + _hashServiceMock.Verify(hashService => hashService.HashPassword(password), Times.Once); + _userRepositoryMock.Verify(userRepository => userRepository.GetUserByEmailAsync(input.Email), Times.Once); + _userRepositoryMock.Verify(userRepository => userRepository.GetUserByCPFAsync(input.CPF), Times.Once); + _userRepositoryMock.Verify(userRepository => userRepository.CreateAsync(It.IsAny()), Times.Once); + _professorRepositoryMock.Verify(professorRepository => professorRepository.CreateAsync(It.IsAny()), Times.Once); + _emailServiceMock.Verify(emailService => emailService.SendConfirmationEmailAsync(user.Email, user.Name, user.ValidationCode), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public void ExecuteAsync_PasswordIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateProfessorInput + { + Password = null + }; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(userRepository => userRepository.GetUserByEmailAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(userRepository => userRepository.GetUserByCPFAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(userRepository => userRepository.CreateAsync(It.IsAny()), Times.Never); + _professorRepositoryMock.Verify(professorRepository => professorRepository.CreateAsync(It.IsAny()), Times.Never); + _emailServiceMock.Verify(emailService => emailService.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserWithEmailExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateProfessorInput + { + SIAPEEnrollment = "1234567", + IdentifyLattes = 1234567, + Email = "existing@example.com", + CPF = "58411338029", + Name = "Professor Name", + Password = "Password123" + }; + + _userRepositoryMock.Setup(userRepository => userRepository.GetUserByEmailAsync(input.Email)).ReturnsAsync(MockValidUser()); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(userRepository => userRepository.GetUserByEmailAsync(input.Email), Times.Once); + _userRepositoryMock.Verify(userRepository => userRepository.GetUserByCPFAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(userRepository => userRepository.CreateAsync(It.IsAny()), Times.Never); + _professorRepositoryMock.Verify(professorRepository => professorRepository.CreateAsync(It.IsAny()), Times.Never); + _emailServiceMock.Verify(emailService => emailService.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserWithCPFExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateProfessorInput + { + SIAPEEnrollment = "1234567", + IdentifyLattes = 1234567, + Email = "existing@example.com", + CPF = "58411338029", + Name = "Professor Name", + Password = "Password123" + }; + + _userRepositoryMock.Setup(userRepository => userRepository.GetUserByCPFAsync(input.CPF)).ReturnsAsync(MockValidUser()); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(userRepository => userRepository.GetUserByEmailAsync(It.IsAny()), Times.Once); + _userRepositoryMock.Verify(userRepository => userRepository.GetUserByCPFAsync(input.CPF), Times.Once); + _userRepositoryMock.Verify(userRepository => userRepository.CreateAsync(It.IsAny()), Times.Never); + _professorRepositoryMock.Verify(professorRepository => professorRepository.CreateAsync(It.IsAny()), Times.Never); + _emailServiceMock.Verify(emailService => emailService.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Domain/Entities/User.cs b/src/Domain/Entities/User.cs index ac3522e5..2ee0c4d2 100644 --- a/src/Domain/Entities/User.cs +++ b/src/Domain/Entities/User.cs @@ -146,6 +146,18 @@ public User(string? name, string? email, string? password, string? cpf, ERole? r GenerateEmailValidationCode(); } + public User(Guid? id, string? name, string? email, string? password, string? cpf, ERole? role) + { + Id = id; + Name = name; + Email = email; + Password = password; + CPF = cpf; + Role = role; + + GenerateEmailValidationCode(); + } + /// /// Constructor to dbcontext EF instancing. /// From f81f5fee9902f0a828c11b2c37992bea3b94a99f Mon Sep 17 00:00:00 2001 From: eduardo Date: Sun, 17 Sep 2023 13:50:51 -0300 Subject: [PATCH 157/201] chore(ci): stop CI automation --- ...nctions-app-dotnet.yml => azure-functions-app-dotnet.yml.stop} | 0 ...webapps-dotnet-core.yml => azure-webapps-dotnet-core.yml.stop} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{azure-functions-app-dotnet.yml => azure-functions-app-dotnet.yml.stop} (100%) rename .github/workflows/{azure-webapps-dotnet-core.yml => azure-webapps-dotnet-core.yml.stop} (100%) diff --git a/.github/workflows/azure-functions-app-dotnet.yml b/.github/workflows/azure-functions-app-dotnet.yml.stop similarity index 100% rename from .github/workflows/azure-functions-app-dotnet.yml rename to .github/workflows/azure-functions-app-dotnet.yml.stop diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml.stop similarity index 100% rename from .github/workflows/azure-webapps-dotnet-core.yml rename to .github/workflows/azure-webapps-dotnet-core.yml.stop From 5bc6e9f4e923698725b69b372d4251c5b195e93e Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 21 Sep 2023 14:33:21 -0300 Subject: [PATCH 158/201] test: add DeleteProfessor tests --- docs/images/notice_periods.png | Bin 0 -> 72142 bytes docs/images/project_status.png | Bin 0 -> 407949 bytes docs/usecases/analyst-usecases.feature | 4 - .../Professor/CreateProfessorTests.cs | 6 +- .../Professor/DeleteProfessorTests.cs | 164 ++++++++++++++++++ src/Domain/Entities/Professor.cs | 7 + 6 files changed, 175 insertions(+), 6 deletions(-) create mode 100644 docs/images/notice_periods.png create mode 100644 docs/images/project_status.png delete mode 100644 docs/usecases/analyst-usecases.feature create mode 100644 src/Application.Tests/UseCases/Professor/DeleteProfessorTests.cs diff --git a/docs/images/notice_periods.png b/docs/images/notice_periods.png new file mode 100644 index 0000000000000000000000000000000000000000..f56f7d2eca6f918055d2da4d87caa874d0b2f2fb GIT binary patch literal 72142 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

$X(%3m#wxya>LuhBeWeu z3T;z^zR*-Aoe`(wb?+~b#E|^7jg=SO-Enjec_L|m(s!*EJ2H7IK)oZcH_TOTt`QBg zLeT5oVz)7TQfjgq)DIK6yx~Aq_{P{UMPQs0bKSAREWR%e{9bxip0t z$O95Do;8}=fT6qD!Xa00Z-Z6CzRpgE>xJQrPplzVlv?$10-H0B`EYDQv0^k1x&-m> z!8FD~gw5X7E_`5C`G)#xg?z8^_8QKGUQ&Lmr7wLSl+fw?R1$ws=VHOj;3r0uMxCos z$Y4f{$aFTcTfVW-cLm#j|P;sPN>O4 z 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ಘyNjPJC{;%)nxy<5o_8&6eg#APo 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%0AxFuOI<6r+F5nv7=kg zK37kVDOuB7m-G)jQGE<2Q3+e*6)%4S;gR=eY|0bUt0Cp+1vG9x%!S#bW+`;!b5U_Szb(s|& z_;!J=h+QBvrD=C`;#AQ`{L3l`wc;LD7@vxAtG;c91zit;9c9Bcsg*`p^)EI-`3PEY zo%FE(VA9F-gD%lPUfG`ew)0yU2JlJn_}Tql_ZPYeh|(pTRKC` z(?Mvd{V-`C@e{U`&L^WQw^jU4tx`m%^IZPTn=EUGm*YxL1Sl_e(0JWL`)F*9dZfjb zN(YD`-tF;%{nk4RlBIS4WUdf;YQRc=SR+tG*wU)J<~*R{x_oI~?dZHY+#y}kKHvHy z{h8#trk<1i1%|%0Dp3 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 z

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 hashService.HashPassword(input.Password)).Returns(hashedPassword); _userRepositoryMock.Setup(userRepository => userRepository.GetUserByEmailAsync(input.Email)).ReturnsAsync((User)null); diff --git a/src/Application.Tests/UseCases/Professor/DeleteProfessorTests.cs b/src/Application.Tests/UseCases/Professor/DeleteProfessorTests.cs new file mode 100644 index 00000000..76e8e063 --- /dev/null +++ b/src/Application.Tests/UseCases/Professor/DeleteProfessorTests.cs @@ -0,0 +1,164 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.Professor; +using Application.Ports.Professor; +using Application.Validation; +using Moq; +using Xunit; +using Application.UseCases.Professor; +using Domain.Entities.Enums; + +namespace Application.Tests.UseCases.Professor +{ + public class DeleteProfessorTests + { + private readonly Mock _professorRepositoryMock = new(); + private readonly Mock _userRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IDeleteProfessor CreateUseCase() => new DeleteProfessor(_professorRepositoryMock.Object, _userRepositoryMock.Object, _mapperMock.Object); + private Domain.Entities.User CreateUser() => new(Guid.NewGuid(), "John Doe", "john.doe@email.com", "123456789", "58411338029", ERole.PROFESSOR); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProfessorOutput() + { + // Arrange + var useCase = CreateUseCase(); + var professorId = Guid.NewGuid(); + var user = CreateUser(); + var professor = new Domain.Entities.Professor(professorId, "SIAPE12", 1234567) + { + UserId = user.Id + }; + + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(professorId)).ReturnsAsync(professor); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(user.Id)).ReturnsAsync(user); + + _professorRepositoryMock.Setup(repo => repo.DeleteAsync(professorId)).ReturnsAsync(professor); + _userRepositoryMock.Setup(repo => repo.DeleteAsync(user.Id)).ReturnsAsync(user); + + _mapperMock.Setup(mapper => mapper.Map(professor)).Returns(new DetailedReadProfessorOutput()); + + // Act + var result = await useCase.ExecuteAsync(professorId); + + // Assert + Assert.NotNull(result); + _professorRepositoryMock.Verify(repo => repo.GetByIdAsync(professorId), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(user.Id), Times.Once); + _professorRepositoryMock.Verify(repo => repo.DeleteAsync(professorId), Times.Once); + _userRepositoryMock.Verify(repo => repo.DeleteAsync(user.Id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(professor), Times.Once); + } + + [Fact] + public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? professorId = null; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(professorId)); + _professorRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _professorRepositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_ProfessorNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var professorId = Guid.NewGuid(); + + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(professorId)).ReturnsAsync((Domain.Entities.Professor)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(professorId)); + _professorRepositoryMock.Verify(repo => repo.GetByIdAsync(professorId), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _professorRepositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var professorId = Guid.NewGuid(); + var professor = new Domain.Entities.Professor(professorId, "SIAPE12", 1234567) + { + UserId = Guid.NewGuid() + }; + + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(professorId)).ReturnsAsync(professor); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(professor.UserId)).ReturnsAsync((Domain.Entities.User)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(professorId)); + _professorRepositoryMock.Verify(repo => repo.GetByIdAsync(professorId), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(professor.UserId), Times.Once); + _professorRepositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_ProfessorNotDeleted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var professorId = Guid.NewGuid(); + var user = CreateUser(); + var professor = new Domain.Entities.Professor(professorId, "SIAPE12", 1234567) + { + UserId = user.Id + }; + + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(professorId)).ReturnsAsync(professor); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(user.Id)).ReturnsAsync(user); + + _professorRepositoryMock.Setup(repo => repo.DeleteAsync(professorId)).ReturnsAsync((Domain.Entities.Professor)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(professorId)); + _professorRepositoryMock.Verify(repo => repo.GetByIdAsync(professorId), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(user.Id), Times.Once); + _professorRepositoryMock.Verify(repo => repo.DeleteAsync(professorId), Times.Once); + _userRepositoryMock.Verify(repo => repo.DeleteAsync(user.Id), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserNotDeleted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var professorId = Guid.NewGuid(); + var user = CreateUser(); + var professor = new Domain.Entities.Professor(professorId, "SIAPE12", 1234567) + { + UserId = user.Id + }; + + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(professorId)).ReturnsAsync(professor); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(user.Id)).ReturnsAsync(user); + + _professorRepositoryMock.Setup(repo => repo.DeleteAsync(professorId)).ReturnsAsync(professor); + _userRepositoryMock.Setup(repo => repo.DeleteAsync(user.Id)).ReturnsAsync((Domain.Entities.User)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(professorId)); + _professorRepositoryMock.Verify(repo => repo.GetByIdAsync(professorId), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(user.Id), Times.Once); + _professorRepositoryMock.Verify(repo => repo.DeleteAsync(professorId), Times.Once); + _userRepositoryMock.Verify(repo => repo.DeleteAsync(user.Id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Domain/Entities/Professor.cs b/src/Domain/Entities/Professor.cs index 307ced41..ac14d25c 100644 --- a/src/Domain/Entities/Professor.cs +++ b/src/Domain/Entities/Professor.cs @@ -82,6 +82,13 @@ public Professor(string? siapeEnrollment, long identifyLattes) IdentifyLattes = identifyLattes; } + public Professor(Guid? id, string? siapeEnrollment, long identifyLattes) + { + Id = id; + SIAPEEnrollment = siapeEnrollment; + IdentifyLattes = identifyLattes; + } + ///

/// Constructor to dbcontext EF instancing. /// From 0fc2623f61488c82c90acff847352a7141f4675f Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 26 Sep 2023 13:39:47 -0300 Subject: [PATCH 159/201] fix: allow anonymous some endpoints --- .../WebAPI/Controllers/AssistanceTypeController.cs | 2 ++ src/Infrastructure/WebAPI/Controllers/CampusController.cs | 2 ++ src/Infrastructure/WebAPI/Controllers/CourseController.cs | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs b/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs index 52d2b03d..19851972 100644 --- a/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs +++ b/src/Infrastructure/WebAPI/Controllers/AssistanceTypeController.cs @@ -55,6 +55,7 @@ public AssistanceTypeController(IGetAssistanceTypeById getById, /// Usuário não autorizado. /// Nenhuma bolsa de assistência encontrada. [HttpGet("{id}")] + [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadAssistanceTypeOutput))] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(string))] [ProducesResponseType(StatusCodes.Status401Unauthorized, Type = typeof(string))] @@ -91,6 +92,7 @@ public async Task GetById(Guid? id) /// Usuário não autorizado. /// Nenhuma bolsa de assitência encontrada. [HttpGet] + [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(string))] [ProducesResponseType(StatusCodes.Status401Unauthorized, Type = typeof(string))] diff --git a/src/Infrastructure/WebAPI/Controllers/CampusController.cs b/src/Infrastructure/WebAPI/Controllers/CampusController.cs index a3b86319..154ea298 100644 --- a/src/Infrastructure/WebAPI/Controllers/CampusController.cs +++ b/src/Infrastructure/WebAPI/Controllers/CampusController.cs @@ -54,6 +54,7 @@ public CampusController(IGetCampusById getById, /// Requisição incorreta. /// Campus não encontrado. [HttpGet("{id}")] + [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(string))] [ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(string))] @@ -87,6 +88,7 @@ public async Task> GetById(Guid? id) /// Requisição incorreta. /// Nenhum Campus encontrado. [HttpGet] + [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(string))] [ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(string))] diff --git a/src/Infrastructure/WebAPI/Controllers/CourseController.cs b/src/Infrastructure/WebAPI/Controllers/CourseController.cs index f6d96dcb..bf721281 100644 --- a/src/Infrastructure/WebAPI/Controllers/CourseController.cs +++ b/src/Infrastructure/WebAPI/Controllers/CourseController.cs @@ -55,6 +55,7 @@ public CourseController(IGetCourseById getById, /// Curso não encontrado. /// Usuário não autorizado. [HttpGet("{id}")] + [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(DetailedReadCourseOutput))] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(string))] [ProducesResponseType(StatusCodes.Status401Unauthorized, Type = typeof(string))] @@ -92,6 +93,7 @@ public async Task> GetById(Guid? id) /// Todas os cursos ativos /// Retorna todas os cursos ativos [HttpGet] + [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(string))] [ProducesResponseType(StatusCodes.Status401Unauthorized, Type = typeof(string))] From 772e72129986a1cf3d46f4c34e3232bd638c4b9c Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 11 Oct 2023 15:45:35 -0300 Subject: [PATCH 160/201] docs: Add some images for documentation --- docs/forms/entrega-docs.md | 10 +++++----- docs/forms/inscricao-edital.md | 4 ++-- docs/images/app_architecture.png | Bin 0 -> 267537 bytes docs/images/der_simple.png | Bin 0 -> 125803 bytes docs/images/diag_application.png | Bin 0 -> 43153 bytes docs/images/diag_domain.png | Bin 0 -> 32972 bytes docs/images/diag_ioc.png | Bin 0 -> 15427 bytes docs/images/diag_persistence.png | Bin 0 -> 44870 bytes docs/images/diag_services.png | Bin 0 -> 18491 bytes docs/images/diag_webapi.png | Bin 0 -> 22774 bytes docs/images/diag_webfunctions.png | Bin 0 -> 24910 bytes docs/images/seq_sample.png | Bin 0 -> 257748 bytes docs/images/swagger.png | Bin 0 -> 134455 bytes docs/images/system_design.png | Bin 0 -> 225236 bytes src/Infrastructure/WebAPI/appsettings.json | 2 +- 15 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 docs/images/app_architecture.png create mode 100644 docs/images/der_simple.png create mode 100644 docs/images/diag_application.png create mode 100644 docs/images/diag_domain.png create mode 100644 docs/images/diag_ioc.png create mode 100644 docs/images/diag_persistence.png create mode 100644 docs/images/diag_services.png create mode 100644 docs/images/diag_webapi.png create mode 100644 docs/images/diag_webfunctions.png create mode 100644 docs/images/seq_sample.png create mode 100644 docs/images/swagger.png create mode 100644 docs/images/system_design.png diff --git a/docs/forms/entrega-docs.md b/docs/forms/entrega-docs.md index 06920ae4..4251b236 100644 --- a/docs/forms/entrega-docs.md +++ b/docs/forms/entrega-docs.md @@ -29,7 +29,7 @@ Essa seção deverá ser preenchida apenas pelos alunos bolsistas. Caso o aluno - Número da Conta Corrente - Comprovante de Abertura de Conta -## DOCUMENTOS DO ALUNO A SEREM ENTREGUES (ANEXADOS) +## Documentos do Aluno a serem Entregues (Anexados) Nos próximos itens anexe os documentos solicitados @@ -43,7 +43,7 @@ Nos próximos itens anexe os documentos solicitados - Autorização dos pais ou responsáveis legais, em caso de aluno menor de 18 anos (Anexo 3 do Edital PIBIC ou modelo disponível na página da COPET -> File) - Aceite (Boolean) - ```text - DECLARO PARA TODOS OS FINS PERANTE A COORDENADORIA DE PESQUISA E ESTUDOS TECNOLÓGICOS – COPET, QUE AS INFORMAÇÕES PRESTADAS NESTE FORMULÁRIO E OS DOCUMENTOS ANEXADOS SÃO VERDADEIROS. - DECLARO AINDA TER PLENA CIÊNCIA DOS DIREITOS, COMPROMISSOS E OBRIGAÇÕES ASSUMIDOS, DE ACORDO COM OS TERMOS DO EDITAL PIBIC 2020 E ESPECIALMENTE DO TERMO DE ACEITE. - ``` +```text +DECLARO PARA TODOS OS FINS PERANTE A COORDENADORIA DE PESQUISA E ESTUDOS TECNOLÓGICOS – COPET, QUE AS INFORMAÇÕES PRESTADAS NESTE FORMULÁRIO E OS DOCUMENTOS ANEXADOS SÃO VERDADEIROS. +DECLARO AINDA TER PLENA CIÊNCIA DOS DIREITOS, COMPROMISSOS E OBRIGAÇÕES ASSUMIDOS, DE ACORDO COM OS TERMOS DO EDITAL PIBIC 2020 E ESPECIALMENTE DO TERMO DE ACEITE. +``` diff --git a/docs/forms/inscricao-edital.md b/docs/forms/inscricao-edital.md index b24b6e88..0172e68e 100644 --- a/docs/forms/inscricao-edital.md +++ b/docs/forms/inscricao-edital.md @@ -22,7 +22,7 @@ _Campos que comporão as entidades relacionadas com Projeto._ - Título do Projeto de Iniciação Científica - Grande Área (areas.txt -> \*.00.00.00) - Área (areas.txt -> \*.00.00) -- Sub-área (areas.txt -> others) +- Sub-área (areas.txt -> \*.00) - É candidato a Bolsa? (Boolean) - Palavras Chave (3x - String) @@ -85,7 +85,7 @@ _Campos que comporão as entidades relacionadas com Projeto._ ### PontuacaoAtividades (Índice AP - Edital PIBIC) (OK) -- Pegar do arquivo Excel <-- +- _(Planilha de avaliação do projeto de IC)_ ### CompromissoOrientador diff --git a/docs/images/app_architecture.png b/docs/images/app_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..7a3bc8bcadaa5b4518312ac76a89b6025d1a1d9e GIT binary patch literal 267537 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
X&=J2BAxPuNNO4{X7_IU37 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
>Lq#a5NJ6dND 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 literal 0 HcmV?d00001 diff --git a/docs/images/der_simple.png b/docs/images/der_simple.png new file mode 100644 index 0000000000000000000000000000000000000000..26d938dfd726adeca7643d9dea20e0afa0205f34 GIT binary patch literal 125803 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%0Dlh#!;Rh%@9sB7cXHwi8b4GE-B8L|HrSOWrj&O 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 literal 0 HcmV?d00001 diff --git a/docs/images/diag_application.png b/docs/images/diag_application.png new file mode 100644 index 0000000000000000000000000000000000000000..4910bce74cf7d27630aff915d9c7fa32eb4598ab GIT binary patch literal 43153 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�%vZ&TZCNCx2tI8@L)z2gfaAM_fUg{y_O7Fu3t~m-^OHlSYo1 z#}D|Dw?)=AUTojUCWxJ@H|pnwD3v(d7A|i1e-V%a1b_ah*)Gz6W?xDH_O$CwR6+FJ$dve3T{&A99=O10?7juTx)+^FU@0@Z{&VmFMeKlHdyawB>LVwj= zZ@S33Uzy$h66jKn#Lst#|LK8HoXKOK^4wA`2B-Oo!+%^Tdsmgo&b+53eVRM)MJOIC z*4Zx7W6~31;kLebv;L9Y`2!q0PJc3wF#LP#Y}sljb}Y$w23EfN-|3VUvdY)rU3R(W zs|}^38&=U^>l}Z-+Ait*_+wifz6^dQpMD_6_={w)d+C|(>7 zfNqd(>~?YDox0~_3QxA6^6PtYQ#i&5)Hap!RVFLz%}xP5zgO^m@@e1ba#+G8(mS*FtTt)bk3WrfQ{j3NA>4AiS3q zo;Rl|w^xf1##2Swh01(l-_jQ}MjwQ&85EjIq)DzrnApMuSQ-z>18qfP#G6Reh?_mX zpOuv8faRR5<|)_^8Psy~-k5pi)f_Ipe#Jz^oOTxHe%)a+-{RDGG~cK*s9a*OrJ@$j z^V{9b5LGIkL60W7j-T6M&->wK!d#NG-epFSL9?VmxkzPyeo~Hdwv;>=5qU&fNkYR zwRwJt?s>6bhR#L3n$fu%YyVF&t=#vu+4vq8-|t0M-0sl19Zo5t6}A_eP3tXIYhH{9*F*)uWsGjW>d}eo1QEzR~cKTZT&fKwbiC1_~l7uM^3lMSr)H$uZOc9 z%r#zqyig~x;!zZF*NW6rN>vF+0Y7Z`4Isbj)kQqMB$ zW%zD4jH9TO=xV(y)um1Tnm$vi$))8oV|HN4bxhEuOjah89Fq%KoSJD&5OAfhnyxhd z`a=5hV8G4EDoz1IyKpeZiMP;6pex27j>qdgHEoRtY*&(bVv%{KgJOO0_Eu2^GBL18R zX&4gbNR#nUQ6;v-GrW4OYs3eO_|n1+Yx)*n8X}#Atm)hsKe(S3+Ne;o*l0{ccw4~@4U+Vtrarf%a#pOy(Hsje_OCxj% zGyEsnb0vo?g?ouRHyXrU^BvkG{&4OK52W&`+$On&xm-7_w*DLp^qL`sR7lb=I*hcB(&qVjU9k^;`<;v9`!GLD%%o3%2u z+5FyQ8#orO3KmU<_&MQZ#nS%%1{v-hL}Jr3kF|)qxq&|fQZWZ&9LA3%aIbn6O*Wm@ ziDmgmkHQ4vFJz5bn0VfdQ{v@(tjtpE?ddj{hAnfLN5;y`;U)d!eb1Zyld!3|YV`uB z@H^zzu9Y#l)*Z^3+K2)H@u3T$Oc(DQ1>9i0$_wO-D`^XC>@Q-1B>dAHfvHOkI*aF} zXM-fdawhc#qYjQpn=sX9-rQl!x2lGOC}pvbTeVD0%VrAO-^0RDR}n+?#M4-L;hq`* zRG?x$7))?ExuVc#rxK3*p|hsDB)%nD zb%G{dXL?g)_fuw@A71Gwj@lmQdL}Eq^vTe>^E_%ZZekxsoZAs^;=0zP?aq7&`x@4& z)GDvzB9_L+VMU=NsiAhf7=JYS*}bRQiprd%jZ;0WW_3F1Ir@>9?uBGnQ2wE7C#oeBpXY<@zGrq*+Eot%$5FUd zU>UtvKRXbHMo(>s6ncs5zH#mMIRA-LUj&gjWab(@sLJG@0J9k=18ZQnRpbl9BN)F zfrmBJRv7wHZGFPX&Ixiu?QV4IhFWo%|Q)>leR`7X#m( zPoQ87tnf8&l`#JN;=fpD6$kE%mZEcLeLqNSpE^hsIu-xg-#mQc@Re5PC+d>r-~^8O zo_swZ>~S>(ZmnQDNMr%NdWM^ok?EANS}9~39s$RuIXK;fxWa0&)g!b@k>_|ad89t} z?aH6lTVZ#2q=teoy`nQI?&h2=N530tU6H7zJhpIeZyS>6@N-xmBOK z7^}vsUwlsZ_?_vw7}dj}P4> zGPfOlLNVqI%wHR2Q+-)cwvzhUC>2ad6kDo3!h$5$cF?=vWJ9R>FvGU|Yvb4PGBb%9 ztC~WI@uV+ySGbe;uBA>oonGr(>gZGwsZQCsRdOO0?X$y6aqVWD;h;_<2-jX{jRa5G zRRxW|fzSs$MDj5g2Bj7UXVwcOeL@U-Ek8|5;Amz;KsBUN+2K@inzQ*@c@CR0)$+3C zrVq7IjbRh3%&NN1Ze`@RE%A0uT3($o7xSygE_mtgTC2Sa1vwJ?pmRr7^p5NnHKL1j zbaL=VLU`QQs<;ulZ|V$2Nb&F)-hZ*@3yOPEr3pxvI#X*c_ z>g4!a6yBH!=&di0i-@EII)wC@?~T9x`sH}3NvoH{rr3*#*rmBxukUMwDm)O!UfL1T zjrpV1uzJ#GE%2vhyQalZ6JE6Wo(@0hg4}bRWnB}Gv+p6H$81&}PGO~vi{C{5DnSl3 z1E*q5VZFwyx&FqxLxOSx(oU9poHgWB@}|KD=!WW6>zAxX2Z`$oQeh z1XiI|rpEdMsbdK1A2)yD|`r8j}^`x?dvB+yc^#U(FT*F!CKp5vibxExsuw_}Fq=N>lS-S^~|stW3cB^sO~ z>PC*qnda|Z!WlFqnLV4P)NcjLITR)n)f{@a#p)N;OVx1eH8wHqvlg6Mlr3k@ru?s` zjZ_h3)w_>ht2Q2z+|NL1*H$?m1i1l0LnkPLPn`THvzWuKJUPo?--tcP+ z8l%1OUixSpF`6cQj0rc#g&cO*OR8HH076Oa>yyrC^zXq37~kM_I&HJDPkiB{ZZS#_B}o+ES^lQZRb zP1M>QV;o+&Pnj|wjj2_i?)*oE!}W$im_cj=vXz?Cz4|cV1T$ynuGhV_n z`c!OU7w6e$RYq+d|1Df{{gfy{EfdFbuQHrqA8IQxnEXhukCj_a4 z4l_P{pk6=gt?sOVALtP`V+VDPv){fL>{2%%#3?lRB#QAwTSE;1a*d5*%rd`~yX*Bk zqeaw9pm!c0fdQzaq>fbppe6cBPhiy}C}+-_8g2~$E24J}u>Zh){ip!Y(e+U?)2j3Z z6pQ$XJnQ?|2^2;%cU=_zFsxR6KM$hUzmwtA_%|`0Td%~q`d|@U5ejGxJ}`J zDR6k|hFYK2d%Y#YKFPiO!8^>)#HtK+3<|k>gC>)`XW8LXCAYNL6#8OUFfgSaMHx(i z8Cd(yQ9Ae|QJw^JA{ycpB~foyeS;TujnO0T>j5jw9XMrS91&vskKmQ{A$3ZNMo+^n}i|i@=@MmC_y+^F0`AHImf)ru0p(ihtAbW|5u;8Ib zDO0aWQ;5q+34S_j!W^feFL_up_ibWcxR&63@*-vxl_=r~g?f!7*wa-y^SatngYgjz(}IJ9RPpm^IfrTiY4HZk=2aE{gS zO9l1Q)B*Z~$!Ax)_oB*i9G}44D!%qSj@M z0Oy6drl}J_sSpDMGY=9w6GiZl;c4GP7oR#38w#ifo9I(MN%svb>UKb7ZPQ66FD{J0 zzwqC2P{VNmZO6+;BvDWjbDS)mqFCTYHyRNN;VEu#KQ*T?Mg(DrH({srJ>Hdv_K*1m z##Jhy=@=fly>#YTE#=F90A9?~N67Qtn|;y8d0-~OI7<6qaXi85K5R(1Zo@X7*cOvH z!KD1|>L$a9lw3hw<1Ze7A9rL)57>_F6GIZ1G_djJT#s=Hy1wkxbcqjXBS13~Z}svI zA5$vd^a#xY6zE16!)iJUloH*Sa&iyLyTCd@9b)-ptfjt#nJ09iwJg=6bNgW3)XoPz z<^s|?&#IdSk3QPa2(m+Ft-AgUA-^r)#{^NIo3YVf{Jlx*^Y8VJMtOH=yZwfyaBx{djl+`fWYu}4ZnpI7<9jFD)PtO%+|7-GF8paLfI1;O z`AbcSW0h`D4}zmpOnmyT*o7n>zw9x7U~L_+WZt!9!A9S$fO~=l|kr!Y8Jc?%`G+VnUl?x$$pDd;&vbg zTeZ|UsF$1d6vrq%CZE_QC#5%Xa}SFmAZJ2+6kLu?O-#BG-@lT#m~@{$sWkOkpf|t) zXYlKPe!7O_Oat7Kjw9@P(irMkAQ$-ljKlWPqQjO0Im8xhL+8hmk3Tk${-f8Wm3`DD z;F3IijGDodwV{rb2NH}(Jwx43X0ZhzJ(mnye=1>10y)J@=OnHtj9d*M)eUCnebV#y z(5n-;tT@mu1&e(OkPa}i2R@a=>48M0|Az6#)9iHtQWu)ue|SLxW*#fwBK=RMgb}z3 tUfxZZ_GB7rwX>yC9yd68c+F2~k;*viJJF{|jx&)Rq7M literal 0 HcmV?d00001 diff --git a/docs/images/diag_persistence.png b/docs/images/diag_persistence.png new file mode 100644 index 0000000000000000000000000000000000000000..367f3ee94b155708c7289915d010640f82082628 GIT binary patch literal 44870 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 literal 0 HcmV?d00001 diff --git a/docs/images/diag_webapi.png b/docs/images/diag_webapi.png new file mode 100644 index 0000000000000000000000000000000000000000..b7f61d6fd16ee0895a5e78b2022ac34f50f9888d GIT binary patch literal 22774 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 literal 0 HcmV?d00001 diff --git a/docs/images/seq_sample.png b/docs/images/seq_sample.png new file mode 100644 index 0000000000000000000000000000000000000000..b98f4a45a95516bfe236e8375c369a4138b7b14c GIT binary patch literal 257748 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

}BLw3W@ zB&+ihdi>FvHdE}kPf;lQE=kZ2|HOXw{tYZC$D8N_1$n>;0FY#DR{9l$aQWaZVL_Z4 zCLh=k0SMqlEK~Dca^Izr?Y>U}sSOjIi*Y_;>SH^T2uj~wuH`U z{U!g)fh`}Cwz*k`88$@{gicWcsLi{FCGr-WQ)=q?kfO=m__JoDQqcIQJfv)l?hsW{Y63@ydaxyM#n13Lq4<^Unc{lvrz^E=~HwOx) zHJw+&EF0hIGew?dgwot@rRV%n-!N_uE6HJi8e(iYnc-?gdTI8c^6uIR)b3?J=*F80 zy}Up91xwC67hn;!ZI-S4j`8}HS~yIy5^Y}c=QU+WGPrc_uly82Zx8_0?)T^(4nO2n z4g)j9Tt4%qM@w?UU@i==))S%3k9B%2it5bHYNuaJ+xEm$5%e|2*+!8cyqV3lrGOmD z3Tz~EY*AhOP6=F_OYUtdlNI+U&WnnVxmkkJm>qC_Zim_HI@+$ZI$NOA=1?f|XC@ZF zR}am5S@lH&<8hB#BTvJGQ#6(h-$27@QSnl6>?ZE!)|LnRAs2`-4MF0b)L9cLWH4x9dz#bLe||on zs=IO@^RUDNUgo91Vnx*Vm;9FJd~OfSqp4q2mDPiSR%dm7_tZ^2I+WbM~b(FhuAkOXWQA+xVBuL z6x9HOI}2yXxjPst@thOBtPEv$p@;~tT1o!0Tt{HC{Gwi2b#kT*Nj zP09}!Pwl-!ei5+_E>N@7n3?Q?K3Y+kpRJK%R9=bCoj%V*s2>`4u8yq!*|OA7X+ysG zcO${ju#p_I9Ww*sF1qYq`kZDniA(9O-nH&(c`O~}P%LrC8D+q+j?Lb40c!?$n=?8} zJ;k_M_)4fPOk4<8sir8TUnm>=kW8^AWJa+c;J&wU*TC|&;okR4*QCy?agMos*>h~U z*pjcwWoxgYqMDPL{ebwTUFQK5(WeDI!6yNdv@k2r2|0v|hgqs9fsj&xCBS~ryyF2< zHg1XlCAy*QLsFlTZMz6i)Z$ZaTfv!I6%=>9WQ9MnBPA#V0y=Hi%~fy^ywAi~Sv~#p z2%l9{QDdjCPoU2D_L?AP2r@cSKl$YpiZp;22&4%aqR9!_$ToK(hW-dcu}N+_?q=Nw zG;7+bqWbLi2Bb)b>WP5XW>XoeD0u_{r;H zYv)Cy1`DolgnZ7*6cl_ly0Qgg%ur{9=%tBO{B6*ZU9dy6MD{Z8kK*ZcN(7fzelU_> zJ3i_c$rLd!yGZ07?7fc=J&=OT-1xM`U@|e-!3{m25|ij=F-A7NNh?FfgdO6rpp?V- z01G0jp1G*9tPTLT$O!eC*$ZC(H%7(xk#{Pt4*?!YX9?^z{8SgWQHa=1Q8^I8vj($u z*uV|Ax$t<6wM}A=xLBtWh`=C&pF|Jet*54AqvBsXEY#K3Kl@#q&4AMTxdAiTvyh1b|EWfz-gZE+w%*||@`@(Yp;&;_S zs`qn3uBl4awf#q1k7^AS=%Vb#hLwAJ*E5i~_TZ1*^zw|boxNTrt~N+rHwWm3kbW__ z$uetAZM$m(IH)q83rVacA->T$Od6+~1_7vB1aoJ)$Vx)K?cgY_;UV}MVYIjX@F)Q5#pwJ$YcJ2f5o zRk-i$xYjhGSOczJ(e}b9i*|k#N}A=mUg+N=%ydTGs-F>*dSM`l5s+Vgh&R~f*tG5q zmy8B3U0QLgr8M6IJLV`Q6f4UGe@lWYbIANJ403@f(TdT9M2L-I)Ej0`?`Fx^k6%6u zBTyUoEKvc$k49n{HQ&#;1v|ywV|Uj@MbvJnA-$V-Me{KPEX~Ce>O)&g;UFfut4C zJ}Qm(quJ;5%>i+JAsi zBzm$`==Se|z<`07SX5TR%*-yMc6*%r3BWQoTW282_RidtasCV-$baUJ5)!C3KlLk^ zyICah!V#+}l7lV+5(%s8z`_U%StwlEgdpavN7>&YnW=a~`>T%G;Prb- ziVQmc_BmzwOewX5-?8_4Ovw!Db*azX8?Le)5Rj59Ev$3m}S8tByD%}rC^Pl!CcGDU;w`PbgDfC=5yS zYu6E=#h$b=(yDhdkZl%u7SvBz93Le&V8>vHdl~#m0%j}mgP`PT$I#f_lyPxzLq>A5 z2EKqW!)xuSd&#<*ndwom$LpNMT|r^uTke>+TLvjVEW!aN?LwJ*IPe#hR;JfN8`wpS zoa`jlSl?AK6A@RDo(gXAL0ETwz*!`%G2~TZ!f=U~OlS+>(2(tqnwn`<(zxr{EiteZ zp+X2T!+&D%R5c>I>shAicDU|X3F!JcBAVWKEql>v^BS;PMKRs15 z(~g17^z`6jVaPV9JF~%r9S(NgDYnI}MQW>QSp`2_LkHdcl@mm}*rdGz2;Qh7 z7IFBZUe{P()bReF36u);6*&g}4VSyNag|WOgx`nZ3_(BF7SQSGw~zBAoM3;aWnqt+ zlpgWPO=&%tEw~WoAB_yY1jnB zjfUFwbrlou7`M)8A(Jo_Oir6vu3uzjJI{zRQCITujLgY!<#`pzS%^%7(p(B9^#FO*SHK)&d=lAo&! zHU6TUf{T?w^fD(tMvs?Oo12SXZ5as4QBdozikQh7p=;%X)BvyfUzPw z_gxP^>j1->ii(U%IaUDY_)yr5t^_5l#5G|*2e96h0R01Y*;>^4eMWyJ00Y6DbE)cV zLdfqqZ2Zo|ClhO9Vj+Dq>K4A!OC$qJfxVypvCDo;{!J0QH5XQ1e5ay_FalCJ?MHjZ zvlrVez5I*@!9>N51-R27^MJl3+uL@El${gRZi^tMX*q<~6P8l@VDlFM8bHA<|O9W2*tuNa(ncF?V?{x?X+HjkGLXwwz&N=~O#r_5 zVyN@oGkq^p-3sX%w2P=$e?|eU`v^uO=S0;T-w8qXiLZo?cA*EOS34s!Kq7qMgXA8d z?@dXP_lD!uZ*FL^!*LXVibR$g0Ym_3srV|2*9+YzqvHedTITs46Q~?;OUkviFcwEI z_O_8mBdb5!hg$_d>3`*+c=!4F^nrz<*L@Y-yUviH56t?TAyV)Qzn#C)3Z#mLP}Of| zMN~JepwDvC4#7&b<(Ixw2y3UT195+_-sxjrAoAng@r2(gK-LM|qpD^*y>%+7USDld z&IFWxX{-DGu+)$chl^Cfd^5-WAt7E)n-9#I3-V@z1%seH0W>Lb@Ioat`Z|C>eRS+r z(G3QCheel@J%YY(;oH$|MsC4rQges>{P-O?vN`_zPS;OGxe4IY0NR}P$RiymIR5X? zN{xO6u*mTIBbx_uM75EzD7gK}Zj=a`q zqiD;}5SJA%aaEz7t1*y1ape@$cvmZe3joC<0xw&*}7 z6CQUn>+*WG_<8OElxJP4+yu%2j!^O$G+{raE`=y+L7?ENV+quKSM+_rGz5Cg;kGf3S}UVr!6 zN%W5;7D2E!w7E7G0!;P)&fWn4eQBRlJaDD4tf($73}yuO{{(!af91;y;OF2udA5Zg z>!UTy{qB%)8y+-DyW1)tVEoL9sVyt`A^*XZ9M1<#PiE?_h9=WdHBxcZ2zckKLFXfq zc>~+?)l2$;DrS}gTajHSB9xn_Tv~aSVyj&ddPv$qm#%jG#N3f=R!2b8B>(nZVptg{(3qb>+uCCHa{kzIhv>{L!Y7a0w09+5vs4TN@2=pK9>hqR7 zBC)Hv{Cc$h@?Zh9S^&u7V1OwE1`AV!;ILK$Kn=<;`Ozj@iz$su4cf;>E?G8KRQpi? z-dt3KG9p4gHC{MPhnBSm8|)KdboU-UPN;i*Aq4&T-N8#fcRdDOrBmsula!W8N70e(~wFQC-(K6#u%>}+#x2y*S(W6&p{exkq; zz>(y1*)so|b^_D&B^&TpSC3+Yxr@J;73F?mW4Uuh;|CPuZ`^#9>IX97EyA0Cg^U~i z+~9yK5D2)83mE+Ht&iu(zmi>7UrNE}N&bvLO$Jh9c9q`YvAZIOIVB~|k(xc5aWzE1 zns4&NlnOa{e*d6^oIc>SNA)GFE9#-n*I@=#Qm{RuO4CBtQaBVa2+>|k?(5U9y#P^> z6(!Q#k*(#N`d^|30QWluw7)__Yt9$@iM;m~$3Ymy{Xtj^JV^M#WuiF5-YK%T5DNlb ztBIg;#jkm(r>)nc1!fDtqlL7xUfi7xSVKStfgp0zp+`jjMf{U^{O`p0-?8Pz^_}F7 zyhvMnp>?xPyzexW)%!JC6<$H;uJhE@80g6Kop;7hW@g%QxA*3R==M!R5yr-BP7%d{ zMjPZOt{TS#Vh3=A>|+X)PL`!;F-+Tk3?D5-3g|sQue79@YVMtFG#BtfPay}41MLTN zVu9W=n6;BDLkXwN)US0USe5p6PJAv6=q^!m!2fCs)HJkySpGhuK*uAMD9iinCBc*k zm(hpGp}N`&)N9{oSfo5au$M`MM<~3!;2K)%8&d79rXu=|pWe5mL=Oyo=Hdo3LHAvz zv_69&^gU&er0O^ipg-p?i+r+$l>Q>zZw3-@Hp!KsTfwn2Ykm38c46^(O+$dU3v5DJ z%c$EeaF|t7LnqG8$We=b$q6#c6*IO+>pA!E)fQ=B+PX&HN-Su%6d5lg46BdtMzL%;h4%po|Z ziZZPXYU2ieiGI@sY#Q}>Dwx;})5^hVz_3`+Z4@UoAJq|ZmuOauD(q>}wz!T>PU-=yBu^FsXNGA!V zB+Rn|vs5Uvb5$Qqt2ifSSKZQXCC)`)9J;L#tEQ)$`L>}NG_0^T6bSZCw%kU1{?#G> zT^vIXxrsnrlsd=8xmoGS%?(dY?PS=FH30AjJ(LauHRQ%d$Z4fl!S(2(!OQP|_WN6U z+G9nnV|~V#ffK(cgTa598vv^Q_)Ys&f_}7H7ft@;7#sP61o-jOm!q4kf~>A(vAH_i z)NXOj4i~V6hG6JsLptxjl9NKeaSGxi_Bt z4gdLAPtX2#Ui|%6|F&fOW1aYmntM`E{>#(-^Q-@S4)6(plY&?n119c$D$d`&uKywa zfuZBckRkp*Rt!ko|67~JU&r>}$NRUxXIo0l&;I&E|2SBlP7e4BE_CIWLAL%BT_}jqTN@Pv=fti{Wpx$oTzs*K zD&O~S^3Cru^RqKT-~qry^R*#A&G?(i-B@;j+p)^Z^=Y*4ht8>^d{Z+bpwmn?;JZfDG|tHnj)donz5??CMlj>xJIR-T(}8fc!99#FmyrH->o9!nF{o~dhlXPgjB z&9Zf^n4=WzgEYEfjD%7*GfF8x6b)ic;qV4XUSJQ%clFdQm`cC|OIRYK&zS z<2{HTfZGLmFwmx;HygOWC<^RYr-1w9PVRH$W^zoQ#J$7|Z*_t%-ry1jT02m~7NI^& zRGk6sAE%oEk^SKb4X4dk**S7J@W6GfWx13sA1#k^oag!{xShY#dlIvDDE0Am`KL|#HLl(2Rc4~UF20WH*!B{yXW@z9IeAzREbYVg^BpX zbfSR!vOX@D0g&SuU8qQNmyy-E7OVG%(&%QTDwk`sRe{4~|AO}S=U!Q9?PX{HCI97~()n56959==<>tD; zyjHX)Zm*@~x4+aVsCk#F6JB!*zZOyb*o66qit6orwtKy2>De3(mO{EcG$&Ve6CZGy z70J75`Dxm$ZHo5}b-gZ3{s!{cSzn;dfyg+`Uz-pLu+(^UT(M@Tx1<2g_6YAj;s3KZ z-nso7H=p73Xkk*K+sGbDV_?{7TD*KYyD-^=XRD7$hR0l^q59;rXDp@$6#(F$=l@<> zqkbxKMrsQ4EgMKh<>~3}6QJ7xCVBgNg?NF9&a93wUX8xMsJO`X;X?W(IQ+KviZ*c< z%Z*i;i>+~DhUGQOZu$4pY`HUJ2rF$X@+gSDp6J%uoVp+eKc=Svg0@2qt`dccjx4iW zEv%%Z;b80R3Ki*zFXH9mXP!!1n^45psx&WduF|=zKa;5q_2&` z8wbUq%U&(asd^{zGp>ir-!s;k@{P^guA-29z^Sqz{+c5u5V)PQ7U~DK$9Bv}e7q)l z87Ru2;}d}u;P+||B?Vyo1Ftly67K%9=-LuAoKJV9Fk4NcsK8%56(67aQ`7o>kY88r zaBA6HRk=5)ovILQ3BN3j%E3aLUZfriebpGE_r-jk7-U{X0UQeW%i#)Mc@KUs05vTF zk=6%TUD%s}Nv!0suxQe|#?jw;hJv|6dXQuO5+6 zZEt5EyRZQ80yR!oU?+vng8brCivv3_yZ!zhi;NUvXY1BMVFGmZfab%%yO8CYyclqa zaw35!OY}lm+{%zo^}%!xV8#kNZTR_c=CtxjR1q}}k1&31eSa|F_Z**$^0iu25{(8R z*Y*?V^WqKS306W>ff9C>@+I7mPu3Q!)DGSxz*&bbmk&JY3Jd7J;1J-Zfv=*a&j*uZcS{@GdBY2~oNr`-e)Xa$ z`F!aJ2*ikuhpHS)OD+c5BD4hkK3H%VvCvY9T(5RSb@6H$1*OH?BP`k#=6 z)I)FGR5UalwE^{N!pcl_`8#VGex>PZXPp6HJoAsjiRZi@o}2+$9t!eQ_!pcDdabVTf)7gltjwl#9O`0+j_8+&;1ZV2K{lr1>7sE9^Zlo z6&c*_nvd@NPC1YUbX{7#(srsa+L1*FDA*?(j~7$^0QYp7=r`w;B{Tczddcfj7z0(# zETj62GjQ#~p;lWQpcQNm^uf}5%glgv^1w`g4`q;$IBsz=N>gtf=lHl|{(VuA;Zy}N zw&mmfkV0^p%~+v@TbK^HQr7g>!KGEz*5OyRpr@NFYB;kI5eMEB#gOU-CRyN^B^(1|Y^itBYkEZn>~-eA!G(zoJVZTUPeM4tgl2G)PiP%*{(hL58=os*E4va+VcF zl98Nc^S8?=p8nz@z`{sjq~n4}%B#S#8kpl(6dKj-^AT~HCnZU?&Mj7INA z5~CaWF_L~&00eugz0nxbm>jufk3No0l6on;1c5qJXBr(Q69;mC{IJx9y~CR`fQc|0 zvyTjmmP7Ag@2z;W;V_^!gm0HRN!>A@`^kK?VPwIEU*=3hBm*9YaqSJ%$laY?*7HIrGovNFPD7M`t@!v}f_Vo|YsbU1IqK~HQ)uETqG6|{* zy+zSduVk|9p8Bu~hteJx-}{$aS6Hhg=>N_H)rYrsInaDOd>1wac!O$XGQ#z1joE&B z+T;^8>kN4r`Pt!d>#L*Ka7uZLJQD2In*ZMe_5XnfiUDD$>XGa|rIb55wa{EyR)Le3 zCBRq6*lF_~p`aypr@j+7KUq#ssYa*f>?RkKW<1NQ%Cx~~9< zGv$fA@};59F3c-LeSuP{c0r1CsfNUjby?H0VpRs!LO(-mgL!t;oZX(AyDC?BG{wxy z-1!3lEX+Zz4FoM}TwD}T{dzwFt2v}3=}b$J0=`E)Eo_Z#;eUyldSq%WYWOEazXo_C z1qI$b2rGz)&@fR0xnmey3L=VMo0^*5X^9mg?D>=RDTI|g(|b?w0w|Nfd>+K2rCtyy z`qf9VA|no;3kaj@qIC-2gQX{rM^F_2jqA2~erHq+iD#m@#co`TuITCC>bVC{cZGy6i3W!E-{on|&%dHJ%YeOBYh?G2z zQq=rB%c^-h4?8gtGJaakjAGdQmf~w58~?7vN9X-yTVNal&IT|mVCm;F@O2OTv}1oG zl9D(A!DBa<@^cuK@zc&~I}c8L&30-lDfbyqK&R?jvzS8N1N?_=dH44#f2Br$Df;;n zWPCjJY9C}np`7d-rDz;KqWZ(!PO3R3CLsR0q|K`-L9@t6kt@tSc|BJd)Ufu)MgbY7 zURu$;S0^nakBx5Pqo@X+!0OwbZmBi_;VqK5vdmmOY{s2#WMt_(a|FdDFjYjgnAv(A zVsN+M`mpry-H-zBw4fG#eseZx{xvKl&VhKb&Zw!dk(u2&ErUQ$DTm?hGt`-IEiUR|oNhPlz`4I56y(dE3V?Lmzy@mM2pw-sgULkl%4)$pZ z4OG32e;}z)udm6HjPwr3~C(sBr2dbnWlbyBc4~Z9lJy;8{%G>hs8H530P* zI3I!3)MVqE3Ud?l93wl#22Q;0efWW0awoicwGR9YYMzMIZ}=}>v@8dvuKWTN>$Pr} z9D)y}cvIOruZZ&0!aMfzB0jnWfgga51=4JeiF3oQ2BFbxbw5p?Xo?%(pQ0{-gSO&r<+G_ucWB`S^9?nutL05MF5nk%+MJ;Nd5QMTGgyQrNYUtzK#I0x8pG zblY}p^)S=(D$F#3{TBU9XIgXnGNb4B%0^X{f{`2eoKpT%v)m>Q(fwuwOAg z`ou`n=_KwG6YOA12gvAcW&nV$FprztP{&He2JqDPq1G@kuOu(9Z)3S5SSL1{H|a(z z{+7#V^2v`|0E`nl?~llq!G`q1dAAm!C?I7leL2`y8Ybcv^&BB3;51=c2rRNhk~yJcs^^> z#Q(Nf>5v)^zer~}0g{LpOsx-`qz|;(v^&e1#JwVjZ=0uwUt!fk^hIw#2%PbZ8?FQ4 zOdM57U$4bcf_icIswRr))A6i@wYB&s|HV?!_+k}CS?B1MVd%g21^~K2b;HDXzBDB2 z({0CN?5x{!~)!l6~H6r3{ZFiTn}b^Iy5BFs@k4Hr5QTM;(}*(O9?|- zo7+9AWwA&-&8p&XeZdZ6Q6k>Yu~^<~E4!nT4MRinEd@_A^O1DQH~?}1+3+A&N=HEv zpfvSP`*F{NHAO`KsnhJU9h#zFO^@ywMwFqrUq{kcnfHveo{m*Tjd`oI1s~ni5vAHz z@K(*61#aV36m8YNLS&`$mm`f+KC5ci@mP>Pm#&K7ZiGE?W*M}4n>`lD*gcWSS|1NgJDC$LH_RZ6{UtBy_Raa?!0g{qL?ROT~Bj&da z*&;&7aVoRZmy`aN!JNm(Y9lxYS`FhT))|DA({KgW&Ysf#j+GZj< z{om;N>aZxg_S>PmOB$sc>1G6_Qv?Jgq`MoWLq$NkVL(zkq#Fcjq`MpG?z4U0?>pD; zT<4sB{9}Zfc^;m<_kFLm?zPq!YBe%Ev|TP}UR_r(I!)AcI2K$Zp5XkBP>JTUMlrXc z9_8k;-|spo2_-K1I9(OV;Wt)yasIdY&jkj4SnA&SGQ+c8GSMez*D@9sHk;+u*EM1O?S^ED%B`se?}M}R>UAZ^q&MttS3$kmpqub-NGf} z<0S@k5cA_8{Wa^{_*{&17Rs=7je#~R+@L^_OdCTO&??ADTT)C*bWZu2DXYA0D~pyV^dCa@%IzNdX}MbPg}CH@|;*@E9H>S?!vBjNEXcIKak z5MjwyI69~!LJx(}pOm%tBDvgEMlvV9oti}nIt`0K82O$Ufh~#{mfDEZnfS+;5RBmy zpFMWu*S`GE*_{SK*8e$CU(MW;vxw%Rf6AWT_R&=W~8rKwcQiAj|1mPWf!$` z^uuoyy;b-sD%k1YZod#Zb6%_?SO`581QTh$Wik32=M~1XW1J3t7XwY_E1h2u7o`tl zAlCDd?Ky1bkXUFX2ekE5yyp)hTEQ4HymkCP_xZE1=tdJu=unkoH@# zbO1~59&C9|zKNK0=bLoLS}#phe+bb_f92LsVLo!{F7NjAMqgdbrduLS`ze#bHoQ4D z3J}HXXq2}{D0HhY10hHh{w*E{_#96O)zv4L4Z+Oo^DT3hs?GGPWdLk)d0W1*a4TOr z(WJMjsEZQ7^+Rhsn|a7s4%o1zo1~XMNq?)AD(@)htpVmY$z#7E4n17t5p$8Dz*I8d z=v%Upvi1u1-abL<41j+}xVfEARY!B3gP*_Lcnnh0?cCf(6T?=uelST8g>mr?pf#@{ z$iMh%dS?p;X6JWQoERbZHsMY+`902BlpMZyXia+$6whb+fnB8lhIn+>rlH(o3+uD385oUi}vVPs?H{VABdeqHUFwfnV_Zv~BS*cp*|!$;dTU2Se^ z$I{*j-;`T;-F09+Abo*fCMXzIqATXdwXppsN4e|%|D$du zwrfmR2h%%?YwTsUTkk$@MOQcu>8fgIm;(zXSizUIE8+xqA)SZ{eI4zc?cHmBExy`a z*qtBK1wAB%bFUrG^-(pU2oE=uP=izA;i;ApezeCy0PCDsv2g(rp7rF#W0m`&y&9d~ z(qru6mfjQ}iXxNROSxxq*|N&=F?6JKz-pMvX-J4RhNo_K_n@k=*8A|b-`ngndw522 z-g8@F{iS~EyvDqS-8Zf{_d7gGyNi!kz&twt{o__Y#6nZ7lPANMx|j&QqpL2NPgk|U zvb_4fq0m{Cj7?vw8N=HZi@HN5hWm3tP|s@jrRu(|UU-xPwdU(7gIOPqsZk6*^$U01Y_YI5RP6=2B8I35qn!TH^TxvOz_R*|S5&9xUCzDKPMd2*&7 zdXB~e+lbw;lwaW56?{1A0>cYI@a_>d!3Y+bKa|95yqqkRFlW1J;0{A=8f z=u{}D#Y5$t+LYMz1R*-J&TDHB7d1H~pDKS~Z7OHS{f@ox)K}GkuD2pypCG;ay^~EqiZ$=`s^gl#G??z!o(Tc0agT?d$vQaqJ&H3c2aVQu5H%n}bq!*&X~T zw?2|bu()C{+GAY$aMWC%X+so?YTt>Scax$!O^FUu$M)Td2{E@EI(f*}kWMhln47+1 zhNOtbuiyQWQ<(e8xTVG5Pdq9K56iWEo%4dLwFNk7vG=j)bnWc@9Ib33A^~>GAyr!Y zUk+n)%;Z_n&a!6mD9*R?D~p2hWKlA6TTvb@Vb2B53Oj^;s-TSItLQ)T>=9+?Fjp}U zcfaW~sTbso4}1!AsMI+@Rs=tj7lzD;PaxF;op@H=4B7aCSIRcCBeKgha3d7zEceGsebK7qwQ_x z8y)>t?Xp5sRLRf9@G_)yDz z{tHKGfs>M}R1Eh!Qj!NdZ%wtg+aVvZf7|-m>#g1yyK* zAr?+Z%YsUs6A0ZY!p%&2YE-O)COrj$+%KtiLg7LV1m^{eQ9knOWBYT^+GonW_SfZE zWi|}?edk&yr+)|XH9j(a5kdKbjz%dri z{GG;MI!l#_5Z>a&XBF9**@cZuX@719gl;cR2MDir2lj!43}fCex4P62^7FMGPT*?= zd}!0}zvU%d)RSP$d3&#$#rz?{hN+}AAqq^KVqgf^`CO?($7#ra%P;MnxNFNogAukX zKU>wQNnAfQO~QdXgIm3}svbEm(%e{yciJ}cE6ZD`@`rOSVwzbupu;!Ui9eJ4&{8E9 z;CvcSfVf@OLzVRjr9&e7V<$taMS zHrdAZRH>gmA1Nc0kQxG&(}j+X%Nh0s)r0KxGkmF}tW6 zm>)lWzLij0MAjIr%M~?LN~p;T!iaFbNRX^;mT2J$Y%3@^*R~N$zUMbuCEV$^q$YAfsM+?ZH zn!CM(ob5yB`@+a#blhXMjL+-Y-Hds^70|Eoq~CfBh#_D^+B&-01`Yf$S>Z;SvtN4t zwI21UPyI*dg5mHNy~gepkH~k!2(VimebHX2767Ite8vxYpoOy-l3I#Ck2o)3x0F$v zmR(2|#|E(?h`XseGlD&`np6inXiINskaspL0t9%O%9-}DDl%D|6^*VNd2XP%fD zOH{whEapvs_RmC)(3vJfQm#-5NHCHiI-4sEm9g(>Q)hbvJz^M@Y2Li>z|~z&%-YOE zNfqqpbcUQo-D4ff=)8aT7S9_?#8_QNpKSES(tD9FZ$1`P)fAuOuhgZo6Q!le2c8x% zcB33p+CLY;c6N@hHPVmkp|w2gh8yXEuY1OywvSQKHHe1xRh!2~?&vuC8J2&7RMmSE zpq(gXo)`4n+@)105)gCMEr~A(S9x z9EKaYwA+(aceR9I?H>cv6}I7rVObuL8J{O2BuO6ej(Bv<=~ns8F@AWGl}y?783AD3 z<9)plXW05SkmIzCTCGjyK#dOj)8`zj7Ul3*_D==9ykl9cQWcc4C^2;!yDupuzWJy*HN{%=>S%SnS0Suy@Pm(^hV)8v ztYGYXu3R5A)dCLYk3(3)3uNla{i07Y)$jF6GC)8>H2tf<=u7E9#z>+|Z>^Rj5R zk>5|55Xe4%;J~ratQ3QtihDp6_NGf3iH!*^cgb3-QCy6BmQN=rm29h|Ak}o&BqoNt z<<-nJ$k?b#<&Hk^^k{n~aJ;e#ODr_JEd`a9cAmOs-?=6HIZA9pQiMk9FQHy|lAa?~ zh0YE>cCTdREI)x!!NyPwR0feV&p zD_m7KGb!Q)f!g;$M(XLE;CL%u3*q~RHjjRI(`q{aH?r%lD30NuM@&J&!Ngut+O9#_ zB69VVPfc2r>R#C6Y#K%0ZvP+#ad*6$t%1hM+?}&uU#Nc@kBJQnhUUVcvhxya&^k5s z&u*Cv(g+>rTRpukb;wz7Y+~=QQVvEZ5~&+reqI#9h}v_xlhpyagH6D^>M~J4AGL`o z$mizhSgGTZ((tJ85SD`e!2djfoLR_ef<>mLS?>3>DmEp%!6lE2F+Jg0qwY!GJ5k2V zoj<((LO3;GF9 z!5A$0DphUKmpfU!{^Ae&o|f6*8Dwl}WIFYP;2qD!qrogEg&Yr%ZEH28Mcs^_jw8qo zarYP|ULnZlN8+C-pNN@`juJjHQmnIpt6qsI9Nkt;=97Ap3rEo#%N~xsRXp~q-Dk zQ4s>!=E=uSGW?~#q|xD^ErT~pDZF7Q=u2%sXTuy;)1D;hE~{?YCMWrPFILJ|x6KP0 z%l<05y>Wk{6_ZaT!CXqi^!NLd7*8Ce5t1SO5Cz z4v=nh>Xtwu?CalwZ7W!ss;DrW=-BYBi$$uft=`pmrq|qN8N-=|sLWXd9HshqkekLs z!c7ul^zeT8ppGoFm<;fM^;_?OfCFmHzJ&QZYBUgzLQ-sR`&;9?pye!`ZA5Ob!$+w` zHj_gch(#q$e47F8-fl7!OTd1&@`7^pU28C5K=a%q&*gx|HWKEu@IQ%~Q>eHrORQrw zAvuQX4A_@j_18b+egZhz(U(zNh)1DW)z~N&J2E{f$|oIjy9|^VIM7U9uCV6Wkla7g zYc(AG$Gwkg^|Vp6fOBhOj# z`i#j1O6l)ucwIZoMIxur3^DJ)-2h`xQ!F17LyKTGIvOinb75<1az}IlSr}KLHW@Ti ztO%I;pk<2rt#o%^U~dVqf>n6*f$@1>`BfLDMcq-U{B!L(FDVR?ghUB?1YtV1&&I~= zs7CUpPz=iz1E2vGImiOX+_T`~k0Q2aUo+22`$-7>sO`T=e64LTCtTev_SMr9zP||5 zk5;5cSON2H+EQlLL22pQkpsf&rwA6ScrRwKP{8}V%cL8-K43qf=IXkQH=*ty@PF_u zN9#g>y=aZ7fxg$GdacEGU6ToCwRF3kCf4#19~SibpC^7iKJhn-K6oce^7zt* z2Y!tsDxpILd(fW&W3N}SXLGB3zBMh##G%(YpOe~ZNsWS3(s}g5{vQu63N+>~JK*eb zf5X??;m*6{G>O7ntQRqqKs3`P;x?5}h$$txi#chBG+%vpb{HZVJ@ zzHN^Ss*+}SAx;SG@eEgiW9n9KZ5oLt62Tet-^@&wWWZz^nNeGPUE=!Y|5!EGCT3;` zwIKj8A8l;PMC`Cl`W7n^l=GA7Bg=Q4JBZGmmaGr@e1nSOVB5m&gQOd#e`sr)=A^(j zM{ks$RH1Vp_BU5Z>ThNz#(HKok6f-tnyFD>S%-OM{Kc9A{HeMk z%ONhW7jqR@M)*+q!hYeRe39~YZ+oaKGIugdaMF)qz2B~g`r16-*wwyr{gWQO1$YwA zq;0Q{vt5K5C@Gmcn}=<_%+E6|DJ>gA>Ke*u=5H;(nh=GR=`}JVLJb<-P8A>)Xm$tX z6sdxxrqIQVs%jG2ohGA`i|S7katJ&%cb01?nqyU7L_Yxj7zFHK5^MA=_atb-aV6n0 zUZGy@#~;r59nqHBn!;7bG>A7kQ5G~*cw63{yG|hNjpL2pkF+bKXeGQ6DBEw|fW20t zbgr3|f~)=L7?#M03Ze`tn^FuJ<()XepgUHi?*f&e_r`_n`m z+pK|CsA1TfFN4m$*udauhW?q>JWu#N->1AZUEKBx^<3%CvaRL|K2L8cB|k$W;Fs4= z9Fess%34E{c;DMw9(v3owH969a)UWLC8%?N5mydk<-T#PX-o5`x+q8=zPAc2a+v1dN|g zuw`QWgk%*~;q-8x_51W9j;!U*jPB(-LU=7}L~98=A+z@ZuEn(?;TOv3s#lgUyjhik zv<{(H9!gWPcMie|PQJP9Bp)LXDoCT{6iN?y{qw&O(2^%iCS;VUyp(1AtJTX721Uvp%em4e#!uJ;e>n=_BpBjLQlLIC zIH$%2DQZ>?BtB7kr%~4~XOe)sd&}m}|GTAMn>Xe`@hN+ojDD&dJw>Z)0EBF4^03ir zx!P2Vbi-`=7tR7T&)5U_Gw|?)C_Xu!a(5MH^y+{+%hCd#0ZfFT{DiP;fof7~YKk$> z?A^QOG(FM6UlDtS>RO>PJyW$c_^~{qqW8UJ@f!;)&Jf-TcC$k+A<_|W1|8L8f9Gct z&1*^}M=Tv8Yci#9s8=hZ{vA8xIGZluqkfB`(e2OELOuiPmm7;yu77up~Jt}Fkr4& z#amPE7=3$E8M#-8-EA1t7>~|6Mi#quHJ3HchNBAt9qofleFq3nnw_VdeC$juZ(ZHq zyF%Yen!Gc!wA}+JnN4;nt}#}O%Ye2(l!lVCK!whxO|AQR&^`t^CmL@URkYW^wl=!W z`>Eye`9AEfr_Y;FS4Vh65vcvvDf@(QIU@wjfk?^%5xMD)E-iJXX5kLbT zH&xSKimoQ2+hT7+EX^WT_Kc08x!E3b5#UuBYUR$ydb3`9KkA~t>TgrylcdI|=qa_p z`{xbU_OV(|qv(XQvZmA?RxAkubFcM^Nd#*~BYnj`l)n;DD;8*|>m8*CT7H4DX=Vcc z^;lIFRPwd(Eh`1KKZBy1t+TVQ<0s=*hc^(c^G?^p>u@A1F_)8dQ_0>aMA%9{Dt}Fl z`=~XakGi|tWyQz&{b&L64QTA`B(4-Ol)&7t#%Y`8UGDpDMRO>tXdADv2GfX;uHmY` z5q6ZEk9Zkp;`C3ywNy1rC4mE#f)fmd=&Xi9MpsE`kLa~NPB zN_}l?dS@nE$wJeZO`^RMncE!vwA;hep^|gy;!{CB3kJ*+JKss^T!MD6JaJHz-VPy7 zp$~E70UNu#g8%tvJ^`A&UuqB~cs`Bjo^GMl3SCPVrWbSEaJ z0zwr@$JL$#fo;<$ktr(e?US|X3g;NP2}wpw#AHG7F_ZU^RAec4BdqYfJT;prBkL~x z*x1YIbWT$Fg~i896_fGZ_>+mrR~5g236VMIoTas-Fcy)8MbP0!)?+%vZA8w#KWiy2 zw2DTVJL5!*+@QJJ>3E1C`lp|M>i-n@I ziAcORc8+#T?%Tc0sn1a{9BAtjr9cwL{wX-q)rEp^q0DK=>y8!HlgDcPgaQq!JL3r@ zP2ppsfD)|EkMq5(Rb($7E;~fGf7+FAZqhx$>fvBS1&`5udK3|7*A@+_&a0XE3;z?z zCAQ=mC#b)}zzRZ!^5BnR2)zh(w6vi1sAv&*@ZsYYACq|5{Ve$Io1xLpYyCOoZ;yL|HS@c zv{H~=g2g}Y({wm%5z;GDA0*!RI?$jGms@kDhNpl1ZVN-G7F z`td?C9kJ`~&``?UEryBtvq@CTZfUc-ZdfeI^{FAjpOn&plE|py&*5}!8~Fj!#`}%b zSg=o9Wj_L<&p3W6$lH7E8XhWY=-V2Nzy8n*pt4@#Scyp4SqK(6N8c~Zlc1I+YRi?n zNl^4}IlvfeY8*aN-;(zkcVyKRqB{nz0FlOqD)1=+C{t+oD7`Pd9N5~_sG>k{_)=80 zQ*kmH0%&M3vcT%4QSP%PMWaj9X7F$M?qFP%OHm_rKhyp|ua>psK2c6g8lL^kB4eOs zyI|=$OAB$qa`59Y>RAxNz4#(Bb$*e2UuPFCMGQ&i_TI*!p#cE(i8qW1yb;nVv-nY6 zops)6mP@?Brq;ISply3Y<4>GPdH&|K1e z8Jd=3`4n<}2u{YOQ^wa{rb(*ZP`7?t?3uTUn;Qf@76dFYVn=obv{C?Ic@EYh3ChYu#jDXl# zJ*SUkpLJV}A5(@k6_7XnwqSp1g#llnZ~oJgz#9xx8V0WGPx(TQm|JWy+IZy3SA1`t zH9so=$(8AW2T+q7zl5ivF6)=LTw$H_??7vcj4{@0vjVYrNcP+g4oG_B9{15tK!Nf4 zGf-`CeOpGlheLVP2oZ&p7JUB}uQ)W&p~ZDCBJ)ZEqs3>7g!r0-2nvb#2kUt34adz^ zee}?4bOTjiN~s(w=W+>j3yTVJpNNm+|Dg3LNgb^1$JC%Btr388ri^2H&(J#*S-s>; zNC3s6bT=d56oxW1Oynw}>{Yc?milf0`Gwwebb`G+zp%5!6GTRwkf=2&a1$mCAM|XR zf*xScWGXwm3y&^f?)N(Karp?<<-M1kI6Ytg%uj;89Mg3wG-wbgOlKRtH0jfA?e@#7 zwjQ_)v|km0*5U3ayi3iuA{2C70;|chor*@z`6rxZB@*GvS8b?qyj4!L`;865uLbj+7HZ)RXUKI$ggC^mdVQv3ag&3`96 zUp@Nv^%Fd{s1sDg5r_GbNqNsFvKneXp3-lcn)AIF*z^h=7Nt_rSXXONgj7c-=&M`( z!D)VGG2vob8oLvaPsrxKDM9h;?X8`;+vuD)9>wu1J+-(V;}iuZ9BAwp<&Oh)-V?Xc z3Fn)Y0B!3ENv`6DMV0J>b%#hAh_H|8a1}%kIT4Q%qQZWXWEZX0pOvbJ z%9(vXX|lDM<;H(|d%}~?@q*Lv3I?IrD~$b?+wxSAe=@Q2jTZIhN@I&x($n+a=Oa%F z2>QMTJB}Vl7Qg)X*3XyBWj8;d`ykCE(%>SiDg_nUtC|kO4C4*=o4DhVk(Zn30o?sehUv%;ES2J*|VP8tFvAOxt2u-ZGX7HZbgmtE1~HsbKIs-_F-#un25-J zJeS`4RVA%;Y!XU`T7Nri!kl(NNe_C%DW%zY&yvDFN-7H;mTsWg+k59o2T>xfjk{(I zqYW8aYWG!pgJ{m1=C0uw&CM=|ot`X8u(|#zoQr(MK=}w^y9iyt5b^zMfR9#wS`pPE za>fw3x-m?g4zPz_acI77k@6!#Un)7$>dPAD!i9eOhr0s})p)B8D(sP%rP$)#qVKmt z<4DviP7rptadM2Y=y}b}CWa2C`fpzg{tJBJ+J82-f35-i^#8bw|6I(!_ax-+o&Dzq{d;l$ zUiE)I^MBle|NhiJ-}~<$=u)qKQ<#7MGrvLF!fS3Mz6(N!zIP}!(@V5UX z;cahO-s64?_`g5dX@XC1f`>cE@v70n^)hU=FHfQZ4&=lVoEAySbJ#Sol~_jCP7Tc3 z-fuMemm{9=Hx?i-;%~%H-dDk$)h_8zdtN(%@c7NekLJhaQ=Bw}`e7kGZPvc&!mb-5 z+>Xc0XLZFjZth$9Y;WF7kdo;f@p@F#?L8`0S9wh_21Wpq5CHp;>R01vA*uq2g`Y*4 zPNm8$KsrWY?AoV84tcGjvcj>i_*HZI_r5tBx1}kif9L=c*x+8k6y&TLxr`g;i=eYh zE-5E~Q8auW|J_I9T*KYgTKaBEh(ZIvH=J*(MAJn+TyM4Kt(s?LHk)}9@N6qMn*2&E zsG$-4*gAb|&k1-pwu!_$?(wE6H9cZVw~bZTjFVF01d|rWn$$hgJKhmlH!KoURLhlj zu5g5!g6{hS-d+y_6KP-lBN9#?zwmb2*vLmTmN+SpMRrbuW&H5ZUJkGKaBzi`{KK-) z(hLQ~=7(nA{N9$KghupfYY>*|aCk$uIaO4YpLYhk!^PPKaB$cN#kUv$lqc=aWaYd~ z>V+o{NmVS7n4$1eC$x|IwOev+1U^kUmmQ{kW3yf`8uroq=q9pKmU;i?@a$~wTGvRO z&G{Wx2aAu>=4mT;V$bBUj;;^i7Om3Ldti0ml$I^ZD&YM4n1S54CUA0sVl*u!U3YGt zf{Hxqvs`c^XTxQm#@~_T{MOm3)C?erOaVntf-wQ{x3vb-__XFnEe!=B z!O?>HK_i6`?EJVFn6x|heAjS=IZFhUg`jy{huen5u?s)7;qK{>L?;42DtDR#L(2_ z8M=Hkwe}_c@}lDGlm(Bwt5+AcK=BiooZ&rWSM9Yd8wL7?*pv*Zxajz)k$Gf4RNKS- z>zl9>gzdcXy47E}*^$Lv?jO#}E9k`zrYnF6*>Md13p!4bBA^MGOL#1N1-z?GQ>VgM3)6 z72_p7-;~zaz{J9!60{7RIF6RU;cuT~it3TE`qGxpRRhUQzvb(Kx%FtmiHUWPv9e7}2S4KF;46)umcl%{-ECjMB%?T$7w)gh#6#A7uDC zi~-A;h56ZbK+)huSB!eE*hT!gXM^Yf3c%78YnGUpYVDq`Jhw#MXWsnS@9w8VOJgl{ z3Rz~-<{J6<^gOb+*aNKk4y>GhPR>LB(hTuYB@1$#-jL=y$n2B^B07|Obyd9}F7A+G zRwS~RTDX02=s>@Ki-p0`^#kQWtx84{n@QP`rz9dR{DL_-CVi9_j59LoQHE`2DifGf z)0;CPg|dc8TW%3aBxU@d$P_iTkwbr1?Oc_T(Y!QKgirO2D&0a{)atpg?`WG(EAqzN zr4>2Vz`#zz8>X;VFKip=<5eGWTA2TcnVP_5K5K|iK|*QJnv$)3=XNg4;%~Q0f%!>3 z;$trpll|LS-{$J;zJb|&)~cLeb&3|BS}OJpu$+LEh7zZpto_soe+cqc;-?le{~_km zkoUlCt`x*X)Y9@O?4~gIiCENCpUX4M-7COZn4WtJjGwh4`s>eo?2r>G)XY!*c)M^9 zS0g)&B`93I0_J;JfW58%W+mBK&KHlqDeaH@k8k zaoTAS|8w*j(c2*SPM7^Y;%{yS-nTe%PeOLeH^3pM|8{veC<2I+8ORBrFb|2kN(M0e zEaUxLArkB*fu-$aWsc%^6|1ki&!2|m;5LS$EJ;R7x5*Z0Ku9E&>Itd7aXmK(O_3ud zo=UOU>r4Q;9?*BcC;Npsa;(y1DB{y3E)f>A zr2C$`^gABVLwum{7w0(duZ*een}`_Po3j6%+7^(7C&9XMx~gZ?ds`!8$fQBgzKYk8b{b-yKG1O9qV zSbBY5h}C<#C|*l(QQz$}v=$)oHtCE9i;tUm*jrF@_I+56w9#yjwgWCCJw`*mw(eHC zEurrQ8*$_%ut6Q+GQ~m|0(ZQ$TzJG6m zfobqKO|h-Mi44Epis6s^O8OHH8F?aru!7hQ$l5M;KEFGe{P_;E>!2uryB1JTis5{!OqDcY>Ni>3VUqeiVH)9LkKv`3=uuz-^kL}OT zQ)Owl@1I(`g+KgKgU|LNk3*!EtF_$4^@EsD{4L{7*SKP5dt*D;;;(*PW2{o&)6?a4 zT3d)RW+gc|KX9BLZcG9G_g13P+6EvWKn(Si5IZs|Yl_YPV22u?k9Vy06+KZg+G)r|X!b%0U4@!eje9VBp6ZfL-6`cdH;oqWuG2Yti@hKL6r zrn3$7aLQE3l0G$aqbtlrJ*joqj#PPw>Z9~1AtOaW8q%4j+C99RfvW}$)igKPbCue6 zS`*$0U-@`{0G+d!nPXLXwwl7y=Mpf^QB(TE-pLmWz3uVZ^c<8Z)9?a64)Qk=q6RrQ zZJPth$YxRg=-pf3Gw~%FPDt?gOhSHw8G9H=zragPbJsiP&~2OGc_NPVh!RRKxt2w* z9!?Gr+47>gN;Gj-g`O|$)R{VvjSxC7simx(_7C13Sb9NIS!#u=v|e(N+jw+2A&5|^ zQQ1?-$mL>HFcvx%R}U{o$2ISQuF=ULcIT;Ic{PRRj%ynOqncK3%$~(Y zhPzN!_fzzM0{q)J;GVjjLqQC!N)QBWYKPHimU|9{rW;in2S~~^C(-QuorMLAUpc4( zWRONq81P+`M6bV%{VQ? zt)_A)aOgX@3IXL;xz=dnZsqoo^_QsNrj#-RO^#3Kde$sKi!Uh9X#>l8oihFRRoTOO z7wfX$QIIyxyoM{8wJT!tC6+HXo7sMW=wo9G@Lo`_%H!q;igfil0^}q!Flj3c$xBBU zSUxw_R)2cm4~{)mG!Yb3?NF*0iYRdqK$MDuRXMO>W6~2w#iwMGVM*So8*GbHP)2G{QWyGY#3R6d zOxSh0ZSQbO4f1Gsj^Yqe9HgFa<^l#OP_?Om_49>`IU46cFVKsoMUB&cs``R;xQ&}ca54g}Zh>g;RH`VNKm2ojs`>sm?-1jjk2SiF zcOP}7g-iikT*yO`z7xGG+4TuPd3$%)A+c(iSiZyt>?^ z9P05jdx-XO(OBuejh_6{hEva-onyh|V<01nJ3bM-JJ$T`Kj6T&-`cZaao=`_shr~M zpD&68>@0+Z>s#OIaIlwcRxFqQa85UP3!*`Vj)Emb&Ajc0M@9mXMkaC64UH9a^BeR1 zR2|muIy%ngojWvol_>x0Z|?@^FQF{Q}Tn1JfiIE!+bAS&z@Ijr~MUZNEw9W&&o=*(tK->tsZREDD;x@)eg@_BW+G=R24w=Ov|Em?1FKG^HytId4s?L$-;=WKmD zae4>0TwqnAOJJ3o?{gbbQ@V@oy3Kn+{URAg-wzO5i(ORRltvlB?ef1oxhUYtzd$r6 z@7{Y@WmOn+@zXC!&~ZGkvhcNax3SZH)%lgU!1_RY);B#)`wzhrBD`3&iD{&tO#6ZS z{$M{`VbXtyUN5OXr%gzUlrZ?v(hwV`MuEb8YAyEWIfLNIG)_q4W?jrk!#WXyurrg@W%Ffi> z_X7!fu&BZgX-2?sg9I8-f>S<8K-C2SPdifZ+qYo%13Nfe7TRAyc~Zb9Pa-T@vaN^b z79FY8^C!!{OjcQ)=pb11Kn;YY#Qw6|R5EyP?k20rz=47t7cUh~SKe9|ByrHpdgi(+ z=}Ea9iV=u#S91C7&fWG}f6c2&hC)j0jZolxS}GBEu#BdKxO#ixYAa81RfcAWEZ)D7 zycigr9PbdufW4P*lhJ9ASym^#j>m;#8XncvL$DrY*+G+rWJVR~*v9MXw6_w-jd`BLgz!AAs0bOzcrE06(EZz zzg(HLG6H=ks9*qPPM`CI`x}r50rCsxA5~(jX2M12Z^T=sO?43?PQk}CZBq!$<=DQU zGAP#-%b>J(J(5~3+Ax=W#ESA;rSI((lh99j)$~arTXHYf7`535?yQgiJqHsL>y2d7 zm)bd&!oz@pl=!mmEeE9`RD8MJrbxF01jtWX$hG2dl9JNvu4+{1gtz74@cf56zWy+! zGeNv@HD!z*UVJ@j_zgwo&bB(2RfJThw8V|PrZa%9NON+EPLwqqJ51VXphZrcIhYb# zhl&7uuJ`5NZLODk95Wuu3&T%Vn2t6YkxkMWv@~ixL5iM!W>%jSJS6u-8|XQ?t(tAI z?|PL|l%5EqgnEhjJlWbu)16G|gHNY?K}SFw_?J4E>yhUf(NifLTGX;$6_lIPvF*Cfx!fCkWs(#6VMegy{=QpP?v4&p zN;eA-l<-erhTlUQi`%Mf{{0$TO3}zS=kMOBDXyJ?H3lgaJsEmAjkFM8q zN$i8A0a8G4>X_s!yz7oQbVqy6)VKDWu`v^Agsb^|c1Hl}uh1!jj_?2W_JGC@L)cc& zFa4sTH1(NmCW3^6<+teu%lF;Ler=GhVj<#PdleiPv7g?bsIjvoK%ma!daeX!pTJd- zS6!4+>C8!ylXR5rDCwy@E;}xorc1CHeJjL~!NmMLJ^Ze~J|!jH7$YfV<`>9#pD_*a z29r1+?xpx^YA42BbKt67J_8!q&eGG>=ADyuAurmSe&E%bd>1?8(zQl*>olbX-j3IUQUw3>p20} z@jc>~-Z$_2H)IyeFB`fd*Bbm#Z=-d4NsY{G_u$J~)yAIhYzNea4(?n1{zS4r|4??4 z&WQqZ{%j32Lx*HD(~UQHr83S6=MlD37mJg%=VMV{2ef1MWh*Fk^TSjG36Ide%+!ue zaD6>u`~70bRjUq3#!+KzbduHBIUfgOhJFLOa+@$jk;7M2=czu)9co+MxBgJ;{u z+xsP)yc`iC3+#<#(67R}Ucg;t`gYB}nD6;&&g^GW*wZ$5H0{#&`YA&P9PgK@?LX)) zY52C4{#1x**rvLNO!+dS-|m=+DS!q+bvdA!F05&r~|HjgS0!ipz^&O=>_kDXNQgFz3825tpnt`~Caj9SV?g zyJU&#vUoyLiq&O^>4RF+eaUUFD_UPYeHEx(XDf zBkkMtLTMuTHS0LS-0*WuCk<0XH+@+8@bb6@MG?KJX4ZE45=206ip%YX%!5RXBz zCoe6%ZpV9%J2StL>2M{Jzc%`%8$e9)Opc5j1ErS&M)2i}FHk|H?>Z<)Gg6prwqefL z6efNDWvt%x9@oZaBG4UOqsdvuDreZ3YC#`?v32stgdbd+hm~#3fN|3* z{SHWInV)|i?INk6MTI-_zqw5)xIV+~6ErVmb{F(Ms3)(xTbTSA`MY(1c$j+oo39O` zoff6Gc5as!eyaiEQyoE>RY_p}tk1|rl9?&+j|O&RF#BimfIl*J3^^UrNQ~|$7fGR| zIxg9c=9dpWVLf)DSho@e$k3`?(v0J?Tf-7uT!!w!;+eovr68dAQA!W09A!N0(2to- zj#GQ-%t9j25@sb7i3_y;F%1u+n?(%?`UT0K1?NI#i@DzB#3$)@AvmC+(ET%F`w^=n zE3mWVpd~_uy}a`D?VPvu;VQ~wk#)+ONq0;YcGSNjLqfy=y(x~`9BlM?zDhi7nDzw! zdAZzb1ZB{vbt4Ozv<#hBNK(8( z<9N~%-%oPlABu{9rb3h$qe5Wcy9S4fu?5z{$VI8I(eObMW~5`68k~!#E%}0x$!6D$ zKN#U_XDXj=hBX0QGx>aN7&EVMqog>Hy^GXcJ5!~7b&hZgz|7u3(9&sRsCJ(6&Dq9_qWuOB3YfPItda9ptQuO%$KcH^0d(fwR$aR!{+3i zDir_FpE`8eO~1TtYlt-Sx}-xZDP&`C;}_wAsS^p6s~M=vWT2b@Rt_|VeiM5A-Mgvw zL+#Qj5gb*Ufk!mTE$lDbddGo(27)ZmY8zJe6 zINKH~?v|}PM>0l{JBQ2Ae&9Wdp*zQQwM?OIt{$2xSNReU8J62rPoBi`nv{j%>~zKe zcgETe*{mdG7$_rK!|y&wJYy)KKv`UDio2eb{M&oez*2(EPv)E7>%VwYMemTztFkiB zM+H$@ApgbU7kxlIVwGJ+0*0$%{egHY>CxdCv_j;&lipCok3&gZP4fP?_E=9N@Q9sF zSB<5Png@8IaUZK829x!xDu^TD*+zxoazZw(EXU14E}IyK(S@ZRj;~bq!v4$G-Y77O zKQ*;>PZVbS#fng?K}O~U@J?-QY`Y0*Fim>_Xfi+#^h6nqjB>Aodg4|F$grF_LCEUG zFZO3MtQ62pLC?b65@+A{E8P(|er=z~OlW7pULmtv`PCn=Ri;D}1nOgqkI-r$D5Q-M zr6S36%30i5h*$DO36;iPxczkc(#Kfy4RWW~=D~-QUqVpSSAa9i*W$YixpNdW;iZzv=CgaS0Xv=uhSZ3X-Xc`VCN3 z-%QTms42xxlO@sTSk`Y;w~ZYI0~KFUql62V@&@6Qptu(cP~2^4CkNIzeoas@j8k+g zv^H$6xlDj?(!1W*Z|r~X=2#&f_*TUVQe)erdlA-#f7W^K5j~eHusk51mSh@`{&Ir} z6$5&EADyQzW1NDe?k;8~W^z#hQ)|Ooru?uH_qaSpPTLlvJ-R4jM0krO*jvvJ)$TL3 zr=fC^nA9NqM&3H*r_kE&r8tRyOR1OEAB3^l9y>ah`1Sa`)M>mRvl^)S*8k$`EyJqp z+IQbcNr$9#gLHRIKw4TrT9ob%=?Hq8x2$vjeEWYS2m~8iJlJb`m~QJa>2Yi{3CC75@!` zkQiNmj1YS*UtQ-2{5wQZr5S?3mK!&l|E^;kJeFtAVt)TJ6pSTX`a_^~`7=L0!%z{^ z1@wt|XO6v9vEM*NH(Zmv**JuM_eb_0mR3bxF;&}JXN(AGoSRQbthB&}wL%4u^uI3N zB*vDpnX&wx1@MkPcUTkj^1Pi!MFLExx(5DQ007yz?W}yWrIeZpKAtq zVIP}JOx5}D?0miEl(yHX1VLw!a)lER&8wRA<}H8Ov&$hh9-ov%>`{2j$X-t|Dj4G6~-3k6HR(C5lU*c*Fm^Dq)tTbv%e{Cm^^^-FE$(I)j6u+oPTBkm8f1So~uvd zUHLVWxOwoe%kG)SS`QRdTY_L{qjxE~&RzE~rK9$_}aG zcqZE4nIJnz--aJpJfSXV0!6*!xkO~b7opdm8Pob9AmF-Dft#JeKJ2+llT5&$HzTu_qn3TL3guVj!-FJPX zIM$oVfTabp1JPUre2OCxaB#n8y~lD;fq0}@q|s|Gu3Tn@)Z7_+3!Fb z;Ez#-(G5)fe}LC>+W!N1)#dTRsQ>>3UI!MO)~fbul=Qp5Y0IPcKyG6rs?u}7-Q%(& zAgpe0c%311D1=n%eiDFeRG|AqYvY{4LIYeY9?DM4xIWApXLOi6R%P z^P^TQ;KsqsZVTRWz&Qrk(LXMLY0@Dz7V>xknVl8H&i=lC#>W2%1p!pzTpSVFb$Npi z8R3bSulDz`4*V9(Xn>edqxh4Tk%F&KL=D1@baBwEjyms1PL)fZt-J0Tw?jq;Sy<^& zZNl{DK#z$&Is&Lwe)s0b(}-tEEZ*)TMqZF6aiJnAQIsS~!ZgC48&>zH>x~GUA3Vuw z`0;Ifc@Oiyz_{IjC~(F%igxw*0wSiK(lsDP=U)3i%&6nHO5Ptl5LCEvu;ktL*U3o+*QCio9t)IdCCc>Fv@4ohI}ZXF9->eP+^jwwjRpw0t5MkPH_6u zH1;Mo_S@A}S$#nkJltZe4BBDp6U3ask1MaO7@B2s!SCcm;t!%~>rcG841ZEDP$Ve= z!t&xBf3xsvH9qI|tZ%&qc>KV*ZTOuz4$gDv@Yfmq855DdK`1zbn~&clbsirJX2P66 zPk5~p5sAqdYXVP3ZZf$1qfv*PQUQ)PU56#w0Nb)!mR=;OUdtW`20+!kt!mE`<9W*P zX#H-UMMy&JC-OKa<3MnTpaXVJqDQG#i#fw@F+{mP(NA$*-l8WSUWZr+jaOSb?Sc`N z^#05dDd`Qu}&Heu{xM zC;0nS!~!t1f2v{fLY#P(X?RSTiH;J@cs$0Zy!^JDD1)jp6buPmF)96)XhOO%I!0JR z)_;M!NsdbLY+cj{UhT*x7%PgP&yF@XdWXR8hGQ8aLeW2_fqqe?%JWDu4Z{G^`umKK z3|O?lg;drW{Ja6f$t`8nbymHd)+PEI2$oPb!+cKs(4Sn>D#RA!Y&x5M zs|H!lOqCLf;k`=mXaEWs7&9nZ1hrFI`7Sc95BwKj1;tmVO$5Ix&L*6tyL!j-SUJRt zrzdZ4<62|(fuB=l4df-qe1QKp6L!?WK6;)nH_N;^7QpbK#;Vln+}lPz(JZisY5`Qi z#xe~S0?O+pr4=;x++lMz7ijNb%l4@u1bmxU|G@{c}V)o%Zrk z?Qu3b}21KZU0$=DE~ay@h)7C`Y%MeTeWBaRyix*IghhN2LfofxO_%L0@sgg=mX5`G2e!icCWTgFOw`-l8^@lzs9is`kV?ek*68f45Z%Oaw>%P_G zdp&pbgSEJzF!TG17%O&mkkm;}6l`iUzg z?1u4D-s8`BWKxnkB3JlW(|g2@FPPM2HhZ7u?>FB|Q4HfCh0#Z`2_hm`Mi68vx{Zis z9Rv@{@ja?Ql%0j{E~W}W5?kbt?3(G-u^77a(JZs$=PvQ-f?(#q6DIB}F)78Gsmmsi zRGD6B8d@v;k01=xWe`4~Dag2pptrInf6jrd6rXhf{MHmNMU67pTGc4fVPm1a7bjVoO(trsg-}N3m5E^k z6r4G%vC)?hB+wwVek!CsiSKQz&pGp*eRCWCiNNMq^2IiVm-1V7OjzFCBe~78^;UTu z(bidn`6V7i*)Hb#5kB=bdt7|z<0o~FNbmzTRhEhw=?U}PYD(cL-h7aXf7N-0NCXdy zL~zqGC~V14&1sM?$F2UzEka4{kX3$#C5(S9`(7TWjf2S0EfcIqd{cs~zt zzrGBH2imS}rlf4Ic8GnwyKCYv+}s<)gu{)#<2I?L;r44yQJB!WC-nLfTM9?qw6B{1 zxbq~xi?#ll;&xthQ_^R2;@mvR&Td`oJg?5n>!D;_ArxPnl0dv(0msjQm0p0S$@?kW z-$DL0{$~ypgaaXoI&(D)+U1Y=I;z!2Tdl_=6pP- z-@5)O3>2F8?&%`B+Si)>EZfV3B)6nEQvEEmG9xRc{1o8h`WBS42PuWsv)?YCgwYpm zCH?DJ)cCZEP8%5q68}9} zH@hh#9`wW7J8QU}?D5K`S#eK&Fn{}nEXQC$H1m?p{syT}-BXy83!63>(9pCqAdR=R zp#$EM&A0SZnGQh8KuI{EAOw0$&LVthFpLgAKp1Zl{a$+gt>*ccQq+mlOBzHRa8UO% zBr`Bj$5d&H8~qg8{}qT#3ZriC$sh>IsYP^YN~T>z7?%K&)GGlZ}-j2jeQ(uLe4T?}uN{^zY)t!9YD2v2J( z+gfv5isl=_;de9jt{Jy=hy;wJ&=I8YV4*m@v~at?X}SsHG76uv-Gx$skj(3j z(b@RKVt47B-!V1$WK% zV>aN{j#1r4FntyARMwEzSOJSvTUh){daim&Ex+XR;ADD9gSx~@3?#8N-=d$5q z5(!J|hp%Y60O;%>#t&u#ep6lZOTWTU8GgV`uySuhEOWZV>fS@>si~&hwcZwH_Td_( zr_HT)!12#A$ok&+&V5npmJ4FnVpNQxA>QI0bxZ=9jcPWTmo)=q`sE1)^1`IS^wsc- zh%nyVpm@U)jZzg>dBa*A5AHTei6Ufvhci= zHA-EQ*U0Eo^EX{|jPtXF0fi^OLO|Ln1(A#luYp>?un*dq?@-DAz=yS4j^_29yAX)TjK&k2hx@vM39UTHO=xCrVu5{$t+1HAaN_`UIQa zN{y42pc5s5^BBx`jBRZlfDVlKB$QIb-3TRs@bPGFiU0cT+RYg{0OtTkpP<1F;uHY# zWW7&fZ?zAo<)We;6u9xNWIpapOo7C^cH?G81o4MIJ)O6+vp-KGn!_u;vs049alpaW zDtf_Yb6cc+wcR~6)b8=d5|H*%Nm&_gVY)jZ#U3i76lyh90|>L!fP41`=(LGfV?(Xf zS<{m~3B8q-i2eo;cR^3D9B87h-DaqvjYJ;K4|dPYjCmB%aR~}&FuQQWa;Z%%S#IsK z>~XeI;dkc&$HL`iFcM-5wN+Db!MA*T@Ax^tYQA!x?bL2c053^08zE6?u_7|`3`|fg zP<6XB(T5ft%v0*3m@{iH%jP;qV{;W*8H`3*?YEO>_Y_3qnF6$@c*A~((bj+p1CZ%= zecLn}+-B^mJ9y7{!1f_WO_h+S{L+W>&B^7utjiBaPg`MSUjh`Ef+Fh(2_Y5?)yaOJ z*Z*dfJPG>XooWv%)w|`T8qx`HY~&M#mgt% zURD<~7cy11w(M&iK?Wv5ys`F}Zb+Qt)yf3%XS@fGUnp;hsOh+?T$w8D zg4M&sW5&u}@w-;HqC~6M>`?>~SJ(csb~R@zg=N6M*RFSCV}5Zo_V~IwA%hza!lubf za?O@)@)36Lh!RnJ$?QIkv@7`H*}~bT)hk06Y{pnYUS>B}cO>zZ2?-PXdlX@%0ftMJ z?TIfZeR+@!+rVI{Z#dzbUvU#mm0>ji@k3y&!Ni{meq+?Z8_fQ_Fo+3r2Ok|a!>3&R z!5Zl2KYhO1AG)8RfJSx=F{B2!sLJ*J51xYb!NbDJV%QbjRXF+swbNlDT?FJ~g`iN= zx3T^u)b}2A5H|Lo1WVIG7%l`fLV~~H%b8Q^C{SR!6&6zS?u(_ss3dtRb;xHB@BO;5jD5FQbg=hp3YizihrnV!5K?PGaG&ND=%cN{rg>JqEKl>Vm@I<9R)pJ~g2jVJw1 zzSC33J)u2VI;n4CrdI<6yiJOK{x_dp3O;4I4aDizd?^>d#JWXq9l|)r zqn81MBStpgM4J*fJ2lCks;}9VjNJVwc5D7)%r{_Elr{yZ8dU<|PRCyvc;z5~p;-SF zr@#*?i{g$>*GVFNEur!Gr`Ew?e8oLrdM~}DW)31HheJTqlqREwJ*`GSq@Yb?@Wzwf zP~>S?7~-j$2iw5U2UmzMz)+mKr<9Cx&N{j7vQmKTmTUD0yFYDE;(C zKV!4K>(v*fC>qr5?#fK=%Z=5XTvnpgz(*6RHw<_o%CS;*Trf<|Zd0p45G9^oOaRbg zPY^hF3C8cqDm_|_41TUjc(_#QYXp->P<$@RFI%tu zc?i&0fW@kK>(87#RlxC(>aulNQmTPfNvVWE(ph=MgI(@taUoe{^;T;7CmD)A$z?vz zK9L2y4d_m#N%|!Xh=8TX2mbRhBw2>U2k9Ex_cq2_RS*$z| z^<-oWe6~q_A=0IExojLL*l&L@Cn3X7`M~d>r14)L+tbv&WGCYtBMWz2SH%ASlr>49 zSU8m{2dI?G3{pFmK>LRaeMV}JAb2f`(d_PXhw+%255V;C`Zy?^aqoJ#( zP=rx;;Vj)^n{t7+p}cdhsyzj$NIC@eP*NBdm_X4TNN_Xzx%n>7jwU~dx^DmW(NU#r zEpkHpH;WW;{GTxj@Icq2v5=(JuUhV>(Kg=6!CT4@h|LPV)_;V<5HM6p+`OvZ67%Ua zBgylL5)9v^%-k4gkn>fCMBhsNFU+yeHw!t>FS6@?rgrufzd=$=4NB;3bHC<#+uM@T z$Jo86|3Y*B@_FFT+YjFjF;_53CRYG%2%Y&BM!XtGJc< z0>dr1=M@po0!s#8t+Ipz>D$DM+rDi=ej|3fw*6;mj=#`))58F4_#fWzFBgdRPiyoa zU{L+v85JCF0@Yty@b6duFFfLZAxZEr{{;~L3mN{GlKk()>z~NFf8N|*rt;rs{FhR^ zR|+xz`W*i~+CMMl|GduM7x|y-{sle%d7c0MuYbP!pNs!}h5z!6f9s)teqjH+yZ?Ej zf4~1vvGi{j_?I{R@B94w@Bi}w+zuTa&a*s2{QIu{^R)kSHSl*|6(;5q{+XRayI7CD(H3LQ=ajM4un#ED|k;?Tq zK!z&(cZX7w`L%_w>u!f%D*rqJNafA1V$`_gPmQi?bGy(v0^GxUqF9S@O;t-qS4<;) zy|hFMb>H?W3E@{rtvAQbA9Al7teBpvwSP!FB6=KbD@w>F{&w23w|uacy6D@5kQ@j{ z(HEOrjKn>aE2%_wNO}G$A%_GmkCT`4X4jmq8)@qE!}-R|wzY+W&X?lwp&hhC^^No_ zoI$M1v6EhR{$>$9^qUQU;78)2Nwg6MuH68+3Yk4D#e6(|p#($acSecpoW0Ej#7H%I zrqd?$Lsaf$K<0ji8Y;%BMLGuT(O0CYbz*8Z%i;d}c?IE-h(~ScSZN|70Zpe5gRJ#R z3)!EwyN<@au<1h1&<{VX;OObycC8AY-?{LO-B;o9a!3eVeWnay2{=iVLulP{RKD2@ zkDuweI-fM%W&L+41NRo11jGNEW)yYX?;2C8FwjyR8z#@qFw$KOXdTPP8_jBDuA!ja zKz7sziEpK!KU237+0PX1JVQNvm#*ZaT*xxMTmC2%W4*l@V(HAfrT$D$B_q=mPnd>k(cyYic7%_?i!(}Fr)p4a&w z))J8o*w-IaU;7kyt!WbZJBPKpg-)KRFuEZDfXYi@#E!x^{L?9jWoh8Thrq60E*)Z z&#W7Wq6!)tlVV1;E!4!u<+wNc2@4wZWPSre+uTTj|7Byh^7<&L<&m82x9*<$*f}nz z?#;qVf?V-Sw1ClpsNa1K61z%S zru-hK!=#4quCKd9>RY)oNya)F(VczyZyRlX*w=A#Q6q*r>PXV2ISrEsj)Ldc+$a`9 zt@z?|+gEY)y!&?p$eH|-*vB_J{ex%k@cE0a_`s+?OLK=GpT9lYi(JSS*)|^>b>DFS ziQgH{kFAjR7v=@MO{|mkK`l2QYx`59onwO@joUoK5G>jMKCoczd9~j#_cM(K85j%R zQh0gY(H9qP%$C=-MA`O;8F?7{uYP~yC?8V%BYJnP`|QgXkh1+0g1L;2rRkB|VgOlK zSn#uS#qjM?-uQO#0J^^Ojg?p`{U7Da8v3gd<+7q5FV0#)Zx&gm)2^m>M*YEofXF*H zwk^^T*_Hqt>qaSybV)5r6E?W?Hnn#G)%8!ekZswQGPz*tJoN%@UAY}nJ3DD6{ZDtO zPt6g#EJQwLpo@*y&#pc&q@M54!vl#YUWB?T5PN++p{6;EL4BR_@>IlSpo=0$@Hjf) zG#LZ7*c3*x=siBx#aPZ-j-<&V=b~RMbLhF9u(~_U==!sxtFZs3HYa|st%{iO$CLzN zfXWb4hh!;it_~U+m4SZ#!9VCC86v=-j9$N8X9hV z`k2ZoH%s~E;=9O?$1{DovCOx2M`e$M5Vq4X@)9n0Qh0VzBm{l5?Fo#ZZxx7isr@vw>n5c&^Ghv1>{ zO=;53DO@(XqlTuD+`fX!^{K710vI|wkw7|VYd+jMd}-P5ZtnKC?}x@lOyqHczYj8~ zKZ}=fbL3sQW-*8FJqtfIF+EmH`Hjzz1WImp7S>c5c4xlYTRXc7ENE=MX+tWl0MFNR zw5TxIK0;(zaw40#=~hgPYFdVU@pYgwhrW}g#zp@Gk04H%Y`u2tXYZ*gxd#X?W%Z4= zlk!W|cWI2G>`5s)k&xZFn?A!<-*Rc>e2zDMRoUK>g$GNiVV8D9|-d~m;RE8ra^${t{S{ul_UjrB)~NlVZgCS>;>7C|1DsxD}l z6>28y;cG0aTkC@#zv<}tmGXxhE9T=@L`dt4+fxU`@xmzhG8n|I!vR8B%_ z?`2eo0HZ?q~sHPJ1!7wYkUFMn)4rceYe#05lU-QZRCY^?df_hsO2$1>k_kpmB zba0mFx)fh-{K$v8j2e5N~ius1ge^mI@1{8bCgHJtSn^|n91BqYy#E;w5{TE1hJ zd;w4Mmck^J?Y;SV`%(V-S-P)I1|mM5J-fK+S=oAieRmJN**>JUwH5uP)Ak|3#|)%# zw`h(JIjO#w^!@!-_EuW=sinKSDmhJpq6{wXLW*$6`!(vK!L+oN1{Vl?_36@4>`FkO(l=3^*;wIL12QK8`@K5B8z;A>JUv>`;bNlmw{7)ZpffPKj>c5> z{rn%NmrNG>iy=A-N`QRf(0H2Z|i=674)@Ty@y32si+DEbfZg?5^Oo0 z`MGI&M`nxl^KLlJ-SigTSr=cvI#9kMdtTo_l4*|^@@^`$^uhK%amQE9Q-IeGZk{Kf zVq4!j>(vk^Ih(^1RpS=Px?>T~eO)W^BAB-&F2S)J0~&-k11<8URLxwK zjUx?TbJ{OBCtAGhX6KrgI)bjgqSS1JNGmV%S>tA%9}CebG70a}^n~(t=Hgwc*os5o zJ#Z0X3XI!-QE~A-j{Njoox}JV-JyZ4z9$ouJ}HRkq+=``VAK>(ga`xlvtt!anjo7P zX)3pfh@6&$zuXXu&8ZC^r)XAscI-h5w?T@A#Tdm-R*Qu%Lhxtp`~2fWA=Qq+mX`a| zDXPpYpQ$NQf<(vTPOV5G7(Kk@xx13(>uDWG)!p~*OJ2W%UzZ~@_Y~w}?pNv>`z#g^Y z>f6xFW@L2OS#jw4a>f$^|0ufRs&>K3#ScwS{v3iOOGubH*|)!GN2kpkuD~m%etkV= z2M@VF2v0%ZQCXMvSN)PQtNj$xY7*=h(C%?J^e5IK(}I!Ih<_W!(d5U$`l`gY^mJV_ z3t83ZA9-d;28})`FXXg!idr-6v(mp-l&P$?JG8?bcE)mi=F{#?>V6-+k~W*i<42hu zb!U8Uq??lOtVT4Nou4@kXXzT*qB}-t)aF^#NKIFBttM5MwZhk5tgXwNb}mS|@D zF_@iwAHvJLv(uYT$H)@)Fk)qEd$#GcJEunQ67Hh2knUae$uFfKgPB-7%IDZ4gOga9 z482Cr-zmTTwT-EY3zBRv8+j-^?7gpBykg#AUZ#kDM0r!g1Fn~cb>wexSEG88K~8?9 zog^OEA<^#8Q5!{T>oz>`{X2#V-?WZ6hrq(X1}9M#qFf+0BJ%PZ6XLy7zLO6!NU?A9 z$@KEYK0z#BKiL9hlkMBpxHs*`qdU1Pts!^Ggp5@yGF)c%?uR$>m|q3v^mDH0$Xpl$ z97GBVgmmX!j=W z&*H5=?z(xeZ7EqG9c5RYlOMtccz9s%NvAYu zeVT^b{bo}?&BsfSI{0Ww2-ywWCe%=QrLHyg&{R{~f;Qu5k#i%MjB9Z=kuB^?-27A9 zI4AmjpLo*U?Q%M$_!X}9OoLmVUl8rOjlJZ=LHTi2BxXQ-X{LSO6@qSpAWs* zwX=3V>%WwPyTc>;`buvq2>U_uy!_bh3J0>A_XXQ2w#FdV==8Gn2M@R5%=oBme4^wh zQvx=4sBxnok$0$!gb8|0juvcu{yqx=CDP)3Bkc1>n%&@6tio_NvTgO^Mp)!Q>WFN2 z(UY+5xBSgd7+*u8z4~I(u9Lp5X9mVUb+Y30oGKMp60u;C4U5TYiCQitHSQ399_yDh zF~Rfpo3H&fx%X0)gRWg^KWAbNAxy=@OH40-exU0~CONV$CB$(hfpaN1-hm(fccZ@N-T1j(wC|Ev71Psl zan}mQLHcuR{_+Ke;uAU9+(L6v zMa7<;6yEBO5E2Pq!Q-20Ua#SgtE>q+`yqWu@yPkRS2g*#f0FKQR(c(Xz3|x}=gCOT?r92>!ns}e)%1)W6l1B;LQDfD$!4mc6hj^u zxC6WV25V?ao>+Yf&+WM+whV-~&F}p+_mM(F{g2S`IDJ#1ic%uNL9)CbN9V(h3=A$Gv5zGk zC4|Gq9H033s{eX5Zt{|A|9hoi6TY`1;`rt+FN*6FL)TU6`7npeTR!49#w!+oaq{xUg6jpFotx zs$zcT(fxRdM@${vIP}-sg5z~wItzL-4e|iOGp)T*$J=QqvfAbgA>TKZP8-^|;uy^) zlM_?}f~uG{=H_DJG!pEie6^8J*I2tEEPFBFO(*I-rp~tnoEG?}&0&Z${Y?cSO`YCV zL|@@JN=gT)Hj?49cf?v=qR|VDl(8PsJ&E=9&X%kHLLrOz{e#-tiXmlWm=-Fmr!O;= zRw8vQ=W1M#1|BvLm3mrwIo*#*ddatt^*>!R5!Di&yK7sA9fkhqVh5GrVCQqRWW2YP z9=;9rA0s|?80P2Y5ny(E&dh7QHn28n%tRVj<#Be@QPA(YXIuM$58Wu&TCNH?csQC1 zr@dXxY1aQ=qmUvw8$-&ZXjp`lko7EWSBRmdKv3}bTREq*t+NXX{L z({4;v4){HCrPNQ3$*CCi%uXNf?DwK%ejM>*FSjkE7eJuh;*a(0hTjdE)C)vHRDIg5 z=@@}6Sy0OH6w0yO54IK=`mKhfcp1&JuIVX>@kNR651eJj6|tpatxHvnCC@>v+SlKo z!D{=aWhAAX@}}eh({JJ9N4x$pGCe5rE?W7*!V|il3vPHzAv;lLG`oZziv9yWtG#(^ zg(!GvpM;|MIz1-H6H{wg-NQkLok&Dv^)W z(a))HIf-vsN~*Mv#!l@EcHcH<|R_} z%`H_Vn=#euXs6UU6qCH6uO>o&nMe^DM_pMJ4Ro=`o3f2lYLDAL4_+oTCF++<^vIVn zN6q~u!Ib8iHQf2C*`notR>amC#T;@pUznMj-~aYSFOnsL8jJczVe&lQYc4kL$>P#B zQb7#WndP$RO2|{lh(FuYRFH2=~;&7X_5OYBY$ch}olS923xXe1B6xMdVMdp;<2NJc|BX-27BzvS@; z|Fqo?uN*tc)kF3kLK0%n*`kj-WZ9g7OL~LWHmmL_LOQ0B-)USgril#WyDd?)fTE}I zJ?Ek>EIMa$l1f?W?Hk;=GZ8*B;Q-$TziMyLvy>@lQ7~tVI@Nrx>zG#!5+EN-eauyg5zhRR(CBZDk zg?@;wZ=y*SOXY*#jjSSK{qV!m1q;^L03Lz?MgiQ_&T^*QOF5_-oWQl4b=nY+`Eu!w ziLv|5$?d4|X>~0P2yaJjraY%Q(_E}SAsB#Db{34I>qLY~C@RKJS}c94cW)_ic&~u> z0zWnB%ZplDw0CFJN=r>tkZ66gCByKL(PjTA1WO(~<9lK~M z_@SQTtTw4h%r{K*&m19+oPV4r%S`)R=3uZMm}0ZmVfM8M7h3avS%8o*`(;6F_R=Vf zbI%H{SxMLKV0;>xzZt$~aJx~>E<1vc1A^qDV1ab4Vv{R zOIHL~mbS$!;w?=RrliLeN`Tg^MY73a-^S86l9o}S>2QE3Q1ChzVwuvJsOH)c6sG~H z9i*1`_$7m|`-#*`5+uM(+grQW)wXDS2auaYA439-k0xDvO_FduLXZLuyZ%n^2vnxY zN2m`~3t}Ug;~OmmBZ7lj(Zn=M=G}~Fr1}K&MNo;~o)b{w_xk+S41`#UiMbGJ#6H)E z-`ySlpwvo47M1}QcugSK<@xqKi5tJ|TnRgJEk49hQ@^6cv8VO!X{G3WJkV8vm@M>j z^94M@y-&qw#POtX_c{sMqlnD_+2Bk8(!G6>dj1{e>LR@wNXCc+tkmYkdbaL#ga4{H zehNPQ$XU`L?{Awsk?YFv=Nt;M)IAZnGLTD0|DKI*WHo0EODiYbNClsiRH!B_foKOw zvd_L8nc&oN^zewyD+=on-?4tB9Jh0qiIZOR-s~OL2ZQUA#n{eui;IT^*GdnliKJ1B zD@57$+0$*+3sIjmJ3oB?T$y)>W@s7_abNO2YS9M}nnqDQo!_TnkpU-@O2YH25B8$* z2j+J74FF0Im?W;d8WaovYp!r-ulDeN&U3`BgfxTCd&!}&~6zH?~ zDudQq>?sI3;qPkZol)Y*ciFT?VcA!7S-!pBakY4Zm=^0jR;3>2dg(hC5B_B8$e0TH zKQ3LhaK`&`gF{G7dO`6ufUtu(Tu7=7J^@OOMxXdEbe)Z=IfyvFjoOFdEe)Q?5I)za z6Z#*?RY~iG>G0+-#z+>dJm!`zt#5bGncghfu0mMB%iP`1!&t(v*yBW;3Nl`-Vhl1^ z_V*~iD~m@~GU$Iouw=6fJ|E0z3xwmTsSwbU8PlTG+e(e-31{u0nuK%JR(U8L72w@e zB!i;A2+_sIz75oHtZgA~*(Gq?djG~& zWBYWv?=%g+>DOf_Det+?cXq4%9qB#}qNLfYk1uPeMA(HgLx0BaNC5GjPpy< zrdY$nDh%3(j=8z-<1v5S+dmx-3UJN;;rlMgw%>${2?S*Al51IQ4&L%d%GNDzX#ZFU zMN2#Qlc0BlL7MrM3qAu;4c(c&{u)CwK?%ZZW16t6kHf@@1T7^C!q+jT`H!Y`@+5S9 z!R>d{*pK=e521L0z&Wjlq{d1JyV93n{((W{>ti`Jv5|gBlWu9D2BzmeF=Iij1FI;| z#1~|na=M1+m_R9dx8sLD=|-{*;gzmZcsS@>*GR@zj`TVrH%R(&PXoEUnNFgznvo)+ z=H=yO6b)7W2r8gFA}v*`pT*n(K>XM>c>(oTWm5PmX=Y|siUpOXLsZ29sL#qZk8-=e z^}AKmaQR+@SUfqfr6kKlVoVf!aQNTNm1La}hwfthR&?gJGzf{?6u9AB{8}O4FikgE zQzx8F{>paRkRL~jCZK59#Yz11`NPAsC%KnGZl_c72b|89=e6JFsmYBe$6g9DS6(YLQw)M^C$1y!{xKlAHV9>z2tOI` zuikcvPuq-$jGEeyg?d$B(g`2M+@r%M99&g}^e5aDfl(Ff>M%Z08{>teb(fpEim~PQ z8H6A78uCc*s-c8Lgj;(BUMU_Yb&r?j#Eh(pq7_;CmfM)godcmmZ^klr=t7Z3Fbc4s zU50&OC7eF|oVrmaTEJd=rkygtlU_;8(?72)(<}$6b@uae%5;H@^!$Cm)zZb!AhovK zcb5tYk!yeNwgH;-^|#Cr){UB)p@}kmw%+0*g*lGK+(L-3AYIUs5V!@;eY=A+#v9=T z7&W`2AHNFkGY#@S|C;rut%JI5^9EHWWmB4BGMsgS3KyJQ)ODVkQQ>*JUYBn9ieYGk zqZ2u*P^Q-JeyQZ+q+GG5nRf+Eq5aB{n(x$5Nh8_#Tm95sM!IecKINB3gdQ-nX<+4K#w9GCo8#yY z+2|u#(R9PPZr7l_!igBUf~MMQA|LiQTs3AbRrUFr-WJF!6HGhzbpSzRa4D`(rwFoe z&@0CO%*Xbs#(94QRF26)FrJysfG{S|V1!-SJ3*Ewgp6Hu@gb8MweZtNcwJ(N(5N@1s zyDoQyub_L@JRF>}xnv22N4Rj=C^ryy>0dsAeL!c@MFYo~FO=XC<1ukyG>qeu(Pi=T z3r83#s~9#=nnc`my#ymOAuM(JfFfKfiDb{D2>xa&$O!uvIimqan`<`O00!2NBV=q( zp^07sJedgoKq6q4N~>|WF%a@QM8V3)CI;Utttn0dmtN*PSff)9``L&N=lI;=>rg(z zBN#P1qLN)s4{Yq7W-tDD4N=}0=kh4@ekZLJ=uuu{u>>@p>5J{(C%Fs!_Dc)%>Vm?r zWrp5S42GLqnJ87qOrMO7%ehB3xU6Fl9`p-~NvkjJ?m zC2w9;7696XN(8#N{}mlO^EkM$t`(;k-`n^3DZDEa392r8tm-;qV;j}K_m-8;M+1c+ z$`o1SS!|P-%_xxU9A?#6zu)V`TfoO+?F1>C*d~LzIQ@M<%5-q-a=+B~`0xdixsF2;&T4i*197$T`Xt=oxM2>{INlDn4EzcwGv(30@ss8qUCgnP zEdRTY@QM92cX<%#o(B6j@{IxO|V1dwN{W+mlVzLUGqm;B% z=y$Gx{2&^{k?zSer}u%*+lbYv+yQl!^Qsz-mT$TvLdSk&V9MX|kDQF;YMod4S(nBdwf;dih;vad7VtKBIAxr0ju74IH0$S0hklmI`lwCd>SH_}Zu2Z1k z6W-PFZbd;XNuDe&#VJqXtM$4Los@8A+m?(Oy+^!Um8c(4;b$Fk_{1GBJHwZe^SSF8 z69xUm2v|!j$cTR)z8oFBLf{g4|I5Bfk~Vc?wsr@#vhjQe^)M zYIjHaMzh+B$pv{PT!%^t;v7T)SXfQe@@s6NLL{X6f6i>~`l0ka`rRY19q8^9!J)T@ zOh`~X6=cT3M(wOCk@(Nn9c`AxTR^uOXaNHlU!TR7JdFLhoQ+Lj40hoy zVB!QJX~q+&w2G(x5zHP{d9SoVJF`K{cQNX!47q&}Yus4IynIT=0(v_)dAPr|A8vNw z&*|w+#|(*(XSzqNy)`d7(75o#~#qBf%WMu9=Wd@Xg1cWx{B});< z1@i~_NIyMue+pT+zBThvR*im57BKt2wRE#o9v-nE1U-BLbuhEs@Vd`%e%>VqBf&2O zSE+P)9YTT@8`05v42GroJ7z8p%iItW0SIliQ!RfRfF}x3bR(Z zq#zpYM#c~!vrfvipQN503;OQR{+QycY#-wwbIDm?`E!|2eH)Bu!)zw1Q}GeFGAGxs zB}UV&$NNQI{0d)reG3eH4uXbpNmB)x6DPK6_#IYe1vurMp&XY`iMME2gwQF|wxr9* zieW;+`xm2JhN|c^F1kSsZ(@M7lhjDv;Sa?2L9yX}4${nf*3a!-4{@KeFM=wUFG`B) z%Jaay)ve5snI)^;nWYA1fMfYmm{a&7Qtu6Wm77*U*5iV(I%N4zN$mPhN2F9Dx-DR} zBhMBahm-dr=;*!52|TNBCX0=$kW)3J4_v#bmMR6uYzYPS(}V!U=afK`1NPW_MFCp5 z4%TM!X8F&p0Yt^71n4CbGALDAAfpi20O95tM?E>t+txkQHW_0X8gFMIx4P=6x;l{d zpS0ZRjlW}%;4J^d6maUrA?W!VVOfGL%8!=co>v2_xs4p><^E41WC=TXh8}p!X>}|| z@!j`Xm=(QaaiY#k&MTB`yPWS;csvx~#>e~WM}TJ11IPPNN4>`(`-J&*Z&C)?X!(Rd z{eq)S$0QuDRS3IZLklFM4P~sed;5uy08wECy-5JCA;MlVG$uZq{Hs7|9!Ds&a{_GfGwgh|e!ncjXL zGidW@Q)1eV!fNYIvo)R36LA&43T{;6dA)NUP3T%1VK&x{cc$1pc z3Ip;L&$J>(p=zu}nXDR$!m_Eiue6OlzR-||b7k&Wex<{cby$<$&dES5$xw`T==HAMkWwSR%`gLUB0`8|LS0%bAHfS~qFIdddCoE>+KB&^ zkE>5mxktrQ=mtZUX`JaD25@@Ndjt^7d;=#y9*95C-QGkMS0n*{lc6G(Wgwyu%t>=3 z?0pB8W=#!eLu$RTffTnmaLUDn=Jm*V>|cHgTw6mx#+nkyu5vKk7$Oxwkd~s1>F-@M za+{2EKP&S%4ts+i5^KZzAwJ&iah#L+X01lA6Se?u4I0GXo3-;fVwVmaya>DOr!-~Y|K5ebGkVd+5 z=W1cZw7=sj$G4Sx>x@)NRE>uAp>H;-$;*mnJbGnf4=n4TLAuGSKgs&|P!CKMaL{5W z7AjLC=+#WLFrr?$i@P3o&)cXeYCpBkXWTr%x|6oeG1e^RDwSzxD4iA* z(NLSS_61n7Qtmz=ST>8a*>fW(|5kKU&R{M;=pM#>J} zuzlIo5U*MDfy=b^WP=h-sm>h}Q@MrclCuUz#`cP@b~X0p|3lYXM^zPe{i3kx?k=T4 zLb{|Iqy*{CO-oC+h=kJJrPAFUN^eBEOFBe4&!g{q&b?>c`|Up%>KG1PYp*rue10{< z;Ma%%4~W^A6fr=OJafC^PkJe6|8|dVz`k~4H3aSqzOmM#Hpf2Q*!O0+mqT97TM-4e zUcsR|S=00tkM6v~+eB!$p#@!8phgC+yuc!QSZk##Na;z)v$hwcbKT)DAbv|zqGEib z9By8_ryj(A4~Q!C+Fswr?hh*MB-h+dO~(fYs7a=hFR+2It=lem7$aA-@+N;Yn$6pF zicVf_!_C$^Nib-PojE@Wj)F|@{0t`-);;l>D(D?Peh%zx`po%Vcbvu@H#ynDC;WIw z#zV`XX4Je;yf_gQosg8+I&c5gs!ce|4IPLZFb1Egknr?XzP9ngDXaGW(;$>T|D$+O z+A6N=l?$9o2)yluv682P95#OjJb#>UqAO?`$HP-Wk;MX}vSIq}zmux>*IyBuZxg#i=D3gp@ z#2I>6kzb3Tl#G0rD0&iHnU?0EvZdK_wRT<0^x7I~#UslcQg1@->SZw;*^lfqoSYgG zI!Y>G9KcKXAS6x$l9N4?FIRNVZx_^ac;UVk%o zh<-6h!uBS>B`sY)F6juC81y5Vm?@9aU@Zaz0(-9GtP{DahgUZAi;7rXi=~4VNg^Xv zxBK+KHSxN+nqHfvLWeE@1i|(_U`C&1fS+3oCI34ytC(nag`wjcC!oM3 zwt=yM+)*`~BO`STgT1D1zP!ll$*VPSG>ONvNn!tcBTDxFj?(&K9gVL$OrkR+UP-Er zQwn@o^1t8E)GVi}ymLmW4m5ZV2i@`3V{nrBEfA&z*X~lFq4lx{2xk_zH>iDYWBvK+ z&o|}t>4L__*wyD87m*Xt4bDcYe4QVI99(Ofi-^2_;zyKCJXwKAY^WJ8!jYtCS7~S& zF9)2faJtlD5y*aH{BdFiv;iW4MC`4UF9xjNSCl&gJeZV}T6KH`?{0#w=G^$r+m%(^ zNdE+LVvMLPGCgln!5c#jqkVpHSM@fEM>9C`4~io)*ROM)oSw&DW`RNi4z0IVwV-MN zMw}IuQVs*m$bdTs0)Y4f0yaquKU^K-g?T<+A>Qkba(iYjz8twz^dAyB(~VfMopiX# z9KYq)vj|?fF0@8Ol!$eZQF8iD;1d!%n{C%UafrA9G67JPX8V8hLUsVut8sNQp((iq z%4PxOMiJPoSN>@vggX^g-aFl(#bSKsVOy+Hqxpt1!$pcx;u-1L=+KSlY_l4_rmpd^ z&t_Y02x`!~3z`?Nb+sdw0E?!P(AQkstT|G4xrCwe+5T`q#sbxY-H4P=S*Je+Q-GPd z+b5eKCpOgCo8=Jg_X?jg;)z|@|CDt~-H8aw(XsGcL5-u@Y>pG7XTc$!r8J4bU zre==E>h~K@Frv^weR8p)CZ`IGjxO6xM?dv)@^g-YgWkPwtn*rRbMV6-V7|K6M#~j& zUX~jwHU1eMF5mm)im!WCEvI?J8nU~0*h@OWW=+q_hA#a?x)?6KO(Z-gX*2OGvF_zh zc@egtfseLM0eDLK^TIG};dgS3HrA?H9WpqHiJ9-vr#SacBuzx$Ws|2M<`Qv!Tp@(p zaa>@tVcgdM%IYTqA`OkDn;%UU6w$(2q7Y!GNUVR>HMm7JGLrD9Xna40nWhknGX|F9 z6-Uy6$~LJ!`4>+^8`ONktsZx_6Y!(p(?mC`pNcBF)#E!B-|Xm~j-wxmo3OK=@4Y6m zNVypbA*LTHrnO575Q{U0ztuR?=>4q7?UQJl zCd2=WoJc``;a~(h8?oAeQ#(3_g3Sifv8~S7`GuJ|nT{^iPUW#vIJ1awe98mkB7-er zR}tvZTWbq&5zG!RYPe9gp0lJg1UJ$Pan?tJxywO~1x`Qisen{<3e9M@6!OA+W>j3y zPnwk>x)jCFd>L+JjO?rmU4s(d9|-cIlP0K0NcY;V=OV`cX(Lcb*Jb9k-Q{m3V8XsPPKGftm7v$U~r7c52jI zQt~19e_h0r%Uz7G^b(bY_3hbi)*TlDW0oFtA}kjqa;s5CtlyCzRhsgIQHuDG`iFjf z_R0mX3uzA=_TEWL4;R7dfpVS7eGszSOIScD`gmwj>bk8MR5i3n)yK9e9HdJ8iwQ^q zrl%~sqM6Z7F12liE7ib3p) zSXwy!g3(=zi6vibKkr#Tl`7Bb+@3(vAmetQsHCZ717^t0R=Y)9A3<;#Y#fS>7F&6%(_lI*>7FVMD3$Ih(bab*Z(pe{cEK`O9- z0KEO}9ligY=9^DiKWF^!=7><=eX|6oHc4U(VhNKLKT%djNxUu5sfU(7o)XV*bM+a5 z7;*BBks{(6%UW)4cxwM#9=K?uyDmQP(nXxLHFW&$k#$}isQsr1r&(F3LSuD5zYtYY zdaCzzmI!;MeDY5-p85=PU@peOuU{l+uWTvE^@#|@XyOK+Bl>CEQ1);r!c_tSu`>YU z%LqhF8Dqi58;!t%6Sc|R%L5Dj%n@KwU$*jrMo4~QKJ#|h=npuF0BX1K?!_+Q!F;{1 zXN{y#LM2#dN#mQ5xkx3tKE}Z*7klN@l2^?Um9I8^0ROOD)eCy=j>O!b&Gy*apYWQp zr(Cta#a${oHS96YS(xEr8DjAq`J$JV)$^ain*I^4t z-r1?r`Q$mUJzq2yD|Nt3Q4#wQE5v)j;FR31v*O9uN}G_=;N@4CcCWNC{?sV)pcYoJ zs&!MEN&O~cfMVtJizc&;D`+2Dgk$5TGLKwvz)K`7MQ)gVr$ZnDddp9;k3hu9((!eS z>^+!DfNF7algYs+0^n}#MhrV>FUpHgcPHo~X3;B9jNWi{9|39|{d65@RNlk|H_px- zC1P8;C=L!sN;eX1l=p3CiD(%favjg&@#_dw#85Q$6d3bc7nF7e#z*`h`NdQ?C49UaxE=8F5@z{lKOj9N4Tx{BbA^H) zj^Sb2$(}$!N(mS?I4jx%`Donpaccp!_2J*Dg%Jzb9!9det-XX zzU6f`-2C_N%P?5L`5rs-V%uCg+>S~Hn~>{&G?#xB?+8#VyM1c1v{nU=@ZFU}KU zfNTSo3DU<5zjFu)O67a_>tB#@Xd+rdOB9iF9fIQsN)gcEn2+oT@w+vt)BzoG3iZ$7kXH{>T0raGC{!rpo}#c6cdx`ehp~{h!7NJJb-00BM0FzFa+G(bfl#tJocjzJ+#a9OA0Kk%xh>oMnsh$Rgu;=Uw3!jJ7Pp+|GS0%p-}$uD1U#PBOpL~Xm))< z!EMn4@R@3p`~7)ki?ub%+(o3jhokO|gF~B+diReX{`Wo`NcD6@vFUg86m@kkW1=Z{ zIe17% z37jsT%dusI4i%?-eqGwZcnOuM&Vv1Ap=dwe_on>c_Ov!;r>5#|3TRQUNKxb zdYe<;(_V0g71xSYk`pCs$(|EqF*G_Zpg7K&N?`~%);x)rZJNj|G%8*juNzC}^D!|` z^HOqg;zL7GkHrvgFnq4l}AWZXEmm{ksO22**yL>y`K~`+e<~ zIl!irQC+>!;xRxu>JDs0d%9Ireyg!?VEcnB;gzJgkAKB>-o#twcn%EK=|?anSPdVoT(pKC=6JN(}=m3iVik-9vwJA#H-FB z{Veo+{K?-=9zf-y70N|&@VdWoL_f73FxP8&4F^_rmCX&Yx=AR%?C$=B*$q>mtunK}Ut5ZFX!QUK+O|5L8*1@jKv zJ2_%kdNj4!ZIlmE*P)dBlNkTI#DNEz;cq+o-=D`RxO6xxc6Lp_*%pr!(0C|T%PKqV z#Zd0jLwbLnb^RKhwx1zq6MY;2ok3PpwU!K%m>j;mA}f6Q+6m5Qp}`w7tB`VHazU{p zK8zypW|ABj5U0L+%!cdBnV3+s+@*9nXrbjQnxn(78dHK#f$HsF#Ixxlqd z0fj>_6S&U)+xi8iOE_X0WYK0X}Cww*7I4g ze{o7dzvV09`;2g)G|JqcO}=wnxJXF0J>kT#ocoE6{^6@IN}YlT#@AYNxHJ8DdVN@| zU{E$r){MR`rKP461{`m9N8okT1rVUTD^|GilQ39-wDt-pJUIcEV?XWi`eja*&$nqE z>>nkx*IZzp{NYB5TR^wlyvD;D#fz4r%@WrEYVE(e^7nfHjfdS>PHq~Qk>9K5r3uqQ)_Iv8VVl#>WXkq152Ax>aQ6RZMO-9Cmj7e_bTTWYn**mgx!_ zh=fQhWk$fQb{0^@YM-)DQj>`Ya<_QpEGX?n15Lyl7g@Cdz%*UM-JBvGpd4r|e!nA{ zUg(n=v{(9T$KiGdvIMa0I&t4T8o$OOvSF*v5)c|B*qUp}z|?_V2ORD_HYDYU?Q|Tl z7pRc3i(ZX2^3S`Djy1wu$;|W&OPR!pvbcT-^luN#$FBd0;VJ3#__jQ~xgqgvbn4jf zg_=q=gp-i9otbZ^p?DkJhm)ll3(^sJ6FfRZ1CKl*3IRRg(S8 zp54Jym-6zK1;HR~V!Z%$E15rFf=qCy{PhcEmo=P%pOllv-`EDalgmBxEv2o!6x0{R z8tay-gQ-ntzi^!NkmptwqL_{2*19vz+C| ztk0ulVQg$QYJ6&D8W&f!=5mWu)-u2VwN5&z>e!YV8XCq&#*S&ospAIs$kREDTLzq_ zW(3rfRQC^QKB=hkH`e+1Tr2+d-^R>$_&fLYHUX1RoUqNfcMl<%Uh^L7+swAyXpjFf zDxlcK9UOo&4CbqjfvybD8)ZhVTjIzP!^;m!y!^M#UhY5*zI9sPb&P{`c_0Ev#lFMY zexmo<7Wh1ok?$B+8a+N1ZYNQTxme*HQi>dgbIl)m8dZxL4zb<6fg|t4n5d2%>Zv#1 z%B<=L@H#>cuh9E*j{Qf`Zs6xZS!?Szr5$5s0~9uIfXX{MBCtCmY@v%WsjYVi92Flc z?HuX}Tq@8w4?EhK{9bl)x)d+Bs;r^r{5;p1!jZ4%85Us_K|QuK%n z$Nt6xlH2&X+2j@v(6hN*4A@i1AF_*=Fh2WJ#*Bl9e!yT*l;7{gp)th?>LTfS9 zuoB0g^Q=V?loC-p+d1{+W!RAxn*7IqPA9gTDf>R9rTuB~kOSqS>INdQJ^f;_!Exms z*22kDPmfA>-;%=j@j;&xnaE>JHvw@<$~G|NB&vAQF4D}WdTNrPdV+Yg_w|2(9>zXRa1l6 zn1Zwm$>tRE+sGz&&Dh?(yD-^H(3qWILMJWAUiNIU&Xt2xk$B;FGFjfLqlF-`Hy>88{|_Yu@4XLyikp|@zH2bkyFFg|EMEa?CWr==y<`y26P z^)tjc5C>o23~ciKrR*Xyx^?KZ#~X}ypElsDB^`Nn8=cI?NlHpxCk~`8^)+rLBB~4x zZF_x0iFb4}bPMJhqWi!T+ww=VnANRw;@QP;zcG^B2AqD;0<ZHHvqxF>)|qq`0C2%f$lBuXqxVyJ~JMN`&mQ4$BS* z&*GX*RVfK{dwY7Qs3bxS8jpHrC%E`2(7@CMf&k`k=T#Qra)kXOllvIx3;Mbzh;p2- zQPye`Ce2#TC3Ojv%E}L?o<`!OVG7(0{VoT1p>%--sObAM7|zsxh5X-`UaB-sp4ct+ zZomqE#TD4Rd4d_^RPLj3SzPi_hA9$9&#$zJ5y)^x2&hSvhD&AO+#T*VDwaEd&k_%g z3N&0=3Y}&}KX=F!A8&iWqzb}*ETw3Szi7LY!W`?8TAzGLiL;m(Usjeu*H1;T8LYm# z`Z2pA;QF+lgYU7*7VPhpbz{2Ud$ZaH>$|PUQzTH92Mcc6d_nliwO#8%J>XZ~?iD2L z?-C*9rYuWi=jwI;w%?Djz1@|*5~I>aDNG(q(rUOn zMuN#-P<2i8R(J={6|l#(D@BB^kV|kPX$AvFz<*l=J_WQZm zin)?^#{tk~iWIp4{sbPL$d8&xaPvz`1!eg@GK`>~e;<5SSF+oe-%B30r`L?K=Q9{l9B4hkFD3& zNzZ0lWghc-T;ZWo_!>=FaMGTQyj@^wc$z?cMLF26CM% zafZ^j;~f?u1&HtZ`0KoIqB{?%vgB^zyC>W=0a2EY95&_Y>!pv9<(+99Gypij1`jM? z*5#_7A8v52-GAa4sXTTexUH$TBKBEO9Vqnpmrzl^6=Ue!&)qPM-{zh;LGNf!IJi)i z%oDf=budIqs!|hKqu)SXp{M=;ll0?j^vKWB5$YPapq^iitexRL9e!R1fBXn59a!XM=wCJs!x`Ixz!K1jLP*ujtO_aSrWuLhXcnLag-c6|Cy z?@p9G%_j)fyNvkk0#BJ??3;c-KJfA0rB^%^X@v7#YQ7ChKA79cOt>s_HpQK}-Xrm_ z8AsEI191i%(WmGe1fb`oaF~!3-k^PaZ??bEN)z1k=fl+9_fpcbv$Ii+?Bs0rw^d(@ z9C81KBM`d%4M#BQDRNj&XdAG;e(e=y`;QwoJ|osS09(N9nzU1A2L_ndW`GX&x}{VE zkcy+RD&Ga40Ty>C<|<1l=5`rOP8V`iCLcwb-7Og(CJaMFPC#$yw*P+XHLt@Y)>pie zq2z<{>e#5cu)IjT(%E1%8yV&0>t7GGMec?42v|<0)MxP-hrPa8##W*aIny>SZ9C((7G=Of}<<|XD!3UTWuw)SoEgEx7n{^%=x+5)H1jRYteakdVgg<*KFO;UzN|O6S8>emaX`L6R5n1(1$zbjO3_z)428?E1nVj#)y^C`PLuS9?v$vo$@wMeftjxw8%tE zK-Jvn8^^}t{&`DY7`^0@ML578j$-kx;5G|sy4Q*_w7(kBNjf{P=JYy#S2jznrjzrk zNJ2>N!{pazY61Pm*Kj@z62$x%DE~ptpD8^v$CCo$$Wsxs{}Zin2k5)BxocX5bx^cG zB8fxOGeS~AVLlPx)h;t)2^w)1>~N55m2DgVd|bE4$Zssvnpojsv-*csR@)HAb( zAj)Jm%RClniaqzMH%<)+_TmG+Qr7g9vld}XR2sDwRpfnXs)OVp!L{TyhbI!e)|vu* zI~#kYRDDNx9>~f`6pZ?K^mBK3wtp-4g~8bc)vfx`zL$-dqBmNp-C_%>xQ2jmQ`mZ1 z7>aVsw~}INam7ccG=UcSyM)vzX}Tc(de?)4l$bF;5Ck)p@xKv##xqcD>(>?wLp%-)$}$`s?Ry z_Ob-tgX^}E&f~)>5MJX@v%JPF_y88Be<;sMH+sQ+uffof7~(a!_BF$J;^$zMqP3*n zo2vq#IfGJ)7RrY)48Er>5$^@+lJ3p@yp0sw&?-eudFQhNOibJuU@;;jz0SB$A7XpE z(ze3Ko0ghPf=h|j{qu9=oF%;b_;>dl2joe2KpPn;ld!%u#)%h`a}f`=A%4x<#iLpC zfh+8N6K|6Y=nl#v+s=6KG0LKQg+(^iDPQJqqq;_tNJ|VeM#J- zJH_yZXc_X8`lUsu24NbHq4l1e#dD^{>H3caNCFFwllm8oOhSJopE%WiJP=t8d|-jm7@3*;M#<66X+x#D1h}k=SLa0=k zN6r#b``$#o)Di6aAfB$wwHX!h@jU{xVH|(q_Z!c99s6tNnDJWa(0pe@&W|_|Rxq1T zc1Dx+gNEEceeV?E1NtZOplg8(LudsW0%0-w1|r-9gT|>y@zw5Mxl{Oo`%3tQMs^kf zF`>&6g-AXXZ$;%TUoI!#4!^RZt}P{1HPDJLcPM;#*LYB!EWRnYwf+ttvvzNy_iR9i+m24Q7^#bRVpzZd0r@=0g3}`$OYP7aZ0u!V?2Os%N7;Ht6=eEhd3$nu%?` z8nC#uFzHT(4}Vb~M7s4ihiM;I6;!^QI#hwe$QU1YCw*8uh`#1)-CFLIONph;D8qQQ zBC)Zl%d1({lE;92m3KGuZaw7ttzhl*q&_HH5U~KckoN>Pc`!*HUdR&C-)al>!$(k) z7+>Q*c@|B=Fhd3_b`8?`NE7jARrf^h%G)ad{cHE1xjqu|m?uaQ8-%3ngEDBv_}D>_ zUG9EgIp@vHnAZ6r&*IKiHBN;oRPohQC_~2{Ck$!fV1nLUKjQGGig|cyy7DG^{8A}G z*|;K8qdtV8M$_(h8%2|#xOy#i62h?`F|CtO?pAcT=a}4tOJ$7%c^M6% zTE-ha2@wR@)2ObKKbToDZe2GPMtR&pv8V0t?3z$(!~2wxKK8xGKK2OF%wzFsW|YJI zt$0x;0ROfN16pg>7siMS}1ek36_}AXd8iNeGV%`F}zZXo#teG#JL; z80p=I(DTQM38TpC)U**9=;~?8o0s-Ca`dSEjEVhp1grX7$(fxoZ`ScsbWqn*R&GE6 z9wsS?LyVQXztBRN87o35=rY^OBicyFz@jHxC*?c-<`Pyo3YJDs4IYl{jBMwBcvq<> zk{MfzWqgh%g(3EkS65imQC@HVzMSs839;J4r)(Wz-s|Npn2`SIlRYlhR%#*6)p7{x z@aix8I@4RLb8#?Oc2uX`#m~!b7=g&S1+YsbBGoa=bC$-uk+EpYf<)d1Cz3_*AS)J) z7=beT=DkzkHuZ;*9@U6mhrYTmNfs8qIDXQ&g2(=U#IEhydyDL$@mXFm7KE1sog$|S zo_A`>u{pn`2D5It{z~|KUW2|hWr$6^P&bIG!){2^a6BtQqHS%da(YD(=zUVq+JE+X zo5GMxA+;(dMpUdbV6uI*FL{7PhlSjIai0;GBbB?K!odLGM!zOjZfd{(`~@RL(jX9s zfn1vvwwnZ*?9#0-jS~Ko%KaHMCY-~-=>sq_@^s=vuplz%p`bZ&AfUpev8YiZ!1?9I z>GCFht#eiZY? z)-XX~^T3gFE+&$T_VY%*Yvw*?sM#I6N%AwZ%N6pRg7hzWNJb=1`7drw%8BUTys{b| zYLd6&K#Dn%hvPl>zBVB#Q6rEyPr&S3I>Xb;nH>0uY_OlxhdMMk*dvGNOC=s0e{@GU zZHpwmV9`#%aBNJNN}>0IdH7e|+vIjTUQkdpx<|fCWla>0#1g{!Uw_x|v{gS_n|WuB z@AuU;=$9NZ{Sc9+97ZiQV%*8=UAa$?T(mW-ZIa30_;-oAc#U{X#J|%JA1MwJ3PH=j z1>$x}vL)@Y9}+S*Y8FN=-0PU}Nu#0yF-=D?1fN7{j1Dhrjf}uD;vJ?}9D=V5{UgOX z*+|em#47P69_Q7=o{_e*B@VpHJISjQxNUuxL+UASc(49;e{rr-K+LoC5g48wb;cs~K!6Jdm&migB53{b~o03Ppjm|62;t}TO2dE7Iz@hI4Gs2-Aj|-dhAN#ZBlYC$lt*ACSfkFf zZ6HrG$J(E!vbYrc!=rS)ECN&;1lacEC)h5QCM=K^uG3s~$r0AS%mGZ+{N8dOH2Q3uJ;QmTgOC9cj9)8y6 z&(UJOUv|gk$$7q4*Q*n!85lisks%qC9FG5;bk%U0asb9CyrcOp)U1|<9fV~8IXfr< zN+a+pJ|KfKZ0PDG{MqW2$n>*#9&`<}W4{4*ZZP<;d~rIW$f&M!vlh+sg>qkdkFLYj zDOIDTE6`#a<|q!m<-Z;{3^K(}9pU!{emPpKc1q*0aQSDPl^;q`IMfS!YT%$irfyh< z{4T=d7w4H5ry!;W1ae&aS4fj?ltRS7en`c77&=g$)|k%CN3 zEP&DAary4fO*(FMARDpui}G&i;KzWQK2(YHkW?w`FdmL{XNQu?6JnqDA#-(NjshR z^wo=NZyDDAeGDlJjzMA>90%{qE0Ism<*kYVKaGDAr6AjxKFJ7r5MZ)|(Y z5+5fu2YvCKDDkiNna5}OAA%E}Ti!SzWB{ypmGmbHpe|X&6b++P(4+!!b>7m(5uK+#T-lLuncwb`dX6)<(8YcR#L8kBw~F%QKON2$ITW zAU*UFqV~>wIC#CXGkaju;%lTl<8_pW3U;r~T|U`!(Ud<1S;7rS=Q1N2jZ1 z_^g?NzAEda{r8CS+PlagHVGiUhm|691?x!pUry#^C_^?WJ`^g3(@#8t+zu@OovD-l zejaNm``de)gUQ2Rml)2``8Z@eyuXMwXE_h7?PFvqoO^9EwROX^e_69D^ZxIP82J&5 zDo9a$;YNS77Ef}ldu7F^iHaA`#kbarTL<5lzg&Nl@oEE%tf=iv z-D6l2YF_9eN4#_pA2+W7d&yJ!%rrRYmezcz?C#@?u_PRNT8btIt8se@w{X%0PP305 z86A2PzUQ}@%&I31f51D>?B};#+>#9Jq%21zn7L2!J}@4&a1zsP>H!};RdUc z5s%_L5e!w}Fin!CBhx~h>qR85D|?*6jybikK6C@8rAv6J$_IjF)rlY#lNg#~^wd zwfLz}#h-L|CVaB;^Yj#I@hI&Fxp`>O^G&sm=_bvnO+E+^a(Y$Mvf=fl>^m!yY4Yj9T{SC%~<_~Ja)9tVv)jH)#W zWi0VnAn2c0YfMY%XcbUwUloO(#YFnkmf8D?E@DgulY8J-yiXX%Z^Iy?9 zKECur-^+^bgiS5_#!8XPRkLpQri^BC6{R|$l zYZeY>Zx>LopdIZ#{b+d})6=nI9Mp1h*4yJEZ`>#@u@4Vr$Y8LMC*&{?px zcqUsy!7S_JwB@m~^HRp4AIQ zCn*HXi?J2gC|tV&Xq=I1g&4o*4Ds~JX&rr@*SLwh4hx%Cpt>%$en#sq0UD|!M+hsk9NlBMg1Jv5uW*_vN!|Fmkl=|h}247)nIH$5;& zX`tL|gG?>>mb76g3om0pZst8`ULP*5bKhm;^drr3#5Ej82g&U&TsCBsv0`q~pf3>M zPhKPj$wk{41PnO0e?6$`MAlywpyT?@MvGb6(-)-p`r#NK25lG8u8qnoA|$#FLxeXI zf4bs-Ij+91q^#olX4Uc1{^(-NB_O~7LTb*)SV|DE^Rgo z40@*p)MisBVn6Fnew)3gk158|-s+WWc!8ASJGIM;4@uwLI|vFwP9QVZEeKXv37VK* zT|DIoQ-vu?+%~ni%)HrAmhd%n?LJbchO`I^Ve|Vm8%}r%%LwQ2fMo5}tMMiC272C? z8R8!8S4AaXm>GL!dI|2}fD5XeM^%B5GApm+HdWxeOm~d;doGTo%EM_1B+OLj&+<4K ziA-|Nb!Y*{30+npyW~cOg&UYUxD6IKsNjD^&&ao|jf?LPL#`yDss8r^Nhf5cOKKOp z>D3=QXanBrP&RD5-`JP_(pP9Z2q>yA$43%hYst&?OOG>)lF{XErzF;&V;P*6jnC~W zOKg*f=~Ptoc=Hw8(g^vG7pSZe3ac>AwIV=Tnu}gjESxgaCKoInAd6P%)KFyTe!)kW ztVJuo{WRw?i&z#E^}YCDn>b~N)z1BBYM9+e@7pICpDB+!nwcPL0vPc$hehqMYd>Nh zqP(3a3vZD1fve{W!>T#GZ~5p?!EYBntDS2Y?oIX#ktx18;i(cvgQAdB7L9t@&J|5W z>cM`D{&{dhg?4@-o!b5IRa~&JHqg>1l3h2t$yy3Bf2+#u5J;IbcJbrj^s@D7t{1zt1g(BqA1P)mYY4j(({1&a+$ zQ{SE5@9m7aX?z<_o+(P}w2xW}0lT(R`INReAf$%gpTzW(5~BgMcRCJK*Q#Mcl22w zF+pHQNJ1hRpF1ftW~x>#cqBmZVB+^o`KomHyU_S3HHZ;SJQNr9UdtTA65*AUmJJHd z>ZBGFm4}rbttU-5A<#oOCM<}tSy<#rZk!e*U5=N0wrI?~<18jiF4EGHFp|I>AI209Cyp1I{%-CRUgN& z^;dgaLv~zJi6kXEFTU}|HPIYd#qHkY+GLVzH0YH5z~n(uQqtOlOPp>OFv@0(fd{$z7bxU>kRFmLy!TSg9Z=+p@wM@wYzSPdrazeWev zPd~`aV~dZBlvVetWxv2Eu8uO#3tvz`&@b^=*!(E6MYll^-NrHmI`~_Knv_NG^m<)? zU_zA3k~piBZThn7jSrdsdDbS03WXbr!9tB;V3A5qf1OX8yX4Fjp~I)Z#W8zhaV{P< zyJ=(Cj@suAtoLs6x-6gA96NgF7iLYw?ft_ugOJ}Z_#gw%MQcQTT=pe|S_jRbi#EWA zWMr2*(@-~X7onw^e}p>pOw ziW+O=6DH56g0w3tfU~h?(4`*Po!mfL+5|E`rLsk1RzSLdT}$iW^~QZg1acD%l8Pc( zFz71a(b|^XJt9^dugM;35zq2MnI5zhmcNsCEO)#>{X*e36K_w!qbSbEG}h%Tn7jnn z{QhY!LgzUorH0II=Q<_3`0@j>jNcm-L7&;p%HZT<5k%N46A1b4(>tD@AC$Um>Bbbw zCU+hw#&n)Px_L8bNpg*ikFO%~DqfL=1nqBq&B4osLCIO)zW3kg zZqmt8rF)vISTTl;3iWp3CvbSNTcIfVK#8?O0!QDjvW`ek8O@OJ>oblFB5&sXvE=U8 zI_%-?a7~`NdQ}K{$YZ+{x&YO5q#VTO^H=q(MaMjUuC2IH&+fz%p~X`eyMcUwvEkrY zm+a}}3q)Sb=u)5K-MW~dX)-2yg4i+j75@ z6Ho@^aMa;=C@jErytKn)r{|aA%VlBy`++YlA&*1ypbMWDvr{F`y5L1 zbWQal6<){C`H82&Jcsl-zBG+o{+;2w@2di7fyYj~xm>2KgQq}s)T2EnW%q0T7o*?{ zLHavAW3D?V+e3-|l|w(!*F{P`O9x{zX4bK{B-#N-oj!ykY@}5B6U4y1C>y+A;5)cH#mWLrJ@^6 zPK0#c9Y=MbXp^ysBzBB>Tie9s@>JfpGGM>8>Y>2~%F6nbhg(c~ahgu&rK#bY$JsJ< zTIH9+fuw1P*#;L%&2u8B=*m{2j=O@~?Y#W0lz15d3!Ic)yjAU+LcGn-8!w8hUgF}V zVBc%;DcGb0nwH=v;KH7+MJn*68nu6lx%z21`z+}hFFx#gd_Sj-*( z4Vk&LMS~V6N=Zdwbe|$iQnhPmX;|mDE0{`@F4zpsbTuZU8rxni?&Bq z4ZyNfQ$*eoep0Uy#@yH3tw;>fC%k`7(v5V(6h~(J>}(KuXBSFH!=z{Rub&I`5_{{6 zCksAMRqPU&6(u_3TSWW5zv`el^V*tuy65!!M|J zDF#h>LfHOd_iMZb8IcBJ>7@4GX{cVu!ShFErq|@$csIhgz~h9wi4{z`#~t)2Jq;n> zFb0>nR2b70aqJCPYHJaq&|c9gEEKD_a=W+cVs?}8&FgrFK6hfsi6g<|A)2TaJx6t) z_l9Pmc3S_^_^Isv^xXb$vI-Q>dp;NhdEQ{IhCs+lRK_#LU6MM%sW!bN$59zkk>S@fUeDz(*B55DRxFs;Fd{3mbIzgv&G|F?(IBf2Xo z;3fy(Rw#!dS59=*7ANocBHwi#dC8dt^`RwOCx4csnM8JCu6kb%c{--5k+5X&C~EBS zCM4T;*tI?!OP~(-@|*T;eSKYUYy2>NkL7o*ho8tYg*`8V{K_-#CqsiNRJ{J3h#jUX;EAhC6*SkXvXi%H6 znBi3X7`}( zNJm5i&*lJQ2}$B`kKAtoepRZP6rpBWaD!B`)HkZgq&9b|dEQ+8EG668vvcmGea;*W zv&_Pt!+?-KNFE&0yq#dPdK?Cl$A_8{XHcXJ6O%N%Hd+1{cwHLfo*nF6up2zpzo_xG zwX(7f=*a&{e0v;W<1A%9e|C`B+&qfC*u#*UWBnq-z;N%Ahpa4<`QW=p5A5_ze@6OT zGAW)Nvlj*1V42N}#?zZ5SIx!gja`B;2JF%;k`9_2BbG0A?pme%wau%bbF*{zUoGw} z?(GNvZVuUo7|5#~DZFSyFfhS>{`$0|x^rO6YwTG$MP_P_iLVHME8FhDN43%VD$j{1 zV1(C<+K-|TH-2+63lEQ#YT(Pm+pNxzXi5!7U-;|%aj85g;xgKOmz^n_nd zqBqFQ_xOYt6QK+PUAgbdD}cgdU@*;16^+Fk%+}HH97Sz`FX%cKyZeWOWKrRv*~3UET5l>lUsN(PLX5u#?&04rGfgN;p!oVnw0u>Kb!+tE zCxkc3AP2T5V?=RPYCdWF&rnP{zVK^}k9$Ax0}hEgb?UBsmtoI-Clux^eq(*TZsL=k z?)GZol;>f`Ie^YyBK%YxA%VaK*KEQh+klkHIF0aDx&+rCbBqsOF68||GfC1`Q0!o@H_FzOtW(ehDXQX@czM}n7Cvlh|eaVPo1(9Hi{RNN*E0M<`U58YiL4Z zDq8L{G5xBlMqp>Rtzy*<2x!DF7Zg1oo1B7fVUSrl1z1hRz0-j9adqn|&H3@A=(pbH zxfhjrk&h57x>a<+%o5(BH`?mqg@3bM(2$YDW`DF1(D24yo*4aB-Ux5zH(jq9ihwpb zaR%P!f9(~owbn7|Y+rwMGBfPKytwjDh2;AVf#g{lSD={xAae|av`=J*j4*uL0Q^+$j651qp9(j2xdtTq#j)Rn}*|8Q!!7H~zp zTwF;cIG6-axJ=9zI3x6rDZTPrr;S$vxZ67`D)N8tllpP>lou$wobLGVZ7m7Q>n&JK31wA8@eWXejS zH2Z{4y)#0!k0q(NqoKzSFMC@2y@!hM}Nepzg zy99%O*QJ^_pg~el06XKJ&EvD{Jv{lJB& zOo}z#p2x}!8?KiuOf1FODL-|oY#gsIdEo7hfsu)xoL1 zJP&q(Ti~udXJ!Q_9jz^4A{HAM%qKCv_rOIkDv0gs}B7CSg=C{hl$l5T-wYv7wN| zW^akKed^VWxrHrLo*n-2U>DlK8c+h7f`WpAf)daa6cm(z){3yG6jjb|NHnErKXU?_ zf`Vf2u>Z@W-**TGtMaKUc7wx*PQH;f3{@3=Vs_P}sM75(+dAs?CFb+Qtf+jsrRGcR zRqSY}Q+(Q>+zJH+1qB5qpeZOQ0sVi5dx4QLPqHWGR(nTYF@^XjC;?4DL1A#j`T1gt zyD4^tuv@p(Y3A2I8HofJI(?(zErejks=nERgBeqGmny{_f?x?kPb*FM3*%|b^K0!qkrUb>(>3dw{8jC_XIh*xI56%U3~|5tD(zac;-c{ z%U!wqQ7_MmAAN1cEmxVF_4>BJMW{wa%6Z`v-obA;28%PCxqb&sz5pCBRlHi}Kf}mm zI4I#fe96;T3cX|k9SySX>zJA9S)j8CYkAPjoZ*zduKlZECSl1@RMi;IT=ZhkwUkPg--gi@`2jVmtS%jpb0-mC!L z=u2q}7vj|nZcN0dO z|J3DoP0F`3FAgG3wOn?*3Z*(_TS`BTZz`eZDCoS%9<>OazkbF!{H4OVf$O0HU!Pw$ zeeOh2x`hxMeYPUsWc5^~g5}d1U29dbyzj9c(2)+Vdp8o&pQxO$3%GJg;ac0Xb!HTV zm-&FKUiJuumqh{j1`m~{CwCdk_#9e#pVm~-h;HWa;I5;d9-S!d`WPL3qzfG*?TViE z;ii3Pym=o%$4vV^P5a!=VEA__6F%d}zpsz9{ivv6eCzIA+PCpzPX`B}mov!w(kHD! zT2}}clLy`p^zJD>1_2}1UPs<6z~VQ1HBaeRWAKeLy>m< z<7dfB0)JHTc2l|ZK<~c5Es&>!fSkm2iR+hCSp)oysL=Z*LDp zNl8CHKM6l+36Q6gM`G0YLAE{^CF{!9P3scR#lsydHbHczC;j zfC4}IefS9EQe&uZs6w z{2kmaZo2?zB$ZpIScnZ_699Hxzzu`cu*0o0@t#c-{g5Xk&V- z{+BiXYW#EIzZxn_{#g1?r1+E0fBZ@#v?`0TKEBaLc*h*-(AV z$IKP>t7^}lS=>E&Qk{;T@qhmlC}TV}Ak8SHb+MJ*`|y@7X(267hC5 z-!I0X3+1(aHcerpa?+lOU(^v8{xJ_E$4uZa=i%#5A4XC-FsGyYMIUsb_c#Rn(_IXn zV>Ny?(D)3~u_^q99X;JI$C1*@@XodwAXcaC+vr$yu=ZThH-%%(A{1`PjemN`6Al(k zvq{NqW%vbSXdFZ7X54O#I3W*$#Zi)$HtES88LILK>Dih>I@QpFNoPamUy&h0fU%NI zLGtC8RC#m^SAs6LOL}6@Z?OZ2r;MB1U$kw0x$=W!XRy;?h&HN2BO-j4abxcJc*L({ z;{JVxZ*u-{aVV~=m7o#Kusb30mHk&UvbSPh)5 z0=z$#Oe}Vl^%VtO(M|09ELV5x54r2Kupf@-t@Iz_P9dVDtZoF^^f8}#$DNgLlD8G2 zIdAFZlcbYShM<~unxX-DCN&T5N|P|>ydr>;9~^I<{oA}kd9~C-$>{!kw}jRBucxmZ zpTu8hPvg;~@teg$JtW7Z(6oKkC-+H|aPe0kvDez)E61~X6?STLUL2T?Bb7zGD=kZ& z|84f_`V8DpVS~gVTySpc2;otIQKO}PWC{NtLx)~q`T(6} zuUSfKUW!#abPhjyLJDm3cL}^2!=RG@{e8OermD^QaoXs++l(XU3*lC0>PaDpg8*}5 z4<`xR<{+*+2Igm~`5UkJtD%_YWBmol(+x;N%8V7aG7Mkut(T&B!jq@TyyOt=htYG< zMZp?~NCE$l*;m5ZYfeZ0F1DIBO-t2IZD7NY_tt8(!nXkohxoHpKfOhphf}c5D?mxU zD>;TFRS(R{n}o3m%Djop(BTI2hX)jKK|CdwQau;E|EU^02vGH)ZnUynLA9b!tFer` zp>DCOoKbo1^GlKCy_YfmroLa|S@D^hqAYDoLLPYd5teEB<@@c6)jJ9boOWmhLbbRt_X#eH-3n@engWkr61h;jQ^u}zP(Zb2K{ zpVX4l&hTf%*PWdLIJa1)lT_cx(Yeo!+bw={2f*zm%9sB^I=?4rU}8;iUNl&AY6KDjEGh#%#onf^S$A(C<< zU-xHC8LFnOuCb7l7T8Thy1_D8$Lj;iz?&RT?f_#$2M3La1D8D%ip@_vL}l zF0PBx7U*0ijT)A?#;&mc9sWgTxUK$j`>=* zUfV+>fP<7tWGBKd1dyeh$fgRbo_%dy0o5^3-h5729uzz_<+nU=@#gwkS%2l}D>{tS zqdf9J>yjcnIK(VVCm{nm{q`2y@ybose~I#wV)Yr#hN?Lg1m1dA5bx!sq>$BTc+xTy z$W+Yv(d?O`#C2Si$Xi}5hk_OD{4duL_tXP#eq2AY(A~-}(Fl|o zz=z`p_qoNtoG!*|_q$o`1di(O?0efNY9aX8)*@k14nGU@cq0Q#rS=h0Ed$d_&SSQv zPhL^x_^F+vnk(n*T6!R;%HS!_9`WX5L=od`_r&Q2McLrvl4QV&DgngDw9Z;!9YP^! z41?el-+{aLA1sNi`7V7=a*8@D`IUvU+bU{NFML?ss&dlt`zPLORW4|$nVY_o&ocxw zUE;LNYCN;b6SJ$hv-MM49C|+7El;W}Mco)qb<0!ANduwel!Q%f%AH^JCMij}SWyCf ziX3}aUjf_@#bvMJvKg_8s*;$v+k#eSX~M~QkXG>E>+jxN*guSoZ}&4EFyg%eB_O2} z_49QkfGEB}2e>sweq2g6$v`qsah@~3t|ajihRf%YfS~ciA!{$f=NpUrW^}DLtWe&- z=vfjVuki!)8y->f1@LW@l*-Y_%bP>jP^pbAP{9pX+*YFZ4&DiF)KmR)kNDF-u_v=$ z@Ew2Hd{-Vg>0E_@)Pc#kD&N(-9As9aEw{TGas06tZ$0MFJUzh4goP&|V0&?5vxA@i z8YT$e(A?>tb*Wo7fF`fuJDLUNus&i5Gk@^FDgp+I6ViKKl#@|vgnwdmerNb((9Y(P zUh`_d8U(FV8iHW!%C8^ ziu?NHUh`i0b{RW$F74^U?S}em*Q~3@W0Y2`-NrN08ulOM!TbZ{||pjgE|W{Ohky9BIieJ_6s!horS(}M&Z z;CySoVX3BilOHHu-@EkP{630#wAF{=yzBf{*;=~?5>k!ZAbNl?r>4~^`t2e?!q%9o z6*WrZ#wH|1bq+b;%Rn;9_(|2hRbb#0eGUml z#6X#{GdxCP(scd4pJ|2bXxKt~G!H5#9kQxro*1n;azlp%Ro{DgN|2@mRLfAnI`Iy} zL0VT86xtrsyazwn(si3CbQ;%?}_xn`OZjnlSBl#$n zna|(;?eE$v-aDYqel@CcwHYt0{AOcrqY-g=e5}Zd8Ak?dUwHalW&564hIuMueh#3q z+;voRaJ}=LVE7p=N%(>1+ei$eW+gi%4C_xJAoTk0@XEJFvdb6Y8%R@)mY;)tarHq1 z>-nYyfc71W<}Li3uu$JZV#k}*lkNq^IUi&JwX)S|xgYyq+;|KzU|b(( z-V6;ACmZgtth=p8#bVAy)Lo;u zR?uNW9(7i%3Dg18+OHY@8kcF*1H znPuqQVs8q{j=GO%BW|?B8K}CD*UAhY8Phh(BHcs@jc1hUaCSDK2P)KqZM|kMyLfnm zAAU+hk$)i#G@PyX*622w^8#XTrv_*<#xr_YeOBCZoF)!f^Kb*brh;^2g&WG$+$N#C zAGREQglQaX2&4$cDi6VgRLkn9dG~nk%Ooh{seDxR<_}PnBz^9X@iK^sDmfAo|YiIXy^4R-Eo| zok=CBJ{8uawB>*0wu}NjOZ92Dd%x-&GS_}$tyH&f z@Jk+aW&o`tDAT7b=y#`c;(qM2%DGY43CO z)S0EHk!2@nw&qnMhSh`K;$it5isq^#>+&Prv-g!kT&2At++V7|8MY(UN-mGnG&uiV z7=T+3e`J5qN6)ALpxPUwwIJrfuPU_ue5F{hxEPZyP;vMe!HfpqpJax$HUoI)s>pM+ zn~;6n{)n6p-Lkf3$9}r~t!1uMyCowV@ahAKvjzFf(x{w`TXmxy8-j%3S2P`ZRExcv z-^TK@wR*6^045Xlti!`rNt0f&C(cW?HPW~|jbVda-n)`${r=dbn@L^R_cBL^=#T4@ zHC~rIJ~@9EznZ&tgv5IGS_u!R{>Hf?n4*rPS2GhABmH8JMBTNU_vjr?h#D=0zTR52 z3*P)jOoSg?Ikx4N64u4-&`47QMM9iR``{YtAvxS|O|=OY6eSjTq{+|3Im{wDf<0yT zv1e_FO&xMDr#sgWx>h|GvmKd3vHtoeqw|}st zMol_4iN!ejO$9j3TCALisMddToI~iN;_2WL+fXWnh?1Oi50xZ8JD_O@jjL}AS96cD_BDsV|KMfI`SeK;oZNcf0s&j)e#)fFyW&_P~e zSn$rA@V!#uG|0r1Z*#ES7--xcY+Yizkj+ynbTUmgs5q}xpsuu;cS%=&n|oRO#3;Yi z4k81p(V>^5h;G~?cF+{jSv}lq-TsP0@Khx;z78$lBTVDU{U=N#3NUKK%d>#t%yWG!f?smzwG2&iS@*%7uo zg|6wVq8oVBklG?=uB37Hz550tz<8vlreI=12Y7A#s|HIt0gGTpahCI|D2iq9xF4fz zjah+`iuDA$IF(IVxYKPrLL%~+qipJY^%!e?#8>0*8@@$R>-4aP$rTs;s7{}rMxX;} z&ftb^D2Qo+^JIUXGR<%yHZ$`xs_BSjvawERM=4$`$8h;X+)GoQfC+*3a!}@f(|134qmv zd*XX75r;*|2Or0$o|1g!Tz9GkHj3N==hO_W2(G5M_hN^9jNh0cN}ayIiAzswSi13} zWpygs2X4eJCp%;htnqv%-0;Q4TaXi4gJM_om-KnV4hR?sHSUB5bkpb1Bk86~zRDJU zY0`=h%c0?q!*nrW5HJ+?cXs}{MA_Mp@eRzqJxad{*@Q>Y{YeS-8HHG?Bhi`lMW0Tu zOvG`b+o`Kxyeiro)D-R`XsB%u+Im#{msA;iy-8c%M8wjcOr|QJ-zu62GF6D zVvFlsZ(M!c{v_+ppbq5lotjhM1>@r2tnDtqW}c&o9f)W5OBH(yb+N0TLawCQ!K#6F zGDaxBC%b?Eipex4r)RL9sgY*Y4ajU3E#7>oDwc|XcVz^k3cT0eCTQJ(PBBw%UcLz^ zNcCe8$}`?X8yp^?60D}0b^#;Rw>NCb37*=TE1qZS z&AWM``(Tz8ufYn_D0|FQL(q5xfyX^|JyoxnY@kXVl4#t3X{f8@PD2Kt@&}J}z>dbv zqy=t$9m{~Iq{smr9|cXe*y<3rr#Z3*sZoj7D)>YAxJ{Hco;A$n|Ed0mXkI^nzX{QM zvf6-pCrWbz(&pucyPpU;?7y~mHz{sC5USxHT}ukx+PI-wjn`g?jAf;EJl;JgPTrrv zK~nfb`KP$53g1yg6-LdMLKT@zFz`p*2tL%$PpyC#Q@r4z8g8^yGT7ebL@9nwL>szz#WxV*C?jie7_2b~c zBe zMSiyvbyl2Z2z9}GKtqEs2yN&eUj=VHC8+grs4Lg`cC}}b+pMY2$*a-5>Rk3Aw5V4w z!T$Y&tamO`^)(c%9hIfhO(yuJf4T%ET9ho%uvKXX*;~-qzW~<*ooY+)C=OW2HD}?m zaifv_eZIk`n>YGN=_Bg&FlPp2^_Nd%mT56u?7B@{UpKxI1=PLQp1+hNlI0Xz{6ph< zF?A>CXODi^kw<0^Rp^>Ek|R!Fg(b*SbwCz|8J#R?zbOVcWaj50Kj^ZlOgDIFK2M@T zPnu_SXl(b3jFKJj_@rCP(Bkfw$0m*38#YE8je&&xvDWDC{UC*nXH(6&kOj24p=c@q zTz3hMXn9KWmz#(uk1=Cgdr)(enkyH+UGj%{%X078!cS^poU)Kz-EryY@ZR3eAf{5z zwwR;!;JTW-8gtloaKw?dnT(pSwZz+0pDm+#ef3aVrj8)eI`5lq2$e$OP(XoMxt|u} zx)Y1lON>gLOJanQ2!b^UzM7%C&=|#T{B@3fisIxW<}$a|D~kGhhRu2sN@-6t97llX(|=|Lk`1AJ~@0PhSoUv5tRE^o;P z-Z8A3i%|*-v>fvyl3;VPp@8gopcTV*Z5kR`aYCZt>0A+XnbRKQlH=G+M5FNBjFX(s z@R`NBqIax|+KId*-j)YZ0JNKtz5>|kgI7X?0;&+F5sL9B9yW5!<)F99>1c}|^;k_@AR^{s{1Tc*hYl2d(=F3s~_1Lw@Bwi_bm z!PB-H1YL=m%efr-@Y%$E^1Jli9#!v2Rf_T5DtErWLbKjV5e&u5W z0hC--*8@pfnBC1;;o|5C*=Qf@Pe?`rPcTp}T}Q8^e8W zN~Tz?*1~*$-gE8VB@_92yJp-chRMAK>PA4Nj|B%kO$q5ErfPk#_fiG+Mf5cVH+e?- z17^oP^vSc{)X6`>!0Llso#-GN&3V;?TCL_CoW<*{mq7}90`<0TgwVZ`bb~x7fLk*? zaev15f!0rK`b&DLvqAkUcK{4!cD(_zWaKiuG@mB4lnj=uVqe*nknF0=O-56KRD)TXpqR^ zhhZ7l7Iy5GIL2?Deu4C~)cw|9r}nmq_&p%@<_}fh6eFzON4~W6oorj)t!Qh~r)c}2 zSRLly_x6N_D__>K2vAdSVOz>l6-J0k;Ub0qEywlm+cO{3zv`xNL~QLXvx+{0H8m(Q z{WHt_)-P0#N6xBi=!*MZa+X6IH+6>yjc+ghH9|xkp9V?#_x)JT883RKb%I~i>%(FZiL7yEJSCik zdDBb!a}fhkv>RX-Z#;k1A7?!CJh4G{GKc+>*iAkOWU*ZEfO2t~=VCz&MCMenWb(8b z772R=q^MS8`Fckm1|Rw}A)$l{NgKK;yV%v;AfmznC7^|TP_g;y-!%I(99jZq%m!C| zcU?1?`Xdoo2JY*&_`|sMJwqQ|i@?Z!%UZkM97Jsj7UeBM;ElRh{m?qoM~F!CbM!&{ z*2HE|YEDU17-B}f(ynj4UbTtWoHP^3&lZML-Q@#lYwT-9b2HKJFRNDM@H63|OE0Aj z(HjIZakf}&l0IW$nXqyWbN-}XJt)QC=M)6ZW^Cbja3d&{vcIbAhOBcv*=Ekd`>((W zN;D&*L2FXX0|s|{tvkV8BO&1zA4$Idtnqr-&V)@EyOEebuLR_Ib)`sWAzc-_l$#B~ zRJ*5-XnTwZD}@bMR4r<I4|BRU1Q?URSJFvBXqm8Q3BG7@Si+%rPKc zjRluSZLJ4=`FBZVO2wWW*eMJH^BH}0bdGYkkyCs(_1OL^+i(nDBXD#RJGk$Pu#56z zP5)~W=O=Uo4Tj*m{EmboKfE2@t(vhGK8@rrhB`215}+AXs|Ces62X*wD0u%kf*tXy zlIHQ)nyI9=rmNK(^sqdO#Qb)Qmhh;s>)5w%#H0i3F#ME}&8LWI6oHgKXJViMhF?(a zvy0>Jg8BR}B)v$45?XNk4wwiSwhB9p??ed}uVZ+{iD|ENm)NG<_?cxwm~4gT_P>8t>Kl+qDhu6TXZTZ{w=T5FO59>QX)X_{sYI|1Y9kq2+?>0wQTJmtWA9_Q3yk+I}8k5W$d^-YxW$NDHMY<^*H2ihYZj%?O^b{sxaA8$G$;Ov zjbddF;p>WM%qL2%-h%;zqd32#*jQhsUW$Bnfn^3t_rq0(gdW+F2vbF?0%W9RD1nP& zFJT!J`8a%qgPY^-;^9bt{sIq5RU9bvlA5E+q#yJ1Mn&sheVv9cUFv&f`NvS_B{nvf zj;wVw3$oxuNo!MsF{;5->naTB0OQ{IX35hgB*<(Hx%<0PCLtWP9sh~-AKUEKRhl=Z z9A?P-qeNhvkwwV^rexOftS>I*eOG9Z4P24aJNnE&45&_Pde14R^|G1nKkP5hiy0;g zOgCm5lXYXuCKlSwV-CDEmt00lY%4{)<3)vmZD4dauJAEby3jVkw=$4&I_2w=k`rk} zZ{z`qmJWQ9rTd}GK|=emjfr9`k>@#4J685>)GWu7$ExaSg`VZjrU?BIku2N1(+-8M zFWM{pN9Qxawe3eu72p3ZeD?+C-{&W#{j6LeY5Q9B=^rJb!N(@4o!h8SbB!95T3<@S z60$uyWi0~5*GUwOKSFJHlelBGw5fqJ@|@(a!9E_VSYa}2p-5Vf723Hg zWps!Z)_hmmP$K{RqXNqD`$q?_#Xdi^ZFd?h*R06ZREaXeQTU{5ep>IL9V<@oz6qlo z4RWMLl~N{p26^M(6G?si9696ld#pw=ZV%vTvY@HU4t1F8TU9qIA1#Q&lXuq!8_JZ- zJ@3nWl}=|(kq1?tg2$9br^sEY7zkWSEu&6i z^=^8t3^~XJuI*mH?y)#@$A8@?tX8Mjnq}YX3qilx^(im1Y(Vn!1)JsGpHjp%S`Afh zyw*a4dgjX;0=+BQaL93e@u3idmZjm+zMO5}m2rvM9+_2DMFl`rHdivl#H=_4G`B?h zD!Q<0)q`ZV*pnJvD+Geqn(6i8w5IXHTkW?|EG>R+f$u0Xgja2qk9~s_k4=g_PyG8bvnJasWeukgF`qk*0#+=2 zdU?4&r8%cC{au<)cK#On2`ZBGG*!X&+rVcyGL@wK$q4@eZs!omAE@3w&n?kM!uyAudv8eM+wSf@CMf9e?OVO1W)dr(V zu91lJqwHlVzy|rs8njY*S~ewEd;)hR&ApIbX!(r(N{jaqqM$!tH^z# z^eX{hPyQUQ|B+iZe-Ov`yDkL}SwisO;#!RHw#P4{BpcEBtf zrxqv5QDhog$s&B;XQ=WWFtU$_t3JIX1Jr$yxw3m-ABHaZ&Ua8-<8rw{CsAk#IfzRu zf9>Fkv{kYJVf5?Op1MaRlaKar17PLyHYuMHk4>42V+M2*zDuo16BW6FL&S1}Jagm= z9g2>GvC#vZEwD}YCn==hks+--q?DS;`x!n@4G{UlcPhe!_B>O2y%SHk@pJtGH<~wGZce$#~weQ8Q^M+4TBmkDR^1PzV zk#BhA2OAQuck3idIB^74#-9#ONXjmRg)oXdho?~v_4c#N(Fv1KZORCQz*4Ly? zILt&*FCYI|Ph+B}`PHlGgQnwtDEcCNIZ^@!-WwWq?~TX;KA{$7@J4s46}PgE)pRMy z1@@7No4LAS-U^MWiIdA@sVq?@5JN6S$ZBZmp2a~b>~ydeOu>p0XM$Yjw?zS)0 zaB@;}Z93?$Q08^Q<@UNAO*M+L%!<=wwVKr2MapsWQ0=LKAl!sF@fk)dIts1o)K@<) zP%kQJTR%ce-Jc7Z{3x?x7f4*@wt`;;TCWS)@?PJFbeB}gp-k|7icQr4WyNSqW4 zHD>PudRmMg0`8e5r?*G1GBf+(hc50~*FQ-Tx2aUVU3y1F{bZl z^^e0Rbk+FJ&DWVv1=+2d0I@=~ywm34{S!SAs3FRXo*+P*=*${ZdrZ_TJ#@)5De=F>Lozc3hWx{ zQZmid8coD7yI zem=f&q&|KtEoFr0;b!I~>8Fx)nqz)7S>zuN3+-qDBfcy^h?_Gx@fmscN>{U%tWA|Z z4#1{Q19vxfS9fuG8OynkpPL8u>7hTZI&Te(x{W=cnSAKWbs>kk+yPHJSEjb=>@deI z&Me7a^~4q)w==J$16+|8an^vS>3q2Mu)*31k&_Ni+WOf3h9~{>OMWHb?>Y?|5ra2Y zo}QJkbYK1L<%b5+>N~7cfr*$X4L}qn7k3KlwbWNNBWR>_byfn{gusA|Hx38FNo8}f zD$2zx0xEqcxF@?KO8F`IXfs_?-}XlUna#@3DNN&LOLDup3l{VXO3U z^L)6GXLrz6X-TA~G+0g9-^zhMA>)Ems>oAEuBDLnvTK5Z`Zc+nk8T4>7jmA$*zCCmq4 zX%~6%oM@0HCEf`wdRN_>B3lu|>st|Lok~jqU*@f|Z@wfy^UzE&_9^f=sN8wS1tVD* z13`n*ZE3J^3o`hCpP0b<@r7<&`w3jGAe(PZB4Q$vpHwEf&o0CN@n8d;Sfr1$oLQ}G z^En$lNVVd+kn)fvOmFwGkw-5lx^pPv#Hz)d)(HRx9C)-@AJCI`RjpFUoOcuJoFe68 zIn?Ro^Sg}8&;Xl)vz?MXyurGuG}y@NA@hW0PrS=82b-*$N!2=9k;!xmd;I`mNSrgc z^UhkpYDwb~cRPIF0@ zJX(!!zC4Wg;Xgp&iyZZMP>1VN?BlSi(E@Yf;C*Xx>^_7~`8%Z%k3Dq%=*%J^@7+9u zo_tBH1XwYVCaVpnw6vG5BvO{Z@Y3x*g&92cV#`$ z8RaO*2dq$)+$6RSYmjUaTa9v@1w7Lizk-+Xl7tuML|dySZe=u z#)+&+g5 z8oKWDtT^ePrxufhOIn%mG;A(VvSCYWDDM8Wp^I#B_5KF|=d)9JGQ3e-)U$8wP3_6Z z0*TUAwh1*uO^y1HN%EaXDzzo9qpO(|UTfFmObbHyKDxu;n-C*{J}=4&ZyPl3V2*Lu zad>Al_`JjqLvl8HhDIP1IG>F5H-XBwRIs%MH`kBZU0K+kGaygQ88pQE&KfXr5Tw1w z@BBC{fJ+vWEN^935g63hXRGDMk7WDw+}==yvq2~4vkcX2zSlUVKcXGN(6dgo`=}5E zbf<)~Ps(4}SdTSS-%ca*Z5P~4ujQvWhs`e89>6FI&!KBWQGGg}l;C_XeC+moi1I}k zW_Hzsc%bxf_i&i8a8g4XlF0X7jnB; z>3V#NCY(eAjzTks^S#v7>~^T_f7oVC4OK@$moJ-kJ1z{X=7A)Z`_m}ak+wUe7zikq zTUx^3cS0r!Z&SDap7U*t-1RA+n?Sdfp|7bTFt9HaZ(eK-V70a^Lsqyl@+zpYO;t{V zY0CTFQnVP&MF3*%HOjl}G=wcsd3?X5R+9_NioH3v1J->GGGExG7=Ss_-kL#IS{)|q zV~e!QdWwEe;x^0Kk|4J9lPAvGsCv*-95rkYx))ZNMiUFu9PtN%jwJ{1haIS_hKP?u zkqy|FgI(%*Pw$dKyZl-cZnRp4s#ieB1p@^I}oyVI!Ms%K~Y(PsA0RK1g|T^(`s~B zf#v`O+|O}|RtbN%yKR1%nl@DNk3*5_0@6%6j*AWeYQdJsbx$uxrfnAJ)$8Z=HBbAo zWo34`O;1&Aw+%~LcpKR;?QNZ|CIMEq+pX3svwBMVWqFI!Q45nd=PQd2MuMoV{o<0L zK_P6>iXr&${sY(ckj3@@%09st(ZIf>=z#}W@+u?H{y8pF&ksJR1bIiRn1uTOILDQ; zHKyHDjj77+G7P+?_kmkn1&xv)971Gub?Ht|@x$=V!s*}{bJn%(q$N96#Y>*98wD_U zRMD5NhbSBpIXmP`puM#~2BYyXUO|Eiv7Y!)CEbE^Idees5F_L{k)?fcz>x;EJgrhc zK=5Zfy?yJFEkB+c+i;K@fWgvl6 z7~y;6X%&@6H51I$imd|&C&r50Is^zEJLjcw6I_QpN;8>T>G(2InucnyT0XUa9+Ol5 zEo0<%@`zEE1|{%m&i7F{{M&-=z1+;cmx;D|`UPizS|TAb+F?V?-x3n-f~4;lWbV;d zMru#Wo@tZAAM}yag*@xDQKrbty)Uj0f-#NcnWg3R>6;6k2<78@BFS7cv~lA+mvaZ_ z3MoK9I8Mjlj0Da)X4g_e_H`p@22af$v(yzxuQTl>;i*ZX-xJR1U_XB1buY3DW{DY5MoA}c2pIw>$r z)M_RRSL$}3lurG>-vyBPS+LM4SwGGLU4IRWdy$g{zCwJvxZd9%CaTS!meBV{&@sO& z-uFy3Y3c67`3a9ZSmto?TaIlZk(WlR$oUMUL+&bam%_!r#^P!5%z2$>)8LmYJI1ko zE+Tz8j3~!C+@5Z6XlkS+9+^r)W4!4qsbHS531olO7bB;0MA;d{ukuA#rv{VSaWX z*mSQSi*GxsPbkFu(GOe7x-sHb^`hO-om(rzPC}{Lq+-0*!+^`Fg>>e#pSWl?xq&Lh zv)kg#xsd%$ayY&blP9kw(Xb^%i?WR{4(y$n5|cHx7O+~{;uRdku-DZde{QO{R_SI0 zf$)|+ozoIqP^>z05PLRNIGIHZ?KksgSidByPfhyW@Zl_LUpbjdc=9$ybrSeidun0K z+{s>Fa|w=HbhD0BXD*okAWKicg6b2cYATU~%B+vuW8_0%gO%Eca&pA}!f>`pr5i4= z#j%%1@uM+DOV6pnFDp}l;ITD@Vh$(QA)wFE@1JB*Q$D=vGYZFA5_XoHG|n=O@yHe? zK4v?pPcv3nPY@N(IYk=u<-7p8pY>RW?ZCMKS5tg}q?6G4l8npitNFXV-kDCziHZZc zeF}nyuIM^Odmt8%o>;9hB;+ve%|h#w>5S>oEmw0=XNAst$EAPpNTr|oa;oBKK%s&1 zVP|GjLrk7+gRA?rG5v(cD>s9<8PV~xjcPsu)=yVzL{d2j*wN$i<{3RJ7g%;KziU_B z&$N4@JGP3evQD9$o{17VRHl9!UW=(K)j~wDbI%Bwo>($x$M>`?c=xHX^PLT<*>BVg zFRt@*b~3kxK(2pv-4$r~d>xT>FE23`|7t4}TNI-TW`3Sh{<&2EEG!X>*QNC1_#s~ChLY7VrK>q z^D+1ykSAw76>bI7O@3pB2$&-zGJ|B7_0pZ+Y1B?r5+&&P%>zluWc^&@4)h~x@G{M} znYJBCdYib_ZpEJr*|Mz7O!{~ehI@_`Ybs9vEU1O5#t2XRMsgxZk+S0(rEA3ZgEI1i z%JRRGX~$c7^#jCG9D!+BCwQaB?DUJic>`tStXX+-WQAHt%ck8Zccpd z6{+4OaN)BVKX-rVO|Ca?&QtJOMBYrSU22Ubx5Ws=%1zb>#Er9sZc8>w+C|+wL)^2UfqNO z_C#3qm*WrTx*H|Z_u=XO7ab5yAm)j#5CtKJAfVjN^3;_p{xGLZ6aDQ)$$KteM*GCW z007I1dlT|gS#O5$PE3tZO;F17D6JK3O#Z+jM~u=XIlFqrsuB8=xPw7_t6OpX04+$z z2~>5lfKCV1;El?iji#`$nh}Y{gNWtgX0It|~aMJK63ls97vCBlOfeZ+G z9QUGPaOs5sqLF>Xje5YuinEeed;m=mu6gA?7Z$yO+(dE4$MS$-6dm&CX(+_x44v|B z6ByS-31V(OSWcnW$YR*PA{@z}sAnWyw)9=sk|c&hIV_lyu!m*Ad!D}iHX)<}%`IuA zCGTdkmqfLq0V%)AWXozO`nwtO<2PNSCGY#SmlB*=E&#Scacw>W-Yb(Drl&RGRkN>! zzR+TM?xYV5-!Tl!4zBcE2^~r}D?Y2lo@0>C8Pqv#r`6`GzCr@*7G2`4 z_rvpvtQ3_~SmpN{OTtMyy!7L>xjUItI0Zol}7YH_o1sx z7Y2Tu{nF+SnTqcSvg(;|O8X>Ls$i3%b9`$|iJwU=$Q$b(LPaf@RRM9{qg5_JzzdZt zj5nD3?{d&y%do*ceD57HK6QJ!0o+yDc2a)6p+JjSpRv`mICNNs`4W7p zvfTUeM;9DJkb1u40YQVh>8W^Y`R#4V*0r57$ufj(;3Uf&?)j$+p5V^`xgUY$J~f^T zTLU_S`N^qXim~-mpN$6GbypUQhN$g5S|fV%!1sXn)3n;f zC}!ByIE=v61tTWY!u!pubybP0hytDig~4n>p9qL9v+ii+|9Ja_Qtb~24f$xiNZjGO zLfeM+^?I_M3+zE$uJ1U2%lKKLR}Rq^6CRtxs4}NjxB4+LJ!C{?a3PYP@Reo-WUFZV zM-IhKdSM@n@3H=-4_=@qMezy@R#lHLD%_|a@ii*4L#N2VV)!6OuB3_X&KR zFzj|6KZFei9Nt<2zMrnotWcO47hKzY%#O+S^1S{J6N#4SEmhyY^VCyiOiFzkfoX4x zX)>*S%L9Xd4{ij7!HF;UuGW%XCA3DBtszjq99)LWVIXt1_gP<9NYbbn(PEtu_ z0#9h6JolC{%Ut7@7q6lgG>;IWS$&n}K}xf~kmua@q`i@WIj*gJA)h^6IeDqENH;Rh zcyPX@t`d-HRP+veEJ{os?eQW{`m=y;?apn*j(r05@lvVt&`koFQ-04K0y74QI2VU` zv+V&A=l*Ur{1AUn8jMYqWEK+Gdp9np-L^HHTHh;LGdVu<#c=;AG+RD0!b415em8Mu zrZsFqT3>09h^aE)fS#beA*F(5@_kDK&!~Nkd$?L#>1VquYC1d2D()RHP+*ex$aRzSF<1No28LaM(>H*wPa>Kk%*Z@}Ctjf0BR zupvaD4G%`+3x2Hjqv0$q+c}YKBGUaBZccMOq06m^!vDwKdqy?6b!)>aAlN`fL}@CB zbkI%juoX}ckRnKp(tGHgL|`jTK$IdK>AgdMkVHg^^xjEmp#_MLkN_d%i|0A-KF@x( z`}_Be@qS~R{JO`;J(9WRTI-r+U30G6!4gArwYD+tNmFR9d3iI(6eO={qBy`+UH;(W`d#m_mk;yEQG8tseRv*OXCRMWuu)Wpil@wv4k0afJc6>$J?q5%KdAw%UC` zg`~RIe@`tj-2Sn~aJiM@HHY(=D0z_A#qv@Zpd`r$RsUnn@Sbi~@`t!bUG*M3nUbIL z#m-;L@;^>6YIL~?r2uq~`lALL-0FjLY(p3W5MFXhEy|)QRdQsD&1~GDqGCzQ$Z0i= z_k7Q%YIEylJxOCh!_aMhDtl7i3WzC@V3RSG`0YigG@W#ap3)EK zPQVnkx>ayIMy$fLBmOC9BS|`J!A533CT?^c*)&2e^JwaSGE2?X*=Q~sR5&H&Zy#DX zK2uie(7wDStoN0$J~2%_0e0n?UqA3ZJ=Elt?Kx6YNQ%GSFX?{ByJk8$0Hx2o0SF<( zLXM_WhMkP^)FopIflo?Sr1Ek6<)mon+l)p5wYVKVIg?WL=oC?l8AiF6Km$#7Sl{l( z8ldy+j!zsTbURIE{O;r{d;qHIDh8wql(J!M#g3GOSFw?%D=pHewxJLd@9Y9B%f7`k z2Z~rfW;!DK&d2)A(5+?ISy)sar%9I1)^CV!hel*+o|`MP2x0Ov$O<@-Oc(b9y)=dB zh9j^ zp72SSfpX7veh z9FngvJEP}Z7v~l4Q!9pIMP$w1eC#rnjL~VNor1FDyqpa}DidzRYF4G&S($RW&pn7p zm2(7f%F1o{7v!~gX|26z!R9Ed5VL3Z7P~^8D$6F-4af*=h|m;N99b_VCboOKX8NK; zY=gYRH}^dqqo@bgGA+IH6hB(5f#K9I^yP9Z^uz3$L`K1F+S&`>E*<;6ClkTgf=jg| zoNo4mS+TRsP-FlJbrmyAN2iH6-05!{vAitf=uRH!jSud6G$6;$ZC zODGq_uwM$Hc4ElqNc%4(B*yfh&la5T(K;nJS1#u(3R~a$QRr&A(`*l^?}B({%6b&| zNC{XcYA8c?bXEvLH zPdt2x^YTI!dfq7ekR!7L*UWX$FSZ?(L9a_q2P{rs_wQxn4c208djuYF6D{bf(YUp0 z%$&`pcHBDzV8*b~fd@>A?oQxp-4_Gw?|P<2#2d6EZ0jZRSu`Jb8C1eHbLR{%Y-afO zc=&#QV~=iu3p)Klgi)HNwfoYJ%mk}`Ca42iK0iZiiOC7wc*8Z5xV-e49&0bAfP1zT zd{LGwqwsfXQMwh8zd?6iuECmE5M-v71oevrip@Q1f4jd;C2zbs>T?}_Oo-S)@c4dM zZjxG(3trlE^gc$+H~fLHrWPnmp$p@MNZX@AZeClB?lTqcbTE(HsMNn7AyQ|07I0f~ zq={VhS!Liw%hS{;-&}#G)Sgl-W?~$dFBm^IR(1=TJJ3^U}z89l2A%%%SzD3@y=tq81uk{=bNe3p0>R&sHf+`3OC(+yVh*82MP?8W6a}D z&hBH*a`hy^MbrcyQtOrN4GR0Ksr9APhSIW*&9$~aTUt$&+Frmcoq?Xeyw)BQSSQO|##Bz-J;3Yqp=HRY6UD^+iTxHGd(`U!j-p`%uWv2^&5;pwH=-`y#r zRBBl44l>=8+H|YJWVCY!%83g7m>x9l=Q{QY9t$Arm?ec z{(_h;pG$SfId@CE2LCfF@aM}nMJ{KL^5%)9#{43P`ESoI$Ddl+Ach=Ff&Sw={9#m! z5VP=b`NQ8r0+Ko_ds`-X9C`pL^XZrZhZ1Vr_M4{GT zBVLW#c~MZGds;5ZPhG-3(@jbL*(37rZgVK7#m{DExI5#=XbFsr76g9P=Y1fl&mb}30Am80*GEQH}7EYr^iN8!9> zQq!%r?5+q4LE5f;_J)y`27XpyAad*BT!7PWT|IAx-F!u9Ix8Dv*`;UQVtej^G@Hr{ z-H(o>S*OP6*ta6*h3GQ5r4i{Y-r%ovtEfZU<_4hoz~*xyS4b=5_HgKLHhXMA3%Cx| zh^|Dsl1!$}$1*P`qh;l6oZbLCD;hUhv`qRn3q~xL_$uqDu3X736m$HdiCeZiJAHXn zDnnIXPFl=fn#+73giviSgc}ABYAoG zP2)_gK6pO@-NwKF%AijDwepmGO_J~Yb)gBj#wTw0qd8mla<%Q>3av|@3p=)3z>3Za z*KEW{(S}aR$5l8&CHS3}&8zp}x~#JZ9crjrmRNg|XKa$kR#2heT&{Gv0o?VVVGD8- zbCp#ta8=HaGsfk6X{;)&jIq=$2vTzSoj#?=8Pla~WHznOyOlF9IAcq1$P{Pb9yIjF zc;okq?V0NGd9UAHg;+-W_d0cZwcFfT%^=JzhK+SW#tpGMIrK^Z8+^U&2Yu0| z!t=IT-;k42CK&UzPNNhAr&0UPp^e_NKmdMNwtj^LK={uo`34*?bi>=e#C6kb~vC?9^gU?MCCW zy+Y}GNUm0H_t_Gio1~&3DP1sZEKziwVC|G<4y3&Nyb%~wFAN;KWbPz)LW!%ey>-#- z6;O`7VZ7exCKO$qHj!_)k<-37LA-u;@VTpz0APeL*Bm@__+$26L*ZJD)Al{gbZJ;@ zcHMxRd`qFE7wST69QYgTN)90nx(|&jV^N@BkQuki%i0%*2rS!Gu+kZ0YaXO7&q=Uc+&x3fO)e6EFdQGdA}M=ZIXAq*u2 z4=UzOg3a9mlNHU3s)y?)W^ij`7vh4@BwNB~uki+NXFa5wQt4Z2VY&Q9$+T}iruDFU z8%oKandl@d=?!Crd@?oy$A-O7_A#!B;uC&k4x*xBrvpvJ-w%@ippXEG9guaAp&V>m4;Pll~q+2kCk_=56 z13$u6^cOhDQ^L@VOu9ltSwVwL0Q02BVocbgAh_vEYglb&nyXLovYecqa1Wbp72|oj zKiG{>f#twF6tK)?t;N>7+V7(x=FEPVU&*x_{QQ(XzuvhA1zW6sgMzhYi(wmq1A>|n z`Sy(ybi{1G&|tb)mTtgKC4fr%Jnp4yUu%)(9Y8@#EBppEUHg4q%lMz`_G|KPR|P%4 z)L6D`SK#$&IcuD=@}o-TsXg<>Fj5NH-qO8qiJzyz1;C@JLum52c899vUHoDBV$A^0PsdVF7`#aUns(U zC-N3W5pbYxvrg6)ye!aBZF@5aTtgxce+_|nGieGu`WyT4CkDUNxH84&DzxM`*BhG* zcSn^EcK}+h?4IYw&NiCf{|bE$`%QJhT-Aoo&kXt!5M03 zH}6e)^Gghkn?#NJTp7Pl-)xE$L-P1Q{vl?b|A%Q?Ab{0>f}iNFVAK{uhtF21a~nFB z^SXBLGZ@_nUaYKvu-^&Ezff7q&tLw!rt(SXiK1WSg50$Uvp2Q8uJ71wLBT0GrXyl0 zP?du=w{P&UQa+9#YpOfN! zIk`4pHqD?N!HaW&szYX>HUKtg+?6B&(bzam$;pjHEm&zm_{&;=F0mx>L06L=x(xD8 zGaC_{$GNHwfRq6E80L(;ue05(d<~Uzz;}kLf54a&SIX&2P?;XEvgvacLi7T$Y)z!} zR$j$;WaN;;(T?a)xvwPfb+nwP4Q{B!r#u6*l@LX(YzH>$B#gM#AJFhkGG@7woeH)D z?H9sNj@%RjO*3;UUqZc2eC_N{G*(z&2EZY zk}E6m>|42Wfh|8E&-w)B3yE8V_%M7Y zs1xURrh8!83vlD<5aaP=r2ep=`l>)& zPZ3bBfQt3B+z8vR*mS-0NKi7i$B@+lv{!~!EzMl-c0s+RxLC?#j*?E))bditcXqTP zae>A&tUkAkS61O+(Pp5M9eoBENRND5?VS|o`bbsA5kBL#<#h^7iG;1$Z%1pxayjK0jnL|`vzSfpLh`nEtbWc80uQ!uJ=U>I)Xw+8^5;`lpeSu8;rz)%w zzHI@wJ{dg+F1J0~AXb=GFkkr$?=F6mf#)o@u zYY$WA0F^rp_h3E|93MFiy$6;K(@X$-?Q%9GSL}$K_A$cWg3T0UnK)56>xI{Ej~vr& zW<0C5$Qwy&vsTG(!{(YoWRYzURTW+RxU`&iimVP}fd@ zuW#;(`=Ld);W zb{vRmwRA68vAP)Q-G4@H+bZ$7NWYZ7B4T990T1gD!HQH5TD)$`V{fZ`BAyguez?Q( z2WTsXx3Mqws`2^chvt?6NuWHVvt380JgSGuxnD|qE{G15E|d<2Rvxdjr78}^mKzCP zj=g65-lW7%;;YGq&b6jVn|e*XT-;jYdPW-Fkf(p25PD`3WaHgJif(bJeGz-6Y9;Jj z3qd+b7uB%eH>njiyhRVq*g4d;j5bZd(C{BM=i`L>W7QY^+_K2) zTc@p!W|drP6^fedJqxt7#pmatBZc+OhN29wdsRx_dMo*O^Q% z9Ms7?wP~Zbd8^>-Fuyl?V3M|UGjW%vSsr?PT$*=yCb7(-c{gNZQO+R|OiuakJb$R! z1mR9@`fkih$H@YZQwmQYS5lj*wN5tXS*(S@0h@EO6WT**7ExT3s0;4S`7J$BmAFSh z;{(W(YmX-t{k$hDbZBMy?O|t@FmsZ{)(=ZU#}aU*P{4e8*wOTS5gc<=xe%ZyknVo5To&4g$a_#sp=gE4VM$pfN!U4`k<| zZfND?ztso*S4`<^7-}WHr*w2GiN;**<2S(@6<4~?J2>r)U{HPMqn+;VbyV4CE0xyY zgEZ-lvTc-~lfUJ+FR}Eq5u2q@iwdE8gMG_Ox;Ds|wQr2yEBmaPqt>+{Mr!NVZK2m? zIA>aTSaI4TW7QRd`Jy=J!FWKM1A$_XRa#gn-lTtx(8?=PS^r}w0oj|4gmOpbUQ<<} z)w`U)eO{9#|H4R;Wn!Gf222YJ`(sG!_8<7;HR%)+U#h{MUAbNhL9OvY43MpOQmm~blpM!ifN-`-bZWMqI*G{!@VP;EUdTi8Rh zaTvWd=xH)Yn$o~-u{{-befEkPKi#U3d6?CBFHUmv8~Zu61^J6yeFFlWQju4g?pwW_ z=YBIP7xOed8>@`H`C&;;z4Cau4&yzlA z3LwTR2ia5UeMXx{{ayF(Jr>a5#Qo!)l>Oi1zF^*$+xx71Q(mZz zAGv6vf+waAeA+i12!zICeE^TYNrl(GTwOBxfnXTBjwvO-3k9G~{0+183jpe;Y27+pFu^^~-i+v|r3;C=no(JEJmN9jYT6pJks*i- z*z*UdK1JLYFo*R4@&KRWIKCAd@t8C!o{l=sZwp9Ef85NhNP)a?J377;MXb$QgW56q zR8qD%3Y>3E-q!CB{zP|V#^#N0Dy?88s^Yt|JzCrXs`i~4<1q?yTD#1r$v+~I6j-hO zRc84?hSsihUS}JovrD1h=u8B2Z+s(!S=jgbvAeb=%+m~)DOGBqE$%NSbg|9sA#qV<5^Uc~# z?i!v1ry(v~wLUYKsJI>}Efsy$wJ%-q;>P2E2SE;AIujVgjmNT$Q6wQ3v*gB|@noN0 zEk1|4p>Nj%P&0I~c&=e~d3^+b?48SsKdM549h59p6(kOa&x@}B6~9e)P0>u+E^|EE z{G_(Fp48Yo(*39?>CL9X=6}TCeN?Le|;)cRPeSxN=>YM zl=~OMqkezHa=En%<-FE??tixXpTgf($%#2ny#{3X0;c}o;NaiC2hq`DF~k{J&tDI3 z{eOr5fA{RK>meeLM+x8`Z5kUmvA2bxUV}-2gySQ;dOX)hq(5#uI+l8$L+UEmefy5u zI}ep~Z-MYn(tyZj1Be^5(yTvb+i#>hAy2R|)i|jv44a-zT6}&Q`S^si!%WS~`9)_cGif^om6k_@PL*`{f5; zkHLb7_*Jv;5o(J@q0MXJAtd|&pK|X`XjBsQ`Uk0grCDKSGuK0D{vT=tMX)jnE_R=y zkXbuvY#E~1FJq06utvZ$N02KLS5dPd@=?ChGWPp-$1-sUr@{eD!ftEo9Nd0;n+K$Y z48~+iOlH(UNM<9$E!2i_$Ql+*R~%;wxiP*kUhG8vJvpaH31-i4*2w64EloTeIOft0LpyqS5p^%X9n{QtHDK|zH+6GwsBA{cKQr7(4>QXd}e6td@^knOj+@3~HxfIn7@>c}78CEH+Dan5y~ zF-cccrZ>Bw`M8r^h|Y!gjZ3j)94)p-6v4p6qLJXkM+jkt;FVVh zF+iej{7vzD7Vf*~jh!H_r|odIETb20CHR7cX-iZp!7H5u|< z^u_47y+Lqzd9o!dUY6e)BpHtzDoD((79pP6XZpIBdMCV@nQP4RkvFaC&x{2eB1yOM zl}|R-@y8d$ik=&rJm`2h!^0?>bBz}Jn4Po4t9!Al;PXSo(=HAlca2hrNzpNhnTZPo zMP=&`aw+biiY#G)1qOpM(iYy|lN{UkCpFDnn@x@mcMw`B7QuF0^=@^G-_2!ZQF;Ei zy;hY)HCX|HwxDafr!b?s5i3l!C-^QD8j)19RMkaRw7_Lk8UyojHcU=pazyM#^6ZWd zSZQm@2vgoV;Y+O0;Yk8yRna>@i2tvenH|!sdOs|<|7#$+e^1S}wneQ65q4DtT ztp-fF(&i_Fk<=ot(M>bv4imS=jiZee=+3jgWTm_{P^;^1j78&M3JkyJ>=+LNWz!29 zTY5|fo8XaRV)IaHakX2u?_sV4HwH$67!2s7yVSdN>{+e8s}p-{Y~f`+L-9js!s_TB zftAS_`1BCQ9-4H6rCIh44?n`1g`e_!I0s?;E*oX{dUQmgz7($PLE`^0Bja^rnCv7hUYs$?>kbb){M-lVl|KbVJ-sTll8 zJZOQ7m#Z~9Q}Lpci7EU6aZp_Mab3Thms$hY^uxH^`h8S*bu0QUnB}>Ff?-TV>uyNQ z$YaDLFD>(5X8uR)`Cu~TC1QAf!p>fLK3D_!F!*EaWN&zpT0CqIrZ)JEVMIOEsr2S( zp~-w*Z5C+QOxfqYKLDv-&#am+X$+86)9qfb;8G+YdIAkK-V@p)ZfP0VZUk^&u9=ro z?lyqD>kX4O1_T)(#eY;l=nFdPBJP<&fqC8pWwD+hYHxzKW+N@r?Qho~aPcCA zn=o1QBhFQb)O{;+IqV{0>o=_x4EJlFPLs7F(yb#v8qWnQ>M3aS;og#NK4;5TG-ia% zr0{`0)C!vEcl<=)h2fZx66(9YOGe;PvjA7=#T)lEW~^|rT1`?~A{gVscSx;HK1Qf=xtX zieqi!IX!OMX8}ELgBK5!6Ve1)dwYkwP83C2hmIXls2xkVOg7{4`X%UEm9GF@g@(Q2 zE>Uq|Xs*N-yO9oT7FXQw!q+}b*`1g-tfsdS ztO&^T+rtyl)`RF(!`su%=DvsE5h`siL+R+?V`=5`H|lwJ+vs5HdmVXPt1xWD*)dL- zA|#4^1-kH%J2=ZJ3fR zJBdfilclQXeAbXMKro5!ssF0+TgML{`Zf{+p4bT=wVbxNe zeT9jZ21K`HhY$h?v!1U`Fyl4-Q%;^26I9r~m+)lGURbwEgVL`0So@Z*c=wH@K<_ zwzGOn@;T7sTcv12tq&rv30O@G?iBopr@toNKPJW$39)0lK7KL)*;kDI=z>uala9eK zhf?ozn=ZxA-oPv)=lrq(tH7(R9}7+d!ic-K8+aTGj_|3U`vbSh#2hpbJh+8e6G=(R zj-dA5{P!SWDD}*|TwM*Yu42*TJ@*-pD@}l);2gQI4c8=wskz`@i-06_vPEe{scU77 z3Rznkl{y)9O1mC9coLCME%lOQdR74?Y?=tZzA$!DQC2WMfVvjs@FO=n;sVB6>A$?MyJhM+XM4l6*ypiJO4DuwP5 z&t(qP&c{&P%j=O~;{0j`3^EVW&ARH46-qObg_x7QbaPKlZmXNQmg7gi>@m**uBx|6 zJI2;gg!_xvTvSmCfuqEd@nAV&BdRFtiTsH-=6Fi1JIq(@N1dU^@i+VFnysc@%Z&oz zV$w(9*VmgXc|_DW9wssjbP_ybrTWfjQOo6>X7*D^g)yQqZrAD^HpfC?;=v+V_Cbf) zB~FoqIO}xbVot|+?sfT^t3dNdIS@2Lrt7=Nm92NTNywlRZne$mWb`}{ImoKUxR(2e zcH*SjlPBWSDUArg^4M8 zOb3V%mmx3DX^o(C<@rQlV^#srU}>1C3G#KOcwf>uNTBn4WTKvyNb?K1rQ(kx{nPEA z_&s8m;fQ?#bd;&Cp3}PXU4NCff{dxvE_Nkg)IPNUY-+tv>BT7HwqgzmSJnY;sl2!d zM(7S47$`D32oJ($ffD!qV}n)?5Sa;+Vw6!N*~n75unJD-JbtmHI_GKfo>&gHe378D zF}Jn&doW-v8<>UvC|qEqP(9-lPpe=`@)bCzT5hc%-Kb~z!9Wu;YSuZB(sy8 zwu5eBmPHZ{vbxxBz-qbR9+WPkjAk&<`Z$i?m9y8>-Vkw+3=BcAfqP69`!w_7L`1UZGspI?d-#dWCNspU`n=Yy5h=>G~cO!Dm)>ltw65h zo3Y6t_I`BY13fPA(uVhALe6iU`H^1;LRGK?di*k^uGLLpYldu0pMMa0{G4##WqBgTrj;Ym^)MJ_-sde z947=NryR%dO~WbOxDH3X@yd8_X8W+gc5H^Y*1TrfcWYgJdH90znZ666G62)y8tlrz zVs^pzbm5rV(LTOe5?6y?b_#?zg8`!JI>0o&lN~gB?I-nsj`po4HxY2VH5^S-=%0hE zwVbn8D?x*qqC*bu{xt{iQE#Reoca%iz@U^Au$^kNbKMt{ z#B~ui7>@ODAnZBX8?gqD7}0_5WJ0c-{$o9WopVOQ%FxJCYx?QEzHh%oBC%=-EsRQCT?hcz0I?4Hup= z&mt`6;!d)bK5NsKmNv(^&I2hyTP4RQiqr@M4NUyjUcCM}m5Tm;~XjIib*(Q^=W^5DX6Ri;Ox>P)2m#wjI>)DYlO#k<^kKVf!T zfpjb7g!G`)g6o4-A!a{!XB4U?S>W@Dj|uL@nG{R^z>~uE_&SK7)D*s}<8uM{7`Jo` zxs7}uNd?GnvftWMa_s|3JcXDS0q@Q|a9=PNKypVSm(l1(`5i|%eP=wh=Fm_2DfOyb zOG5JZI>*H~to&7J2y_ifDJXHL$X|;WWIzp$LiEkHzs+*FhVY5P@uj|4+#XF7z3ML1 z+`Q``Gq(OkI4Y#7)imPxo?U$~p}LuBU2DP*bUMQ8cx%6ev?j3t>#o^)3P(#V)xofO zW3uEeoV<6o#{AN&@jmgv8+F^s{_cl)uD+Q$$TskS>jsg}sIz@18I70(n6g>tCsPz1 zngO`K7*LfQ(@;_7)_9eWi*Br{z5Jtgu&F$v6aFMt;*wgF%0{pW_JIFNeYU*TTJ1@T z^Yt=${7u*!o~i4$Po-Ws)!*8IxBkwx<#bb_SK48Btsn)^KWgx3K}j=zUBGiseMq=xW}4<5H6IM;Uf@!! z;URx%k5|evj^X+|+$+^{z86eB`#b)zXc)03`*E|o^Mseu$n9@06XF$)9&w%Omv-6Z zI}3VuYPBH6!orjpmY2ustoIf1SetoLRFk$K7r#9#PdVN!>yh9*{3>tom0EK^p1S&nyYF*=D9$|z8Q`TrKG^%_u7@A@vI-KuQd`jJmBQj&^Ie`t{hwX{ z^T6FxcSfXGx^8WEJ*@L5@r1SMabJ4&;4;ty^iYYy4VawCzBB<4XPWD3Sufz2^nwS_ zCzpyQ7krA=$3GJ@@?HT6ZFbIb><+mVB&Bsdh(v3N?(U~wRvX+shr{J1l0Pnoe>eGIqFIP6es; z_#{3;#KSel&}P_oPE3Sea=RGy?VX$))kY$0Q#oSx8fQpc&%LrWpyC5l3Q}6Fyu%4s znT}385B>-}oUX%Lpn3H@_Xm-8g~Spxi}@Rlu&Tpw-M>17_hrujG@jfmN&*JVt~;`Y z9xqIx#JKtuW!AQCsZHO-aJIA^IkVJ##5ey4!`U}yB6dRAVuN>~;kehEZ6@c_ z7#1GgR1EYMSf7LdvlVo`XfJU$xf3?J(6ZP(R&c&aWX_sn5l1F)aw0ok`A|YD{D)6Y zO+$-Xbv?QTY%e>Q$LB=5U*s?nmC<^Xm!hRcFK{+inWqB2(KD7@5g3$#MB?eGe#&P2TR87=6dm zHS9^wAJDijKTzW@{<*>TXy29b8H~~v5is+q*dYIEsvkFvP3M<)Xj}aH>KFfD_`%49 zfX%ei(=_=E_o-L4qk5}60?6>`g>kp5*kt>0)6+Hi=gQd}=#)-92mNX*R^Mi?SBcm+2tZG5kK5jGm0U3LL%` zexh-p*pI%e=Sy(zC<&y~9%mWs)k-O8kOuQv~!ZXCd%N6*DEjO7)#5hQJ zJGEhdmN}d=CFQi&Kmt>kxo}K`j|Xh|j$Z2nW+LD?POY>o_fd7L?ckc#e134};YF@s zXQ{~T_X?4>Tsb@sJPsdbK9)C1ykR4GhKMeS89@A~wekTy4X+C-Y4Ekmh-?JSmNpN@ zka$L@-D`^Zcgb<|QC%nKg^}H015g2HvUa`gOqQC7ctKEz6)MkZ2j}4T#k_6}VVh9M zk8}|N=PefQ(rAfg7QEH}_b687wF=KU?=s@Y*c|Vb>UfU!gsb_~)769ZBud}Gm?Rn_ z7u52YvWKpI6%e=RK&f|mIov(ZCHsSC!5f&Yb2l)V>PHr`1(e>R=BE_+*-N~0A3fte zTlsG9YfP0L=Iz=j8Z3o$-&SA>&WA@OsuX2;SZ0;lh90hoR7tgY8zc({zb)qr;Q-+E z;}nQ|S;0n@*j_P2pMmeU@HbkuU!HL2<{vlXYn?T>A7Q`oC$!54s&;;9yyEh%UP>g$ zOar!Go6&pavOI38Rk9a zv@RmW`gOOznf1I+ngNemX*RmY%=q@Ps5i^M-76k*)qpqoq_IgO2pnt7dX(UK?!4IJ` zXh(zH3HtKt5FEaQF!-73SF(KCTk~kC|NR80YnfP__M0q4F_PYko_x4|d{SkXy?OQD zj%BF_yK(2oLIz3QK4jnPW3$_9v%2mB2{XK!co&pga2&4C?IWd?`^=(~7&n(kH$;xZRJI}-ES4Syq6^(i&wkzap^@c<77 znF6P{J9KH^a_3wLpXo$65OZjV17X2+YpU_V^dcwMBG^knjEYMK!9zpESKGF)m>}^X z1m(N)8J8CPR$kE;{>)tnC=M8zxh2zUEeGd8TrXxdp|DK7X7LNFV!qQ#nF(}jgGXIz z1)UW!G z(+wfJ_v}~;G_K3UO5a@q^j_U~9c_+AV_F(qnu5^>8#i)f0=bz!VKBQa(N1EBy}%aC z4*ke2rUPv_|DH286(&+MTSe$yTV~_(9KuF#G6$a;{)k;LVnuqf+k;$}7m!ipC_6na!yT1Kh*PBn6=D>q{<1C|y6ZF8w zmvD+c+ku=>Cs3tV;x?yjGS;m{wI?XmzUzb(0-i54F+(V_(0}T8Y5ab6BUSi48{($k zQtTV6^7v1vSI}Dp{<90+c?i%b5AsyB^Me|Fb5b%U2IAE-+2!4;x7&rH+~Yh+Va9O~ zcFk_mI030i-RbZTetUMgmcsEUi2v)$L{MMX!fZl3xXPt^>M_eTcu}?w2&rQ}nC(I) zw`O`QcQzi*UJv&+_R6L>5i|Gb9W^+7^g+Q78dY1jsa~OKgnd%>0M;kqnc>+Ymkar+(WrT$Mpql((|Q3mYa+)gknl5jp``wzDx$BQ9{Hu8UdZyXx8Di;Vd=Y@+H9>bw=v)2 z6NSthzJTa1I~mr z@sE7CrrJEQY3zkiWBUX_2J)%xY)u4qcO5nPEmwp+1{++QoAE^Kp4C=}gs$#+;jo=Q zT%IjW%s4k&wBFoB24Rb;W3ko=*9A5!5Z@;PKv?crouIC(>QpCwFi5P6@Grk$HYJ5g z>40CpQ_L%Tf*O-U1p-&QLgr>*Cdi3=o%o(kMt^1bIN93W-|rF9Z@6kyk(zGN_epAi zvcEONsOH9S;CF9JbID|RZ+$)_n}QU!L-Jm4AK`?ep}nB)3rY%a>b$f0S);V2pAU z`~eWY;SQ!&>Vv{q+L!^Cq?32@_0@q^X%e;I+N|fha>@2|rT%SwHZ``K6w3e+3-2A2 zkZ~H%U$bkp3{PL3@yV95Kaca4p_P07a>nK5(1|z!GbSZD(R^li^+~>?fUd4YNl@g2 zyWHbi`EN};-q_x2xH;Rv{bQr(;Rr&EqRW;6+pb>P(}L)?bN@BkQhEI)kvC_Joam#- zap@=dXzcOrk-kTz)s1H(Du*j2wf>XDS8PgU3OW78{!5+@)nLq=_bzkAnf{tbME!%( zpG+a6ry>6-#((pYo>^0gOl&mHS-<8fF&GNn_6JmaI{K?a|EG{Som8HbV>v-MxSyZ<9y1(inCV72+zdH?gjLfI}bASZ9U_>Tn5 z|43&_9h_6g*gq*p@;X&F52{!HNxBB=;Krj%bpQOpzdkq#Q*~qg@>lG)pGG~@i8{D4 z7K7}6Q0>?Ys%|>Jr2Uh0<5Uipu~4DXpTqs@LvamNH?g6T|0Lc2PW=B){I5Xce|P-< z#XBBB zeAAzZZ~B7tPts{p2PfEO_)nPH@DuSHstNxjT@rP0&%;V|{tEPe+9oFvs&1TLZU2*W zfU`luH4Mu{Y$8(q|gT-m0M`E&Gpq_fw@^l_yIb7dPy6W3PV!_Q0P3 zl+RQ8`~n)D1%)cOQ#uy#>1(1_>#G#~9&X-s#S3w-)3+K z^I8Ahtk7+~Me^w>)a!;zUS;xnzd)k~=E#MR{GKRocYyqwx|1x|$v4w$Tc~e%JNiP@)-S^r}c+GAQ}!(Yl5-{1Rb8TdqZZAtMJZ4L!C3?kk&tx&-Ns zgr!Fh&y1{k!%MFJ61AQY&#YZ)kyegaw*`N-nq8$ta}n3#uu%XapDbPW>nx(dj}8xq zUnr8{@g)2s!Z5Ap*N7o|`YrfO`q3rWnkM2#lMZ|v znDzg#_nuKrr(NHuBB&#Ss0b)XQAQCE(4p60L6qKm07XE$Gy{PUfk8$Q5NT3_AiYZO z5fM;YgaDx?AT@*#S_mX0dH+7od%rVt-+0zp>-}=hTF)0(mLXT&{o4Dt8?VQlSE#$B zscROa|9-PfNIhMMP-;THpCVP?eaB7DDte)o`LrS`gMuqZwjLy}ufJeX2wi{V+KYJ( zd#x@+H*;+h;gW{!*}cr#;S8Z_YZV)qXKGeu?Msl;L1k$8;8(Zqt{9Q*CD@#;yNmXJ zYKZLK<9GPdIPZpJAq?X3*Ic(7Zr~>BJ5i(>80njDS4;b&-XHt z$iv8x^$yp@wypPhP)=QoR@&pXkZ%@<_du=;MO3m4tS$s!V{R{O7w}f-+Q*)cKdO%g z(VgOj@~rY#GArN@mS_BTbujNKcYpo5&GWeD$$%~I!=yVn2B zF|B6snoc72NZzb-9Jjr( z8y_NlTG8GyKXMCCz`=8BmX;%#gI}bFCaoOWuAY7$=TzZzbDOjJBlFv!$fjBRm8F;m zLOdgzsNO1Jc+F`-js?>@tM$4)W7I;ZU>c#U&?>W!4gr_KA-gVk3j>6`o5*NqXl&?0 zlj=uMNMGT;OtR)7P!E5HdJo}q)h3+e(jBnWjVchaYmJ_G&0M;Z(CI2%b``@DCIve}c8?tU(l^3&f=t{Lzl7W`NZjM4o zTXqZxBv5HR5vt)QO%EG)sK=BxKs1SL`RQ`tbjiuUg*CP86|oKH|UQ+B~4 zmY5Hfd+yI+7G%Z|`K$2%5~n_EzXa!LO)8YN*f+UFwpL}4O_tKPS4Kq$0mysG#F)v= zJtyj~y7l`whU;Xb`PU`y{h6YDj);&hgp@Q;EVLl~f$QHAg?_Ntw_4V${>@=6<@BrZ zw?pIcOV{#p#h~*BYv;XhOl}4>rEygI%Ncb!F{3woQbTXj=e+m*$6xktzRi{+3^Md?DXwl31%Imig+6Q`q<_@`UQ->x=~$qRvERJ zt|iS(iIOKFoq`vevz}#8z@#)~kpmO}*m`CYl5Vp2`95R+E8H}L&@ZH(x$_p%`qHVh z@5?n#m{#uv6H0%{&N)PG+nCq<*x=qHWEPq`+87~-UPOy@$BIctzX+x!t0 zO6w%r{6Y=kW5A}{5AnfJBJ3XajP{Ifca7fLL{;OOWTq+iw}MuaIgFdByDfAh(WB!6 z^3IQ}1G*xI!p1ckZagLikU&}9>QB;Ad(v-AM*_xV^Ll51+W}&-DNTd5MJvvIZ8mgg zNF~L12++?R$CzoH>(ITKsG(4+rnH>>^}z%aTo!uq$VZ;u@6{G2eu1(_->Uu2FD%cp zKur3Q0RIwg;dEp+G^367%_oR_DbiqmkaX`w*kfrve|XVK9!d2r=RJP*x-?kiHSTW@ zgDTaB7Ct*PR5%}53{7I&qEXT=dMa4>Wif`jt~8bYxaXZAPA|h;b7f;lWkL}hUBVweFm~dydNJJam&$|9 z$d*z$^rgJRk3=5Zv#!BamwNVQ8W#e3>#rfCj7et$K)u*suQE6UH(aUxA^iDC)P6(( zD(FftNhpjKxcg)~$A&k3*W*xF{%X?eSR~ibAz}Ua|1@(Bg{`o5#R{a~jlGa6AG*35 z(xGCmRM~XY%~A!5=cKMA$aW9YH#K0r;F$hTxk54fmpFHLi=JAKx_XA*Nv1LK-jNm$ z??hHd9W`;{JgnRd)MBPQZ%c7T0W|}u0!#&?(KhCn`xAPS6+u3_3R1Mm;S!6A;W8V? z?fayC6}LA)N4dZ3zrT5R-}YG4(wYi_CeA6!`!1q}E?K~|VlRc0b+!e+#TO^oiejZK z+ej@5E%f&u4L?M4kT=d`BwvSe-qH+~q;dt24mU(=4<34f?P*^)MTe55lBuwa-TwSq zVNw-$d_p>DB*rswfcI1jDa1tbAc?4v?ZtNKYJ~#59=^vXqV%nvw0iu&DS)TiD1eex zbn`A9WOf0>z3a@%N z)Bi`Lt;1COpnZHx(=ahHX$vg&QrkoUR&1?#|L-hj>}M&)KHl6E>k*ET*`wij2KZ-z<_@Ivl=i$VnaP2&}?RDN>)nZ#=F1W=wJJE zFlN2$&t9^20iOxI1^jIH*4vEAYqk#1azCQ2O{bU56|`0~4m6ShB8)f=_!M6vpQas5 zMTQ_iHIV(vE{Gj?7RP1(1gwJy+s6g>|I_mO@jqk{AT$8N^u!-@IsY^L{~Z4Rmq||z z8#ot3RkGGPz^(Z&a_7^?)*@kB`DbJ^e;^bg!rB}^y$AjSlX}L2ZViAd9vfdYY2P( z{9`I4aVPjn1B2XSaq-A5{+0)d#3 ztgjJtAx^m1Pgc7x&(L$3!IwDrcg#vY0fo5k)K00%08innR&L0Z{&F zk-KN(X9qkRPg<)0RenQ2)uEB{P?EW&yc$qembdpKU0$+!`%K>6<_n|TyLr{9#)gNl z#~;!^vG*gMVmCxxN6gIocii^Q@oCbGFvJDQgtLpXv?_K)yB@pnd{J+)(*Jj&5Vztx5;{kAE1@O%B2li z*F+rP7%(KSgA=4$_MwZ9Wj8YrKe=X(eW8*zlm-NC7s6=A8@%iLImLm5_Q^B^pV_rO z=Nt%CdS|R+}U;O)`41v+)-s~}IQ z)ray0hV?*2)#fHQx&I)S>RSMt_0hFx8A<3g`wZ`;1m-xfQhsJ|a3q$mq$~q)wX%AS z#l&EjIn_1;HCs_2=B3QNIChET%%GJU_~KqhDkEU#SArsy-4q@o!yUQ z;mz@Fpv2Iu&wFc568$h*DnmM2{t||M31?NgO-e9OFDbMq>ehSdxo-8#i+l2Lvf4rS zYC{+RTEsQUxEC?PHvhi3We+%;WH3H<-TyqV7x&O!{Z<-`IspE&2FYm z@yOx*TMsuu{J#gnG1Hu;U&`tS`11CaPutshA-CF$?WmUOyVH~&3xn6;&W%nfx-N)N zTRhIKM4r>y=7Uj^458d4HHs0hmA*9v+Fi#)5bh>qCVg_IUyC#h3R<3BJSM=I(i(Zn z6>e@Bir;iQ@ELqLoJD|Rinl=Onf*Ootjq1AB<}`%-HBQ_I8<-KsUEfoM^gL4xCsyQ zRn7VUbQsGIp~+TP`U32Y-f=lErb8S$Z->)_0)O+CGhROHRIP_GFmX{Ls^ng)9{$c< z1YK*aS2EN8fE&|NU0()dqsyv3|3Q*Y_Z>@=z*Ec6NA**_Ixn+Bv~*5?jH7Du3rw50 zI)@3y9NhqlSMhticIAph1CYR*@3_xB@akcuAMgWh&?bC-Num6sFH788wQ1vz=Ey@h zeI*rdMv+Sv%4Df!qiZs6+OyJYL8Cg4JK_2ufV@*POLZ^MVZs7j;Q&St6uK~?pj}oQ z!k=C9=|F`BzB>c3blSY180Ul+Hik|iT<^a}GKPNwc(KK|$syG|ae}Umwtao}4+2L#l zQQj%x>sBlrN%9598+ae`mm|$@D77!W?3D(8SnUMb1$(#B_1ipBGVAmJI3T@FDu7A1 z`~t}&?GzSPZ)*3N_2ELhTYup66k3js_PLdm%eJosEuJ^rc;*m(qU@UG!wpUGcjj z&wrktbHjvSyp@ht!M4h7;-@L<_o`9yI@V9Zf=pPuC&ho%8fp&Ej)xnhu+6)yV(QCQ zxu25Kk8FOhSNd=05C3w@3*$9zFSJy|KS*)kiI#q@f2u*~ zbzYAZpn#gE8kH{|WLh5AeZd078oaP@I-!yu$(sf|dyy(kC~MONl_GwM2d->6jpb-5 zF%1(?HQ@FGS_i05)t|099N?1i!9ESTQgo$6jsKvhSs+{%07T5?!b`CJ z7sQ`@ecV(Oh{k26OdPl@K$$KA!^?@*9XW8L06<_SaHIitZU-;!P*~cJEToLFlLs2} z|F2dbXz%w>hVW{HKpVanYHdEJ}Di=J>tzt(fbRzx?DcmK!uu?xk}TsCe0K zv9or%bpJB^lTa>{=dqhx4<~ZBbjeRFwskFna=KKS5hI{dCkxKV{VK_2Y3>PSptNwKlIn;M4~0Z%A!BLGO zfkJAe+-?}_nuU;J-AF>s>jMX4ZOYg1UzB>-q0px8IZ=k<4eBO+3A0D#dBwGTaTjW* z-Am$9TjM@>qmOmN{yeQ!+EDT;+Pc1-)sV=+`K+> zP>UkM3~Z)5((q?2blgAbtq*vqh4iItm*mp45W)R9n@yX>vf(doC%rfLedtteMc#pl zJgjaa-|_&GX+SRZH^CdTSnlmsaAkIWhR z`<3z71NIQ+#)^fLrnl{ONJXN8y$b08b>nDb9qIJ%)kZogv0ge!GWdGA=KJ;4mk(kC z0bU@%r(XeVe`2aTxw9&^eu(V$6h8yQG}{jRdBAjsS-?6oU#qY?{2n!~FX5VTw1;4f z@?30Y%nYnMWB4cNpnNCJy86CMRQgb|9EK|dj0>ZRmaQxQVwAsg`^U4whOEoc*d3pH zo&F!ZPAK+y@1Fu5<9s%|#%6&hC-iKTU}`xKOG!hl11LEeKx?$3lcc5iD53ku1lOZv zAANa!(p#pHTe@+1$p4d%sJ@p>W*w~7*^}5HGwJ3I8vW1A5P!WeB4p}vCn(Q2TWg`T z@$2cg-d%~w>D6NW(+YWQwyn&_E$1Ka%jJzL6E(A4{Os&NvEqVRlGUrfyT&SsYdOJ{f@kC&e^YTK28@c2WS$XK zhGsAu7eTI(+!g?4ocbhdfe+0S^8WCVMQwJeni*EYg!MWDsQ95(2S1LMMB>cl2ot9Q z$s?E{8}GK%X&3i;Blk`7P6)lHw?doX-4M!`KFy>|1sF^`s@5|`WvQu5ttcRgyjvLUzowkqyug$E4=;hl`i8gFBrp7Q3s*Aqr)9A3)U0d&ARQ^Y2eL z)iN)A72yP>9b26!b-}VG$H>`m$OF+rh2oLw< z)5Shub4fc?GS+plljnZ-1qwz!y?nH^tV?-lR7?~Bq^m7q{pXFe9v$AkJn2?$G8%L4 z#w7v2ZJ(g^&{U@seHoOhUlTET61}%%_d2w0E7r9{h#{=G&Y1EW(2;PW+;nfJF|q!B zjMs}0njGld%OlZIBD~-yKFR==lDEQBOO*qKIHw2Hw}iqe z+z`_M85D>T(u9AW?#9;=SKsozxn=)lZ-LP`h1w@Gpid}6+Cd3r^=P1rWxBrd!sj0e z2J)OOJl*FxS(TfZ$;T8f!$CHJCI6_m(T&yk^$u-#H_UC)eJR`zHBfR5C|$M+aUI_& zhNP0iDVa~iC}QkW$i0oi?N2ljG{l*hbaY@?M)JCeHmzbjk>Ts&^pTE!;5f9@k$wc# zc~Mm^&|`(ihxVcW=CTrX`<_~}f>W!j3E%d3Var51;D{nF~1 zE4ozPOjqR`6@st+ve2*Z4_*HD4!HG56hzWo3SlGlb7q(J5hUgS*W_c4MxftThY=z`GGJFHAooeNV+K`~a z6{2HA?9sJe{y0xoQm>|Nz1Ve&Y#IY1Lb=B$ZTYegCV>jys`)}@j$gN%@TPabS(Rpkx_|)eia`Hr&ncqxxQ7~%Q zu~+g9gbI-^h|PG2Z=*GL`2+~3L*sGd{0Lin&3l)QFXyG5W!eSK0#4_T>#V~)pw$fZNGxu3 zB97l-(uR7CFTh(KoFdo*jh3%nZ}p&dt~KW?-~wedQG}}qI3uWugr#la3!8xr%%eLI zJAG2B%$)5f@>etxT?;bh=^Hag&{kFkqk-qRoMx|)`vs86tn`Asm{0> zO#e*+rM_jGJespde8a|TeU)$;2Qnid6o$JHV=mhoalsYGr?kj{4yRk!NJvsxi|G1V z@M?0sFU_;wg&7YOHYlrJw03`=Ssi>$P#x?yBDV*F?7q`lJQ{&JpCQ#cZ*Rqy#f#4H z>rbL!?S1mNH|2MxU63^^#U=S#LNM7@`e=5|U>AS>VI~R-JEUk<6MPO{ANK6{)$nJL zwK?HzDh{MeEIg~kYRFmkOHl4$i`6l1m6sewr-RwpA6lF>iqFr!6u=H)BxDAjsk)zB zcQsK&7O@Ee=Hequ)P9Y`Td=#84ze>4PTcy<7K^U717`|0e_@ zKj~t*U~d!rN<)G8_UG`Gj0~vjzQLU5j9&fj-N{UdLiwH)8f^>|n>ynV&q0|fjec*q0FAu)tL=%8i=EkaDa;k74Qi4)e z?v4^i?NM-K-DIc=!cN>wjZ4N->Rw_3OQP!$MBz_X;BkG6qYwBDO*_9QjZu$Q4it@01w)4X6#E*U{h z6%|ADWd%Jcpt0l*CAgS&Z;6(@6^sTmgSHkYM<+dqYs}m^4%ONDrH1W?Df_rXkT~zT zin0NuU&_D^(lM@XA=zf2V8Hl9v4ve|r`)B14Wt2;V}zvT8x*uFq2Ag5`2`njZq27# zD4{CM;xNUZW~zKuO(3_5SO@+dwMWF@R^=%*UjY=9M+(zVsu6H~#Fod$JYJiQyBuXz z!3u2=XSwiesm;fx=UPKAP!gI`K=o$kR-O6*II+y&%?&~$yk4k*bdx!4q}-VK6#Esr zhUrjHCVUNBm_~9U8>ob4wA19k2C1OfG&OzYDbWl=rC;?-ZY$6>xckr6S5@4G-&$QT z;4-HKsQNQpQSXkGXYt3@Iy5z!uK~59QTphE6jtL}l}7g{lWp->jCg&{bG_1RyW7mr zovrG!ZUN+E80E_4Hi*`w6aD#U@KXLS6-nu`PbTHpC*45F7Cu3?-XXBjl1j#>!||Hs z`^IDI7AeIVM?Q(eI(ejGZq{6tuH7_{$P9xnNHmlNRK#sRw3yMy-&d#4n;;hNgavcM z)b~D{=oMYNWmJ5Gt){lkZe<~>{HkzC6+$Qd%**g)q0n`s5TRUkJ|`LHzV)zyN_#dB z-n^@s9j`^BcJ&g_$6(a2E}^L`6sYn$y>xkX4fUDtI$TGG%x?e5@Ge9{`puIuV$ zx~M|xbuXqgS|Zj_$< z^yl)nO>3Ham%X`_np|=OAO3DrSF+*R*LGO8nw)kmQmjxI)@%rHoGws8__H zFrnkmdg)cmLU{wm+V4GWMLy~s@qS|PqVzkddYxYgtT3%k=FcO2&0lLXaE_B7{kova2q0S5@jz7@a2YxunUtH+|cv zXxrqoujkTN9yqDA>VOHPS?&kt9gU}f9he9t^TRY{Omdc%I-rL{G>t+UYmD6Xi`~Q< z=KU6ASpL>gYgq3vxyj;`U3(zgf=trmnNTC>s>=kZmy7K=*B!Kka0H5Y`lOm4K0^tVCvl%M&$d}OgSlPhiXIcLA~c;n4w?2V0Edn^seh|j zSP2vC0Ukme0Ki}O5c+k{NOO3>2`M++%E-Bw;UN@|zxVEA0EWD-)^l>y6wXb~IoVn> zC*h>@&JKG*H^4{jc0z>s2}^MV6~>8mSD5n8oDRj5ZTOjzjJQ2ZOr^z7+{Fb@1k^PR zEfmf<)?5gkf1rMqf04L4w6$D|W6-Rlc_gC78EOgRz>~<@)}s4D#7XsU|{5KO3+!3kY<8cvt`8*&h_dY zJWyRBTH&6Z)0I45Rn;t?(v;m=XER8KrUYC&W$$cKpieGwubi$OweF>6!OJDJiwmCg znOS(w`O*}gE{#+T6_{+F?UpYed^kz0Bd3dLCIW55ZFB!PDquEvj)hJ|kPyq3MSI$# zO?vLQXxm=d<25TK1wz~Ye|Fg!qW0%=&RQt5waKwm7jmrBQyc*XTMyEs{Gk_}EI|`Je@oMkv)OZQE8g69y9qDscF!2GuS3?*bMbwHBgKl25 z&VsLLGHnV)%M!77ktI~Sq6hMg?~LzA-^nWD z*QV!*xd`;MjI{xhM8y)sVvn4h!pS{`Eg|Gz2->U7kKFU0`lWkM^ul&x2cvao%OEb& zk(;-^Hu{)t;`-;;$xd@mp(Hf;HtwdG;4?6-Kp1E}_!pa<`6BE->bZn{5`T^Bm?5|zM^sx6Y~Ju{lRSy6X?O6ox* zALC}2NuG>hrMcMQH_^~vVrjElCJuL7Nx7PbL2SPKvX%pE)-U%ju}N_Eq1`8mO}iRV zQ0nuXZ6WRY>WuIXZnf=>s(A`8xYaaKUvsZLH%~K~N8O>oAsISLC^|&uvoN|YZ6ZZo zZp%U62FIBu3397xO$PwNV@lhWqY?>#r;1!K7Fqto%qwd_AGCGj6yi@@;pxx1>1ASh#Fa+ zakn*@>n15B8^0IEzKi`OHyciOW+w0!5T5ccj!&Daajn3NRcZ0qCo=N zPRR!)B_fgp7vvRoH{PPuAsnoJ`y|~>E}oU7vO|7PER=;{qPODvtz0sQP94i6rWoCdoQhg*H6Mpy5W+_Ht zT5-gKdFRfRda}af6ki+XOaGv0v(tu$>|06X6YcxUJFIKDd?N~a>!CNwx((vUEf%Yx zwO6F3BMG}I-z!LJZGsA;VsMmQ-i!V@9okM}hochP2Y^dzW1T_lw8P((1|bHhUW7&}ahwF!`>9p*_dd zXp@|qo%8fUN<}!u2+meoyn_2go*zYXlNzBAh#EduvvDo}oa82w`1qMmI00P#JpI%z z2jS|W(k=M*i}sD1Mr8jxHKz*!+`hI~*yabIuO#TpJ8GF^|NH!y2-tRE9366pAog~u zcG9j5LRF+Z>XDI>>+e^Xei$*;)Pob!w(IoP4$_>{*be!mJl>*(a(YL01o^0E_K-2y z<#2Mz#7wu~roq*#hFw7l+G{){WM!QI}%P%%PjbW+Hp=RQfF1dGmC+EL1Gv~aKlKZC7xSR8FzRLy85RsBA zy7|p6pI)+YGvy;uMOe9=XFVS$z3S@9+pV0MbnfRTn!Wpj^KzQpg^h&HLV~iBbgXaQTFAo$vaC$EHR~YH^dt;u+4XQ$ z91g7a;oucN@tU~+749`^tPNnceD}>Rv1s#kbI%B?n3j(=8Sb!b9ksB^%j5hmmR)AN z=GzS4>$KQ`)1^P0(j9Fr3cD6Sx)W`TENr2!97mAU=JVsqx$*<_SHv>QPhT!gUjdWT zW9*og#;`p7@dyiv_tT7sy2kHnAVq}x3~SnvdRY&SlDfQ zWH?4kgm-`_+)MsN6w5fhNwh|z8C%UaeyV-PHy;c{H zwX}D3G!%$-%YSRvzfBP0w_uRcCW>z5$6a;3G_96UvvNx)w;N+(>}EQQjBjF&>_Q^> zA1P7!+rFI?cYZ|39~sGhkK3Qez3AEL5BWcY|APgDlQfnCgnR+=H^?)EZ7l~O-;T=Y zoFL{^I9p+MVoHk$*A*R7RMRcY9mpcBjwS-%-%7F*-%4_&BsTQ%MX9Bp%h0jST?{pT z$({Fl%%?!Wb0H~R+SG`=Xd0)@1}{f0LJ@0s4>uT6$wY4joNunsS=m05kL0o3I8Grt z?J&1e=SZ+c>*HFa;eaar8mQ=yDK2zr&y`Ia0e$!<0^6PEeBYu*_19a)8g|DQqdd>f zvMxPu;hzGPFPs+>MQTT#Bm(|$g1%zsS}W5Ffv_>qnZon2 znkK?w1(}d-^!Wb$k?RGbN2D5;&k))m21xe2yT)T{{|}v*1bF$tt4M|Rz~?4o0iRGHKQ|G9vl2-9)tq2Xk8;` zv5?R3Y5Dbhn~)U=fdT>+Ogs(YBrr^^-}l;TY|hw4QS|~if+=_boZj0pFPbO4^}^_6 z2RR#4Yu=Q(6s1PkO0_UISdhf{B)JteGBa9j};fLGaUkJ# ziL%6z+7m(8lx^7iqwI9M$R_*+xsT;*hZh_zPN|N-hLk?8n>mm!f$V#*%|q`-grL-bCKUBwX!B|I~Iz4#}%fa#LEA6X4>M?yC z9IY2c%8>Nm-;!P?9A$0mVP?65r{V3_>pX$vRiR6lCF)=5A^qBEQG$VE3Uzl0+~WcX ze>nlbCk=C!LBZV#jUy9of_YT7OfC$>dQNfs_y0l)MS8|n9WQ$g(=zW z0a$7-P8ge~=8c*AAx<{*dd8b9Z71vT8)p?QsIT~sVP}q16paS&<)sj3qmFi)bX*NA zQKgVtX>Fv_WjAfOEmb!wb74>}Io3kacTk#mW${dJaY@}qvpJ_eTcZhg9;|VlNu_D7 zWEQD*oUnDf{?T8v)c^&mK#=la@$BkFQ7$!wqQS@aHJ2nbpyU9HPQOx#z#MEG-#w$S z&!(CjTo9~J3h744!piA#jk+xPZ;W!}hBfZvJ0F%|87msQ=FPfT0R=K1lxTeMY+mLs z?N0qB>ow8r>m?^o3^=><>_C_>PO4qYiJmJ3_@bV+?e`z$EbIy3T5mSW1Y~&z(Pk;~ z25!e8sg1~)X*()wHsj;-5{htJ*CYFzohq+7lnKS60tUXu=xa0I!9KIhEW+JuKzW9P z*>yTO%Me|)FL54~6Y&Tf!>O1T)`lw-GlViZqHEdO%L!0_6N$=Qi|+r-V> zq>}2`B3SWOy~2Uc|$ZKks%o^~(5 zQ2T18R&mx=(uf{TX~7W%iRqt(KHvI<)Wk!zE52!jI~@Z*Rc>Ob1>Cg^PVOaMK{;(g ztTY!=RuDp~2CAl!K}9QkqXzW`lIinVmEX9|x_vAzeXKSD3PB7_HzyHqZvoyfzD`Fy zv;palefL3OdgnpvPC}W@*mKA~G=;tKeuABun52d4f^z0lz2+AW zKOKRjx$&jzGC7jJx!xcq%XwdHr(O2f>(O4c9$!5_TJ98I_AUG4U4yqvXKEC-l>)Sv z`m2uiC#tBS78!D1k6kwwkjIf(%8|E9Q>v0v`u4iDml*DBWIoH*yE<1a->x(y^_OU` z+Z}Nie*$qvLSnvNj02!bV23 zbqxtfH0g#x*jB{ZyEHNVvSrx|`$1bU2ZfO)Z8P7^7X?&@DIm^NeJ3_`MX~Spp|Dl9 zoOW8R_}3@|9c#(;mwEYLpTh2hi6w|O>i&voiuFo3!}}Y|_?ulti~{~`&7;{kRuZp# z(T>syHr~3L9mjjW%=|4#$#0L>R+Q5|06Dt}lT{*4y z?8bC11(w2$-LgLNS0HE6g}Rx)_bV6{YHb~s>g)F0P_ z%Kw{7p^)Rk zh9YdmqGBO2ssZ9=Xja+mIj-A+)kDS#zTTRyW8dcvR zK2`khHD^n)0|;Hc7RaMn!TE<3+#QmNh8~`{df9mM(A(%n9eJ(4nfCwMo`&!e+r9LJ zt(4bXf4BVq&(}YGQs~K2s~l*LSUSP87ux9+j~_erkMIBbp`}NdwLlB5N^kGsk&zJr z2Mdb|)uot!ZuVa;v)s*WbBZ2mM4hKaNbUx1F=>=_EzSNIxxr#aeQac(&*b($nC!2$ zXYc$nyfV`&l@k7qHOCzn(|i8nzsCHBYB|JGYbCsdUYuW87+EBAH2&fv9rlpWG7WeTtvs{H!h&h+y~j_87NTtyCwUhbDNFbR8TfY}?Kksr)TQ_P3u4 z8=4&kPR7IX#>38++(0lv5u<}`3EJYBU%8){l44_Jm70{8IJSE}NIoRwHjNs0OG2!7 zL?#FO_c8u)N_z<$DW*F(N+*i@V<_!MH zJsb*~I&&QFGdyWm@#)horr_ez==g7=b=Nl>yUsE1lOpv0;WP!pPL*RzR)j1{PZ%YKfBiB!mn=vd9O!>c|`tkPJcf@!)X=(fX^ml?x&>m|F=OR zM_?cG0$SMEd3M23l)QioJJAPoDzNYK2msUUb8U3PkvIw)a@BKLas z$}gCM3etabJAQrSFIo4`Pre!sc17cbFZSfO(?bZ=ouInKm(Jvsk?4ZKuVE(ltU5DJ z`bh*`^f_yP*;_*FS%E z|8VptKdbqiRx3!_1<%8482p*D{7%TGOC z98Brs>{p*KS9&|XhXs3{UvxsIOw>Dzn0qBCH$f%0eq=Ccq|$n; zDQ=nQmyG?GCXwbjdIe?f?I!P; zJg$Y5swCxKUi;9?=N!rQV(U`@j(MZESH^urvCnE3M)j!vkieT|k6vuq+ELj7G6XE= zx_YHYiX{P6^ds^Ce+78i?rdyHGv>oNrKNpqEsn4CvSh~>2U6Yj(qxN_>G=i-FZ);Y zAqAfOjc%c*gPpw2s*CUMCwQ!P#93}F_LumV7MEU&66&TumME{uDQn1SK8;QU_CKEF zR9%tE?5n|r()vfi-qWwl@v%v6<8yIpv*q2q@&P?(C!ch17?)LzZ510cZ$eIPw$ljS zO#>6PHr^lNz)1p+s&@C55X2oDQcXqMe$PoDmq%s3GNPo4CSFFPkrF%rEo}}wgb<&O zPk~$^m1lX259izC7;A$qVvMVLY4RV!>KT|r1<$`udbf6rS_ez2;ODtK=s@SO(urkt z+Drr|v6<9X?@LjsT}rA#86E8F0pd}UY2{u#43beb=Q~Rp(am9{tDqVEicShLP zcbgIJZ|TJP7j<*`D(}n4?5Nh)4&2~9a=iDLTS=K4p|n}w|7n*im_nIGK2W0&<9((z z!4HfGb%otFZzeSfSp&!_$Ks9sehjWgt$EEAkYgnta*O{Y%>cV+GxReJY$v9+*j*rB zt7ARSKt=;vRrx6eK`r=Pm=>1__ppJ zZY)4RyD%;!FK~)mYfo=4oxv~r*kNxkRp__#YAcRH4LE3e*;KBAWQl40n>S}v_Fs!| z)uqa~#7ZJVs7GJ&+MipjABQlrewmc|3S@Tgb`B^KbtfG<$UtPh;(jv$xZz1Fd0G=W zd6GB{!PZKYH%-Z7ALaTtmkj+b_r8VNa~xeun#%J_sw?a1F)M;wS*?ba+V{5?dR+5r zdyrj}5}YpY>9HlLP;ugB5=M=lD5HyuDL}w_l5M;iwd(-~t;l~)TSWVs3D%uUC?hg@}sDJD5W|>k$zW99W$1R@rD>Ls`J23u*U*S-qBE=x}-K zY+A-IQ(CCGXz8{ZAd67Kaovui%5DBQhk(x^g&X^Mvvu^7lNL&W6?ZYgN2i-jBPc)> z#qyqH3I6ePE@P08QtpK=Kvmv^OgpL&Te#Y3{)X3X|INluW`8U^@qzouh_muYlu$!= zMb+RH0dPo>WB!PHzb^pkHDkQLPJz6biE?!k@@w1N+8(yxOjhga>~96`)aU2)8D zWsl)@iZ;g*FU*27kj&D5Wv0CASr7D8aRGhKK;11;Gcu_hs2M@u&e{Am;FftO4j5Uf{u6e2)To?RXM-tqH zLBOHuMaARa*W5=-Ei;`_Pvdg0{V(?3Gpea=?fVuHQ4mo9*@6@+O+ZCJN(hLEg7jWO zL_|6$Razn_q9C9GA|Qm`Nu<{hih_a=>7CF^LK0dC5JKMNKKD7>ea`WI$9O(ImjbW3|z7W(UI1{<0hvNPj3%7 zo`Szj)r?6UcSDfIuMRBM@Pe28yF-jUt)ZMMXuE7umTAK;mv-)UmZiT8a-AY6LC4k^qxtAkA0b3iOIw%`8M|; zm()4llNSCLvwAqt8`G%AAtMqG@xejeRkUEMq@O8k+ z-~k*fRwWbOx*y@sqG4)|dB{qR&r!ReF#a?k;V8`UQ$FjmG-ek+Xkhs=li`q{dI_GW~Dvbp{H=9(Bi*+JWzqvT!1FJIhxz2J zkZ3}ZdbVxLi-tk+IMOeR&(3(jE8jy`f%pKN;so_t=%R?Z?d`UJVAJhpP?*~s={UDN z$=qSw=Vv;>%7jjj9uwLIt#9Zv9%Dh&LuESor{kK{sGk9@_o1{3BLg$oH^W%=+Sw|< zVQW9m9;33B7fjRn4%hJ`axPXN^f2i@rTOroK|d1TgclW!v{|PYF>~VQ0`Krs1o8J^>qLaqr7WBIAk^(I7J;pg@dkc8PJw{ugLA?t~S`t zKV_y?;Y9XGfn>sjYZ<d;N`M_`4l9n=4 z8{q9NF0$C5FQKX|bKD%1()NPq?mZ&-nwKup=Vq*z^rEA~m{-afs-+l|4T0an?` zMls%y(I1Vx;+d_fWmx65XfKX$XJiv#RTO%EFJwo>#gY zN%G1j1xeluACM$o3IiOAvCbUSqo$`S2NF7~f`Wertw}Axg}dB0ulxNiCw=c5yXfLX z838#^dIu!bNba+z6&=m^8$WZus zHw;x(xGA1`W~p9G3i0%_YGN!ZvWwSr=FfR z)6o^$SQ0^eNf2|WTq8?-Dom}6QMqz`!pn-|jMn(Eh)_SRbLl-Gs_-)PG=A|;q6YA@BE=2z*;jNG}AcLPC|8E zxVF4p-5c$@S>v$%6qm8pq3UD!qr|B!XVuPea^#VosF1%X+lCm&w{N+rvkqcW*!Tpf zz)70lT<9R-=Adv-CuOrUXU~?E3zBv>gs7jRo5FW-hFlxdg%9@KExQ10Xdnt+xb-5XTrnDR5#qc!v6Bfc9iV#Fi3A9?6YB;xf2d#!TdhABKM9 z_!rjPIyBA7Z~!5$j9gvc~?w2#;lF8QReZ{K+h@a+nFl681Mj$LHDb}LE4Cr z%fWLeUoqS{{MVcitb5P7VyH8Ti#tb8t-bbm+8>;Ui&)=DwF4N&G9~xAmXX?9!?QSD zx-P+Kzbr`*zaLoab`l}Ma}~%l_cFt}X4K^mHgb}1hok1w57xXr2aN&ZA(x;NEH(Y2 z1!U^o!AJSQRM0}u;7~=B%h2LHGd_LF;3pt#r;$0!((v}iMdCa!zx+ozgc}4cXt;kSn0e0DqKWd=$=RoTre({m2xkbL=z+l0o>Rs^Ls_>d{VL+Rmyc`W?Xf&l>xcMA16)Y&ZFle z{3{_=+D|Inm;K^<;oJ|54fNI>_3y589|Mthy_R2{i5a#xJF?>cK^EF{pQY27d!NCv zJN6Ly#!B_S4E~^d=WDV z)Rasi?$>n-rdLFVw%|2tMCa&Kl@%tyLd(}e6w_enF8U-G_l!Ei;r^(1lw2zdi^kA* zlEEMMubz2?65%G*(vBj|<`E_WFBmTXTatCOM9cRSNPr-Ea}*ABdCMKt@xb>>e*&$3 zdt^|JRcP^9_(JWyj}ZYfINt?$)6iWS{*ytVP&GS~-Q0{Bn)~~x{b0(j3hx(aNY>?? z&;V1-$b&~s9vNy-&|W`?1B6EA-GyTxq=3juevWkl-%Sy#x?$9PT^K66t}E0%ja)d`7w1>C3mw5i2w>ER*@%~yIX zp8ISdb1jUoJ#z4TWn)BvHDKr7u-kD3QOEsY6xUAQ5r0j1RLhmwbU;yKn%eztY46+S z9(?W9Q0)HN_v$ZHmb|bM;pm6}s^+t*?wQ;q7$7!TZA1q=K){>)VXvPW6JGci8ehBE zKqUp*n#NDaKFZZ9H#k$voPEG(CtZJ|Jc`tBHx_#v?@tG$th9r*Jl13?pzzt5ppok- z(H>*?;Q3P%5WOQyNez_wQCs;+T58=evW|Fy0bA}37J>^A{M0q5R-VJY6PzrO>}=D`2|A zgvD1(vdhlj_tCAgC-CXY@*Dmh!LtV8G!YhE&#+&@v78rIoU|ge&JEn(4t)-C(YL}le;K<2PZ;S-v_DL^yKOdl-aX;d z4Gu<{aNj3h=vs&-XboZAC*w253EmNmKI5hfP>MnsJ6BD~oLj*U{INwp~U-=EjOIE0O6JEWL~0Lsj1U1uZ~)*P1el$0k3st%zs8 zi3oi+btm*0r@|1+*uchme5vTh6UI^-BIxPW((B#s)n+b^_89@g zlDsqOQPx_)SvJ)45H*6PkxZDkGPt_YtURmiM}SsSFLi8vMvuk&F)nlV1UiRS-Fl2; z_L3DPiM~KCNET}>6fTS)_5b)IA!zI_Rj-nY*`Ft_#g(xk@J$0W8W}ly5v#ks9a#e1 z*=Bnp7?ei{ff&3)^c-5JOw@G9As^2&*8wMV@*(uwvaJ`G&xwIDv1)#s)UK&JE~Y$Ta*BFK{FXeQFyu7HEbt;h|W+p06BG zW?6{OP-S{IJzc31zPjIGZE>=#{JQ-s%jW>!p=?|s`iIJLm@Q0Zu1VKqbIgSkk#v(O zh{Y|g;AT_q{Z#KX^JBrCt8jP9yT2_J|&_#lp1 zftw|wpCD(F2sM1?>>EGtMhqQK&#g)o)Gs*4g714;di{dQ<;%-@XltJOm>oY-k61QC zMh`qAuiYUeNZ^1Ezbde`10e#(sClt5NzAS_j!Ci^vHCG?K( z)AboMUN1#6T6~=P9Jde11jG4dJ(s>&>&>`oFS20T#Y^thRJt^*wL8gs^w;_X)$Cu{ zDF&De*f?c?G8zLEPrcDZ!&-NF@?`fV?kyl1y6=Fn{VVAiFJApPHtS%#Yw*L8`o{24 zSh-3-hRDbx3*)#gD?U0piX?HDAQnSFp}ScKW))2_pjp;7G&z+vqbGjXcge47+3SVJ zb3-j5$-s@bZ6{Ktx*ImQU$z$h@o4x<4$YE@@{?9Rozvr&5(|6Q_aQH>4px@AkjdfG z1+DEfOaCf+MP!GrUt7B} z-d~%pcF{F~cN-@-$7A>Tx&0JqTme6k|6SG`l}mgKj;;?um3$v7 zAJw!TM%CAkp-;2Db9`hGkABxv>zEpP7odVS6slqbJcpVFT3GaZcvw7n{xA?0%?dme z67M~FLE31=g6V8FNq?WHiGjz)8~3@SLL{Yd!&{A_A*qgl4S3Wd_&-Y5h#tymM7N&_ z2Qt$&%DsG!m-#ODmC6phWO;mzKE2*DogWsr|F%NB?6G^IXUxypvE+M$u9;79#ekQ( zg5Av}3;igT<8@Y-1a!V4;7O0dcRVTLB!h2@Qiv=so}mY7KhXANm6tT(cwODk=1Y=pZX2XjVWpL zw3nC5xCNsN5Lwor7UE9>;v&f|doYuLxIJFVx-`c?QGm;j9(^ECInL9_;on9%(3}xh z@FD-P7&nUy&n07ht2R^emaBFp6~0*9@R7Y$91`(es(K{|y!9ydqK>uuW*=_bm~tqJ zpY5^)M+7Ny5E=;TFIe@*njZO4+_=^fqr8YTDC!n%xbfofT)r7|^ja6eW~-NFi4yk} z$Y!`z9j)(_X4eaMG}BW)Nz-+yX<$z_+bA_nGaoJJN;W<41^Sqyz`3!TOMs7mhJa%5 zC!A5QIB8i#xb8B5*?Wb^(E%1V#kGpJdppkd3S<5>Vep}fhU8j@jd3k0Ti16!)-4ZT zxw!Ui=RHsJ+)#d3HU1~uoRRuw_#4O~*4o>e-mn;043N!s>I6Dv5DN35^Jk201k`Hj zv0Zv3Moy}UlL}ay3|oM%G{HcJWjsH_2ZJLe<*0gQK>(87&^5vsc1R&$+LEXMoxQq^ zukfHNWiSO&l!PRKO;m2)1}zP)K9_lKo5y`Qa?vAbD1omuK0urCB5wh+=XQjH+crhR zU(YXk37;BNv`Fby?E$1bJk)D3d}o`5XQnJQtAa;l18(y3Wp;eH^;h&As1(9;TQ^;O zvLS#T8*>Xwd+=5qmTF<>C><=@QCsQpKnEg1W2&1St}oqR2)**s*1k^ZVaE;N-{fe=WzfzPM&Xxg%cT!Y*v~L?^_|X1`J=O!C zsO*P-6$;!~oyvrR)6T+cLS670`SdW)`6Y+#J1pHhn@U(ci8qu!F7@3F6)9Qm+Kf5; zg}e+^-JkIBwZ?fL(g(Kh&pn$O+>- zw}HE~VYe7a@Z~GZUVaH4ik1bXsCbE<&?EkMCxoe(wG0bE$-UAksA_z3Y5v*Uq;!#! zaj>&B%2rnvKdq^0KKpD7QV65rE3HV66c|=R0ARkrOW3OiLce!s_(X*^>|#_%Mpu?5 zOm;XW&4!&81ZD;e5ip#@goa)Eis#7ALD#QuLa3^I_cf`q!=59E1_lX+kC4jFol&h zS=pVAJowzC7`II?rdl|BI5=r+(2|gPx;yr`$rYoSh%Pm>YYWweW|X$k_$<)gNBUtP z!{sh>zY)g)R)I$^QK*K(DV1L8%_v{CzD>UcUSt`59g`VNq0~KT)EH<`4;);ncGwjJ z0U5Iy=7TPfcx~yL?^3&%y%J6yc<$ZQ>D<}O5EI_)#Swy1(Y@euM}+g@5smj+Tv@ji zc<2wqyydmdWd0Ol`L;WW(Bd?9imseCj+3#W`c_`3xniLW%PT5E57VX+jXmif$liRju!Sau`=#V5DeDBt(c? z#=X1K)=#YkxM}aVhzZX^$sjiV?7?pBs4GB>o$e9F$JO^T`%iLue9-yY@PpncVo_Nj zO?dZC8)7-ZWtUZUGS8a`=wNo8>S=!X{R|7Zt`eOa(W4V3%NIFaZKu0JeV1B$eJL(> zIzO=a;Lq1~Ul%3~#eb6~&Im-g83Tb>kfLkq3Uc+fd+pRip~e`7=`FraL%Q4x0nsgl zvwy9ZFDWlm&2V97^BmQC&-`Ec_;<2+8poYe2~e@+ zM+-gq5rPz%hN?{Fh4At$8`quzxuqEzcH2<^E21@!za40CVGB5XLwvoRu5lkatRcpw z>kX<*k=2pr$3L?UGz+FryAf4z`-ZCqISDq zY)qRif}*(i^iwSyo3mHjW*Fboa{`EiSlo{BVxXzCeWm-UioDrJ4PZVj{Tra}dxg~M z-6e9vy1O!K1Br9{`K>tDOBoactt0V|_PXtDU$b;dNQzZBMx5?sr`|XD4!q>tbwCD* z?%!@oF;kD~iQEc)xJ~bz-!s$StmQ|RD7j-g;D~FR&mu^0j`#e0N`0g9eAQHm8gK!$ z+GC{B&4m{dl+Lctxk13!7NqMiX}T5Sp3Y`mQxMllYJDA>;IM9i;nEZc&T@KV%`ujQ zfKK+l7QH7J0c*J?jB1Y)GYZy9TYSRe{B_i}jX0zCb+Igz;%xnc;xVv{IoMz;jXCB^ zz-1y#5*8O0Blv_(aiDB(r#Vy+21%CxUJ|`of9hrosnSOd_*+ zs&S67(Q>|bmoYPCpwah*=Y2QYee0|t(pZ*rp2FAaFQfKfVe1iJ@!lawF26@+vln}h ze8RgVi%L9hS{Rlof^?j>YsN}UW<*5C-%P3iG3D^imgH<$X#7|aS2%;n_4N{g27 zNPIph-BSBsZF@a5?Z&fevnyluvPEm7IOlzmce zT`k6#Am~5TtuhJ2(w|vBbzE(D!}ez4$#|4+rFK78KwggG!wJg(sRtqMTWivnE!zA4N?3B z)V=`w3r2K_QK|l2jCD(A5HDaG8J}aRiSg*op-+V(OZGWG5*n z8ZidL-X`CNg$o+d>EI z4Cmf`R$}!`!RI|2gnIGiQIYhK9j{NDX%xptj7i@k6hQ#4e4?GA3VHi21xSx>4|I<_{Von@udK%G_Z?MY6E9=(Ngswv7)c-HQ=S zrHN>HV_(>;YSSA}|FU!YA0(}ZtuJRXcy9b|?}<;Ju7)TlkkaH1kR+5a*$NElK|5>z zN%d1?LxQMZy&+!T8TAtyKgMT>6^#N4ZK|NqBK5Dkma}5@R>UIX_+hhO<=-1fI%91y zd-%d9lMPsfl2tip?C|4@zaWGEkk{*T9a!{-av^VU6s!AC>v^Af`X{`veH$pDrJj&r z?H>bRXOc2Z**CQWy&or<x=p4ZTo0FEm!ctdwP}r$5Z?hz^xJ1FMLL&_#^MVC95r;OpNCE zxBL0$hza>}GOxdhCOH}>EvF9|XY%!-w0r%AeFmDy*$1~_L$qt68E~z;**NJ;BDa0? zV**)7&mf(sE3!BLvp@g5kTXIR009Y}Vuy5uYd6QMKOX;;qxi+&KtGwqQ^if!#>U32 zLFFU=Z@%?ZmFIx7_V??#MB0(f}-aC%(uXuVYYH(%EuJrJh|DVaVd-$hyP7@iES z-p9hi@{?yZvI+bxtf@NAt^eA*butyE_fCdTO%G?&^w>P^E9L(vQ zOMd%XY}SMaXqhiBc+Qy?0m<|)(O&4;&SZHHHDu~dfB%~J_;`yucV0yy-a53j$(N%T zqUG;OtwHDTe+viy+QIrfOxf)QKN~wTS@KgxMuz3_M(olgJ(Pw0t~ASvwzf9CE~jO; z!1~^R#&7!J*jLGrH-egIB1Qbtr46zz%soZtz8gCicz!?xvM+w+kLLl?fM~hc<+j^z z$IJ0UApzO#hkMWX)?cSV21e(-R{-<2`=XAh$V|Wgr8SQqYT8+`;qOug@aL(s&m&Jv zv;_SvLH+l8{wfo#uJoq`-&l^hTCe?0vAF8;5fd&s!%Y3Qa0Mj*1pIpFilJ`3Ff^!!umB<|rbaJbOt zT-Lo4&Ba4HDI60LJUZperR%;(R{Ft#PqxptTv^BqScDMcqw@_k(I_5BU7k;WtV+nM z3NCx7bHWr{g|n9<#(?R{*)#t4zpfwd=+FD%MCjzgQvh(BScb*iHIL!^*U4x;rj`!08fpT897_Q3VgShrBjoe%IY zPuGbJYVso$W{?L7&>nf)Va}OWk)V0z->g@k%30nqQ>UJ=O&9X2FzpJLZjpViF3=IZ z4j%$q!!wjAg_TZoVD~Db+~%}4DokS&|5Dy+^Pku91-O{|-r`prD-5^RD}5r_nbO1FgK-Lx9ML-Gn? zSb)Ht9+e6Ck3Hu<8uOA{Nc(>3RP~vsD9XlJR@fVha;oB~dN_f|d7|8R*r{%7p;K;L zRHgXUAT9{oMe}f6~-19bV_CBfUNr@!q#S+)mkW8nqI8aYoyGHgViQKiw!SJgpeu6VBf#+EoG_ zznQo~vc=xGO{(;T?1Q~Aucv;_Tc0LMh*a)Ts&GIU7JfUA@cI-y*(N^T%o_i(J(Sv+ zBnNRUn^kkF8Vcef{D9HJ2H0iR;?K3kx267(bgX(1<~xLpbt`=wXyrh>uQdBIw&h~| z-^BrcjaqHUWRJEqrA?phG|OC>B+%wWN>5s4T*2YKno0Us`TNgWOvCOlf7@Ga^LCjC z`cfq4(wpPc96%hf8jV)KPd@jzx3`x<(D#F-!C>s#`Z}>Q%Ui{7B0xu(mm!VOy*rfp zyEbm@IcfeeE%4B!G*NM2fIgW2=PuKAXytR9LYt7+2U+*}-5Y~`pItnLhomvDu<&&v z)eSh>MZ zTlE7{)ZjmEn#ufp^MVpDp1dTgxAmR%cgsS^$T|JoP^wnKdfuDuLQzh4$yG6<Roli( zNF-Q$N2kEMoPN%oafQ}Ds7LBP;S%4QUAgB*bq^d$XC>GDsC7a050Egli#RXvrQMZG zz2!)042O{af0Z`>+=}OE><8A(&d8`F%ShdVoD?nKv_jt*CFe}6@qMVQCgP<8y2MTO z_1}~h^zLo-!gg030BWsblfQg@d))~6_3m#w(NYZ9lbhO@>i#dvM;5&C$Vcl2{l4Ey zQ`1O?0L`}2V3N%5Pdmq%La7R#>3J7_GvPi}9X}4#qwzz^Iz;?t$`gKb4v?;T&E7E3 z`RxPMo&z3;WbM+${p)J?Yu5^E0wI;@$IsbNxfBjeCtm=x2 zrWAMo?@s*3@|1vPBXm{F-~H{)dfo({INDmY;5T|gKsoDofX$^Pzk#~9IP!?^?vv6Vx~9r|Ow_Z;W{UUi|6OkY!~4AI$Y~Pu?-~hs{XVD`-%dW)3z%zj z9(zvZo4@PxYk&Ujtor_)s*O!5&g%(OD?EQ-d_HK!1~}@9OH0S-nH8R8{Y4z~x1Sv| zzqp@mh!77%6>u#J_J)ZUp8NoGMQN7+yq!2okVvQNAbTx9P zc-7v?c(D)2ul@H15@tOxAD1c|wK|kS3Iek4W&gA>j<*HCB z-XA4MWgGLTyXD^=`{4I4ERkE^fpm;tP^BR~W#~Z;d8_#JR*ki1<>na_8dw?PGX<%C zV}Jf?EkMj(E0*>L5Yefyx9$V{2MC+&OhI$iA||@yyEi-s{?;Ua%?3{oa03yX>z|{% zAQyn+Me|@-+OONmzrOhMlW@q$37M{?kJRC@2t8OLnN{LP8cW>w{mv;pGZ)Y!u`fi+ zPP+W==h~WSrT~px4R^TF1-Aa=jSRXFXmU>T^0}wb!zapq^BRR@U(zo;H=22I0N-m> zP<7B(J3b-hcUuZ47H1zUAZX4)Z#wbbPk0|5_TL}+(*c&8yQvRi$6b~`=+SMgkUi~k z6Iq!{XynP-oc|xOt!fC(3@Uh%bF5Iy)`lZ*;%edkCYt>%Y{+jOfa!or%tj^7Ee4rm zw)j}+eZR&9VD?!p@ap>S_x4nkgX@r!=Z*H$CVHS1g7cXtP&3r7p$Zw0#Mikt^2h;| z^xm(%{ocUXW96r94;9781oSx)2C4f2RVk)y;^AYnpyju1M8I~|a%}uk8IiYY57;Pe z0?L8m=LnHYWnPnw|Lw}MM*olz_h0=fBQBfQt}?9%XdKDbu3DKGwC;8-lk=|(Fe-B@ z`>wL%6A~;h`4}zb@`2~%`7U+@jL~*U8e3#CbJ<~vx>VNLs%!HErjxwhHA)_0CByGU z@k?Wj3oGw6?N?ggDBHb~DzsU|!)+XDWx&qzmi&LB+D$6;%-LZ85A3@@e74-esZuUG zXxWRbAr*ub?5%GhhyYnv`V(W9s@a$hdmny^>*DTxGYBlcGZoZ^#rOI1|5RbM-2a)f zBLZG>6_S->&AQ+jW2?s(sM(qSZ3xenH%@5^B==IFmhmD_Fb5v6|F8Pin#G_Ca|@@~ zgH~WsIq|6Vgh;2<71u9a;=|a|)Z(W*y?UUT!V+LuBd)OnV zoIUFIUM%q~*N#ew=@k}DEAsI4Yu6~N^o}b5IT>3|lSD-y=b*P2M=D$v`1BesgFryx z2+rZe-~f?J*v%FXj83`UE%+`DkL)kfh>S08xg~Jb2FsAM+%dv1RKEQzXh2!4i2=OV z(b@1u4drIwpkMkTiq8_z&lQ%3^QHzi$$u{DagGnGq)kUkyUl|c=DA%dCoNn5OBf_g z3Rvr*`^{?f&OZWAVNcL}+k;#NfrcqDd|QluH|#&UFdXl3@!*)lcd0V?eCvK}I-4C_ zx+>@kvBOSnaX^QyI8PYcKIZ%{t>}Y8PhSW~Wl~EJaN8M(o(s#3LCe76xC(vFEoI)z zf67Jo6(<+u{VEq7CoP@Pqs4$WiN{k?`n?Sd-U`5{AFEUcw)n_DtcVK82GhQK!NwuJ z;|gx6-AHQ^yXI3COx=pnNp* zDTKFqCXr9>!D8&@>Z0BB}k&v$VA0_8oPygCPGKTgZ5;$i+kl*3!+qKP` zV^z^(&-c>T^^0mnJkq#ia*CC-YQ*o>(;df)LB=g-hWTh@MJ&`5bkvqw0Oi2^T02Yl zaY+u_VH&13iXBM8#Mg*q-r*eyk%J_km$@p*F4Ay*_OIdU^SrI0YjfEpHf?5pE)NLh zqNSLHxY0y)h@ha^8e2rsCs^mv3C`eo3+Q0#9i}xgqnwe+@Pnh(LaoF95PI&!{uFwO zITo$~28eauN+At1Dx}n4B9is zwxDoI6ktLfMLlNf5s-b~z{4ZH!g?ej(>fT5-ch72AQEAzse(gpR0!RhDoER+x;~?x zvkC4*VaPC0F;M&)kWtNdCOgE`DsMq+ZDs*qfD{B2NE#jmuRR)VXUSDJs7)~tirN&4 z0Z*BGtZo?T(Uchh0ci{k-mP1afHr*uC?@5c3GwjEK42M4>35}qe5>5YsnM+4WuS-G zD<>oh;od3R>vq(~u{k=KWi!2i!=>i#X?{7^Kl9u{79Y0Ov0!3iZukg53IeqWk}THa zA%$iaG-&!_iD1k-*-}Js4NX)0TIkp9cMSeX&vm#nAi1#HRI<==!3PlQJ9GzXv=_3y zpW9=RQK6d^=?DLPG3b+IVi^zg9q+f4%U@vLN~v{4@I2j59nmF7J5SoMw#z*d zDvqlJq-i|1ip4;U3%2iV0b!hcChi&>b_#v$)x`*8-DX z;kCV*IahLp-L*Dyl(*02SaOP4w+ycMd!4rRW1~4Vq z^2f)cgc}A-1h+$~CT17lKv5PPv!xLCO%9D-k-9+;m9x~e_&(E)N5ft#Ye|bD{z58J zS^nApGYrFUAgeTHiB`%*BXoon#P@6IU(x)opm|f{xL4~Flbd(*(n2jl74F|MQ2X*U zWbWNVsc@tf8A&*20 zWv828BZW{l8iQ5id2X*Dg0Pk2qd$B?y|1qw!q}u}3Bfl?@?&pfI|2JvM?`gv!223* zFpY#kr1%dknP%SNK;RbuyNylk=1&!?l0mZ-ua;Vt-L4V^IvSAdRjXIgnw6D^gK|+uEK2`lTe0L=)m`*9DeH3fZ7%}UB;?Q(A%xan`7+H=&J`oo7GDe zZZ%B@N!4w`Qgx(d&cZ$=>7)ML=+2c2*~jZrj`aN8loNqky_no|lK(hRR?Ka7lw7S_ z5~S4XW9p+^n~AD>@a;q({#9;p^0kC7OsskRpVH<~oN#M*pEgXNVL z#>#?n?=Ig7guG*6+-QvpX!I)yMRKusk4wfS!&rN+af|qft7M~D7z%kSat}= z*OEPOBaU)O;#NRrt5c;Ozr?E3+j|+7@ORu>>%gvT$J9B?-&N~03loaupN+om`f@zT zMX1iDF{J^yzlV*x(DAAf3&JGMdG4(m=cr^AZh1Z5Wn5eONPlwzyObhMFlcMWZ)c+-bE61aVPzE%oKkHsnr4$rk0qCUyFjeHnEc@9m5kAyMmgiFz9p|{|B zVVsua3aU-^8bJd6oyQE~uBS||=BTbifVRHU-?|v9s>C&PEdi_p6+D+krjE(~s7>{Y zb~?Xzkl+2DH2QiULNnxk_D6%uX6M>XHhe=BS&ZL-a#72B=bhnsnZo505A~gT%9p#> zI91kEvp}|(#ktrR@EkL>JrNas(4P=kpAndoarhZLaYMV_`A#t$yZ!aHN2FthwT~jP zb`%N20gB6xy=3CWVo|B}h0ZcC46zJfve?-z>-MF{n$>RFI10hH-ohK=x)yg*(UKw} zqdPSVfq)*YDuhn1RA6+jGEsk;igvOC`<0sP812|N+W?95qN~f<32x=dD;Cskpi)T{ z0=_f+f2p@4gg z5YqOC1zeB*57^7V8Fi;u_ahZCeHJSKKwL+A^h#iE4=r9CburbnW~Ne!9>lx=eS%C0 z!rvivzCE)y90}^;dX~BoLNgkxarebe^}+W_M%`;#;tIqn^SEyK6HVNSfraGf*Jr-> z?(Q-tefaR7Xhgj9vCvJnNr~%1sAJVJB1Zm%JIQ75Dmy%76;)b#ddDssP#NNqc%GpE zADIXkH={qRvcY+k?6kh_I^Vo|!sp?o9+eAJ34`&qFf=ptJJnMS*u(5z_>cmS8b>1sv2-04kIV+MzUoK0S#0@&3wwwGJ@kK!8- z38-BV=Vj=FSjOx82vgL<9=vfT^4+!4kWZEhWG}CESD*-ILqQjM>0$E4k@c=6 z^;`>!t2_k^+G+_-3yk0;$?zQa4Y~)0K2NsTSZ$_8N~4Ez5j_oDn3Tmm$)I`7b%{w7 zkmPFdZE#+YYTFKc)cgw4j70XHZNpVXN;Uk5UVKyyg-2`q`B36PZmk=q?B^@ZE@bN% zS{8-?1`C_CzR`L%$|^o9Px?SN7hoX*1{e*xnp%}(@>8f^!RZqwddkC<|sLCPk^s?v2S!Jgi| z4r73*G>6+BXZpO?tzCx-OtK2*uL15b_63A;1BH@~Z?IE)eMrc)w$LDHvTqnXho^e* zHvMLH4ZtyTSFGkDV5Lq{lxQu-z#+l9kDx+F(#w_aPJv~V$mrZIbm_$$lN67OL4_Kx z4kN3)QVs;zz4*^5qfk@W=BI`RzbZ|*1e9nr%x|of-n*(4$jkfQPmM~T>Xk7ect@}@ zWy@rH%5w9-s=us)+q~kLPtXu9)9wPk$A#bQO`@-tifTUbHj>@33JHuCG^4CA?S6?o zDRN{&;teurQVWt{@L9ZDO$~GQ6}Y_&wJ*mrLBipQg$CEWb5_Z%CY(PF(x4^6YYgpP z102-o$hMk~^CcQf>fF_43d274^B`=e0k8Xn!_TNCZHF2X)Jh=wQ|5TZ2e?84o?y+<}I4Y*U=NHO`{6*HSM8EcZ~ToCGZx79JWMf~vA*X-0` zKTL4FMm26VI=fF=+#$v5;dv1>wB!W*+T-H=v+e!JjC}zgj#yx1ok4L+?&pK4g5$ds z7*Mb!$M}lYIj<+Hj_cbboj0vI5fdNuBa(edf@mL2 zf`V~LbLluJ_vEXLidlU$sw+*u`F!0@v4bTOtTX=D0D;IfEae?5Ma8&0O+K`3thDnX zGdOqT3$M+Iqek?c%z{0fZ)~@Zw!ty&O>C`yWX_;#6 z-5nE%?sk5BWFUiiv&v`C&9b0|Z7l5RJ%$o(6ymp0CZnq)VMrcvK}yGSS=IE_rTV1m z)f~U&AOvq-g$d~hj?@_O5+0ei-Og2|YD-fwKdmOdKIY*T+PUAIRnk6{l6TX?Y|;QI zjFNE}gjFC|E6sg2I#-A#2ZTU#@2IJF`^_CTBf)eAPFY#|P@EQMEvkX-ThD7MZaWOv6==o-5dVB)R+nS^> z%WQ$eb9c-XKRm$Z&%_VH`V9=yY&Oma-xtk6GO$HSy!fO4!Dr_gTIPh` zlAqQ9d(?1KCqg*JZ!B3l2`D4;3TF{RG8+Nh+Gn3l73Auo_+(3i6h+Zj^cUwBUz+tj z&Lq4;?{PR!FJ)9-TM_VXk3w}Z&E;`YFQ3-N*6$JP_ePQ@bco%f2ekrul9A%enSe{N z`x4yw#66($idevg^7D*nQS|ZjXpa9x;*60`LpPGD1{_Jt5JaaqVnKrq8UAes)U5|!0`sSu`UFVwJHY>O+U=JUDWyfbG_q7`$N z_tmWR`uWtLc*cxY^fMdd!vnGC%@vxY7t`>Yy)URo@V?_|jh{9RKvCvL1(<7U6jbh= z!rzkSd2&R9Nj1B1*gqj9_~_ct4YRvcTlK|Y69Y@cP{v0(-x=iOebF7H!2nz8i>vr? zgT2C@?9Uwu@a9({Tf(`UjFo4clIK7ztj#S~JR!p78u_N};@jID%r)&P$ZrNb*G!aJ zWBADlTEm&&pz5&Q2iU~Bw9L`I?<|=nvs_jgko#3(G;g5KhfX=9kmL&+R9H_}!?OaG zAGdgb*zL2AM=XE%%sclTvjHD33MVXXeb?C+xO+Hd{QM`89T2Bieq2tSG7+D)Q%v{j(^SH7|3AH+^}Z81J;;4Vhr#C27O}`)!M|hyL=ALPgDu7k4twB2ot- zM3HHeg%668*Ai4MExQ>vbv&DB4ygg}Cxg%4to(N~$xm!7H-4^S;x{27>e)4_=EKKl zc&-oO$22nad3KFd*0sUrSQ0^>`+SUh%Y}2(xy7%LRpJc`3$>H$?`kT6U_>EQqNNq6 zkNv%9L@EO6=sz4;Y??Vwy5>~rI#FKDl(+HvZlML-e*$p*W547ve6}Ocpu@S(sa!nC zBHb>|o{zkbdZd0Z<_KwGru2!)Za~z>{@W|SQGNUAJ&Snkb;>27M?xF3nK|892_x9{ z7oE^yk2J`XA?5$$?K=aS+O}>L<)C;Jm8Kw|B3-}(0s=y?01DE34NC7d^aK$V1p$#J z9qB#vP6DE$^d2BU=q*4X5CViGZ+q@N_nrHB_};(gPfW7co@?&4*P3I@F<##0d>fg! zYkz&rraK-J`jF5$o;yKhqlIEQYGY*uO&KAAEnN771V~d@@gOqP&vR+azm&WsbFM?y zR&g9&BhXhUCAzWZ6HrjgEI8mDF%S=BWc{vZtI?GCR-;$GvWQDsf^)eBoE{ zDrQ3+IU&+p*^GrBA38`W?-Ph)KIub403q$WhD= zA@1`u1eG{OMCj;N#}ywnT=GC`z|5=UPZ`ZFk?}{v=GDqqPh#6DWK8`!=x}Xnr=)mp zw)w{&d9SCklN44p>XRL2t5}buU<7*rjF^NIUu=$`4FH@6{aS#`GA!J)|I4=hKZFSW zpQIUS1*cysl>fP|1q85m08h@QF#P9F|M~X6xdHzlhhkN_!Kgp7Pk-hN`BPg(MNgai z5lg=cWc^@@@!B(_l4#t!NS@Z|tp0bHtlY?fa?;3<@ zsIj-Vw^qfT)wRM$auGjCB`GOagi;70!=%k;LKBp`LQVnijciH;2UL=d;-OyEETHjI z6?Vq+tCAMAOzNoQ_?iuUpfDfth%Hq`&WDHdZcYe52APxLD&AO<6NZvGip$K}RkCOM zj?7v;y{qdesbY(RlO|P5&iVk+IQ>3foH8cQKyMj8&J4)MJ4b3S>|G!(tbaNBrXBvp zFd4QsABqJSCM)#E1Jmcybft&!Tvu3+5;VWT1JF{E86+-BsXOEqng{@6e>NQPztT*A z6||>#qgLE`0t&03@r+^7{BYi_S;xOQ+pS&oL;e%yBd4X~eEvu)pj+k>!=x#AH6t-G zy!+I&K}$s85s_&TWO}q;CH?m10B@8^Rig9hlVz&U+jx)o{frN^g@o?_#iaPl;De-3 zaV?ex|NP1PH!W2w;!o1IFo8=xjtH2zBa$qcyD)AHe4SKH$n`jCEmbHy#cv0CHlP1! z+I;;SR(pX>Fe~*WPUu0LdK%-nbxuxZf z(_j86?0Py10v@`b?MTbGr^)cLcyhrM<49?4a^gr`>R5wG++B1rSFu|Uyc0ESjvA1h z7$l2SeFjgtg}=yjh9nt{|JKM_lD?CaQ!V$sSZQ*B^c5B^=d!j70CHrFZ=>y5?IvV@ zh+wtit5>hQd#t5Mo`DD7EaRi2>p&{^=8rRgT&e2m)~fL~CT+hF1cwmR#V#TT?VPD? zYw?)pdJnsZFfm0Zue<7A2)L4vBw5&3U#PNxA4j_NUvxcKVP!0y{8qB|Nfs_Lyo2GT zIwzQcTD&p#>{!fFg*Lh^?1v7e8tWSHoki4W)nL7GDRP8-81vZ%3qiN-Qt~VTwThZ* zM-l0^BuV>AW8YZ+A%B90n3nw)1q#MCRa_)mNqWbd2B|lpSs|)i0=Ci2l+72+ff9WK z<5%ofNIQ54o-fEEUgz#=<79L^0==M!HQSUYXTWSO8|6glHRW31`73=IzD}AmOY&z> zCOWyHI+5#TK{=9uMp+*h(z^t5Q%O!OG(OI)<>T~QWNs`ajq%jLzei~xQ>N42 zj*ZmM1uuAiDgM3%I1ZQ;=>%|~pC)$)hU$kLK%7ZHJ3{n>uaisZLAK*ry$A=sE1qS} z)niKT*z)6lt?z#$#9f5|?_l_gfH)k@cUV&`yIQ*VHlM0$Z&lYfXW{OM3=QT9RGB%?< z+rng+)z@^DY*oF!iXpI966&?4=|_m`RNu=ID)52)9aeKF%Jt4{M#TyA>e_o{8=IXN z%>%=JM_tgA$!{{|ek=e2lDJEqQR*z3@Fr88mN;tOx!BB;Sdwe1QEBV85o|+I#X{Il zr4p0z`~ z73@HTszJlQ@H!X5lU~hwyaVTFADaMDnOVD|9i+eAEG4NjvyK zX7GbS55Cnw&&6x&q-tlO^;it3oW~VHB*9}AUQ8w~&=thU81d+_X#t$^e{Jo7nxAl=kU-1lf1j*yCN*0Cj3ctl10Hp^(Ktc!Dk z*ZReRyarbUDY5xrM43eiLTp~7L1%pRAJ?_fayfhpqSz!?O}5Z!>pjj|f%_B~+VrH& z5$$XHUnAtCruOr@!F8kXLG%d@hDme~&SU2uEYWF`(oGCY3yz7D8(JMHSRf8_(MH56 z!(Ol}Qrdch_6QCrzdSDNi$S#Fs=#E=k|lzGY)tjZti7}*bJa`OKVZ7Xe4~T`WnbP> z4e6Vnk@R2lp>)&GW)3gTMal4AoY&Y*iH>O$-5TdI;CQbacw4THJj& zB)M>Tl1wzBc2{46H#vgH2YC|qx|p0x4yJ|bhMz3+=jWMHrHaAPIZB(3u}E#U2rpNL zhjh55Zm<>g&?MH?SuxUVMBZnoA-i~3s9K#!*gQcjBNNB%b0XV*Wi*y~pXOhNxwX%g zC}o`uJQjp$jva421XP)Kb;!(s4DZb!zinihWJ6C)DTi-1-=`rsGDqEjBkv~o--DSC zwCC5V?>yScyxKfaCzT&}n7@{-p?{j0dKi$TVL$MU3~`Q1trc*8{S+YSoX9pV(Ao!4 zWxk>Swg?|?eH|N_xS7SUfo(UKLlCi_eaM^#d(I;jep=6Avr)){tKRulZdzJpa)*&- zh&zXJ$ko`MP-RJh&4Ma{PhDPqYjOSntz#kdanQpT#HVIrs%qo1zRPIDs=G3$<}+5c zDYlxG^_Mv!&x>oBOB+_q1026kMw=e81()`miwod{Uc;Lqhc}Rv#0{lNRAr3l^1=y{ zG5l(SjPeF_O%b^^w*I7Km+>2~r#g6y{CJ3>sjOOU#xs?Cf(s@oG9U^5V=>BOHQjwn zEm~Llk7QMHSJ%x|&)@yFRQ2*(!Y-70E@VJ`%DW|9oEh%^G30OR6{hO0(}`a7(`t|A zHJ4wS&swVqNUx#8HFY?QHKP<{tGA!l%z2yCU8Oz&6l$cPOK)Xpb|htMx)p$y|wc07=g10+#e3ZQFw>mtX=Oo!bDs>cHfsD$_ zXRsG&28(hX-6}&@rWZ#P1`U*LIG7l@J?) z0L{qAh)5Gp4n8^@VK2t1F+hsXyR`Ukq6KXqLC*ZN=kNJh3+<0%=JbSons*JBzCR`5 zHk3+m%UGfOl8T&8c4Y5{?8hmKJKJBloy)Nqedu$v`zro=x(H8Hi4>=<3+HBCcVc6U zi;wGlp#QyA&}(fJ-yT~a*}Z^r9V$zcb)ln5ukUd?9duC-m3#AOHppCoJu+9C63(un zC&k3Y)=KGqYv=5sa^CgI?#+TP&Ab+B94CUvoQbZ_HV$bi-LX;fT(-996a6S0l*BFh zboNF9WyPwtG(WYMg_^A5RV=2_qw>o;CZC1onjQQY;>GqBeK5&aEUp$|cgk^rBS=`* zBPmD1g|!|aJD8f_2b1F^ESrpC)VQ&#fsd~*1-w1b+iP#yKeHZpf$N|JJLB@u)v2GK z_!z0NRp5SqJVn!XrNSv)6`@~}6t9;;B0rR(LByR=$9hi7%O=zG)2qL(Q151wk5Dgx zIE+t}iS=l6C+ewtNDsy}$~W*E_%21#jh0EtZ*rHST^sA0sXs1(6}i(Y!<7A%aWP#! zIl)@}k0_%b64G4<%|buBCCF0IxFCUYzpW3M(QC#93Xs8XXUX0WnjH`B%D7(Gc7FZI zZ|Zxkt|b<!Y2dV-WJMv>>L|Y;ljYA^KHw6dVQ% z{dNj3VhAiR!ti6EI}cY|`p9n#bTxV(pf;q?(V=VBD06T9rb2fVlGL9-G14o%(kzkD zlUa-5at>`c_klNpZSMlUVlepvhO+56F=rRT%RTjMP;vt{{73WSjDBLwL^6+uK#`pn za)7ho?%w<@&}V8QoeMr|CbDRZG%%e*6X9IS! zi)I2M*o=5qZ)`tU(KC0qf1rEc?T$Af3pUzI7tVZZ$|hXR^xR>64UTgipeaPjDebt@ z21sa|9Dm9oTC?NhH{F(ejNVv?(0%5sz40^bYmBo=^-a&~#lcbU z?4h{;5pRY~h;g;k;!lFY%U+)e;=7=cotpb&+)s##USH1k-xVSK$(-ePrCU_lW`5sMQkW++!=rze2cQ77P5EM? zY|;pryX*w_Xz;0r?VO-~SG9+Q)2rpm8?GI+=K5p#5LI-K+WR7{&1QoYoprJH0^-cCx1f2c+RmyK9SI7C1ZmsJF7Y+J(Nc)S{{{x!!Y$p5BX)p3J`$D zDlAQ0i}ZlBu?#71-cWL8@LiVHA#e9CGyS0BT8*t8GC7~bb+7lEEEjBLyLYLv_M#Fq za{s(*keXAmNB>x=8Y8_yRUma6M@f;Y8&VWbf@6J9;(?EQVU&{a_mTovq`Wv6SebHs z226NAb%D#iAMCJOEv1h9Kw5u_EE=TxJQ%&=BR!P^ueY9#ktavF*B-y5Ukw zTzk(P`p|xTppKi9>TQ3Q}72u>#(%S4u<}?{F8)wha(V~xOH*?v+nO-&8ALLGD_qqFwzD&|Z7t@2N ziXuxuUW2~O^)@fc$eM3QM(yA(pKeLp&`!$_xi7uN0Q!{dJm-PI`nD=@u2wx-Olf$H zALlAncD=Xf^#C4)cTSNou{R0({eJ55kj&FbPUVz2q+o3`FJ5kauZ_IyzTgkS&u_p? z>>7C&^xB_Ksh_f58E^`6X0tEti9T=0fQ~VW45XeJeB&(#?^kpcYTDnhh4qB|E>#HK zXnFCeC<+1G0gWm!NvLqv;B{O8}7455yX8>fOG2e{Wf#nR1Hfaag@w&#MXwv^^y({g=#n|Cy%$ zc%a#9-f|u{q>alm{%NA);^FXIvCBy(t<#+qqK;GI$|jV|%>JeL1*KLNx{U;~^mqkk zMQc~xIC-yZi)a#Iav$bF+tMl6p%L^LB_i*e-;%48CY1B!l$!|T9{I)Wj_A`MT76~< zJ;6)EgOBFV-x=axIX``t&?eTN^X#{(nY_JBV(AqZbXjBdMF$*97~k3t!B zo{<-b>!-ElT#_mxAH00*UoEy<*I5xRqp@?d_z|#G;A_{IAK&VOK1;R&T9b={!teDi zpF=w>0w5*p&aS-|utUn5B#wrA+a;)8kLg@J#G@p<8cUJulUt^P+1;t8Y`H+`NgT4b zH@m7BMmqShe3~ND{$#Je!E62UejvF!3bsR;N9K+plv7cqs&s+a>R3!(&oO1d1_DOofR=z!sjU%>}`1O ziuMLD{k=2X8pvl!dx^iY$cDiRt^Ty@rzhZJ0jcq+sQ`~|X5bOqt0XK+4Fh z)FqF(AZLOj%fZB6`Fc_{KVWKirX;wtRi}NS8w{vP5BfUS5jOZH3C!b=$=*nVuW$p7 zh+D1`W%ml2_MWy|sv|$sO@zwBlB=D}J#P5q$E;}!JOnnbFA3f&TKCV(_9Ijj#Vi+t zU=;%o2^XCMCKo6M6e`K3@iUzn<8UegW17CmJI|w`E0yTnfrDQd?nXJX)y`!!dFp4A z9dzJmPRVA!t-e%)1b>rjiISl*ets?&!M2#H#}9M>3?7f$8Oyy(U|XS#KF7}Lnebo< z@vqX1BJc+N`M$Jk647o>{mWjED*K(LFq)|bcz@P{CGjoMgbF30o83PxfjJabTQo!U z9zhwK)5r5YtG!l&hH74g$L~E(oV&cZxG)CNu|1F}cU95dG3;NT{)Zk{%?rU>m?u?0 zq1hnX%ry6f&B#ny$ii;&KiT zH`we{Gj;TD_@*!4`Qb8{KP5XkpRB@{mHF10xv8ms>6H-EF}2;MArt9fy7ViHd}hNp z;H(W7fbIc1{f%WFB8;4>v6je+!E-2tuGJPz`VRZ?2yLGEr&^r#$y~McnG<`)yn^)O zQs5vtpdgO-J25v5S8pYC`Lg~v=wQ^Wlkbce$ctstq)!CYBv^7p`fUqTo3(4zSE74( zh>NJCi+5Vp)?{ZI0V(6&ppU#CO1h@Wq3IFZ!K9iJrjse`pMicM#E95;&!>2DWxbEpausHoxK>SI}AhPhkPh+reJ|Kz<226Pd7Aq>+5Lj)n9vS&B~{CM8taN$4lcfQprbsy9}RI~>8{lpd7%dNu2Z>}dR z3j=`JrC{)52KvxnHo*TLM`8AJc6az_*|RTU%z*#$sC!{T)!N$HXWiyEfH8GvZ*T3t zQN{KDiz*U6*hw8VECt1rrvC!cr;=Rkjf{+juRl*8Xe9wY>VwM14*|I+4D$ky&&2bx=81EqD^LJp6>V}8XR1PV_kZ~H?eOoRld94cF|jA8u06O3J@lLc=`DF+Ua4GF$b_;PEM*{?ih@eI9#ZwX#80GztZaO`6j4m zv7%iWC13G5FRg;dXVQ8l+0{kDVdzbEf5DKa!E7s#*??<$>2|9FVa4(?+Qrd(Zzk^1 z*H1^Rl>l#{xCQNMLizHxrpm{)XhmsG=#{!)6hZ@D(YJ8>=6tom_?2`)W$q1uBLnA{ z_dNWk4ZGQ*q8ebso`yKzLX_Tk99QX037IcE>cXe_mDa?nAI^RgDE$D?TE?(Snn&LC z`S%Ktx0h}8iD;v}@7w@@KA24#i>DouT`(7YEK5DaW3^BGJxYK7p$zSlg^@mA#9VI{tkTbObRnz<7QSvHvi4p$~1l{952zuN96G6ZH6G3O> zJD5z8a9wvj4R6IBAIAF^gj?0@0AFj@g~|cF;lkILh{l(5{(O# zc7xqpj!x7#=O7p?IAVV{fHVg$a9m@%^G~{;3d2mNjvw3_H!t}e(^gYBhVO9JBczpi z)2@lhc->M}H9_Q^xzBpIpT|tm6}yuHTmBRuA6MOEK2-ZzK&N=R5qA?xoD?p3%qXh9coVSnw%rw<(}QYunu(Dnc@~GhLWe|59a_k;jg%f$9))DH zB>=G1yEf%WBSS+wGx)|_P!N7#?k{XTI0|G-?fGb}njl>Hnt)Y|jO$9EF7{Mzfu7(~ zX~n6@jy~pt0M@LYDnIyJ^R0;y#{vFC9o>4Fh3cT0%&${BgXN6HX36@y)7^5aW^JxI zl$s6b0orA~wwi*10QxP(9}kJTjR;IgO}6jnd8iNihlng`zHH2&5cFOClH9l5QFqzK zgBRi@_H(bJodf@A=kQ1^xHK;bIV*s;;T#EYw2;YXeH$qZfps&r{pR zRva+VzT;-jMDQDe-Nx0l03S{<1cw(9lP zQ$M1?U>b%q^DbM&maymPj}-x(X>0kVJSTeT#S&2Ww(#GH1xES z=p}FsRzyDU%dS<>O*f8nu0cC~Z&wp9Umo#pW2u>BNsdEb(|Oh|xWg?a+It{(P~7<1 z+xrV8K<`t0|39(kg2U(m<7e)8DM%qRpt89_z?#^Ev&4@SCk|hd8LD7#Yh6xB`EI^1 z;+qEYahb10%tu|eWTTc`t@-?eHtbQn&MZf};sxO>Ure!n$;}d_vqE03C+5}D)=-Po zgCdZ!FWpsQ6sWlDjwYLWqLjV%{H3R6)*|ge)Jpqo!Z{OXmt^OmhAtiZlTGGsk9<-Y z7nt{Rl#ypIREH>yBMC#$_yrmBf!U$Ag)Y5F{h?zh!XPB&Fg!5De)t|L4a+3dSz8!#7^U@Xokx2vt*^hNnmHpIZJiW5 zQ~b8qr}#n*lg}C(rjA!1K3(hqPs@7mPS^)DcAKf*#W2e)t&X}bztP&o&I|BN=^Jt^ zEnNBKJ@Ve421+8* zEFH@TPOr`ZX38^aZCw#210M?Z$U=f@nkGVaxM(Gs#$ z)mZPC@x9IP+L7Oi%qj~~ci%+L=x7*4l+@O|koI(%dJ8Pcl@s+29KIIwn%fgXysxxU z&x~uLt9i0gEL`S~6-{@Zac!E5@)*$KIWa$I)8oBjX%5IXQU@uAdHfMk0Q&B`x|N$z z(h>6jT&vOkj=17fgYgg#u>TT}o3RSOC(f+t?$5H*RuTKHd6I{z48reLHwNdfqb=OL4v|7~mvr$aioAg`ZUfnyB#wGrci|93-38$Hp_UP~ z_s{Yp*=OJ%%mU4+mb6sUpvML}?f3bk&iZ{#W7~bLMzJjnQvZCQYveN8lt^gY@F=QQ z@7A>!TmKa!k+_kOL26BvHBpmtGdg|<-5upFhzE-LWZfXe6GR!UieS>Rl0DZ8V*ho= z6(3p*0J*>Hp;7{byjJ)JCYD{$PeU(WheXPcuYTFtoo}2*c=Q`&-;h!7ud|R+X})s| z-hX&DQ^{UA3hO#MK(W(>WZyJj8(e(|Gr+UbF2oIFD^^0BeG)Kt8-5RPjEy+-tpew0 z?Z*HbdVeDG8x8$%F48)K3z>;ZE^RmuHCIHG>a+<*FP8+IdR|s{fPd@Z zLXK3pQcJo=7k)>gv!c?>w)N$AmkvwJ!uJPHeuDF0>YJ0ewg#*Cq$;1yBG>)Gb`Enf z=zCt*v*;b~&mXMED9*2nTpHVz?)tgjV5KH7@+#fEt$lZNIm3Yn*2&xNU(54q?D6ri zYgVeo%1@An&Xd|A!f<~5M*mZELDdYcH`^?|Il~H89$ystcBrLJ7Khhe`yj|?<5`eC zbN8Aktbksq{29({oHX4m^H`UqvFZ^61E)=TeISK^9jSgmoNQC~O4UB7^__v#j>AOw zsH_{DYVK3Y98K_Qm$A=j-mO&HaF+eZ7@bJz&s@sA!;>zhugV#N%91wL6V*dET=Tem zvV(fkd{-o}LF9#z40AIuaUZ30P)qM`1~iSxIlrDH4xQP}3i!>W+7RQ_BAdWh{<2Z2#IY*io4<>$ zPumAZD;p<7eWJV;54BsWTkuj7Sg-vtXss+iz78(J5$-Vy2YNA^JAQ~D0{~fs2pSZ> zZA2!xJ>vJYS(;v3(AoHkzEvj!ma3y7IV3^ z4ZbvDDkuE}*W!zIHZo|Y{jt27CN{o%J=oS9ztmqopEt2>$p@%{OnN0W?^F1^14Ba& z`SHNQP$~hyOdPZc1j!JUrha?~4lxEJZ@XgB%D_ALR@=}6tbSu-eeIdsnUtBO*I&;r zhD!eipdgw7o!;zXya;4Bl%?u+PS;{ zq`oJ<(U|VklF>@Re9J8rw|j#zgEkR>7k31Yl?>eh zd|~q|htxC+Gl~bGR@N*l0=MA(-wv*nwTsA~CzG==pG9i^MD`Sj{ZU`!EigmRKFu_ccbJv5k&1U=wG&87z9UWP9wvV@a-(L&uzO7dJhn! zXeen=lt)t3`yN`;Y9L!nD>Pc>cH@gBAXT!g%l5DG#wo(A$}nz@F3Xdpq*L&@Ghmto<{pOk!$ zXdLs0&uEYaNE&xY8}1Z~y**(1n;N@R71C@PyzoX`^mOCC_2hW9>fuO~aVa;p+6NR_ z1$ls)VK%9ms#=!5iE9v>2ol{0+_MK6gE`z)wzH&}_1zH_99t)$VpmzWO6(*B|9N%m7x zX0YHO9fhU6F}1#;z-_|hGWk!~zs=7Txu_jrIm9P#7B0it1KPjCwR{%9YFC9%<+%4( zZf)>^NACq}IPBBzN0T^km;3`BDAte4#%(oyMT>ej^IkY-?^|^jyO*UVU^kRjM)?7g z8vj-zxzp$Xdre&w4(iTQaCx25!=*iHcX4cV=mw@fRt~!1cU$aUQ6yv_2X#>U`)|95>tZTk z#+QP&bxN(cN=K4*o^Ff2y-n-~#Z*=m+HA|vo(Oi+rPdg-OT{-AY9+kkM+CqDh}zl< zZ&Tx<_2NP-$fPHO+0|uh9^BwVDA_w^BO_Uz&P{l-a-C9NOkulVZcb{WwXdq5s<^Z| zfXt7mG!0{3=Q7LG!M-E}aQehk3+qo-Q43NdH@TacZ{vK`rI5l^W*ls*m)>kV>OWaO zESp7>1UBcErf!o1&yHtbIVk7phX9seGQhEEvI7*P;z`(5PA3iN$wbPCC^bb zY57ZqkL4xsrdg|ibpan3`u5ECZ@;k(U&z?uqR%KyQ(_K{489^&V1H`!Tbihps8of+ z1QB$=bSGe~F4f)x^-vM;MO-Ngdr@3&ZR8!vP^KIeiSk)E0MBY~zZ9Dd$vnqIn8I)Zp+9q(K>S>2r@x;69Wm|#3>~N{d??P z!9O|op`MOopK0Ie#j*+1+%(gVy~yVcbUidQQ3W~7EDm1i$dGUjNcnzG-kY5QeiLqK zgrwW%D=ko`X;4$*C-oCKu!jAx@U=6j9|JSRs_Ru7C{iuk&Xoj%&+c&>kF(ZY>+wPI z!Z9)ikupnSjtgmuYBua0Pf5((7u+YF(kZ1~Zr1ullG@x_T5E~vB{EVR((RJVkc)bK zXjW3HTPeqIb>n)~dOU)AnvHdhfu~BKA5y@5&sFm-P+>$DZI8ju(KcVsR2NpuE?W9o z2J&W9=sg{3{i`tbu;zbo{^Vq!0M8++)MR6#-!sO%+zlx(j=yR2>}-@w$AGDuTn!Va zj?6K36TV&IZ7B!&njtUg43vBNxK{mKUZZCMeI_gJC`CgZOiT1P!8EtpL&Kmrna7liA3!iKl`jW?-w;GDDl4=dPO zn=%!-bHH4L^2vZXJ^ANJ%Xd^xXP|oj*+6687`^IZt)~3 z4wB71MfJ=cE{;5{5dY}MZ(_#4M6dC8VYw#8#(MlJg&j6I_*u=1V#BmAn&`pD-~+J1R|JrP~Tx@L761&5oyDJKy|+`UIMviuINM$G#QCw-Q31PLfhP# z7}JQru>sx9p6{#Vulq!5=y4oRD@nIr$1x+7`ScV#Y|;K%uPmqEcwS8Z*6s2VnrLW% z>AX&OahRvuJ3Z0OzUfaQ68$DM<}pg%tp)ALQy=q-Gp~?(oA9}~V=`8_$+g$BhnsN_ z`N;5JA+xKRel&wNU7N=Pg&CP?*9rE>^_sVZ`_97xz8XCw4_7H>{e+e)3HOx%Q#&nx z4rr`@j!WwJQ;AMN-i%mbM%YIy&>_B2wHEK6^BWFy_^g;=LP)Rga;mKUAE%Q-{^@!b zf~}MW4CZ}@OGN%G&g<;?$Ib=J4-!eI<=U)=3d}lh{~?$I98BW?S%aTkJBQ&yqk^-| z+vA;wFAIwVyEStp<3oNq%Kp4m*+oFm-GC;_%%EAJ`Obd50Xgx`Y$1!CCUT=t-l||u zAVD^mq@P=AL~-i#<+e<@DV?3kploXJ*2Ab-rD?d|P_ zyk^#pYLmaJNj_N!xYq$)o(-odN<+l}jK4~BeJ6C3&ie;e%~dZ}p~x>0F_=n~ktaVL z?2cc)d|AH_0o5`m2|j+3^>={kzrrnO*3u0v1Z?cSU4xmfEERuY%y!x|=UrJ@p(x#y zUAZ9?xGGRti?KNg{OwHKHVR8&@;(IH%?r>DOO zAfg_go+WMrH%x55pI7AqP2H50)f0W|{f~+CbK-O#w&Zm5zX81L1|`v56%`eQipM}e zK!AqC+$fqoKR-WM0q!YOaYGbxBqXJ+dNsSf-!1?uCN54EE7m9}5*Qor`T)|wCb&FT z@jZK=d+YQ>-iTaw^*`s%^OlZNFBO`#7hd83FFUbzvq4hspI&x0K-nfai--1zU?^Cu z|MapeD?VqChHoXgF@9D%-C35#a})r5jHZD1{ejL#Zql9gqi7Q66*8^>@cP2B^2r_Ri8TawGq_@c+l5Bo>ig#z7DO zdn0JMthjjF&Ge{y3ohh&A0NNS&J?d#1Q8lZ`V&d#k_U_&qj5stTFsA`V<7l9GM+cf z0|^hi49gpkh#ejQbQb`Vg`XM@3k!+y2QLZMX19Ko2K(zVDhyRPHDqgL_3=--NI}tH zjjo6QSCc`Ryp$A*w^yyQmJd}4G-(*SzyvWD$N$Sm_wR#xU#y`2dMsXTdu_8uwb(h! z6q!u3U%=U<(b>}@qQa71{E)dIub-e21N^fL>iPoSVMU!y z`G8ypYL1m=uftuVFr|8%>xRKm=9Z8C{LX`kJHvX~0F@?i^3;*b@iCf<`67SJ#rF86 zcV+Dj5LW>BUd>oR0Icw5`+Mg|_BBCpINRSt{};;&_?yDQDP8PzGYv6a{qcUn8NsEV zcIiSH=@*xeAKrOXe3XoYpizdga!vb_l92?1f~eoT<2pK9k9fp_U(yWw&&w5fT%01k zWG`3!-lp`=DQ)|CzKC3mixk_eTPIMlbs9*HBb z@#JdukJAF4Lw6%uz$Rx}ftLIp13Ux}DjDmBx>R3qMdJ^wO0zmoVj^?7p0?jFvUz}!l z2CzlrNgAO2A;cx}tKlMpTJ2l25TmivwCGP7Y%fH z72gZ_joAT{BJH^bXu^?tUW`@Rn&8+2;sSc?2Xn`!ZPP1r)spp>O?Ce|h=iKED@++ZTmC9XVRTpfTQ4)DK-3U&kFUcsgL-PdGEeEFHmnQCW zHMvgSf~ESYcK2|Z2bSGwHySKr)(rAn7D8NB_FmI0=oaAT-)x8L6~*V|B~Y*b82tlG zY9YHc;#U1}NqYIt_4W1M<3DU;M{QRIa`bCmX3vF5VJ^)OrE5I%E|PNbQ9+bMhq-UC z=EIAo@IgQ&+7a#4s8-L}=~I}5L69~AOzJFx*UOhU^(ulb5p0gDS7dQ7Jk6F2U!)-f zhYqC71KPZ&tZhw@`v-dYdOXSa;RMTK@6_>{Zb_4biTCsH!a%V82skx99d=m2;XZ#M z9&ohHezfA?&*&JsD{C0e(yi)hb@rE+V(dlW4HcF>E9C!>b|ddF!4cH^y}UblxNJnN z!YPK=#sHUWQw!Aqr%QW|4GS09Ws}c{$^p{fiSF2k zI3m6*f!u2uDaY#%(Z(=WX}9RM9vmnC##`N+sTl6GCj{SbpyLR%NF*&E%tt3C9)gsI zqloeMuEYDD15&A@2Av>2jT&XH%kwz*h5$QOVPhvGb+<97aT?$Sm2R@1?Qb_{#{AUZ z40WoEo74I_8JfIXAe3 zO-&vO`lhni6${C-MAcDuYI7tv=bTh~yDDBZeI3Cq%Z$|6$2*t1{Ag)b|HJFE82i4b zmV$hWm|P`4KluI9YgD6$a=XlkOY_ZSWK~N8auvT>_aQ#oI#Hs?dy_J3@S0TP9d`PC z@5es|e*=k+!bk)u5*ChxazuQS!>)-JLy|`*#P>^Jw-s;1PAjIQcC5pki_!pCCS%5N zqf-rO0p8hZf=E(N!0zswTC*i3Exzv(DD%`?{Mi$GfD~~|wKJOcV#c7|0ot{>&8B`j zw&NSStCelT?gT^`WKw4F37l6;cTRf8f=XVtjKp_Z0pV_z?LdKc>(ur0)H$eTLBO7N z-7kTTN_vYK>ji1xvFI9S%e++gBtUvwgi=f4pNv%6DNON!8MtoY`x2mOLCtb*P#iWe z@9XDRXV&X&(`(CJZZ~PuR6A6E;_x5+G_tkK&3%tz)w`k*Kc8+g5j6jR@5Q*^;902C zVck{@^*D*o?`20p?*8w&WRmN`mB6!{da3se%%QKGk!`z$hyw)uE2-Y{=ZpJWxGH}`BXt$>qzmvvs^70OE@&g1uP;z z=*j``ukT_U%3PT3c+kXFyJDe026=%MtO%nn;YYb9SNL^g?P$Tav9h_F88gHr_?nm(B_i9rEiGc!|)JpZd7{&2kTbfBcBKt2E}#C5-zCtY1?b> zRzKE*7DSDN(`btiV8yz8HCfC$41$FfV0gwnU(XqMjd^F)@Ob;}wJJM3K)vm2%^BC! z%Ij+9f;z2QMU(#J39uvDX}bCeO2qW`+{JnoX=T0cPLUquY@$A;Iyu!3vmh9+H&tga zJ(T%|{6FlyXINA1+AXRGBA}uIq9EWaN)@nB1f*C10qISpL`9^7^d1CMLdq9PKI)2K>_@s* zc8Qc-f3`d5>FK#Tkm39~cbd>oY-s*O^c|aOs5Pq|mqKVO;4k2kpW*vX zt;NJZ)z!xuHvl3Ae8AP9DAgXIxGG+&kcY1D?~A@k&XmLa+}pAuPDlk}-yymsotzp~ z`|}O|0}GU6^{Bb!51UWloeduDH$xFE`f8irLCdd`UGM-K=EH5LEc|&`1x3%d7XR59 zgZc?flUO+YSDj3LhCdo>(AVMdEsXU+{#>m1_LzQ? zv*ha;^NU5rQ5BRacMzkO*oc=VBBZpSq>w08ily*0nPSF>)eKcdt8wDIRWNF5PDtxI z>;hDm%g%4j3P#m0LNC3&#bC)2rFp<2Pt@Cc3&X{lSy#UZ);-)5f!|m)H-cyrBfxKS!E+Fk-!lLtXv80`EAi zQc6z7sXVEh@+c13Ua(NKv2^Vvz<9u%m;bgOV(5}8$l{gf4k>)>S#@=ko*>y=2~XI16iUB>*BQGZaK z2`)B^52*id?LodClPhZQnER1OEp=YsS3S<+_0X$G(Qg)Yltf@GXSU$8RBEz9<4E6Rts%S#qKH}Gj%Kql{4 zGY)L>;gMaZ^_}1=8);tDohCY$Xs|$9w@>-|TKB2;o((v0&)MaN&~=xQg5KS8o{fhks44s*F}BXV8n! zLH)%v%xQMC-5TefmFI9(8m3lP(?be}?$K)c(vf6Dt z3dXIaSf|xOfUTWbWoqnm?Hp*SjpQik5&dl03UcXzrlI3UL8Ab?5WvhwtW6d7NgR?d zyq~g_zE*8G1J-(24Cp2Z0d_p*7ULd7?77_cgYy#-ch(w^xh8v~xdM&f`fuR9DdZmf z{#wV{QEK9F^J_CUsYP=OiVE$gRw=OS-f#G|6JX!4y3LEJEcYLL%23GvND8ECx*sjf zQ5P^`|Av>!$)5}>;w3U%pZEc(39+SYoeF!WMZ<7@ayfIlbP(NB>njk0OyE3 zS)~Q;alf1rFG-<#-$JoOgE2PVMBLu^Tn42F(7Wo{@Zre?4^AtUj! z_+Tr#W z#Gozgk$?)08^`I(q%aqs`(kg?h?-3@HcjKK*fq~vRC!lR>iJsDZONAza*WU#r_mDq zbTl~*=H5J-dA<%FuW+ns5VM@NFLl7LL^DZpKymdWYe*{3>d~7%hZ@IjNvi->QLtTw zyDJI>?txr)G?t?(VXTPjtI3Pb^^P+KoUvKW2rO{s+G}Ps8X@;m4F?018reMEo0bn- z5|gSVMKip!o#!(4*Pi`seGT^B2Zhq@SgSEu3-_U~6;ohbDfnUfAwIj(<7_<5JXs&d z8Wr@;q?iQxx{eQU7g#SUSr=JApYvLcApOpW`$KB3OV^QKQK^Src1KGwS^F{ZfDzR$ zd08(_IQHfw!lOdCB*NKxn&An#U98b_n&=woNL<@>b}q-4!K?0Iv&LM>n`S`}&rb}$ zg^^)>w&UB7hAGRt8g-v6tbLd>)}}8TiZ6K;J}NCzQ>9txQOK_|;xeMARgLoFMLxPM zPFET(hng|oa$EiEAgeGY2U10cr#0S(b6$oYA`iUm2K1EUTn$`yiU+jQg@0Ycw zowoLQ<7uypOGDx}#sZMNC+D6Q)m>^_OH$o&tpbv%Uey5uuU=L1SiiXXAiCKgx6sh& zyw$B8Qug`MjV#HTiLctW%9|zE)9$@#mfzSWIi2kJdHUAOm9AW~E_b6Vv^&Xe8X5sJ zRgx-`4uFsQcFqj(TC!?>1b?$N0^Gb>glixu@V+uPeBjQx6#Ot+^8>3p)49;6GR2Q_ zi<*@et<}O+ou?jKADmwmA)1jMKTRb=ZT=fmqISQ_%wt|WsZ-1yIQ z+m-nq_06fqdKVfUp7QOH*UEKs%=g{$O}`K*Jd=0uP>4#+_63Er<%=4Ig}jT?)P!kp zD$^t+m=<-6@AKKrF^5Hm?oeq;^U&ZcjJN}I>!wNQ{&&cQ;HL|8tH&1ZP6bOrlyTv> zUHii0FDu>PY%zisUCV;B{&LVlccRxp#zQjcPFu+1ChhniSSZp;Ir`;3MUCK z6pY~w+lthZfqfDS%P6#ALy0kEI%A%*)E12vNZ2KovhE57c|#w^GfXA2Ceb+wx~Qoa zr7C!1X>p&}_lcSku(cO9gs6H_5>KCN79z@h%90l-%^~G9$h-hl#aEBurII}gYgP_N z?+fnl%yBBPw%$fa?d-pjcvkfR64X;%rgS3QcmQ|moY4M6y>^aaCZmT{Y~@*Vl#ucg-WP~$Rbyp4p~2#W|?wd=CkJviGOlE>EZ-UFOl#`Q*qPD z6W#84>v50-~Vt6voR+fs7}v49|j6+S#dFGUuJPh&W~reDrBI*EaH zw0brrS?;%FNu&LtB^#FUgdppN?kY+42jZQ1MkGo@@SucfeP-aTp3j48dv^>x6(_1r z=N>hhu~|5Zipug8C(+Y&|H__m0!M59#OuBBENh$pk?KxzXJ6uDuNRlo1G+IJ<&!`_ z-zvHw%9&?ekg{+CVc9bN_}UZK0f+U>%bvo^P&ipfZT69HC?u530%`rKg%pH$JK+qQ zH5d6=b(XWLB|yRZxuL2$xg+0VUP5SXaqv50H|+HxiGCB`S&?lNXZY)WYbEOArdmmX znD8!%y|R@U*0aD7>588L4Bd$W$;T{ND36Ngd>U3^_By(wLrm7(Ma)gN)^8FqAuHS= zyat4jMyynPhIB}ji1t1nIzjF)@LT;DDO8g`rE-|-U~#r*n;LNBa=SfORf1Y?4#tfy zBwPJNo}|6wz@Hlt!yVsN+A$hv0fz{!G>oV;)Y!-9x>lv)FY@i~Nva}uZzv#M8gn^T zgZ;J4WeIF$soR_PlE<{TEQ(`*J|Vknt%~7i9<5wHYV0ch0@NIMjNz9_Z_~Q@G-e75 z>jsKDU4e!KEAAvhf}-=>{6(MLg6Iy^k_>Y1vA-i)q|3En<7y*Ag~9_{><7;BmEfxY z4WVh531gH;O>UckT9iQV%z-|y27aS{3ePCQsM!kAC0dK`M%o06CH7#%@TaiDO9eCuBxR`9k|!20Woar%}UHGH9NHxC@P3XSK4 zJ5#&zGgkd1?~PDjnUvs+I^HO;lo3N?KnTCiff;U9v3+vtm-rtN3?H{k!3fQ#k#V0# zJyMQt(%`(~U-DfA&W0EvqUrK_r_ORqNp{p~UX?V{8OuI7bE_yGr3rryxLJI#Uh2PY ztE+T6cWgkBd%l@Oi*_BsK``%5VFuJRd!o&P`BFIsSMT^b?tHodd3JSuR z^g9?op2G7&LQgi@=u>7mk5hT>e=Ug>n_5eSA{HnswBb;CpBrr9xaI8hjRF2sd;N~B z4_T_(qLp|}P4n-6xd<84Zb2VaKxz8sTEh;}{0wm@xzU53Q*sJB!4zN!PoaIr7?qON zusoRT^T&3Wg;)pQd%}j9)|9%6*E!xlr1Kp+u#;raHvH3 z=b`v!#xyHH7tzZs3DvFQ*ur@eCgGM3`M0*)p;Pm9bCqt-|5nMFdFBYvzERE*Q7$$2 zXTZ3dpVK1Wtfi6Lr_HR-lV3w-T}-+kDOc#(sgY|+bSU7LYg>i&RxFqixZxrg0XNZ!K8_wsTBH_1{|KS81jtVq)t}d5jZ3+o_gmXy+oQF&7u+ZAorW2-(zKy3b#F-ZDQaT<3C-CI-r*ESVO&FG&_4@PbJYa{#4A z?K?}lS%QQJ>{C)+!|7|$OxTpS+ff~m4P5HRFgN1Pvi5Q1*(++x1@d=;`g*H0Dby87 z=rOYrOK2J1YMCGcQt5LaZZBu=FO0ZzFhK9KGLnVaEP<8g#(P7Bo^YMshz=aBvDh7v zPo^M7+z{LPkWkB(FZ<6Dtt`8>@X{LGs~oa4?moHUj195e zGulYD^8TViX}!Mx@Fs0QSlXvg82(1-X2P3$8oSuFvo}Xr>*WCX-kn6e+zot>osIE?7;g+7Ald2 zDr=!TWxDahJ#I}u7Y*%GH(Ky}KQBSa&$c<$%-zEs+``!AMC+0LU{q}7@v`f?kzM`FVIqkA3QGKQ+T|AFVhLj)Pn4_w0&#Zun%_ubIz_;qpuCN z^hKNpNbiN0x{J2}JaT2^Z`EyKPeo3=|7KBjWOA)3k_*T5X+rD0pG|6ZW2L5(#J%F+ zMLMFyHI96LYO!8Y^>QOTs+yZOc)EOuTo(TfmS9lc%4x7RH?mZ4ac`d zbJ^?%T&d=zkNQ~BE^N-ScBFfmgM?m$l3(Xr6Ia3)(m4BbPiD6Xo>|=VkHpDwlI`iH zRN0RuB9oULjED?_DddMNVBig;_18=;q?l*c>Lf}insuRk=_)0j=}a}&)T+ZTBe)1l z&WCY*M3d#0-p!9{oOWj%{RKim3E7&3cf%9pTEHoyC6 z!Kex(SLpwn|A*lgQ#7xX zxA^<~`dj{%CdT$Cc7TIb1;W=(5Msy8KZR2?6l7Jx%je75zl+wdZ+~1qrbC<}jw@R( zXi_C`{)UV7BT9QlI_d9#&d_1?+4)sU#&ocGA~WIUrRJq$$8yhM&f3}A1ldo@p#D~7 zCT11ppgF|r#_^6a!8XmihBGO8l+UJuJ-6MMYAP$`jpdQ3Pq;Pl)$NGc<6p|m;}UQGaq>+EoCH}!gdRL(yC724<=>gPdI5}pe6l>0?y?#0(`^x}BwOmqDFXulQ z*#89S)eBFG4YmZSXs~3l-AzteyRPu=H$1mr-%U6Y_SqnnibRzO#QIOoe^s0k~G*-$m4W^iFpsz3FfvsrnyaV`Hl|=rc93 z3Hl=|L4BF~zvNOPc04ZYwtKfLtEx_`y%p4xAOEa2>pE*Ck{7ceBkcNHEF5UO4av-t zly}D@HA@~;gj3!LbOc7}>g)Hv9ZkJwU{F_GEvu`oU7;vBw>qcDvr4gxO8RuV*zYdv zZ~Nr`eyt7ROjAWZ59qg$c&D>T2??ebn0BrTG$A`Xuh7L_LQ+yz)N0PTAd!di{;Ztg z!p6MpA&a(Ai;9ZczdkN#>BlvJZtol&e>8l^kj*Ay;2w}z7bU z_`-SLCKcS&M8}U`46Bwl!vPykEy&-Z%72fgup!|S%=if8rx&=ZLQR~4w@HTK$j8e6 zDY^D+#zw`gma^xl;caA&Q?)G~^#xLUHyGMYZh*7kc%AdcoapJr`g!ROq zTmFQY6F}wCkm}$5@80$NiCmCT7Fr;o$+l)ndQyWZm+JYZIvW!AAfJ zC|d)bEjMnk|9AiV&rj!*n7PYQ2EoBijH6?=%Yv28&i7f@A~Hh&|B~FiycE@KE*B*6 z&BUJ_fvz!!tB2ga9lk7j_3B{g3b9%yNw@cxPKyCB=+#g%wMLTp<0C$su3mvom({rb zOtLzWtNvx@uCsMv)^^$07`fy@hfuCMxP*0W?o)jH_4w~vY(`c^j^52f^Dfg(6VFR6 zpVjq-BKwO_ElL*d&lhIn-|1d=Wc|ZveyRQ!yNixNMU>=obm!~%RpOgw7pRU;>HRO) zvSgKB`!C-H%FbBV5+yo(RL2Jxsx?W8el@~QwU;I7!W_Xk3hjgmjFlyiV(28H( zulz8#QpL?ZRk;5(+*HwdX!Fpbm|3jmq{-jM(0}RF9AwtXfB8#ZDLEm)$X4DT3I(0` zW)TZma3u7r-6Q^q()r;Z*RXobJ+O!Zte8mK=l`>S>EE;KUgp>K_guPrbHU)2yJ`=^ zM5Hq3r81|*n{7O8BKiX?^8OSwUaDsuNm%;Dw@Uf?@>KInB}Jy|Ogn=xqd#d}jelgi z3XvC8cn>u4Vr^V+VkIQo(Exc zyu^VU>uyFYO#fjC4tsE-QweS3I#%2JamQrp2yLw51;27r%=;$n&#!5J2%IO>&m)*_ zrJMuEv6bDxBX0(!oHBvTghT}-e8+1Vn+&^j5;!Nc*5ahL-q01jYJohtr5+jw*6IWilSAM~tMyDOq6|Qx>)KACNH@cSCEm)U28Eb%Wn|8ylV?Yt8?ao1K zXQC~u+0;}~a-qYfLRq;HM`-!$RP$YlbZ6PBcWicT#afqf-t@OR8co+cXctqr`kob6 z>*n5W_SDpTW9_vowa>Q(zBY8~)G5zq8(_guQJK}StbP&YimvY}GM%`D+I#3%_MoCW zkFf!0vplGEd3~&Lv+*XhfrR)@UeV1dd0x8m(4a%+JT^e{kuVf^rL9JzwWypMKKkR-TN?~#ibci`hMZd zJ!N;hX%NyjPHcqyOEYaV8EQB^JGTk`IIpF!0(h=P99R9eJwMuSfiX5VUQIKRiMsJT z2Y;ZzwD4(rZHXk{sQv}(-P+ahY>Hb(q=cm1wrUV8s| zW~KH58hn@WX5<;jqL1;NAfvxvp>T~3LEv`PiNqlJu3AUFgU|!+vIqTq4$pHR9lJ+G zX{y;qMX@Q4vAKU+s#7HucR;+ocNPnh;y--~9(d5Q_k^Nya`Y;GthA1z89I*_^qv1} zLNJG_tE)?)d~kj3BHt~OUw71VlU?8JgY)5z!w~HKooQk-{)uzBvx@U*<7>KVNS;Bw z_r1DU-zmLh*3k>99bj6boYQ2vdJAs~dc@59KUbqL8pq8m&kFQX zc4A`ocj&=FG(tO+(DE1MVPwDbaqrES!9vhOdGwp320HwGEy9q{E(;Su+K_C3R14Js zE-*1Nkx)CaM<-Q(;b=0CgFapp0OvqQvsMIa?Q!Y6zFJ%V*)! z<86l@HoUq>bz8m+BcST&wL6tjry-`nf(x)5)h&V&+|Phg+teWx|-U#}Dr#|?f= zbO;5zwJcE&)@{`VZsVOSYBd_x89T0da&C>OHQqRLK#wHLkFyTYL85Nw!4x(K0W%pL zE`$^xaO$++jchFoMDQe=3eCQ{g^IN1H`9M{nn&_EShPALEzQNfX(N`dMBq%_?SP=? zF{Alwg}#rewP0&Rf}8yY#e^1!(A^tfNpyCp4l2Gy$*yBPJPnRnt9}6UO>bUY+26Ud zn96dDpWrlQof@YI4-)GXBFNq0McUokWC50Ub-Eb}w5lX{4G{_nCcTdFpMR*_MEz^5 zkpRb}J(&?exm8J_j{#$CGo5K7T>k?6)P%CXY8X^*WzY%n<8L{4Cch#7EZ^V(nYAVkbGFoDQvVH}9}_1tZp}5GMC_O)c1J!S4D9dNhMtjN?3(rW%P;Wbf(`gl@{Mw^3X zg#;?!+NEsQwpvFJ>ptdWurJIq95+TjbW|BMoq9CZH9`!y7M=EVsj?OG%5wke{K^ ztNVY&eVO+3pBugEJL!?OyaOquZIq`Ebu!6~%pVznRpmgNKFX?qzwUg<5LY{?q3bZwmRBY0L> zKSd7P7P|y4@L3LgQH!$s&6(Wr6N@ac@cYvp6rl&e{xk6N!ere_yC;*D)7q^Zb48bC z(iXUS#y3l4$}P}VF3{Cb?WI@|*bJ>~p=j49CeI)i+1n*(y7P3|y(L?&_yIB_jo#qu zowH-+lvL=_yh3yrCM%=hE8s}$2CTNh`-3--*s@XUbf*=a9q;rcDAMDz$U(1Y#k#Yk>LOp z-Z|4GnT(l7xlh&RT6@je5z%dgu%CVn)Ot1VI7UBJ#`~vM3q4it(4#)Jl8i$Eq#FtF_;F{DCfBN3BJXy_% z!$&Ljq(_m>oYPLFm{q*e8NnJeNekBG+28DH#mty)4cHtEX2E$$FcZB#i8m3xi=uRX zPT6LqDfZiCxEp7gFHMRsJIedEn5M#sAj^h;X1SsVJrb8(m9K#nl7-a7_>JW!&^vu& zUaODs!`0COkK93+ny1Hx-v-kiJTY>G{I2r|EOR6`-XPa_cPZ317|!{M7+W! z%qn7kJ*PaPTCrtcFZG%zSjqyPcF9%y;MbEFKB-cOeq^-*OSU~NoD720TQc=b_o4kQL9d;yXXHvOweRi2fs3JAQeWqotB0t7c6zM4A4}V)y#?{H_UM z7wIs_)ICogmI`-RKmq7DLk_prpnAywK(o~3^X*t#=J(9cfES{$!W2 z5d&`+33181%G`$`|AvY2P}jyMk$rg#=1z(fKZ7mV%^1Tqna~5{^I}$`kv{+-7riQZ zYF*{Qh_Y(3^umA$CB&ssOBjU1hEDMxeW-MyvNp`;KlewOU)ks7m;g)d{(ueUHIAjS z$8?S=I7y4q6dbE(DTg}M4dYgjmg~pjPg~-hVoL7^XA_JnV(B$tk0l9fCn6zP?jvFK zm~LrMdPphJ&CIn(xnnc_hh?Bnkx$8J?_r@ANt`o&rGq!0hf^Tntz1N%t<}3TEI-?# znR5La6Rt#`mR=8=zdm`-SubU8Pco;ic%lB>nn<0QxQWO$QpViDC(7JM83R5N1>Szb zRaKH&0$!g1b)MZfG zMx(in0Vq9}R7=rzw-~=ZUt=3R-{Nd_L_ZgI4I;d!3aVbKbF1uZnk3%-4k{}#+=ebX@xm4BglQk(+T*17#yxXJ$YFlW&l&2mrLUzvA0ON_MJiDb2 z0n%n4rsbDL>AeH;Qk}I{4VCivIE2eigaJmA(rh>Y`Q54OF(8=fEAIUZVQ^<{p)#Q* z>*&SN@J%gAM(`J>#M}0J!OPyt6;GZ!B{`=E+9lIhMACd1jz$e(1hc{nXq`iwgqk8@ z`IyoJTZQmYy(wQ`{ce+53A+gTXBxEBH;3Y!g!wN2^|$S8#BR_|FHBful9%RU%e!GN zA^JaYjwAJ1HRFEnYV0<`b!ObAG7fAa1eNs!+giofN>T}}S_|)0n?qnjllN$AlLd^) za0({Pq33W+D=PKq%9Vx|J#=xGtxwFuvdtMxl-dITPp9q0Ha+K3sDO6658Lkyu3Dzd z9$JsPNlKWSGah2T@GQ5RSJ%1Bu^=*rA)uA59y3ijrrg?4*}msWb*wcv!-5nx>Jb>bcTINl2=uc z7`09$s;Z;pndzSBtJy4l?KPwE&5|)^G@$&fdJ?hfaO(6;&nrfZBy~$ zDp4C_l5h8C22QF@^>JeL*hXOsZ(8JC+GpN=TuAvqZuKf-A02G%%HQ6=v$v{xW9RmR zZ@qT5vhm`{9Y6a*_xX(Zt#u>Ijd`IUn$fLM7quF-drxw-pYil^%7oJ7dsx!6cC?Km z2)vZ$9|^Tu4a@jZC|<$Yb5t99pS-(`5t@`P;M+6Jd|3D-0ZXs3&}=YOuUh4#oh660H}He2 z-I3oI_e#z)vc6u=8aitQcAP%oQ+70zBo15I)4gvKZA}#tAioE>O%w%)p}@ZRMrA=f zK0hut)QO8U_MeSOS{vW}=30cyFFUR}^G%+-$|Xa!Z$M24eV%6aU#Z}w)7W$4$aj@iiAkMI)J3TU31>ER{yY@XNELu5KFqpe{`3 z3-WrXWwE>c9JwA#iT^4wvp>oUvOJ^^=Jdf2wC$~*$RlaKi!4D5S?Aw1n}E|6{lx8%Pqch1&Z~ienAD$&$rs6Me)2dpi1yK5PeA6@;PvK>#^~_TUS#ik ztt{6RncJ?a!0AOTpv1Scx#MairdTGXl0JE{@@L_jjiTbYHkrZAdSTc8)liq2Z9nH^ znPlrxBr@HwR8x++6M-c3PV?>&w6<^df-HTo^k-l7b~Y?AON$@?^I?hQ{Er|dmdJGL z07wD(mYPoCdFyqsYnF#4cIbkN3eXXH9`QkL<-^a_?4fIZUGiEP`#oG37tHiAM}7s% zl|8-FYa(WPMW3jz(u-0P(%edm6lzoKBr$8ni+xyt?=<8-@#f|FqS86%02kFl_ns>C@%uW7V;vw@L6L8CGwMJsrL_QM22>N5-9uZSsGE z|8Rx(fM0{{{eUe$-!20ZSgYD+VrYRp-iF-szNQ2b;VQL&#v-jVtgrZKS;c$(mmb02 z@UU_zL(?-HcWV=rIso$V)9cI@@Yd95FH9u!BKxmwx8UdS0p@JoS&QVLKWRGXl&SaT_eDiVOEwrpD*qAV=}cDF zjyl@`fM%Sx)a+)tw4>vpP?^NvKlp*LPnQ70hj%=`vibZ^RRPw)MM=n5W{1Bo+oM`GGVUkKT9eq8+1 zPhkE!!Mu_vA^PC>(+-RWIvwl);5)gzH;)2Df)`ube{N9#_bgZ4xy6j#Gi7)Faud2#nB)N7#oPfVPh>HbNM1 zgl|*Ga!m~>)uOm57b{*3ngZp~pR3)^NLeET+}Dmk@{OC=4v&8=MgNXN|25&uo0)O} z_BU0iYIOn!ih1EOUVf|M$aH>wK895&M9|6d%Qd@NWq-BZe2~i+Py(J7r5)w#v^IAe zCsW9Q(1-j~a+vO=5D3^>o)&6w@t^LqdL+yksEnHJiNf6IhakQ^r|;GgYV3zy$=~b2@_0G{y{_XyTl@%<-?q=x-0L{{Be9%1nrpQwn`8r(#02NCuu#KO8|>Utb?1 z48&%U6WjY=4fOHM-cDDlaY2|%T_`Jmx*%a9s%I!+D&`(UJUQ{Os)MK(J{A1?byi)T zN$Z@)E3A^Q3)y4L<@ghm1g2aif5x1FiEG=Nmo-t{!E()7VJJK9QG*4}UT0BAh& zq#wnTwY_PSs3`4|)QCg}B=1PvqDcTbS=#zJqtREyecDB?$fCxYf20oJcDi`g4^hA7 z=28jk>mGT&#U++?(|HW}HUX1CUrcG3*+gz7He(p7m-@+-2>2B?N;cU|Dbs6|k$8+M!_me3crTB@wyu5Ls z?1@(U_3PJx5SGMnrItWo5KK`nNqfJqWyK^(S^mTnZmv#Oe=MvzUzfdm{4}kubN`Dn zRzeY>LUDMSC~476I6?mH2FUO$6Z@pW=PNBBlOAT0-{sK4fHB-lA(E#z5h|2yGW z)ltY=n;*y{Z1GwiTQHW274>D@F?dzR1%KgR*YEp17iZa*GI}Q!67+N1P(NU*F*Mf$5q4D>(gbkEpg6S*r&K0!*LVhO1C!ogW=d1o+7{!~KmnFyERbVjwrVq~Wx~jHKHy1_CKbZ4JCu ziLNs?J|m6;YqQS6vJ+CNS3L@D z&=Fgu8UiJ`i!%Fc2T)Wv?fL6bs=2!jq#?XlwXwkOsdTTUP6*bo4dq53MGp-8$(yB3G@a zrsI=y0Kv5SQzM;^wNCAPtA;y2jn=dEtG+GJ`Bv`kbdct`d{-!ZU;ovzaGXk&UjFSd zQ^m^Q_U45X2^Ka2JRhMp7@ty7WqU5I;pZZ(O<}?L;j$l}g4-D-O{6rffhHHEe-{=< zobH>QoxQys!BV4=pDpk7D%228-Oqn}{E{omfm$Ni2+i$DVvSt??PgK^BiplMldQbv zCqOwQwi(t77{)`V2#QeXp4}^(WPO6v)vGP7qHoP+wy9leS|gU#{)H?pj)WtCpG4qb z19^WbIk;Tz#`&g*$KA+};?Ia@ywkT;aI!%!mRx;1N>QwlJ4hgo307oG>41@_=ZGZV zwV5#DzLG|oK4vREA;BR&G>xyqy)#{5V$*=Lin`W3dKl|r+YVP_q;ORT!m~3e`9km~ zNY&lUW-6KEYDZOJy{dt4(VlG z?Ah(T>-&!&U{d3n14+~mA!|&hs6A&X-rZjf7Zojk?n- zgqj`ae!%C9kEioi1kF3=(1Y2~I|aIO+%|$i{^iZ<-CX@74eTHnd~H)k&q`t4o01;+AOF~J5xE5(@Z?3{%=T@ee zwVuDxeqip0!6SP~Qsmlvtx23_lKmK)h}$u!&}ESCXx|u}bcg1^h(Om=P&Av*tV#^D ze^s6hPBA5yVOV#39Zm$`^jRCcm6pNR#!JLsC3vakdro{0nYvi~g$v^pj=7^OtOYp9~v>3;po)oyT<>(2(XJEL9uimgrRsTP(X!r~H?XlfKuJglJ+?k`=+358fyweS1<)poS3bYkIWRq!JpgZKXftd3y)66L9U43ULm0H`QqpMINaV zuG2Q)vQn!*N^&4Uxf9a?Q=enkQ2Ll`m)<*VV74`-tb`6an5NOtLkx; z&7HTlqedt0i=3;l?a}eiRD;o7etWckti^Vhzn-&9>(`KjBRk*zB&SP0kKJF2m$`u6 zTP&c^nDbNSw>%Xts5%>UCuKTtZ%x%<&+z>v=)$SWGh$&wnaI{luh+JSXFw}z7O$8tfB6GA|6K~`4`1fF4u5lFxR&Y9WvLdBi*4gL;qpuEI zSJi(*9AEZ!``6H*Z7Xy<@b7ptec?uRPs~C*u2KB3ZNgNsxtap_TY7cdv{=jc^eZ8g;^*6>(O?;&*&(qh#=u~EG%8(@K8cZ43I+KQ({zI66Ei$Lt zG~dy&co>ORRhfR?w*)An==3QI1h$rVQLWKVyl4hkJ2iNa89H^G;NUvB53Q$s1QfuC`z(w;3f(f2Z*gdi2As%<{J7LL0i%iUxVsp~)3Nt^6u z6^gAn?sjcXI$dd};pkT08>N@w+0-J7x>x{*7kMiE8rW6XX$cIDhDW`y@89d`hmlfd zt_;6|{|cYg{Y<~l)FxaGGv;Yx*#3ZktAj{Kcs+U-Y+%r1mebVP@#?Y1S~ zRf9A}_`Ruyse!i*ib2p=DXZ#>7YOeqh`<3u+yEY4+Oia=mmT;s7X^g!mHYe4ydkgN z8RyNL*W!Zhx-V*^?ftMk4AXYPPmI!Ks#Q|tk55&FkF>o}BT)2q_F!+>9{GenX7+FI z+GxnukIT;pxRjuJFa6R=`?yzJ-e1Kt3HE8e*_>eK+f%lIf=}4r6^oq!Pio^H!0473 zth9jM7@HGJaOmm{jW9L24OQ6CG|PhAH8p5x-L- zyq&MSIoWd`%aXgy23KzB&rmteaeDV}bvgePqry&!85RMsd#K{o*^|D0!bM&Ztk2mp zk!f<61f@JZe289$I49UpGj8|FgZDe8PHCPC*R)=NfOCLv|1SLwb@XEYz5dM)C?Oe^O&yRA_{?b6ak^@t8=3I>;%r!hpqe`I?M-_m!5|J zC{?*Ir&_zJm%HsNUf1Z_XA018r8s@1pGyPcTg`iDy;#~pz58vnj zWc2lKm<>Q0N9WTw@+IcDt5HZ*A>P5+JFxk*jjzVJ@A5v5{?rIFOXM$W?#;&-b;qy1 zV^m94)eD;naQcggqD6#(BU(;VrwQlyo;+7A)^NnsNs z?$d}8%X^ZS^Vi0{@k6U`DS%u(0;(18+Yf$UdJ{H& z>g}&eo3w-1Yth!19~Ga(ZUUPy-6ZKMIp?v)1KwuE*2Q^p=+dxDmo)P7+1$&A@W56+ zw$!G143`SEE`BrW<>=>R_oZ5v_IWai!xJ9EuQ0K}BWb;t>TMzc?hh6xRGbGfXY(ly7pot(_{MztRUxsA=p*gY{QQ=qWK-1YviBNA z100^BMPmHC#NV&%&3P%uhWs|>oHxA2tYd~w6QFm>Dm6~nz^D*f8q8)2?e=L1y{mW; z)ySd<5%E6;`5;eYTDdFcpmlpEV52JS!-pA6yh*C3QgZkVRTkUBm^Zc8azUnC%eRkf z+w^(lvnaM;T&=M^8jvOQ`(xgb1XZARC3o$MSI6#&dK~@Ipc}Di|aBT3jN1^n*(|IO`ivVQB8Im z{7cxONoPOT{zb@iVJmBc{PA3KbKQH{>FF274 z7?Ox(75uS+=B2t38(`op;aK)NS@?fGntB4D{G9VDoA38=WrvATI%I)hjNi=9Vc$9qmeFJFwzb>vgs26YaAspU+ zXqOfjk(HI@#opcjSE1DJ%=a~JZ+%0LzwSc$?wvs3%z<{_gf>mH|dlhS(&p=|CC#4HUaBTa(T=hS})5M zwOA(Ki zPb;GR*XDPARcev&tt=uhCY}-7*Yo|O`azEbAQ<^KVA22Se1a|{kyQb=b9!C{ zQsk^L=y`>bmz11A_5`LxlgOV*QG8A2O@wB5h;HhcTo&-1mo!{v!lcfIU&Z@D?r{zr9j%CXu5yc06_DUn|gw(3=v#o zCp&NYZcemzOJtI1_PS)m)UFFoI;Cm(Q{FvmUkv{IkNkFtM&?4cTt0qvAKF=hrQ>xL zSChJcdS@7vnSHeU-eO3kKTOQOUp@Z_al6W@{Yi-w33UDWH=YLa701=%dHJ&Js*ih8 z{5u1{Ve>tUwr^72OHRh0jD}2cCe>#45dD0lJS}N$!KHNtAPDsov1*$jp({SkRGW+2 z&fTpZK9wA)z8#BofPFm-$ssn) zuYa<*$T2^DW*gpaT(?G;6jDCL!YMIRKe$>scL-}$)}1*Bn1?NC;O|Eqn~#_*c>6U5 z)84wY9KKocQO$4Z?M5{T$z)Qln|pqfEqK`$Sm@(9SKW{x&w2CsL6YGEG#ooT8vxHa z1>hqcSI~vEEH+UpJ;W>H5e*1;t=T}0CO{+xF6E1~+FPvgl$cQq4)ApK4=*qI+W43L zMZHfE2iU^EE}PyXyuBR;xmaWv9|>F|DJ*8eDnEuIq*9w8Ir&%E^6ht6b8)pY^BP-$ zg2d|4gFc+5abRuJ@W8Z4MCiy+fDCkerF!*Xn*=}|li8dvN?I&9Itl_3e*GM=jEY(j zeXUDa)8cCLg|BhXMVboOdjD2`16&K3{71j0v7`TxiaCJL;~xlM0JqlX3tL{>HWe&Z zUf9|oK}B7Qf}a)o&+fuRUkKgr?xVj9Q#UHKB_+kgWIb708E? zzM(tcoy$=z!>{>tc*a|?E0LY!RknJ*bzMj6BO%8vrW*ShAwNMRKKf2Y(Q)6|$%%|* zt55eB!4r&HWdp3QA?UU>Vd(|Ccod#~f4eNB@%$3XwAyS3RRyzOrnwhJ9GSMYItW|Q zCs`$)4VigPw;9&Ky-(SL-8qj5U((EX~CD zb{*&O@$+q(37of0mTBTK+EOSA9NY{#-~SjAfYn0jv$?=zuotvz>FwR_3iM-7Z%( z77U?QZ=ZA;#iKMP^dS%SP4!{Md=Lb^ymxJCyS4avuiLH$8lStTNmjKKus1f_p|^LS zlbC~D^fZV(onb-$@j~c^yvL{|X5$BFAFR@voKAl|U8&(M$2>u~bG3^W4=3f#i$Mvf zcA=xqVS2a$Sl*{|>H{|SHLBN5r4H&($#NqI*87o;1Xb;c9J$jZ{*7yu5R$wC%s?#q znc^_{+F&uWBE%9!Oo?NUHS*ZsnD~#H5RRsKLCdZT4d#E&vuzOt=hbe#BJ$ehF*@wM){qd zd>Ji{itunLcHC}Y_J%HMgCiU}tQGmimD%3Da(eEZ8hQ{jDvvs|l)I%98+EwOC-v)R zrpU~&ZFy|^i|@Wiim01P@lQ$Ua?CTGR&*h~7dB@v%+ z3l)xt4SJ=JLiXH3Zs`?;-rc#n3hRaIKf{UmR;6kZF%XQ(F`_4Vg&J|Qc~>{$Nb%EZ zt_YV5u=AX)K8F1^=3dS?80k(|8V72Uyfn6bvY8Cz`tF)kZ@)bjl9gSs2@F4|=rkM^ zcNsl`<>sqM_2H7oL~&e=Eo8jo=J$b$$A%N(9XiVo zA~9Y-{3+5r27TNb)9%yV!C01E7QP8pz*ie+yq}gwz_^@zA;)0grdH=P@1upQE0wnr zNc^wKn0!Jf7e_5!X(JM4Pts)xA3PT5!=dodo*TF%>8Bl~bX2XRR4rgCv`ZZpvpn^& zRr3^O8o$@pw*5WzJk<2rU5`5QO?oAXrHse$R%0DY65lrZRAW={goM>w2*;mwOdDFF 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

1b}t0p!>Xgw5|0~cyVH5#v;W5O1b3hSr@d}y| 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 Date: Wed, 11 Oct 2023 17:08:03 -0300 Subject: [PATCH 161/201] feat: Add ProfessorId or StudentId to JWT token --- .../UseCases/Auth/LoginTests.cs | 14 ++++---- src/Application/UseCases/Auth/Login.cs | 35 ++++++++++++++++--- .../UseCases/Project/GetClosedProjects.cs | 22 +++++++----- .../UseCases/Project/GetOpenProjects.cs | 22 +++++++----- .../UseCases/Project/GetProjectsToEvaluate.cs | 10 ++++-- .../EvaluateAppealProject.cs | 11 +++--- .../EvaluateStudentDocuments.cs | 12 ++++--- .../EvaluateSubmissionProject.cs | 14 +++++--- .../CreateProjectFinalReport.cs | 19 +++++----- .../UpdateProjectFinalReport.cs | 10 ++++-- .../CreateProjectPartialReport.cs | 10 ++++-- .../UpdateProjectPartialReport.cs | 10 ++++-- src/Application/UseCases/User/MakeAdmin.cs | 7 ++-- .../UseCases/User/MakeCoordinator.cs | 7 ++-- src/Application/UseCases/User/UpdateUser.cs | 8 +++-- .../Entities/ProjectFinalReportUnitTests.cs | 6 ++-- src/Domain/Entities/ProjectFinalReport.cs | 2 +- .../Repositories/IStudentRepository.cs | 7 ++++ .../Services/ITokenAuthenticationService.cs | 5 +-- .../Repositories/StudentRepository.cs | 9 +++++ .../Services/TokenAuthenticationService.cs | 26 ++++++++++---- 21 files changed, 185 insertions(+), 81 deletions(-) diff --git a/src/Application.Tests/UseCases/Auth/LoginTests.cs b/src/Application.Tests/UseCases/Auth/LoginTests.cs index 3f5489dd..86e5752c 100644 --- a/src/Application.Tests/UseCases/Auth/LoginTests.cs +++ b/src/Application.Tests/UseCases/Auth/LoginTests.cs @@ -16,9 +16,11 @@ public class LoginTests { private readonly Mock _tokenServiceMock = new Mock(); private readonly Mock _userRepositoryMock = new Mock(); + private readonly Mock _professorRepositoryMock = new Mock(); + private readonly Mock _studentRepositoryMock = new Mock(); private readonly Mock _hashServiceMock = new Mock(); - private ILogin CreateUseCase() => new Login(_tokenServiceMock.Object, _userRepositoryMock.Object, _hashServiceMock.Object); + private ILogin CreateUseCase() => new Login(_tokenServiceMock.Object, _userRepositoryMock.Object, _professorRepositoryMock.Object, _studentRepositoryMock.Object, _hashServiceMock.Object); private static User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); private static User MockValidUserWithId() => new(Guid.NewGuid(), "John Doe", "ADMIN"); @@ -67,7 +69,7 @@ public void ExecuteAsync_EmailIsNull_ThrowsUseCaseException() Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Never); _hashServiceMock.Verify(hashService => hashService.VerifyPassword(It.IsAny(), It.IsAny()), Times.Never); - _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Fact] @@ -85,7 +87,7 @@ public void ExecuteAsync_PasswordIsNull_ThrowsUseCaseException() Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Never); _hashServiceMock.Verify(hashService => hashService.VerifyPassword(It.IsAny(), It.IsAny()), Times.Never); - _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Fact] @@ -105,7 +107,7 @@ public void ExecuteAsync_UserNotFound_ThrowsUseCaseException() Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(input.Email), Times.Once); _hashServiceMock.Verify(hashService => hashService.VerifyPassword(It.IsAny(), It.IsAny()), Times.Never); - _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Fact] @@ -126,7 +128,7 @@ public void ExecuteAsync_UserNotConfirmed_ThrowsUseCaseException() Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(input.Email), Times.Once); _hashServiceMock.Verify(hashService => hashService.VerifyPassword(It.IsAny(), It.IsAny()), Times.Never); - _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Fact] @@ -149,7 +151,7 @@ public void ExecuteAsync_InvalidPassword_ThrowsUseCaseException() Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(input.Email), Times.Once); _hashServiceMock.Verify(hashService => hashService.VerifyPassword(input.Password, user.Password), Times.Once); - _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } } } diff --git a/src/Application/UseCases/Auth/Login.cs b/src/Application/UseCases/Auth/Login.cs index 79d593a5..88a754da 100644 --- a/src/Application/UseCases/Auth/Login.cs +++ b/src/Application/UseCases/Auth/Login.cs @@ -11,11 +11,20 @@ public class Login : ILogin #region Global Scope private readonly ITokenAuthenticationService _tokenService; private readonly IUserRepository _userRepository; + private readonly IProfessorRepository _professorRepository; + private readonly IStudentRepository _studentRepository; private readonly IHashService _hashService; - public Login(ITokenAuthenticationService tokenService, IUserRepository userRepository, IHashService hashService) + public Login( + ITokenAuthenticationService tokenService, + IUserRepository userRepository, + IProfessorRepository professorRepository, + IStudentRepository studentRepository, + IHashService hashService) { _tokenService = tokenService; _userRepository = userRepository; + _professorRepository = professorRepository; + _studentRepository = studentRepository; _hashService = hashService; } #endregion Global Scope @@ -29,19 +38,35 @@ public async Task ExecuteAsync(UserLoginInput input) UseCaseException.NotInformedParam(string.IsNullOrEmpty(input.Password), nameof(input.Password)); // Busca usuário pelo email - var entity = await _userRepository.GetUserByEmailAsync(input.Email) + var user = await _userRepository.GetUserByEmailAsync(input.Email) ?? throw UseCaseException.NotFoundEntityByParams(nameof(Domain.Entities.User)); // Verifica se o usuário está confirmado - UseCaseException.BusinessRuleViolation(!entity.IsConfirmed, "O e-mail do usuário ainda não foi confirmado."); + UseCaseException.BusinessRuleViolation(!user.IsConfirmed, "O e-mail do usuário ainda não foi confirmado."); // Verifica se a senha é válida - UseCaseException.BusinessRuleViolation(!_hashService.VerifyPassword(input.Password!, entity.Password), "Credenciais inválidas."); + UseCaseException.BusinessRuleViolation(!_hashService.VerifyPassword(input.Password!, user.Password), "Credenciais inválidas."); + + // Obtém id do professor ou do aluno + Guid? actorId; + if (user.Role == Domain.Entities.Enums.ERole.PROFESSOR) + { + var professor = await _professorRepository.GetByUserIdAsync(user.Id) + ?? throw UseCaseException.NotFoundEntityByParams(nameof(Domain.Entities.Professor)); + actorId = professor.Id; + } + else if (user.Role == Domain.Entities.Enums.ERole.STUDENT) + { + var student = await _studentRepository.GetByUserIdAsync(user.Id) + ?? throw UseCaseException.NotFoundEntityByParams(nameof(Domain.Entities.Student)); + actorId = student.Id; + } + else actorId = null; // Gera o token de autenticação e retorna o resultado return new UserLoginOutput { - Token = _tokenService.GenerateToken(entity.Id, entity.Name, entity.Role.ToString()) + Token = _tokenService.GenerateToken(user.Id, actorId, user.Name, user.Role.ToString()) }; } } diff --git a/src/Application/UseCases/Project/GetClosedProjects.cs b/src/Application/UseCases/Project/GetClosedProjects.cs index 32599d95..f9154445 100644 --- a/src/Application/UseCases/Project/GetClosedProjects.cs +++ b/src/Application/UseCases/Project/GetClosedProjects.cs @@ -31,33 +31,37 @@ public async Task> ExecuteAsync(int skip, int ta throw new ArgumentException("Parâmetros inválidos."); // Obtém as claims do usuário autenticado. - var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + + // Obtém id do usuário e id de acordo com perfil logado + var userClaim = userClaims!.Values.FirstOrDefault(); + var actorId = userClaims.Keys.FirstOrDefault(); // Se o usuário não estiver autenticado, lança uma exceção. - UseCaseException.BusinessRuleViolation(user == null || user.Role == null, + UseCaseException.BusinessRuleViolation(userClaim == null || userClaim.Role == null, "Usuário não autorizado."); // Obtém a lista de projetos de acordo com o tipo de usuário. IEnumerable projects; // Se o usuário for um professor, retorna apenas os seus projetos. - if (user?.Role == ERole.PROFESSOR) + if (userClaim?.Role == ERole.PROFESSOR) { - projects = await _projectRepository.GetProfessorProjectsAsync(skip, take, user?.Id, true); + projects = await _projectRepository.GetProfessorProjectsAsync(skip, take, actorId, true); } // Se o usuário for um aluno, retorna apenas os seus projetos. - else if (user?.Role == ERole.STUDENT) + else if (userClaim?.Role == ERole.STUDENT) { - projects = await _projectRepository.GetStudentProjectsAsync(skip, take, user?.Id, true); + projects = await _projectRepository.GetStudentProjectsAsync(skip, take, actorId, true); } // Se o usuário for um administrador, permite a busca apenas pelo seu ID. else { - projects = user?.Role == ERole.ADMIN && onlyMyProjects - ? await _projectRepository.GetProfessorProjectsAsync(skip, take, user?.Id, true) - : user?.Role == ERole.ADMIN && !onlyMyProjects + projects = userClaim?.Role == ERole.ADMIN && onlyMyProjects + ? await _projectRepository.GetProfessorProjectsAsync(skip, take, actorId, true) + : userClaim?.Role == ERole.ADMIN && !onlyMyProjects ? await _projectRepository.GetProjectsAsync(skip, take, true) : throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); } diff --git a/src/Application/UseCases/Project/GetOpenProjects.cs b/src/Application/UseCases/Project/GetOpenProjects.cs index e7976a1e..3468a050 100644 --- a/src/Application/UseCases/Project/GetOpenProjects.cs +++ b/src/Application/UseCases/Project/GetOpenProjects.cs @@ -31,33 +31,37 @@ public async Task> ExecuteAsync(int skip, int ta throw new ArgumentException("Parâmetros inválidos."); // Obtém as claims do usuário autenticado. - var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + + // Obtém id do usuário e id de acordo com perfil logado + var userClaim = userClaims!.Values.FirstOrDefault(); + var actorId = userClaims.Keys.FirstOrDefault(); // Se o usuário não estiver autenticado, lança uma exceção. - UseCaseException.BusinessRuleViolation(user == null || user.Role == null, + UseCaseException.BusinessRuleViolation(userClaim == null || userClaim.Role == null, "Usuário não autorizado."); // Obtém a lista de projetos de acordo com o tipo de usuário. IEnumerable projects; // Se o usuário for um professor, retorna apenas os seus projetos. - if (user?.Role == ERole.PROFESSOR) + if (userClaim?.Role == ERole.PROFESSOR) { - projects = await _projectRepository.GetProfessorProjectsAsync(skip, take, user?.Id); + projects = await _projectRepository.GetProfessorProjectsAsync(skip, take, actorId); } // Se o usuário for um aluno, retorna apenas os seus projetos. - else if (user?.Role == ERole.STUDENT) + else if (userClaim?.Role == ERole.STUDENT) { - projects = await _projectRepository.GetStudentProjectsAsync(skip, take, user?.Id); + projects = await _projectRepository.GetStudentProjectsAsync(skip, take, actorId); } // Se o usuário for um administrador, permite a busca apenas pelo seu ID. else { - projects = user?.Role == ERole.ADMIN && onlyMyProjects - ? await _projectRepository.GetProfessorProjectsAsync(skip, take, user?.Id) - : user?.Role == ERole.ADMIN && !onlyMyProjects + projects = userClaim?.Role == ERole.ADMIN && onlyMyProjects + ? await _projectRepository.GetProfessorProjectsAsync(skip, take, actorId) + : userClaim?.Role == ERole.ADMIN && !onlyMyProjects ? await _projectRepository.GetProjectsAsync(skip, take) : throw UseCaseException.BusinessRuleViolation("Usuário não autorizado."); } diff --git a/src/Application/UseCases/Project/GetProjectsToEvaluate.cs b/src/Application/UseCases/Project/GetProjectsToEvaluate.cs index d8f91aa3..f9a93371 100644 --- a/src/Application/UseCases/Project/GetProjectsToEvaluate.cs +++ b/src/Application/UseCases/Project/GetProjectsToEvaluate.cs @@ -29,15 +29,19 @@ public async Task> ExecuteAsync(int skip, int t throw new ArgumentException("Parâmetros inválidos."); // Obtém o usuário logado - var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + + // Obtém id do usuário e id de acordo com perfil logado + var userClaim = userClaims!.Values.FirstOrDefault(); + var actorId = userClaims.Keys.FirstOrDefault(); // Verifica se o usuário logado é um professor ou administrador - UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN && user.Role != ERole.PROFESSOR, + UseCaseException.BusinessRuleViolation(userClaim!.Role != ERole.ADMIN && userClaim.Role != ERole.PROFESSOR, "Usuário sem permissão para avaliar projetos."); // Obtém todos os projetos que estão na fase de avaliação (Submitted, Evaluation, DocumentAnalysis) // e que o usuário logado possa avaliar (somente projetos que o usuário não é o orientador) - var projects = await _projectRepository.GetProjectsToEvaluateAsync(skip, take, user.Id); + var projects = await _projectRepository.GetProjectsToEvaluateAsync(skip, take, actorId); // Mapeia a lista de projetos para uma lista de projetos resumidos e retorna. return _mapper.Map>(projects); diff --git a/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs b/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs index 71916a52..13eebf61 100644 --- a/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs @@ -34,10 +34,13 @@ public EvaluateAppealProject(IMapper mapper, public async Task ExecuteAsync(EvaluateAppealProjectInput input) { // Obtém informações do usuário logado. - var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + + // Obtém id do usuário e id de acordo com perfil logado + var userClaim = userClaims!.Values.FirstOrDefault(); // Verifica se o usuário logado é um avaliador. - UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN || user.Role != ERole.PROFESSOR, + UseCaseException.BusinessRuleViolation(userClaim!.Role != ERole.ADMIN || userClaim.Role != ERole.PROFESSOR, "O usuário não é um avaliador."); // Verifica se o status da avaliação foi informado. @@ -53,7 +56,7 @@ public async Task ExecuteAsync(EvaluateAppealProjectI ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.ProjectEvaluation)); // Verifica se o avaliador é o professor orientador do projeto. - UseCaseException.BusinessRuleViolation(projectEvaluation.Project?.ProfessorId == user.Id, + UseCaseException.BusinessRuleViolation(projectEvaluation.Project?.ProfessorId == userClaim.Id, "Avaliador é o orientador do projeto."); // Verifica se o projeto está na fase de recurso. @@ -69,7 +72,7 @@ public async Task ExecuteAsync(EvaluateAppealProjectI ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Project)); // Atualiza a avaliação do recurso. - projectEvaluation!.AppealEvaluatorId = user.Id; + projectEvaluation!.AppealEvaluatorId = userClaim.Id; projectEvaluation.AppealEvaluationDate = DateTime.UtcNow; // Atualiza a descrição e o status da avaliação do recurso. diff --git a/src/Application/UseCases/ProjectEvaluation/EvaluateStudentDocuments.cs b/src/Application/UseCases/ProjectEvaluation/EvaluateStudentDocuments.cs index 4b97fcda..949e3dc5 100644 --- a/src/Application/UseCases/ProjectEvaluation/EvaluateStudentDocuments.cs +++ b/src/Application/UseCases/ProjectEvaluation/EvaluateStudentDocuments.cs @@ -34,10 +34,14 @@ public EvaluateStudentDocuments(IMapper mapper, public async Task ExecuteAsync(EvaluateStudentDocumentsInput input) { // Obtém informações do usuário logado. - var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + + // Obtém id do usuário e id de acordo com perfil logado + var userClaim = userClaims!.Values.FirstOrDefault(); + var actorId = userClaims.Keys.FirstOrDefault(); // Verifica se o usuário logado é um avaliador. - UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN || user.Role != ERole.PROFESSOR, + UseCaseException.BusinessRuleViolation(userClaim!.Role != ERole.ADMIN || userClaim.Role != ERole.PROFESSOR, "O usuário não é um avaliador."); // Verifica se o status da avaliação foi informado. @@ -53,7 +57,7 @@ public async Task ExecuteAsync(EvaluateStudentDocumen ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.ProjectEvaluation)); // Verifica se o avaliador é o professor orientador do projeto. - UseCaseException.BusinessRuleViolation(projectEvaluation.Project?.ProfessorId == user.Id, + UseCaseException.BusinessRuleViolation(projectEvaluation.Project?.ProfessorId == userClaim.Id, "Avaliador é o orientador do projeto."); // Verifica se o projeto está na fase de avaliação da documentação. @@ -70,7 +74,7 @@ public async Task ExecuteAsync(EvaluateStudentDocumen ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Project)); // Atualiza a avaliação do recurso. - projectEvaluation!.DocumentsEvaluatorId = user.Id; + projectEvaluation!.DocumentsEvaluatorId = userClaim.Id; projectEvaluation.DocumentsEvaluationDate = DateTime.UtcNow; // Atualiza a descrição e o status da avaliação da documentação. diff --git a/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs index 5e648345..320cfd20 100644 --- a/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -40,11 +40,15 @@ public EvaluateSubmissionProject(IMapper mapper, public async Task ExecuteAsync(EvaluateSubmissionProjectInput input) { // Obtém informações do usuário logado. - var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + + // Obtém id do usuário e id de acordo com perfil logado + var userClaim = userClaims!.Values.FirstOrDefault(); + var actorId = userClaims.Keys.FirstOrDefault(); // Verifica se o usuário logado é um avaliador. - UseCaseException.BusinessRuleViolation(user.Role != ERole.ADMIN - || user.Role != ERole.PROFESSOR, + UseCaseException.BusinessRuleViolation(userClaim!.Role != ERole.ADMIN + || userClaim.Role != ERole.PROFESSOR, "O usuário não é um avaliador."); // Verifica se já existe alguma avaliação para o projeto. @@ -57,7 +61,7 @@ public async Task ExecuteAsync(EvaluateSubmissionProj ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Project)); // Verifica se o avaliador é o professor orientador do projeto. - UseCaseException.BusinessRuleViolation(project.ProfessorId == user.Id, + UseCaseException.BusinessRuleViolation(project.ProfessorId == actorId, "Avaliador é o orientador do projeto."); // Verifica se o projeto está na fase de submissão. @@ -75,7 +79,7 @@ public async Task ExecuteAsync(EvaluateSubmissionProj // Mapeia dados de entrada para entidade. projectEvaluation = new Domain.Entities.ProjectEvaluation(input.ProjectId, input.IsProductivityFellow, - user.Id, // Id do avaliador logado. + userClaim.Id, // Id do avaliador logado. TryCastEnum(input.SubmissionEvaluationStatus), DateTime.UtcNow, input.SubmissionEvaluationDescription, diff --git a/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs b/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs index 1997fd49..6edf8b9f 100644 --- a/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs +++ b/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs @@ -31,14 +31,20 @@ public CreateProjectFinalReport(IProjectFinalReportRepository projectReportRepos public async Task ExecuteAsync(CreateProjectFinalReportInput input) { + // Obtém usuário logado + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + + // Obtém id do usuário e id de acordo com perfil logado + var userClaim = userClaims!.Values.FirstOrDefault(); + var actorId = userClaims.Keys.FirstOrDefault(); + // Cria entidade a partir do modelo Domain.Entities.ProjectFinalReport report = new( - input.ProjectId + input.ProjectId, + // Salva o Id do usuário logado no relatório + userClaim!.Id ); - // Obtém usuário logado - var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); - // Verifica se o projeto existe Domain.Entities.Project project = await _projectRepository.GetByIdAsync(report.ProjectId) ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Project)); @@ -52,7 +58,7 @@ public async Task ExecuteAsync(CreateProje "O projeto informado não está em andamento."); // Somente aluno ou professor do projeto pode fazer inclusão de relatório - UseCaseException.BusinessRuleViolation(user.Id != project.StudentId && user.Id != project.ProfessorId, + UseCaseException.BusinessRuleViolation(actorId != project.StudentId && actorId != project.ProfessorId, "Somente o aluno ou o professor orientador do projeto pode fazer inclusão de relatório."); // Verifica se o relatório está sendo enviado dentro do prazo @@ -70,9 +76,6 @@ public async Task ExecuteAsync(CreateProje // Salva o link do arquivo no relatório report.ReportUrl = fileUrl; - // Salva o Id do usuário logado no relatório - report.UserId = user.Id; - // Cria entidade report = await _projectReportRepository.CreateAsync(report); diff --git a/src/Application/UseCases/ProjectFinalReport/UpdateProjectFinalReport.cs b/src/Application/UseCases/ProjectFinalReport/UpdateProjectFinalReport.cs index b165118b..ae935b2c 100644 --- a/src/Application/UseCases/ProjectFinalReport/UpdateProjectFinalReport.cs +++ b/src/Application/UseCases/ProjectFinalReport/UpdateProjectFinalReport.cs @@ -38,7 +38,11 @@ public async Task ExecuteAsync(Guid? id, U UseCaseException.NotInformedParam(input.ReportFile is null, nameof(input.ReportFile)); // Obtém usuário logado - var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + + // Obtém id do usuário e id de acordo com perfil logado + var userClaim = userClaims!.Values.FirstOrDefault(); + var actorId = userClaims.Keys.FirstOrDefault(); // Recupera entidade que será atualizada Domain.Entities.ProjectFinalReport report = await _projectReportRepository.GetByIdAsync(id) ?? @@ -61,7 +65,7 @@ public async Task ExecuteAsync(Guid? id, U "O projeto informado não está em andamento."); // Somente aluno ou professor do projeto pode fazer alteração no relatório - UseCaseException.BusinessRuleViolation(user.Id != project.StudentId && user.Id != project.ProfessorId, + UseCaseException.BusinessRuleViolation(actorId != project.StudentId && actorId != project.ProfessorId, "Somente o aluno ou o professor orientador do projeto pode fazer alterações no relatório."); // Verifica se o relatório está sendo enviado dentro do prazo @@ -77,7 +81,7 @@ public async Task ExecuteAsync(Guid? id, U await _storageFileService.UploadFileAsync(input.ReportFile!, report.ReportUrl); // Atualiza atributos permitidos - report.UserId = user.Id; + report.UserId = userClaim!.Id; report.SendDate = DateTime.UtcNow; // Salva entidade atualizada no banco diff --git a/src/Application/UseCases/ProjectPartialReport/CreateProjectPartialReport.cs b/src/Application/UseCases/ProjectPartialReport/CreateProjectPartialReport.cs index ce3e72db..c6c260f7 100644 --- a/src/Application/UseCases/ProjectPartialReport/CreateProjectPartialReport.cs +++ b/src/Application/UseCases/ProjectPartialReport/CreateProjectPartialReport.cs @@ -30,7 +30,11 @@ public CreateProjectPartialReport(IProjectPartialReportRepository projectReportR public async Task ExecuteAsync(CreateProjectPartialReportInput input) { // Obtém usuário logado - var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + + // Obtém id do usuário e id de acordo com perfil logado + var userClaim = userClaims!.Values.FirstOrDefault(); + var actorId = userClaims.Keys.FirstOrDefault(); // Cria entidade a partir do modelo Domain.Entities.ProjectPartialReport report = new( @@ -38,7 +42,7 @@ public async Task ExecuteAsync(CreatePro input.CurrentDevelopmentStage, TryCastEnum(input.ScholarPerformance), input.AdditionalInfo, - user.Id + userClaim!.Id ); // Verifica se o projeto existe @@ -54,7 +58,7 @@ public async Task ExecuteAsync(CreatePro "O projeto informado não está em andamento."); // Somente aluno ou professor do projeto pode fazer inclusão de relatório - UseCaseException.BusinessRuleViolation(user.Id != project.StudentId && user.Id != project.ProfessorId, + UseCaseException.BusinessRuleViolation(actorId != project.StudentId && actorId != project.ProfessorId, "Somente o aluno ou o professor orientador do projeto pode fazer inclusão de relatório."); // Verifica se o relatório está sendo enviado dentro do prazo diff --git a/src/Application/UseCases/ProjectPartialReport/UpdateProjectPartialReport.cs b/src/Application/UseCases/ProjectPartialReport/UpdateProjectPartialReport.cs index 5e1d3a64..42d57862 100644 --- a/src/Application/UseCases/ProjectPartialReport/UpdateProjectPartialReport.cs +++ b/src/Application/UseCases/ProjectPartialReport/UpdateProjectPartialReport.cs @@ -33,7 +33,11 @@ public async Task ExecuteAsync(Guid? id, UseCaseException.NotInformedParam(id is null, nameof(id)); // Obtém usuário logado - var user = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + + // Obtém id do usuário e id de acordo com perfil logado + var userClaim = userClaims!.Values.FirstOrDefault(); + var actorId = userClaims.Keys.FirstOrDefault(); // Recupera entidade que será atualizada Domain.Entities.ProjectPartialReport report = await _projectReportRepository.GetByIdAsync(id) ?? @@ -56,7 +60,7 @@ public async Task ExecuteAsync(Guid? id, "O projeto informado não está em andamento."); // Somente aluno ou professor do projeto pode fazer alteração no relatório - UseCaseException.BusinessRuleViolation(user.Id != project.StudentId && user.Id != project.ProfessorId, + UseCaseException.BusinessRuleViolation(actorId != project.StudentId && actorId != project.ProfessorId, "Somente o aluno ou o professor orientador do projeto pode fazer alterações no relatório."); // Verifica se o relatório está sendo enviado dentro do prazo @@ -77,7 +81,7 @@ public async Task ExecuteAsync(Guid? id, report.AdditionalInfo = input.AdditionalInfo; // Atualiza propriedades de auditoria - report.UserId = user.Id; + report.UserId = userClaim!.Id; // Salva entidade atualizada no banco await _projectReportRepository.UpdateAsync(report); diff --git a/src/Application/UseCases/User/MakeAdmin.cs b/src/Application/UseCases/User/MakeAdmin.cs index cfcb4929..7a4170be 100644 --- a/src/Application/UseCases/User/MakeAdmin.cs +++ b/src/Application/UseCases/User/MakeAdmin.cs @@ -31,12 +31,15 @@ public async Task ExecuteAsync(Guid? userId) UseCaseException.BusinessRuleViolation(userClaims is null, "Usuário não autenticado"); + // Obtém id do usuário e id de acordo com perfil logado + var userClaim = userClaims!.Values.FirstOrDefault(); + // Verifica se usuário logado é administrador - UseCaseException.BusinessRuleViolation(userClaims!.Role != Domain.Entities.Enums.ERole.ADMIN, + UseCaseException.BusinessRuleViolation(userClaim!.Role != Domain.Entities.Enums.ERole.ADMIN, "Usuário logado não é administrador"); // Verifica se usuário logado realmente existe - var user = await _userRepository.GetByIdAsync(userClaims.Id); + var user = await _userRepository.GetByIdAsync(userClaim.Id); UseCaseException.NotFoundEntityById(user is null, nameof(user)); // Obtém usuário que será tornado administrador diff --git a/src/Application/UseCases/User/MakeCoordinator.cs b/src/Application/UseCases/User/MakeCoordinator.cs index 27262fe4..2003848f 100644 --- a/src/Application/UseCases/User/MakeCoordinator.cs +++ b/src/Application/UseCases/User/MakeCoordinator.cs @@ -28,12 +28,15 @@ public async Task ExecuteAsync(Guid? userId) UseCaseException.BusinessRuleViolation(userClaims is null, "Usuário não autenticado"); + // Obtém id do usuário e id de acordo com perfil logado + var userClaim = userClaims!.Values.FirstOrDefault(); + // Verifica se usuário logado é administrador - UseCaseException.BusinessRuleViolation(userClaims!.Role != Domain.Entities.Enums.ERole.ADMIN, + UseCaseException.BusinessRuleViolation(userClaim!.Role != Domain.Entities.Enums.ERole.ADMIN, "Usuário não é administrador"); // Verifica se usuário logado realmente existe - var user = await _userRepository.GetByIdAsync(userClaims.Id); + var user = await _userRepository.GetByIdAsync(userClaim.Id); UseCaseException.NotFoundEntityById(user is null, nameof(user)); // Verifica se usuário logado é coordenador diff --git a/src/Application/UseCases/User/UpdateUser.cs b/src/Application/UseCases/User/UpdateUser.cs index b92ec61f..80135d4c 100644 --- a/src/Application/UseCases/User/UpdateUser.cs +++ b/src/Application/UseCases/User/UpdateUser.cs @@ -26,11 +26,15 @@ public async Task ExecuteAsync(UserUpdateInput input) // Busca as claims do usuário autenticado var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); + // Obtém id do usuário e id de acordo com perfil logado + var userClaim = userClaims!.Values.FirstOrDefault(); + var actorId = userClaims.Keys.FirstOrDefault(); + // Verifica se o id informado é nulo - UseCaseException.NotInformedParam(userClaims.Id is null, nameof(userClaims.Id)); + UseCaseException.NotInformedParam(userClaim!.Id is null, nameof(userClaim.Id)); // Busca usuário pelo id informado - Domain.Entities.User user = await _repository.GetByIdAsync(userClaims.Id) + Domain.Entities.User user = await _repository.GetByIdAsync(userClaim.Id) ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.User)); // Atualiza atributos permitidos diff --git a/src/Domain.Tests/Entities/ProjectFinalReportUnitTests.cs b/src/Domain.Tests/Entities/ProjectFinalReportUnitTests.cs index 3a6185d4..82d6a3e3 100644 --- a/src/Domain.Tests/Entities/ProjectFinalReportUnitTests.cs +++ b/src/Domain.Tests/Entities/ProjectFinalReportUnitTests.cs @@ -9,10 +9,9 @@ public class ProjectFinalReportUnitTests { private static ProjectFinalReport MockValidProjectFinalReport() { - return new ProjectFinalReport(Guid.NewGuid()) + return new ProjectFinalReport(Guid.NewGuid(), Guid.NewGuid()) { ReportUrl = "https://example.com/report", - UserId = Guid.NewGuid(), SendDate = DateTime.UtcNow }; } @@ -109,9 +108,10 @@ public void Constructor_ValidParameters_PropertiesSetCorrectly() { // Arrange var projectId = Guid.NewGuid(); + var userId = Guid.NewGuid(); // Act - var projectFinalReport = new ProjectFinalReport(projectId); + var projectFinalReport = new ProjectFinalReport(projectId, userId); // Assert projectFinalReport.ProjectId.Should().Be(projectId); diff --git a/src/Domain/Entities/ProjectFinalReport.cs b/src/Domain/Entities/ProjectFinalReport.cs index e1c95996..7cd7afc8 100644 --- a/src/Domain/Entities/ProjectFinalReport.cs +++ b/src/Domain/Entities/ProjectFinalReport.cs @@ -58,7 +58,7 @@ public Guid? UserId public virtual Project? Project { get; set; } public virtual User? User { get; set; } - public ProjectFinalReport(Guid? projectId) + public ProjectFinalReport(Guid? projectId, Guid? userId) { SendDate = DateTime.UtcNow; ProjectId = projectId; diff --git a/src/Domain/Interfaces/Repositories/IStudentRepository.cs b/src/Domain/Interfaces/Repositories/IStudentRepository.cs index 2138255a..1c125c69 100644 --- a/src/Domain/Interfaces/Repositories/IStudentRepository.cs +++ b/src/Domain/Interfaces/Repositories/IStudentRepository.cs @@ -11,5 +11,12 @@ public interface IStudentRepository : IGenericCRUDRepository /// Código de matrícula /// Aluno encontrado Task GetByRegistrationCodeAsync(string registrationCode); + + ///

+ /// Obtém estudante pelo Id do usuário informado. + /// + /// Id do usuário. + /// Estudante encontrado. + Task GetByUserIdAsync(Guid? userId); } } \ No newline at end of file diff --git a/src/Domain/Interfaces/Services/ITokenAuthenticationService.cs b/src/Domain/Interfaces/Services/ITokenAuthenticationService.cs index 454b4847..54ac866b 100644 --- a/src/Domain/Interfaces/Services/ITokenAuthenticationService.cs +++ b/src/Domain/Interfaces/Services/ITokenAuthenticationService.cs @@ -8,14 +8,15 @@ public interface ITokenAuthenticationService /// Gera um token de autenticação com base no id e role do usuário. ///

>BN^jdC{Je<9f~T6IkQ8nEmB0 zaM>W!>{{T->F0a6&`zvBkkGyrUEay!P$iRNIV;2{e4Qb^Ve!_%E&y!_Z|-jvz`^fX z+#H=Jd@$EeRE}j=@{c-kHy^G<=#JNm#+frz=d$dFpU}M})z}$&z_%0%j2duFtBc%R zc>gYyNQe!j3bW63{uDS~#z|y0X>0cKWv$}pt*6Gwq_T)$I5eoSDY+>f)IHQdE7zv2 zrTy#YVVQM|30!`g)(r0c!3wl|0a_d?H-(U3%*v#+ z52rAd(@!}G`RpsV^Lo9~w(-pOntx0HVy>~)FFyE0@ob(3rLr>QA+3(pus738y5CWz zHb|$f!zx7`s#(0MO_yKKNlyI!lm1jVSltAvcfK@qKZ8mmm9(;I`ge{OLJ70=L`cb8rwD^nC$cQ`Q^02^fmVcmH=22ka)##&vNHO;RzFmUyt168##DKzFw@0sdX%p z?{j(X-01(o<&x-nm{37#(!}+>`mt91m$e~VKWZ!CPn7F9!fp5uS=14w}~ zx>6_5box^-p1{HMJ+Bp0B**Ohq1Je?c9w_fwAFV=<|Y7AoGT=}TcAMrWf0QwqPx>t zCDo)>BR_p;=lGb9V@emt&-*$sAjuixLR)=-A&=x*=+^HXVOfHD$+nd=Mw!a>@Xl(k zcW3VAt%D~ihaOG4w`k=|Cjc}-c8*y>>w_@p1->Km!MLP z5qnhMc~q0px;(j=k&^>!TUJe)-xmxf??mrXNO}6j*`e!Z%=Y5(l2>MVPe57&T_+t& z$z~zks^v_zq~^T=8$HfnFUD1i^XyJ>+9roY+x2^DF_AG2iEGqinpSFBmo{%$$IIM! z(eVsnUnS-wtHp|3@{b85BWLnC4wzu2;(ya&__9H#V+&uUi-!a_3|G5RUh* zwH!RZw+Z%M-u#+Txb1DUxhyLUu!Lw7_c5(5eBI{Il$q3i|CccJzeARc0)-6_VT^s& z?QzvQeP?%EK`7HG+g(v&trHps-!s46mz3D0J0ksK=PF8RqbaaB0P-B2os%?oF1`|g z_pRk$$Gc9-CC)~odggF)P2Hr?Vb0;=3{2B$nBQ48iF%rnOgOO~SL_%+d4r+{4u>Gw zK$By>njymG&9~j*pQ)2EJ#tJPMciYi-jDi(d zd`IWzVigIQxmZg*%}Pdt8}G)`DT$>RGSmDu_L9C-+-EI2*zCRXx-O5Qc*{m9^2wsP zJH(;|##>&+cb;R9-{x^{OCCbI&dEpWpvX}87slzc1F)rwEG4Vj8>59iyUM9@@BI7b zAfCsf6qx%)Vx z;JYhNFI-hXIaMf+0@k8Cyi5sw5snkDDG)T{tpYlE~)IBQ?8I_dfbY7WD zoMi-iMZ2yfu*fI8ps8B2WUjHycYbWVHgR8%R2Ewb(h$5ntcL|G928cR+lFiP_y?pr132l^|T%q^(d;U)mlv}6;(LEOLnqN^*7hIt9 zV&<86OnrZy7xt00HC__>Dct?D=EvF5u3qFf4ks>y8DSuV$kG7jTu&loR-|nY8#Y?(hq&^EzbK-V+ z=-O_|U$Sz4Ptx6CaytUchKGmiot|&c|F=_>DLj;mE8V`PS#)jPKJc(vbxM7jkZPLx zUkme;H#S(#!ha%-9d{^caR?}gjgKdvLkBX`*+%|f@%1kg*WOI+3u!lMZj8xn52od+ zmzi{-(P;ehZPTv7nkaF2_fa~{l+$%bup2cuL8Uh723#OLv^DhAYgO&y{}&haHShoc literal 0 HcmV?d00001 diff --git a/docs/images/system_design.png b/docs/images/system_design.png new file mode 100644 index 0000000000000000000000000000000000000000..003a8b648ee52d171d084ad52620f6d350a29480 GIT binary patch literal 225236 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

/// Id do usuário + /// Id do professor ou do aluno /// Nome do usuário /// Perfil do usuário /// Token de autenticação. - string GenerateToken(Guid? id, string? userName, string? role); + string GenerateToken(Guid? id, Guid? actorId, string? userName, string? role); /// /// Retorna as claims do usuário autenticado. /// - User GetUserAuthenticatedClaims(); + Dictionary GetUserAuthenticatedClaims(); } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/StudentRepository.cs b/src/Infrastructure/Persistence/Repositories/StudentRepository.cs index b5718990..e3a95fa0 100644 --- a/src/Infrastructure/Persistence/Repositories/StudentRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/StudentRepository.cs @@ -70,6 +70,15 @@ public async Task UpdateAsync(Student model) .AsAsyncEnumerable() .FirstOrDefaultAsync(x => x.RegistrationCode == registrationCode.ToUpper()); } + + public async Task GetByUserIdAsync(Guid? userId) + { + return await _context.Students + .Include(x => x.User) + .IgnoreQueryFilters() + .AsAsyncEnumerable() + .FirstOrDefaultAsync(x => x.UserId == userId); + } #endregion Public Methods } } \ No newline at end of file diff --git a/src/Infrastructure/Services/TokenAuthenticationService.cs b/src/Infrastructure/Services/TokenAuthenticationService.cs index cc0bf4ad..b7bc442b 100644 --- a/src/Infrastructure/Services/TokenAuthenticationService.cs +++ b/src/Infrastructure/Services/TokenAuthenticationService.cs @@ -25,10 +25,11 @@ public TokenAuthenticationService(IDotEnvSecrets dotEnvSecrets, IHttpContextAcce /// Gera o token de autenticação. ///
/// Id do usuário. + /// Id do professor ou do aluno. /// Nome do usuário. /// Perfil do usuário. /// Token de autenticação. - public string GenerateToken(Guid? id, string? userName, string? role) + public string GenerateToken(Guid? id, Guid? actorId, string? userName, string? role) { // Verifica se o id é nulo if (id == null) @@ -52,6 +53,7 @@ public string GenerateToken(Guid? id, string? userName, string? role) Claim[] claims = new[] { new Claim(ClaimTypes.Sid, id.Value.ToString()), + new Claim(ClaimTypes.Actor, actorId is null ? string.Empty : actorId.Value.ToString()), new Claim(ClaimTypes.Name, userName), new Claim(ClaimTypes.Role, role), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) @@ -85,7 +87,7 @@ public string GenerateToken(Guid? id, string? userName, string? role) /// Retorna as claims do usuário autenticado. ///
/// Id, Name e Role. - public User GetUserAuthenticatedClaims() + public Dictionary GetUserAuthenticatedClaims() { // Get the current HttpContext to retrieve the claims principal HttpContext? httpContext = _httpContextAccessor.HttpContext; @@ -93,22 +95,32 @@ public User GetUserAuthenticatedClaims() // Check if the user is authenticated if (httpContext?.User.Identity == null || httpContext?.User.Identity.IsAuthenticated != true) { - throw new Exception("User is not authenticated."); + throw new Exception("Usuário não autenticado."); } // Get the claims principal ClaimsIdentity claimsIdentity = httpContext.User.Identity as ClaimsIdentity - ?? throw new Exception("User is not authenticated."); + ?? throw new Exception("Usuário não autenticado."); // Get the user's ID string? id = claimsIdentity.FindFirst(ClaimTypes.Sid)?.Value; if (string.IsNullOrEmpty(id)) { - throw new Exception("User ID not provided."); + throw new Exception("Id do usuário não informado."); + } + + string? actorId = claimsIdentity.FindFirst(ClaimTypes.Actor)?.Value; + if (string.IsNullOrEmpty(actorId)) + { + throw new Exception($"Id do {ClaimTypes.Role} não informado."); } - // Return the user's claims - return new User(Guid.Parse(id), claimsIdentity.FindFirst(ClaimTypes.Name)?.Value, claimsIdentity.FindFirst(ClaimTypes.Role)?.Value); + // Cria o output com o id do professor ou estudade e o usuário + var user = new User(Guid.Parse(id), claimsIdentity.FindFirst(ClaimTypes.Name)?.Value, claimsIdentity.FindFirst(ClaimTypes.Role)?.Value); + return new Dictionary + { + { Guid.Parse(actorId), user } + }; } } } From 9859dc4e5018efd34dbe845e2baf102447b9b516 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 11 Oct 2023 17:16:21 -0300 Subject: [PATCH 162/201] tests: Adjust auth tests --- src/Application.Tests/UseCases/Auth/LoginTests.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Application.Tests/UseCases/Auth/LoginTests.cs b/src/Application.Tests/UseCases/Auth/LoginTests.cs index 86e5752c..00c233ac 100644 --- a/src/Application.Tests/UseCases/Auth/LoginTests.cs +++ b/src/Application.Tests/UseCases/Auth/LoginTests.cs @@ -38,10 +38,16 @@ public async Task ExecuteAsync_ValidInput_ReturnsUserLoginOutput() user.Password = "hashed_password"; user.Email = input.Email; user.ConfirmUserEmail(user.ValidationCode); + user.Role = ERole.PROFESSOR; + var professor = new Domain.Entities.Professor(Guid.NewGuid(), "1234567", 1234567) + { + UserId = user.Id + }; _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(input.Email)).ReturnsAsync(user); + _professorRepositoryMock.Setup(repo => repo.GetByUserIdAsync(user.Id)).ReturnsAsync(professor); _hashServiceMock.Setup(hashService => hashService.VerifyPassword(input.Password, user.Password)).Returns(true); - _tokenServiceMock.Setup(tokenService => tokenService.GenerateToken(user.Id, user.Name, user.Role.ToString())).Returns("token"); + _tokenServiceMock.Setup(tokenService => tokenService.GenerateToken(user.Id, professor.Id, user.Name, user.Role.ToString())).Returns("token"); // Act var result = await useCase.ExecuteAsync(input); @@ -51,7 +57,7 @@ public async Task ExecuteAsync_ValidInput_ReturnsUserLoginOutput() Assert.Equal("token", result.Token); _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(input.Email), Times.Once); _hashServiceMock.Verify(hashService => hashService.VerifyPassword(input.Password, user.Password), Times.Once); - _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(user.Id, user.Name, user.Role.ToString()), Times.Once); + _tokenServiceMock.Verify(tokenService => tokenService.GenerateToken(user.Id, professor.Id, user.Name, user.Role.ToString()), Times.Once); } [Fact] From 33b23331d810cc09fdbf9a8e8cf3c1f3ec561595 Mon Sep 17 00:00:00 2001 From: PSThiago Date: Wed, 11 Oct 2023 21:58:32 -0300 Subject: [PATCH 163/201] fix: adjust activities seeder. --- src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs b/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs index a1b88546..275f1716 100644 --- a/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs +++ b/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs @@ -36,7 +36,7 @@ public static void Seed(MigrationBuilder builder) var codeA = activity.Split(";")[0].Trim(); var nameA = activity.Split(";")[1].Trim(); var pointsA = activity.Split(";")[2].Trim(); - var limitsA = activity.Split(";")[2].Trim(); + var limitsA = activity.Split(";")[3].Trim(); // Trata valores nulos if (limitsA == "NULL") From 8d258a8339c0e248bfcb8122cecb175df5f192e3 Mon Sep 17 00:00:00 2001 From: PSThiago Date: Thu, 12 Oct 2023 17:57:24 -0300 Subject: [PATCH 164/201] fix: Correction on project opening. --- src/Application/UseCases/Project/OpenProject.cs | 10 ++++++---- .../Persistence/Repositories/ProjectRepository.cs | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Application/UseCases/Project/OpenProject.cs b/src/Application/UseCases/Project/OpenProject.cs index 212cdcd2..d9bf6f46 100644 --- a/src/Application/UseCases/Project/OpenProject.cs +++ b/src/Application/UseCases/Project/OpenProject.cs @@ -62,7 +62,7 @@ public async Task ExecuteAsync(OpenProjectInput input) EProjectStatus.Opened, EProjectStatus.Opened.GetDescription(), null, - DateTime.UtcNow, + null, null, null, null); @@ -90,9 +90,11 @@ public async Task ExecuteAsync(OpenProjectInput input) ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.Professor)); // Verifica se o professor está suspenso - UseCaseException.BusinessRuleViolation( - professor.SuspensionEndDate != null && professor.SuspensionEndDate > DateTime.UtcNow, - $"O acesso ao professor está suspenso até {professor.SuspensionEndDate!.Value:dd/MM/yyyy}, devido à pendência na entrega do relatório final em outro projeto."); + if (professor.SuspensionEndDate.HasValue) + { + UseCaseException.BusinessRuleViolation(professor.SuspensionEndDate! > DateTime.UtcNow, + $"O acesso ao professor está suspenso até {professor.SuspensionEndDate!.Value:dd/MM/yyyy}, devido à pendência na entrega do relatório final em outro projeto."); + } // Caso tenha sido informado algum aluno no processo de abertura do projeto if (project.StudentId.HasValue) diff --git a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs index 382a052e..d8a61cfb 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs @@ -62,7 +62,7 @@ public async Task> GetProfessorProjectsAsync(int skip, int .Include(x => x.Notice) .IgnoreQueryFilters() .AsAsyncEnumerable() - .Where(x => x.StudentId == id + .Where(x => x.ProfessorId == id && (x.Status == EProjectStatus.Closed || x.Status == EProjectStatus.Canceled)) .OrderByDescending(x => x.Notice?.RegistrationStartDate) // Traz os projetos mais recentes primeiro. @@ -78,7 +78,7 @@ public async Task> GetProfessorProjectsAsync(int skip, int .Include(x => x.Notice) .IgnoreQueryFilters() .AsAsyncEnumerable() - .Where(x => x.StudentId == id + .Where(x => x.ProfessorId == id && x.Status != EProjectStatus.Closed && x.Status != EProjectStatus.Canceled) .OrderByDescending(x => x.Notice?.RegistrationStartDate) // Traz os projetos mais recentes primeiro. @@ -132,7 +132,7 @@ public async Task> GetStudentProjectsAsync(int skip, int ta .Include(x => x.Notice) .IgnoreQueryFilters() .AsAsyncEnumerable() - .Where(x => x.ProfessorId == id + .Where(x => x.StudentId == id && (x.Status == EProjectStatus.Closed || x.Status == EProjectStatus.Canceled)) .OrderByDescending(x => x.Notice?.RegistrationStartDate) // Traz os projetos mais recentes primeiro. From 486a46cd055f873eb40c7c94f09fc507ff1eec6d Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 14 Oct 2023 15:31:08 -0300 Subject: [PATCH 165/201] fix: Adjust admin user login and default seeding --- src/Application/UseCases/Auth/Login.cs | 16 +++++++-------- .../Persistence/Seeds/UserSeeder.cs | 20 ++++++++++++++++++- .../Services/TokenAuthenticationService.cs | 8 +++++++- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/Application/UseCases/Auth/Login.cs b/src/Application/UseCases/Auth/Login.cs index 88a754da..e38bca71 100644 --- a/src/Application/UseCases/Auth/Login.cs +++ b/src/Application/UseCases/Auth/Login.cs @@ -49,19 +49,19 @@ public async Task ExecuteAsync(UserLoginInput input) // Obtém id do professor ou do aluno Guid? actorId; - if (user.Role == Domain.Entities.Enums.ERole.PROFESSOR) - { - var professor = await _professorRepository.GetByUserIdAsync(user.Id) - ?? throw UseCaseException.NotFoundEntityByParams(nameof(Domain.Entities.Professor)); - actorId = professor.Id; - } - else if (user.Role == Domain.Entities.Enums.ERole.STUDENT) + if (user.Role == Domain.Entities.Enums.ERole.STUDENT) { var student = await _studentRepository.GetByUserIdAsync(user.Id) ?? throw UseCaseException.NotFoundEntityByParams(nameof(Domain.Entities.Student)); actorId = student.Id; } - else actorId = null; + // Professor ou Administrador + else + { + var professor = await _professorRepository.GetByUserIdAsync(user.Id) + ?? throw UseCaseException.NotFoundEntityByParams(nameof(Domain.Entities.Professor)); + actorId = professor.Id; + } // Gera o token de autenticação e retorna o resultado return new UserLoginOutput diff --git a/src/Infrastructure/Persistence/Seeds/UserSeeder.cs b/src/Infrastructure/Persistence/Seeds/UserSeeder.cs index e63ae604..b695b847 100644 --- a/src/Infrastructure/Persistence/Seeds/UserSeeder.cs +++ b/src/Infrastructure/Persistence/Seeds/UserSeeder.cs @@ -6,13 +6,15 @@ public static class UserSeeder { public static void Seed(MigrationBuilder builder) { + var userId = Guid.NewGuid(); + builder.InsertData( table: "Users", columns: new[] { "Id", "DeletedAt", "Name", "Email", "Password", "CPF", "IsConfirmed", "IsCoordinator", "Role" }, values: new object[,] { { - Guid.NewGuid(), + userId, null!, "Root Admin", "edu-paes@hotmail.com", @@ -24,6 +26,22 @@ public static void Seed(MigrationBuilder builder) }, }, schema: "public"); + + builder.InsertData( + table: "Professors", + columns: new[] { "Id", "DeletedAt", "SuspensionEndDate", "IdentifyLattes", "SIAPEEnrollment", "UserId" }, + values: new object[,] + { + { + Guid.NewGuid(), + null!, + null!, + "1234567", + 1234567, + userId + }, + }, + schema: "public"); } } } \ No newline at end of file diff --git a/src/Infrastructure/Services/TokenAuthenticationService.cs b/src/Infrastructure/Services/TokenAuthenticationService.cs index b7bc442b..1db35af3 100644 --- a/src/Infrastructure/Services/TokenAuthenticationService.cs +++ b/src/Infrastructure/Services/TokenAuthenticationService.cs @@ -49,11 +49,17 @@ public string GenerateToken(Guid? id, Guid? actorId, string? userName, string? r throw new Exception("Perfil do usuário não informado."); } + // Verifica se o id do professor ou estudante é nulo + if (actorId == null) + { + throw new Exception($"Id do {role} inválido."); + } + // Declaração do usuário Claim[] claims = new[] { new Claim(ClaimTypes.Sid, id.Value.ToString()), - new Claim(ClaimTypes.Actor, actorId is null ? string.Empty : actorId.Value.ToString()), + new Claim(ClaimTypes.Actor, actorId.Value.ToString()), new Claim(ClaimTypes.Name, userName), new Claim(ClaimTypes.Role, role), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) From cc995ed2733a9dd5e7757fa8d61c0f25dd17635d Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 17 Oct 2023 09:47:05 -0300 Subject: [PATCH 166/201] feat: Add GetActivitiesByProjectId endpoint --- .../ActivityType/IGetActivitiesByNoticeId.cs | 2 +- .../Project/IGetActivitiesByProjectId.cs | 9 ++++ .../ActivityType/GetActivitiesByNoticeId.cs | 4 +- .../Project/GetActivitiesByProjectId.cs | 48 +++++++++++++++++++ src/Infrastructure/IoC/ApplicationDI.cs | 1 + .../WebAPI/Controllers/ProjectController.cs | 33 +++++++++++++ 6 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 src/Application/Interfaces/UseCases/Project/IGetActivitiesByProjectId.cs create mode 100644 src/Application/UseCases/Project/GetActivitiesByProjectId.cs diff --git a/src/Application/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs b/src/Application/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs index 2ffc6097..b79c23b4 100644 --- a/src/Application/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs +++ b/src/Application/Interfaces/UseCases/ActivityType/IGetActivitiesByNoticeId.cs @@ -4,6 +4,6 @@ namespace Application.Interfaces.UseCases.ActivityType { public interface IGetActivitiesByNoticeId { - Task> ExecuteAsync(Guid? id); + Task> ExecuteAsync(Guid? noticeId); } } \ No newline at end of file diff --git a/src/Application/Interfaces/UseCases/Project/IGetActivitiesByProjectId.cs b/src/Application/Interfaces/UseCases/Project/IGetActivitiesByProjectId.cs new file mode 100644 index 00000000..9cd3e3a1 --- /dev/null +++ b/src/Application/Interfaces/UseCases/Project/IGetActivitiesByProjectId.cs @@ -0,0 +1,9 @@ +using Application.Ports.ProjectActivity; + +namespace Application.Interfaces.UseCases.Project +{ + public interface IGetActivitiesByProjectId + { + Task> ExecuteAsync(Guid? projectId); + } +} \ No newline at end of file diff --git a/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs b/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs index 39215f7e..44cab29a 100644 --- a/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs +++ b/src/Application/UseCases/ActivityType/GetActivitiesByNoticeId.cs @@ -15,10 +15,10 @@ public GetActivitiesByNoticeId(IActivityTypeRepository activityTypeRepository, I _mapper = mapper; } - public async Task> ExecuteAsync(Guid? id) + public async Task> ExecuteAsync(Guid? noticeId) { // Obtém os tipos de atividades do edital - var activityTypes = await _activityTypeRepository.GetByNoticeIdAsync(id); + var activityTypes = await _activityTypeRepository.GetByNoticeIdAsync(noticeId); // Lista de tipos de atividades para o output List activityTypesOutput = new(); diff --git a/src/Application/UseCases/Project/GetActivitiesByProjectId.cs b/src/Application/UseCases/Project/GetActivitiesByProjectId.cs new file mode 100644 index 00000000..b6a6c9c8 --- /dev/null +++ b/src/Application/UseCases/Project/GetActivitiesByProjectId.cs @@ -0,0 +1,48 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Ports.ProjectActivity; +using Application.Interfaces.UseCases.Project; + +namespace Application.UseCases.ActivityType +{ + public class GetActivitiesByProjectId : IGetActivitiesByProjectId + { + private readonly IProjectActivityRepository _projectActivityRepository; + private readonly IMapper _mapper; + public GetActivitiesByProjectId(IProjectActivityRepository projectActivityRepository, IMapper mapper) + { + _projectActivityRepository = projectActivityRepository; + _mapper = mapper; + } + + public async Task> ExecuteAsync(Guid? projectId) + { + // Obtém os tipos de atividades do edital + var projectActivities = await _projectActivityRepository.GetByProjectIdAsync(projectId); + + // Lista de tipos de atividades para o output + List projectActivitiesOutput = new(); + + // Se não houver tipos de atividades, retorna a lista vazia + if (projectActivities == null || projectActivities.Count == 0) + return projectActivitiesOutput; + + // Mapeia os tipos de atividades para o output + foreach (var projectActivity in projectActivities) + { + // Adiciona o tipo de atividade ao output + projectActivitiesOutput.Add(new DetailedReadProjectActivityOutput + { + Id = projectActivity.Id, + ActivityId = projectActivity.ActivityId, + ProjectId = projectActivity.ProjectId, + InformedActivities = projectActivity.InformedActivities, + DeletedAt = projectActivity.DeletedAt, + FoundActivities = projectActivity.FoundActivities + }); + } + + return projectActivitiesOutput; + } + } +} \ No newline at end of file diff --git a/src/Infrastructure/IoC/ApplicationDI.cs b/src/Infrastructure/IoC/ApplicationDI.cs index 62d83a33..f845fdd2 100644 --- a/src/Infrastructure/IoC/ApplicationDI.cs +++ b/src/Infrastructure/IoC/ApplicationDI.cs @@ -133,6 +133,7 @@ public static IServiceCollection AddApplication(this IServiceCollection services services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); #endregion Project #region ProjectEvaluation diff --git a/src/Infrastructure/WebAPI/Controllers/ProjectController.cs b/src/Infrastructure/WebAPI/Controllers/ProjectController.cs index 0931351c..d9f10198 100644 --- a/src/Infrastructure/WebAPI/Controllers/ProjectController.cs +++ b/src/Infrastructure/WebAPI/Controllers/ProjectController.cs @@ -2,6 +2,7 @@ using Application.Interfaces.UseCases.Project; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Application.Ports.ProjectActivity; namespace WebAPI.Controllers { @@ -22,6 +23,7 @@ public class ProjectController : ControllerBase private readonly IOpenProject _openProject; private readonly ISubmitProject _submitProject; private readonly IUpdateProject _updateProject; + private readonly IGetActivitiesByProjectId _getActivitiesByProjectId; private readonly ILogger _logger; /// @@ -35,6 +37,7 @@ public class ProjectController : ControllerBase /// Serviço de cancelamento de projeto. /// Serviço de recurso de projeto. /// Serviço de submissão de projeto. + /// Serviço de obtenção de atividades de projeto. /// Serviço de log. public ProjectController(IGetProjectById getProjectById, IGetOpenProjects getOpenProjects, @@ -44,6 +47,7 @@ public ProjectController(IGetProjectById getProjectById, ICancelProject cancelProject, IAppealProject appealProject, ISubmitProject submitProject, + IGetActivitiesByProjectId getActivitiesByProjectId, ILogger logger) { _getProjectById = getProjectById; @@ -54,6 +58,7 @@ public ProjectController(IGetProjectById getProjectById, _cancelProject = cancelProject; _appealProject = appealProject; _submitProject = submitProject; + _getActivitiesByProjectId = getActivitiesByProjectId; _logger = logger; } #endregion Global Scope @@ -98,6 +103,34 @@ public async Task> GetProjectById(Guid? } } + /// + /// Busca atividades de projeto pelo id do projeto. + /// + /// Id do projeto + /// Atividades de projeto correspondentes + /// Retorna atividades de projeto correspondentes + /// Requisição incorreta. + /// Usuário não autorizado. + /// Nenhuma atividade encontrada. + [HttpGet("activity/{projectId}")] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable))] + [ProducesResponseType(StatusCodes.Status400BadRequest, Type = typeof(string))] + [ProducesResponseType(StatusCodes.Status401Unauthorized, Type = typeof(string))] + [ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(string))] + public async Task>> GetActivitiesByProjectId(Guid? projectId) + { + var activities = await _getActivitiesByProjectId.ExecuteAsync(projectId); + if (activities == null || !activities.Any()) + { + const string errorMessage = "Nenhuma atividade encontrada."; + _logger.LogWarning(errorMessage); + return NotFound(errorMessage); + } + _logger.LogInformation("Atividades encontradas: {quantidade}", activities.Count()); + return Ok(activities); + } + + /// /// Busca projetos abertos. /// From 0d8efecafe99f881bb3207e234e5bef018cf5fc9 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 24 Oct 2023 08:17:21 -0300 Subject: [PATCH 167/201] docs: Add more images to docs folder --- docs/images/diag_web_api_functions.png | Bin 0 -> 31860 bytes docs/images/diag_webapi.png | Bin 22774 -> 0 bytes docs/images/diag_webfunctions.png | Bin 24910 -> 0 bytes docs/images/webfunctions_cli.png | Bin 0 -> 47946 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/diag_web_api_functions.png delete mode 100644 docs/images/diag_webapi.png delete mode 100644 docs/images/diag_webfunctions.png create mode 100644 docs/images/webfunctions_cli.png diff --git a/docs/images/diag_web_api_functions.png b/docs/images/diag_web_api_functions.png new file mode 100644 index 0000000000000000000000000000000000000000..df7b65d79eb40605c1bb1cb24244fb3fc898f560 GIT binary patch literal 31860 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 literal 0 HcmV?d00001 diff --git a/docs/images/diag_webapi.png b/docs/images/diag_webapi.png deleted file mode 100644 index b7f61d6fd16ee0895a5e78b2022ac34f50f9888d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22774 zcmdp;WmJ^k_visZx?5?a8F!hzDe3NR>F)0Cz7O#I#k&7> zU)>jXt?L>V!#pSU*?XV8&-t7)ewUY(Ku39j0s{ksF8M)B0R{#(3;3}?dJcS&Al#k~ z{Gn$eDk?82DoP;_u{1O>1H-`3hnt6qe1!Xi=i5ILMJdig^|_RY>W6PYFpC)tBeti{ zZ;`U^@zz7a9UZ*byPrq2e#^Y&_~s^JP8HzhA%cZXxqAg0o*1zyn5B?=UYQiyQWx6; z3l%`ocfuBKD(qc(r}SA}Gx7_Ym1rx>^T7gR8Uo2zOCw&EyKceGNMH6{T*gnkz;&EO zTDaslizj`y7nbhhHby5A;#VRxroE*wl)_09b{A14TL5_x6 z=W#Gi`DjFMq<56x-k2d09%)RCqu)S7Ets=DNMyHTcL>B#P$IR+qxj+|0s;-w{OhSb`sT|L`#z6~$u_TT>8~nv6V!s3inU!OhCf%1$MS zLP0?x05LG+R}d5br#kQ#h|1X3){38v&B4Ke)q#uE5@N*0!NBv9O_jYUE$-h=FbNAtqL~CYBZy5AEveS=!lxsHh$~`uD#lIl+!5|LMuX=AU5! z17v%6!p6bM&i3!NfvN%zpYqF_ID*a8#Z1fr^#FYca`A8oJeL0-PyW;6f7Mj`PtDhy zT>oA3zn=W>HI;3^5K&8Wpi5i9|5)aq%K!cFpNax(4D-4Vv2wy@;4ttCsxVJ@rpTNvi^KnA1*o zr|{dlqHU}Mg|LkDj6-D7gduY}wmLkP_&@;xN>QDEP@{b8 z7M78&{@GKP;nc#bcvTY3DB%x%Aj|U|l0FCqi}Q^HmNBangroB9p^pz9-QV{gON0rp zAj$K+-wQ8%_tb)ttPA3kAXE|_-3*XWAAG9E7J#9={l6HB@M7oaH+(A3*I02v?)5XS z=d)99%Pi-$?hZrUjSDy;;6G4+fKd&##5;T^^32z$=)O2yE-TAX$xq-;2?u1`1cnwR zIA&6X3w?HRP@VbC7v*TDq`&$nsD;buZeh8-uv2{Z5!z5=VcRBFno>VtVris16&<0$k?+%sTDWQg9DJztIcltckb?nvdOftKMAQY0MKVh}h`aOiVK)4puqQ-u=ws^JXg024I-Pzu3 zqESuw+Ht>7KbIyWuGw_CjF!_Xe%0BO>1w0rv+P>@p1&QBtuKrv3aol{h zqIa~?aahB>OKpLuI}i(z&nw@(ZuZ^pBOQf=f5=OWQN9Ic4tU)rP{Wk12G`FA=Q6DI zWq=}2dm*{s{SvYnPMlmu5yOk87jzl_+|Tice-Ov5$m9LTau#g9u<_^gsO|fdwVhr3Oqhq zQ6$zmN#Qn6K!K8R?8L^RqmI{+(8=K zbgf1s6HuFTIhMIxiIg)~=?pJ69cOjm)LsO9@^fMV;D1BuqKLb13IwKFk;Mq;<%I_n z72OXqy!C2#%cob)=iOtu&8Hk=;6epZkbPu4{;cTY1`9j&CA^6&2KRie%RUeZrMuXu zMnAr=N*AbzC0Z*?f^KD}w6!VvXpw6==x%J*U2Wz5a;~+wBiQnDQaIfn=TUX}wvM&L zI?aR@Yk~x&mlv1!LnUN=y}WbZSnglN9|}5CYi7MVyWvgcG78a=jh9{E)T*{Mxg2k} z!~eNr)R#bWVLDS;#A^E6I&S&|@Bmck3cqhH^z`eoX3N`ml%9o1h3j|(T}aX1nD)TL zDt*&zpjI%4#<{U0b8)e~BkF{H?=+dnE^RyVNy211i)#FjCX=eBU9|1y(0jLwMa11! zy$oMC^%BG2$w1MoxBInR;@@*PaY4<0pS^e4%#7_`4i);NEKQH9WlD7A_3mafD;0-j zE*wJ?%HPyFP8}*Rqy+6CbIxOx+z@r1N+byolS4TjL{1UWIxexjB$9wT1Y&F3&&am% zTIg${^5f6>uzjPa_Ag!=Qxr;8B8Y0z%h44|IH6;vI4*s!W>%T0bvj;|vFXP@>5ag4 zd6mx0Zt#sPOybSR$`&%8@X*0H}-)>{k`UU@>6v-HWo$!|@E(O$g% z@G>>0(@}_?w=|Y<>$2htV-|_)*`Z%Wt-vm~*#yPGhD{Gg2MIM1qb;i6y?7AOVhDGO zRonqYB9x~A`MG^>YSW5lL$TW})CT_cvK-K0zK~@U|>%8n7W#-f)Si)#tgda_{xd*c@p=Pi8<6nVe>0#Ps)@QnT zQimgoa+|EH#Dx3QBy7jPbZyI}%jj8ulYuxLJiA=1+v2BCpas&z=G19~F?V64(p^4^ z$WhLPYU&9fUr-6JuApkz8yvk5JpMe}^l>naWFpBn(zz}wEEX>B(@(#uxZfcZI|4x5 z`mqqBk;H?8J#kxqd!}KoaKb#hx0B3oH}va0@uAtbDQQ6}j#OljY4U=^Gw3)T z4pJnL(c@lItHg{S5R)Jguzbc-)JQhvg=*Vvjc_=#@V5xm_SurN6s(5I@^5CuUFRU3 z*w&7jIroFc*y!ghp(o=TYGkuI-*DPhwY|Gs zPmHv*GjICkb_fr`oAuFKY0A)IYZ^$gcn@);(K|)y?UBlA6vfmqepLgj%fH>}3}yqC zZ#%B`$fG3objc7e2@(>l5s8V}$ajlzL0>Dl7O8!71sy)$Y_%7rDF|4!Wih_!pYur< zX7j{_zq>(E(K#q?*zA^WJx0U*zF3-OBi{LuZxat~%X2O~)*N}fC+gFq@GnI^ zkxBj0Z(`80-*0{YJ&`}|mq}xp3CL4jEU>5*3fEAk{cVRQG^&8W;h?SB?M{uBz7bL1 z%y7Lvt2XAsu=^0L6Jf>~@eSgo=cPA3IfjKO0jC)XX9`>GFQPnK_-EFpAC%=arT-m= zrnFnq{M~OiGh;4)EM%T@4a+*^YKMJ`KP`ms!kN9`OM#_AsTzb1r)MEe;^(v;Y@~2{ zQmu;O03Vz1WZgkCDu+j*A$b%oUaZ9*JSf6pR3!Pdyfn?b0D7h0^6zMxM!#ew4Y;Av zLE2eK3q%`5aVCBUC6E}hGj5j`TeC!iPrw%OCyKs7% zPl#lP(F1QU*HaBmYh$>IrxTS*ID)({Wz|&wvVJvxQ^2Qm8YG!<2z^zp`#FgYw z;p)&I328ZafpuT4P#U}8Ekp|7P`YQQn_cL>{b6pMuDips4;=qW@Zo&H8#94PwDS1X z3yYx)$sdw^w%cR*JzOBa-P-bPkDdzINj$l8vc=W@{06uMZfE)Eom z4~Cq_Ck6)UQc`NroQZG^?QAj&d6|H4yxRco@3+DE#t+Q1-$LnOTZnRevjwiRD;kc5 zx*!mnh#XSSRN6S0a8}&6lB_^A<7oLAx-ZiE6#~Z}v(EcC%0k4cmBzDUh~HnFHNiW7I`}Brl1Rp{2JU8z`+#g%Z)ezqa*C2j#v0K0fXS5h(DNXpsIXD?sTRXnA%K|RwpTECzFeeRvPUcJWHK?MKfdpgVSry>_ zGOL$2$NkfRa$6)8v*Vf$$yI-59Ohk(ES5dBXrpHR$=x>83Calvs}?$@rKsm}u(WuF zSTJ&jemUd5v(qM%q>zT&c?kE-;HK+8DT{xTI}OGi&uB-*D&zH0k89yYmHFTQ>KU(f zva!*yKlyA6=REdi{EPnHA~5}V$r?*6fbGcI3oET-e_JpO4&pjOUT1KF7{al~4BU0} zI1154lg_-_K=L>fn(y;|$z*SYu`};mIiBxRxdQEx!Xpn0xH7tk=Brmj)XlpbwK1`c zeKV$?)Sa~^1S8bTVCs^AHS?5~STCO$OX0i@64u`E1(AP#oSsF3FuV$5hkTkwEjPXx z|Bkm$W>^G1dvJxVe62IBGutmZPid?)NH_c`+ALQ%88-CQcQ@wcs>EE{a+6{4WLjJ1 z&!xYsq}~C`MjR<}d#bz-A^7Y|GDKsuxVVuITgO?N-6=oD^l@6REoiO&`rl*_Tb3#A zyMB}dIAr)&z%Cn0hZ`&r`oYMdxPo$SDeugdS59n_CZb)FbxlBb=)k;UmcaOyJNdfy z8t`mlqa?~$ZMUjPrsFBUmSn`2yLI<>*FQdn1|!;il*r~Rtgg}?g-00MuEIP*U}|BD?8ym~+r%c5-#R30-{|gEd@lPM z-^1c0<1rc?D@`(nS;Zdn2qGxFfe6oulv+Xi2pI-&(;!1Oy3CJ^MELo`HVjM9Qs$9= zq|phlW~?`>J)ssffUR^>xXdLyHX|(O(Jk5UTlB;*hynXViComad2Hr?2-D5rec)vJ zgib&JJOL55M?6Yq0ALx#=ZnWSPh&a(#6I~#^zl)$ zFcF~S|APU3sy?lEy*3#BCG#lSA)ul_l`oipx%kC) z@coo+6&{do-MgnP8_eHis}^V(PUnAfffhetij8#tys>%PVVNNy7%}zY;(T}mSVRdo zMD5ZFs@CA-YoR8?EO57@J2{Z2xA zq3v?$`>=Ff8mh7}Vx$XvE;l3sOgGXfYTM8%oAvgQUsj9FM;FVX8r>Tik+K1jk%8E6 z?RUZeVk1bHNKh%0>UyTWz^Mj<3{NSndPH$j%wF(kTq#SI^dkpYH_}Cwxb7L6_NOHH z7-n^<<&IDXaZWKf6WYcU#RN|}NKKJ`htzz%Ykme@isKI;iT9xud@hr!zd8CC|Jo#i z@8&t-0Wj0LK1q<$#A-palkCRSRRqtws_nK778*VGjMeL)WiyZ-mXHfXa+d*S-0)Dr ztKWHFs)nlX02G1ZcTe##mKA@ZaN*MbHO1 zozMV2M2#7vvzsl2xV!MTg+}%lK*Le!SF@AT=XY582s^mjqk2%CF0`>U>I)vSAutEbBKQr zQ)gK(tZFaU5;@)PT%1eo>Rm1&P2_^Dg*L)XKhRfuVk?Fwl&(l^)^G-dOn5+HflPCEz0LH{!hIe36@%ng# zYaE!(c#-4TufB$?bP|ER$&s|Wk@w4L%rDZxY`EvP_wJ3(@T>3$&}s9Et~3#E66NVC zn=I-)IC;p$p=V0E=7Asp*_sWGfLPE2Koiyr*k9M5^!q!GM}Vj;#WF81)#085c($aL z+a-9i++1UZ^U(VJe%oF+;;J{9xSAK{OE+t6yHRC~wv6tM0-Ksf7}cU-^0M@vPIiK5P6D$Va#jHVc|ioI613l^EwvgvyRV55eKpUWw! zkZy)GJD18q>fYxfp@>57bm;7uXh$0K+5$NG91q(FSF6@jhVLk>=>XfN_L1Rr18eN> z*PJaTRKkgh3BrhVeO&zlky&~Q=N>EwqQ==c^qA61ZEUg?cmPeC=|-*-bYMf0B`Px= z50T96Zb4iENVBrY_HVz}`QJq8=rPMn6f&i%*fL$B0}Y&7mDn?oPGloLNfX@(EC+GD zt9HH$@Wg3Hf`c~jXDek#P`~(z!r$iOPz+2;L%CAN!=(^`3+#=Q*o_a3!rjP)>rs%_ z#W|RU6?QzE8S4&Yvkw;(RiM8E8jZXzzz(=Cu|+V$PmUe$48WSxpBT_GYk^=NQt8-0 zq-z90jR7@F=)&|j|j5^8;8Kp%$Pt38%AnXN8!LJ!gp#$k^Wu}$WgHHbb=$IB>GSDd-Y_opTq!0h74aQ%Lz7Y5)n8Pc|Gv)lUhUb--%J zePG7xK5eV|`g1Ki?be)C3p$)X>>IPS=sO^7#sJIt@hhSn+Y8i6Ep`(&wsmY@dOk)hhO4S~Y551Y znlpLXAmN2*R_P@)0@>J<(FiS>u}QuVinvodVu!Yzv(3ngB60JrIh5r_s4W7 zYw!dG&UtEbOztBiWC*bC9!}bZkehD6rT|&;bDK|jBiROlgDQx)ha{;$gqrmf) zG%#vc*c<4-+3rjXo{V|dlxn1P4g@xn`>pHHHL=U^zXC=*j+kOv$XA8XqFTkcaZ1BU zE}NB9f4TOuNt+7pnnggS$Q6yI4#)ySJ=5p2GjkSaUQ6h)lf%AFdvCt1)FVR0f!vtF zH#z9qXGxS2xMAMJgiVf_+&Fp@!1RZml##uFVKjn1)L?t@j;5d|G&C#m85A$h>?OEp zx;7%;Xtvr8x7#ayF>Q(LGsb7KV>)qQ)xjZ4EQhdcAJv*mXjDM$x5}VCZxuEuRNFCuL>8tbiS^ID@9qW#q+E-LxLnufS6Mbkt5B$E%tx7!U6Q!PiD=3O75cd{>o00w zGB>VnjYHh^T{ULqTXeG!`H4Mzwip(TwN0!=R%+!%NAuzQVn>aezR;P1 zGqHdi2o}1XnPOdE=WTH)f1+1d8Zz4j>v2GN%2Wu_Ng)s@nX$2!r^QqG!6bE&FZ$zh zW>;L0XtwU*kRr5dDw+?F2&De<%C zw&ge@GV22#U}&Lunue{Y_TKlbPH!1JI}>FmHT}OJ9+YugQBVF3IOP!jEfRLyKQkXf zk%#yb6>G0@u3y=h0hwAF!aKY%MH(4~P5c1CKiyQh+RS#K)G?g<6SY9(gl=u$u@`2b z(Qa3(HmJmN1ZCL#ba2n8C3#*5S2+t45?cIMMq`$3l3JzS9#wG2IMx*jE$~Kfw^JdHTACGKJ3Zu*}!7TaU(r>{)wn&QB6GzkR)St=0IET8!;IsXy{3 zDOt%$x7wdG4l1?*>(kxNXLNYdA3a26sHBLU=ofL*`WRe(F&|=iiU+@FD{RDisZ!e5 z-G5Pr+2&KWX?YB-M0<%Hj&Bercu4@06EKDi*T%#IL>44~vIY$Vkcm)WK z{BOFbe*#!fkYJ{iqlqWaZtMWof4kvUG}K4%&Aks2Aw8CBlLb07n2ym#tjx$bwr)BjWNQFbFQ#4MJ? z>REz>M;R5axgh3EsUr>B_}1qfb02-mkEY;YhSK6~N*!8CRtyj!zFw|v4;}W9kn5ix zkO{)=;dkhoHbOnSCj8_v?q;0fs?zn}q9k*{Lusq?DF%)qz)1x73cY0w9_%0eX2vVD z+?fco;cD>b5KFOXe`pE?G-@xjP-x8=rLd^TgoEb?NadHxaQ<#6}I>x?;SwBDONy zdIAwViVE4F0h?Gm%BKUOm?pa>o0UTQ;R3*RXeFLQ0>}#|-r7TIMNKU7QflPr%hzf= zSS@BwuBDa@xAsl^E{B4R@>b^4k^C0_?! z>0TUk(WM5NAnqY!s6ml(i55gdGsAJB16iv(zu1v*)33aDvS?zbi{e(<9dIh41a0{R zzo=6o_tcb9Woy;%MC!{#?&c2c+>q@r<;&6N60k%Ki*rGt1l>7CClpHzO^&NHHt44v2Lxz`6M~?*uM}NT zfu;1gA=t(*r{K6R*tZ3aY{A}KGdE2LEy)wPsO5smC4p~+j+&{l%v%u2h2(8pa`#*| zQS>YEcAE>iXscAS72fL*w$x-RZf)ie?%O=x;DCQ(5uMlzg+R_;ERbL$P?^G}q;9(x}*CmfvI`%@be6 zWY%eR(GgrV4E6nliPQ}l7xk?>s@^6pV0QRiU{%Y_prz$Bdm5w~^EO{~Vvbfob=Ky% zd;3pT9djG^hs4^H#Or#kMMoE${Mb5~?3JI6t8G(rv`63XZ@{QNAQEH}NTg>ntzs1~h%PgD^>a5Udg5$adPFOR5V?#r=w#kCT?`E63 zy3ymwWUFH7%$lI1oY)!}#yqBvMOGEszRFtoDw{tQV*Ze=ln9U59Jfe-^iO-2qgQ3O zF>-5jnC&!G+3fm~ReXPHsSuefn4|q{QauYe(5f(uIW#SMPtSWApADT>|BiuE8LCzzAGM@n~aF z)kiCaC33Pou{#SK$KyU8nxHCKPczxVx1XNw6nzlJZX}_*LBOBqrW-X^#69#<@wt2= zYQUodP#z*7#CG1;MuFbxX(%4DNTO^PDza+j^g(}KlG8jjzK3-IY%58&e_WZz@9TmZ zcnk!eX5tKuhZZhBn~02HeKfAQY}GZS2>bx^!b~3IHn!sa9zPXt1(w;_D z1N>Y61gl8=iTQ2P!XzpZ-5~*`hh}x=LZ2Yz6?`-2B_PFbk0~?u--}FFmFl8T9opg` z835V{)-cRCwm#H)Xavg~Zi1CM$Vs-|Ty}<&dWsFnRN_H-@f04ecg|FX~{>U>);Sgol6o= z-k+8ZGzz*CO`%rvdRwmg%qdhurA;Wi6Q9NcPm2}P*Hr;Q$=xQ1gGc@6-Wi(b-fWG( z0^$6h6+jtycg#KyDuo0Ht7#Yl8U+TKHAlzo_weC6N~|&N-3R~LLHT-s;tP-Zbg%9k z8myz0e^Gy`cdA>b!q&G721c&U&!lR(ZDm ztKWqq~)AV#>|T=t+dt&X9D4R-%=B7C9_vrfeI@ELUteDP(>|Itet$vsm*&R0Df-K*1U zt>#mjuZW*~7%AApG7ea^+}euLYi_r)f&D13#MsZqHKEf={A=pjPNA?EI$ zc&wiVZ18(M-&#(WYH=56n3oxJjP;H2$=dHuY*p6VEr0H?d;Wn!5x#kfv&Erb(mWoP zg;)j5i4b`%6V!NA6$utDr~#k;;Nu`3EBK<<=FgzQ{+6( ztzKtUuAY1}`c-oCNco4tn=xvksXm2mTBRQ>CVZyRl-+cOzMV&W92KSB7NSo-;*9 zP%naNGN_it0HmprYkx=`7u+}GlrkP!RjA+dTwTy8Kv z`?$cSmC_?rGi#eH=zE2P^vgFN++6ng)GPGTMHlgzK1qduP6haGx12Lw%BIek*Z2hY z>i&Sb0ve9X$TL3Ii68B5hxSBiKmR^UnWok?G_=@VgH|(c?iaymu-ep>p?eGN)R5y} zs&`)}Zc2?X-2EHbL%yf~eD~b9xn_TMP$B&@X}sXq!k~@&1m;Ap(H)lZ4ae`ct_$ut zNXOsE))!QriMma5bbc#JHof!BaO<%jY9f-#o8B?NPcEj8I$TgC=T2E>?kHsDeZzMt z&DU^^tMEhGH}3kJ$1UpSa=3}i@OYRts)r1!Z2vNZ$XjcZvZUjd*=ou|;9!xLL8GeL zNziB}lyj*>6}&hykATw4N+T5;NlRxJL16TS@if%ZvZ3{ugvx`3i#?A}N%B%f_G=BA zT`y(1SwL{(%A)r4JE~Pia!R@+=Q3*6a2Ua_sY1>L(l2k5xi9~aP8-xN!t%QI%2(Z_ zt7eGgVocdGLWV-08AKl*rgFLY1QdtVlv_rpyQXrJ@EG=Fo;Mh@xnE!DbFMMn?~Pqd z{7vPRl8P>1P8D#?+L?E7j4M%c$_n1i!c2|S7TnyGZ_J^(M&EDebHAaop$m%ODyR|4 zJo}@&57K8uof&3XfM4ZuxUs7GAwkYp?4)6YlL%24(61egnLWCr9)A&FloXADQe*4u z4f-JzY{c2<*lv-TfwMnRElGQKQMCxJjOdmW>1xtft4FG*Tl`T0-`A<7h*7UuPTQBr zJ4AqE;PxlsJjSwC+&PCGRwk&o;C{kIx&K{0V6zB&_yISPU!`SZmMV~dR?JX=gHuF_d%%h zOFK|r+`zQiL{42)zS3y*YPrnImB95quINzwP5#MBX#9!m0vkq~&#U)=u~A;W0YoS! zsV=kEl>T~NyG37T{ru<*Xe3O`S*r)J4Jj&+bP~^Gllc)Wl#aCHMJrZfh&?AI>S1o+ z=8AQbf2JsZePiW=i=3yl^;RL~i+jC}aj@L&p7k z$#3&kh<>$MX%{Jg`*4+ZzfD!AVy52a*$AAHBy54ZsZT6F~qvcwC7}s_7%q4 z?Qhl!oSm5%l?u!;X>A3sj(M1UJ<-Y%$@UBTNlYiW0%BR2_RlKY88KVzF48v5C>cL- zwTRp8ncu63n7Gc_aa!Jdi03x^hF@VZ3Aarmi*&*CCF3`~Kdy^eB*z%_eWts+NP=Bu z=O+xf;UHzwgLGAekqywyNNxijlX`m)<7jR0%#4l4&H0u}@%lgqNqM5WzQ5#f`TB1& z&(L9UH>Q^ueIQZY1?S@Y4!Ct(ddAG8FvGjnLF;JTp%F``fWsZ=N8;rU4^5QnB=v)5 z`fHZ+J=R9HZz31@%BwC6kNZ^Kv?BAm+I+)^`6UB=M zjHryP8;7rdW@Rc$(>t6ldE+{df?lK!3@S)7V$^*XXHA^So5wuUQA$Yb7!5Sy3-~=* z7{3_Dp&mn2PJN1qfRKemvmL{xlr=@|xBkcFLZ-t;0l1~+&wyaRIloP|X|wO^l^Mgn zBSGnDfCRtASJV-Owzcz7s8hZ3*PUPd7Ea6zG3#eb~`D?VPnu-g&YuJu}!wTP85Rh{tm z>>p>**r3->8DvV};V92Cl7kQJsB^X_27SCOG@RA{{P9q<#rDjF*I#vouR?(8ne(~T zm(QH~UM`%=_6+kCex+Q{uXLJ@u0e>I)X$!&%TeT+Pr05a>DYMn=n#GUX>>c>Irx0R zTd`c>jl?#0zWN>#9gfv>zEl)TLEqZlfjLhS^^#C z-Vcsi)lMwe_gZ0KBboLD34?$oCS)V{$XM#~>l=iW&r)kI|DpmhKOY6SiefRLVQ&W7 z*zrJ{=E)yko8D9q$4B$7i3RfgK-|S6-NscYu9FqBLyT$mkVS~B>^KJkF z`EXn~3#*emuF2~y!ZaY*6 z8^R8EOpE4_cjU2Hl5_f^BLkJX*<5k5TGyPYEdi|4hEUVXO*>uf>;qg~;9fJn)sv$g z-Qu?P@qRwD+IO>y*yK9QFu{%R@yqPhlCXp&?%emc!(U=;%ilK4qiR8QZNEG&H7jMD z_Zs{rva(Mv{WWU`^-eOhs+O7c;WmfY;D?-W#XB!3$-BaMQo~{`g%ne&eq`><)%SVX zxU4e;g$^&Onr9ag%x1~W(lV{da^MZU&{wSUJeqXhFCJQkKTea1wv(N+eT9V8ctcVn zO(rN$AbU4@qr(~}(0;;NqAj;p+k`AzAey&yw{{zg)ID3|RL7iflvsNztU6g@nx$-( znQ*!ir`TWCtef;2v`QjUCAF|~aQD+a`jm+E zcS3#oeb8k2B%fIgc$Tqa_AiW1W_K7d&_#WHvDFrguFd)!>z zeIgP=)QVcrm4=dbG$_4^n{b{&zkbIwGnG@Xa6yi)4gGwr1g*b737NKS3IXMaMgQ~} z&1ewW%QdY_?7S4~Lr{OGf9SliYnUoa5;*UVRlJe4+B8Nkvk!w6Zo|c1ir-MxOisrS z6ZcM3o>E-2621Cym1U>B*D>r0dfFk9Z8XqUM!Z70Ma*j_T~g2lT7~80D~p02ei;p# z&&{>9e_?TP2;UNDG(RKy;)PAR0;L+${>}6~ zwOYOivYGRQE}^|pjh@1I3%?#QW8SYK>r;h~d_T+_)$FVGs|qbzAXFbT&^?#h*%oujTs2s$_SHStV_jMJqHEG-5+k3r@BcCFgRkYwk#U(t}Z1Bzpy!+lTxb5wA8gHSF0=Q zUk7phsq0r;oo$#!ok=JYn&05ytHU1!4Xl-GT14!zxo0J}<_;ak-NNfwqHJX&q96om zEBv+F#Wi@Ah-)t(-NC*4=IaQ%>FG*XCh}NF*N_MdcT_a0Q3BJmD30=;#w&aIci)j> zXuUe7wDj>&q__H_(BX13^?$Yk7eNwEKlnOdrD(qGEw|v>5sWq+ttgNE;G;NUVsAdL z_h+nr-pY)@yjPb=pBYA@bYd|@dEk1{#_RjYGq|t?#*&!XkNxs&9R{$sN`8v-=-Vjb%o#Pfx?C9RZ!ATuN6Xb%qt;-uK3f;0k`0xlnVBjV^xP$l# zAE}-T_LHh+;F}>)$Dllk#K`M#;Q05U*9Qaz>{jijN5VrNNfXf7(JJ>YW~yeOT*@P- zp=f>pM9(WsLJy{!avt;`?DxQY)}7Vl%!fnH{FRB>VtQiP&Z}D;pI{6UcB4IUoFU!_ zM{@f?gD`fe%z~2BAu(rY)TANllbE z2cUjry9MrDNP1m4)@zi&SR3>RQq)1^iSU5Af%60t8t$kolMUg*@yb)JRZ9bu+|d^2gx+i9w4h0@z_ljUQcC6C>H=4#li(yLD%7W z=!QZJPS-qsQG-u+lgeV4YzY_q>Cs%z08;a7_PkIFgZ*FfyrcCXm!6NZ2hrQ1whmwEWTX zkPuB?=_*tdJbBhx+kD7+7G~25a2AX~IvX6KHvxU0Mrs_<~13G=_4xqL=|?(!ZmWXvlWNID~F+; z5Hfv0_9(C-yx*Ctg7}#`h{YVmvUJaBO^$QHYifDW!Y1p;WqK~#;@P{#%b^FbM`H1a3VuW9r0mN7H+KlLt zEMLY5t4)_)la2LMtV~)xSxOFWw#MPSHl`QhU-mJO=K`)2!yvB+dInhzWAFe61oZz{ zF%8M5Or{19h*dj-4B;Q!1_*bAkoL_oDoyMURzTj3qc>N{x(#xXKej>USxB-9@Y9F2 zT%D2`_QQwpG%)V)4`&h}x-#2v{^$8f$4_kBKnMVEK{vrX(nnc7 z!Vy>SS@#6FT+aDUZJ_58^vID5(Dkg#hVx6L(kK6M7nX|7j~W5}y5p3ucU`t-lI!#9 zTixoIFKg!AwCP7EHtFMJ+6y3a?Y&mV762@U6fCU9O*cOWHU193<-Bemaeo8^s={V@ z0_y7q0>$>C-Tv60a(q0rb7V!P*94bWneJ0RdyilE4H=K0a!cIMFO%W=yIQp8f9BQb zR?TM3(sT-?meKOmd|TeVW|y090A?yE`a9YcbDB$Pa<(^@$$AKcXDm+GyebscqcqgU zD;3!|gkC;bN}ubP7G= z^wQmqPB#vSW<7w9CfZj<=!Z8Hjwy5(8-?xX)VR-U#d8>bD-}5AG@o|ZpQ15_xWmBU z-9P+a0JO(+!Gl`E@5v@>^Jnhw)Fz9--cj_5BC$RX$1m#Q6nS>4uKhOMoLYGnFmP>B zG35|B^5bN?J;8X6uitiNZ3a>lOC2T8!TnZ00!%vAPK$Mph!o?qo28=8_S&*vyM-i< z7jWY3(yLdvc#`lI_RC>2^pw~Qe^%!={n2}~>#WZ09O3Psnz+=_REtb)aNGUfy5t({ zMb45-*dI}~?4Nl0{+6NYvz&i@Rt+1VO zj$O7oTSTG3vKthN60R>J+sOtS)-{jT<+MM4+GT4H<)1$Y!&jlZKyp8x`nh&6@A(Wd zL)a4zfTk>bHPh4zyzexsbf&%OQNUPEm(c+^+%SrwGNz7dpVtvoi#Rw?+7 z-{7>1vT0{-D(Xbaz8rwZ#ER)I*wWOV{2Vzk$=2`7@&0)p#Oi1}*0P(&_0GJFbi63= zX4P{}#c^5-+p%L>`Ihr3l_Y&5HP{&$ztq1lQlPZn@m1{=B%1rd{x z>YsLdPLPeCdrq^J2ivNaT@v^8>fCvszq&4@p#et{ROI*C4)Legp@+qEF6MrN)Hm7{ zA?+Ra&i;DuV4cr*xCINBS4Q9V$8c!Z>qe`WL+r8@a_jNufX$fj_X&hLgv?r{o2AX= z(QLaU{gW>{Lm8*UDp+J;N$k_=HczX74*B9H%-b$Oh4t2|$ zYbQQ$ICH<-pxG@mpyK#)s@~r~Ox_!;QVxj@4fCT*qE+60UAlC(J8L?!&S3LR>OHry zT>}4`P#ZL`0bxzE%Hec{S(GxWQBK-my=$@Y6fe`4LU~=$DsmNBVDeb=1};D^bILLR zkjhb)q21utK@w7mGMp4ddIH?89NC3?`9o7G`fXm47rTga{oZYuC<8u&R&$=^=27%c zMHDyT>;@7Su!f*20*kBlC>h)@ckUAGaIfLK;r9D6#tfYd5FR>oaQNb4?+;$#d(@mvWsc0I$4}sMuwW z`>jzp(3IZuznVDfxF);50Y4xrJRqQ;bQ!et=tk)f1c}k5AfYG?BCUXQ$q+=q*vP>~ z!;s!UL70pbr9)JZl6ucJfA8n{bLY;T`<(ke=lWjfd$w>p`^T5y?&f5MKQE_`(_tZ8 z`GxqoIcc|k%kc7M+M|bxF@#Vv6s$J$inKtUhto$ht(e3&hkO9Sqp%ppi_GbE;|>Aw zW%e=#d8jt^WQDCTA=}#e;NaoB`Hc_JIk<5*+J1=;ZRwsPUY)U!rft7_tzpwLB5=>| zf6PjaFA3SaDjD%2yiZ_w?>gVSjGXAMv3hE@fr+0jA@GTt5b6O@eI3lCqd%LW1l^g_ z^I@FHW^4GxS@Y_AXp$bHr&h^CJN(f--Mav*cIyN*kNAATmL0dYG#ZjYeA2%1 z9Dn>XBUT`34-!j=oTR;w9Wr2iE-WnYJHh?)T?N(txD)C_&ZVx039(3z@A}fMVfZ|L zt~C?;y1n0M=J~}9lbOJ3r*X=GWomDiIh7FuThiAE!~d(0o7wKgKLJunZkyU{@B4$-@% zYC`!FgP5w#$`o@L(^vAIll#0UI@@sq%1p(xqFt`Urt&8Iv%i`^m6P{GZF?FDRg^#J z7q*C-GS!P6Wfi$e@YZAvP^^k*6P096{R5Q@gmc~>8M@W5G*Ir)I!IR>Xt6{1{2B7Q zYynI#Lt#osEF!G|vlp~|UzeXpPrMk6t}+;wy*&{vx!9D{;10guvTNRIy|t#%{SCLb zuT9uZu8ofDd00-DS{T-IXVS!ReC2e`Icix?Q{Ax_wDJ-5oKD#e*-)0JAi&<|o>&b% zCx*t(D8HFukmAtC^srNMB-!}f$sU4&H+Hf60SJ{n*Etw|YZ0$C?RmOPUQNI%@T1sC z+VkmH6gvTY&J*yfU7c5$ssqN_i}bTjBg}s{$f4zmDiD`A8O_7l3kjy~DN2+3kw}kE z3!*NBm6z$7+=5jrTPf8c)=;?$$kYhV9PTNY_YQ6)bQg%u$amlif?GTgDsBtIJ^W{^ z!M`S9JKW3tw@=Gu!3@fi|MvZl$WA)jQlGWnQ)|GGn6df5JlU>+0>$r7OB7epB4_rEJy zh(X+Odg6~|x0Hq8Y^L7bY&I~9#C_rA!Hb*MzvToG5Xsu#8P7SG9$1RWdxiNr8om~_ zEy+zucd0QivmZVCl$)JDL-Q=b?T}9#5^5{8XmQ2_()99ZaXKJKs_f9FdGl2HICMIx zs;!+uohHO!sa(Cvbr{6nV2g+gAG2S?a|$s=J{>soj8C)4(Kvl-oC))x@dHBp54MV9am5ACfn9&Wtecp{^Qbi^e;Y9C6e7;G zQpOQ!<9}pOXPmCS@MfLwp|9~Fl(p1xb?9f#(5SY82y9>p_iZ}g2Dgo$k?U_u-s6+K zoQ3FJZJWGWm#Ndt`Lw@vql5K&6N4S}2cc$Wi%U#&CYb1e>@6Hi-+0#p{FRRV>e%J^ z+t*nI5G(`e(TN$qTN3HG) z>i}vHV%It926|g_1azOl3jC6p1%rOhCg@dRW7(&zjV2aUIJ5g(V1)~{4$sz(8xOYq z9opGLm#!Zk3~hFAa~cP3x?*)~4v_I8=yO5q;Tt2~l1$b^4?6sm3stA4Y*Ct}mOaHb z`OXAO`W^QLlOrQLsmXx}tHm3l7D)})8RZ?+*@Qh@>0pheWz{`db{E*RobI%xt3BJ( zoNYS>`DqkRxkYU;d}(Y;l+4^Iz+9aYgC-RjHwC)hck%8FLQGCzQ&c5;(MpjmcJbg>B3tP#7{-&{ zKSjaxigXH!9VKz=Nv=2j==bsaLFxC0(bZyeC=Q+&Wwv?!*`_Mu1?E((I(@L72@@(J}c7kN+aWl7U+6 z`s0hp>6c!FUfK8>Z_ogRx|lAix|2F(`V`{oN9CA!$f^ zXJVdz`Di0h`(rIUVL?&{gu??K+D7S9%;qHh7)ytbX0Ci~VTaH^$}Qmh=4-5fL${yj z3?4*eUz^)ypY6tSIiXi)IW9Wm=|qiUj*nk=6uayiP?|czBDLe5OmC!rrwzFk2 zp$9N4a~hpH$^w%zczq$=j$FAN>Y3u~3I>kJMt>2AYr1gATL?RMPPOo5992LS@;u^s z1RFxeH$Q+ftx7>d3tlSx$@sAx+1vtI(~{o4Gez-cDJehUDq&tAuLb6%hz9U?@h-{A zx(qVA5qtf_LP?`{t@?I(<(Ij)+z{PDwDCTx`(6plr%oW1rL6l;2>qNizL&U0wynGrvWPZYf*mz8WH(H-Cd(P z2U|_tzoDB2NGFFxp3I0afF5>`{4p9?0a1sT>qkIeWG9M<6bsMD*d<+n@w0sdP)|23 zwhN2F{NhMjnskEH$9gZd;^~D1BEyd)YFS2LO&AI-GkfSX2}A1gIxu1`+X}vUdC3zT zY-Lv$_N$hlOXf5s)Vl#!7G=Nd-FJ5;mh`ev0bbM^)bDkfbZab;RcMbLm9iYWdMhaT zkcW)wABB>*J^^q~Ai^a@ZpaU^*_WcuOQM4j;&f0Fqy9xrRQphNaf;mt(MmE;ons(D zSrGAzaC8?TQ?+!UL&{wGf(3Hp<<0uszw71MD1la5PgB>gdkQj4Y)P`i$=vWlrmq8^EUBHmGQfZ)=ViRq`c;>VSa~UkH3&H?M|~F18=twQ*8fPpvfn%6 z&fL`aqC>yBr`?l8=5;=ltVUXkr9g{bH_(d(RfYGawTUe8#C4Ll?~&jlXfoo{46-02 z;A5)vi;oL#vI2XEX!Gi+i1QOA=EyJ&B1%o{>DMOx-GH;yxH+a?qH|fZTI%FYtUg{S zu@0i0zsY_d+sL&hRfH}B1voeNhh|#hQ%qGqM|`U1s&X^Q{Xm7-#G??rGOlloUr?H$ z^%KI@xTo+;W{JSsWmt7s!K=LBqt~3zSkSC+ZM$ zkgU%?hJjO_H%r(;isb~SoKJpGtbeeD^^$Nm4pGsA(8+ZRMrq)+>{3Sgy9`SG7yaWq z1V!w^&be`E!mazYQEXj2Pxh-VtjA{`@Td($KL3d@YFRhVR$WDHee| zh<@Lm3S1no1C|D0`o9ZiP;WX_DQF$nxWlm>CZ%299ZaLST1R0Ufr;{OH4yZx{6 z%%%MdUF(E+IJw}_^z|&c=g3L0XP~u@>iWHl$8F{<4}*t)Mc}9S&(lYvnvB-(DenGW z8@mZK^@_aN{iRS?fIr}~O7NSTPb6-o+;C<<1fjSK$20X~XR}H-8dHQTg>jD@{F93- zxZ$E%a`x83-blBuyBU_&>mhINvATUNNDXp(hlab1>;~aQ>|y3G3wwWaFAEMMdA$w2 z649(~1ouiKJRY7?C>v{?4cC#{GTRB{nQ|MmM%4Cgm~Q=BEUH#E2e0lFWlsAM=3x1^>^p)%8Jsic)5ATCytt zQ|mFdj{&kk?j5>9U^!0aH@C0kru_(Hg4-+VRwn-vBCZWHYZfKHfiVmq35D87E?Fby zEd@)~%o1{9$=BTF18L0S**D3r+>%VNJVXB%@-Hk`1G^sFaN#C*^GxF6Y9adzTzcgO^H*X#xIe&4(D zd(WQb+&Nt7zAaT<-St$@L?|mtp&$|QNu0l_7r-y+f+ zCPfAZ-(noR|7B33z|R)$D{4a?>FY0wjzM;C3;87@en+TSwfw3%Gq$%qWdzbw0MWz) zL!`TA^tYJ$dma4*Jr;ZMK8RO8t3Oh`mZ9AE6=-+h8|?+JcjWCodog6z&R%PPMRLD> z{=@m&&TrPq;yhmRR+P$Wv;l%lBy+A2Z%cmzBO!)d=y#^ebz=SQ@w;-GtSF3COf)NA zD)D>yeGUG5YdG9f-Gy0{d(T)~#$suy(gBP?fn-uL*t8B*5_485{0Cu<#q@|g_)wzM zIf>W2+MFb0VPr~#l#D(8uY^H;>`>~W*%wF1iw3ob!7KhNj*Dus{%1Z$`?UuOn*Mo$ zYZU|7YBw^PAHxfybN6d#5YMM=?pzSq~zw0X$i<@hsfVs)*X{QZE&nFe&a zrkS>kxq<=&J#Y>W0U2fq0Rx;t0v`h40|5aY9|{2n{Ko`761h3Ffd6VHj%H@IP9N=@8*W`rfLF~}s%txIE6DSi*x4`}o7#OaV|KT(f64+O;LZn} z+L$>Tle*hj+dA>N3z9#l-~-N|ZnKb+J|}Uu5+v7FP$m_(b2KC6W@cq(B^N>@B_$Pb zG&Sc_m5}_G9k>!C|LE*&&&R^z=H|xi#=&goXu-n9%gf8c%Fe>h&IF`ja`LcsHg;#S zb)tBA$$#D>VdiAwXld_kX=h9N^j_l+b}r6>`?8p!hW zgoTZnmF0il4P+H~y340*>27ANBVlO+bPrI55C;#Bz;pWl+mrt-@xO9v|8GuC4z~Z! z`Cm`|uQ@fG%pAq-Y=9!2h5lDE|1$sg!+#kCSe{z`Up?{C&Chp%eilL$VEG@J2_Y)K zi5{|;KTW^Hx$w8)D1uwFX!Y^{=*E8DN#7okeH;9n7OALg8wq{ z0;#^VnO3kO#6bW@67JD+3ete@7`dmBOH?KyGS6=-0lA|+r$CU1fk@K&&5X|=|6HsH zxZmqJg*2%nObLkGZAjbrsSHv`dX^RFm%4qS5CP+~$PFMSJe7f<>~TW;oB}ia4J3W_ zcYSuv)R#&Rf4+K75hwB+UfJW_VSH`R%Nu~E!2Q45lwql=feQNw1km5dyVLu#ajTJ* z{koB_7US6qCQC91(VgV6OF^qm1{E89!&u0<3o0{(Z@X%F;G z4FBOoqg&_0Wx{9XR%tK!CamNknjG(ZeoCHI?|N)(?2oZKt_Hq0;5y%j+h%c>y_uxP zhr7XpaWK)WzFSs>c5Qy2!jf5v{_n%KBW4F)Mp7pj&1wUtAUL#{?Bl`|gZM?;HU)ak ziW0%GEXrJpIF8|Rl>*7ri&?{wR+qhv1zxk^#Kc7071YkV!?tF}ngX?AMaO;|t&g!D zZey9eYAaqxf=9MqcQw7JQ-|Z=EJN>;5JvshhCT&(FgUM|#spFlel(R$ywPT{h{ zq;=vCjXLpO-hDHO%H{m06b)$3WFYEi>y7$Aj^CrsaS^;(n)GqdRl?zN+a1w{FXnf8 zCN)fpvs#hBb+6ueH ziJ%8$)`BL!lZG5WT&==6gcA|+I+|MRH`TcwyvOHvtvFO(5~AhH`cuVQbncI%={;=UHJ zLSAo9h|Iyn_32mK$>t!9&%$Jh$z;+LxSkQg63?{Fxs@^d>0A6)VsYw8f=j%bi^7 zvZu*U3NOz8n#I8SOd?SqP^D-CIX#}GV!Wm%(;>{e{z~KCP*)?EPy!>tv=oS=<_c>Q zL~x|ETt;mpxR7;FbGAYTHx5=O+7d;x)}OH~ zD?>T$>So`M6yy~Oe;<4QnAP29su_g6aSUH_TlIM_SrZzVh`SVE5RiWyqYwxiRu`BU zmy>~6k4TBNi&Bo_gMvp0T@Eum%K%T%jk46?kpfA;4`yNv2e)%$N{S#UmHS1VrC z-q-743(^V#l#2WZoGpM2sQ&{O%;sL*`Pka{gQfGnj)*l^@OoSk*{VyMGs_5+y~+l| zyyW-yp~`xDs$0bV0-_fhe)BdIh48hTFd0P^l>y=*=uDB0kbJQ%4&YnNbyM$lT*~b&tv1;i zdd)>Uk>Cm5?bp}pyYu?opA5qK?6?!V!Z@U1#M1 zluDX|UEaP)46mf3(9Q3!*$nh{%#0jI6o_dA#J}D7e-0@LKYU#zS}b;g%eO1{zHuia z!JZ2!sTfM2860-0+OHoM8dEsn6T8R@u5S55u=xHL9kXfQA{TLFj?ZPKW{2K z!{^Qc^3lKgAw}Y2Ds{MFe6STE9X1V!XyYxN?aJkLqgLg6DqKDL0Kr0R^FL47(5T$@ zDw`Gz0@ZI1oM*9C-ZbEMvW#Lw6~{es#4jJ2SFDg0qq3UCeF z$&?+)NDS;hfBt;1N=D9mGMO+e=YO`OqBqV94r%(rtl#>v8kTt2_dyvRE)=PU0qBUZ z%V=s^PYk=Iv6>GSX`;y_lk3s1g^>lmt6~V?5xcKJ?))qWJ1~%@s^(zY^_kJJn72jT z^6hl_b@oe5N#VwLPs@P$fP~Mv#HcYj!?u+!kKLh>a2OhqQ76D9>IU-f^=7PTee>ix ztU?QVj@KdY-I6=+5Vhzrme}se-SHjD-88O2FhezHvIA8aeFt7IzNXQ(dHt1FWVz`c z1l22WlDq_XTFa10d3a|Aqw^isN{aJ!qGUEO_WZYtN$sI;QL6fM6UROUltUlFRj*Yl zZb6CifgElS^tgPXR((2sA7CPB^+knbp0hm0OtA@E1w!S$JnO zx$ArfvHl0ylMIj5$R7kugO;->_{QMwtQ?m3gkdCR9^n%;#@6lxTIipjiTGWk7*Oq` zd_C@O+a`oVV)TStfJwt=Sq=W9zb=F@X|p0Lsct)y*T~&&d3C(!vB#M)p(y^&_dycB zH`kl;#iJ!#0U0CXm5K6;_QI5&NMX98ow1_l{YFLPl#_-GJhzwnyqqGpWP|WAx^;|o3s~yt1spd;qAHx`6OUO z^2x;W!{tTal6B+lt1h6{ddZ~{u6f=95(zFYJqzcOm!*8>dzfk@>v?~iEhu_W(FB)@ z-61DiDt;1czu^Oiz-6y$VaK6eF;75h!C2Sq=ZDT7tj4RL!b*2E5*77_$?+7JSSfS z8*f1Vtyy0<#@LU!)^r4D<39MMW5kt4*3bbuUt5{4CrAOIT-&qrz8euVpKwz6Xow}t zvOnd#zfCHQxns(c&We;P>}}?jz}wAd`SQvqa+_aX1D!Gu&W7Eu8gwdK)}P|(d2Ygo zlTt5c5AA^ye%74RhCCB;7=q-1;fiLqqpml`UW-}|9l*_h1ggJMp0VC6MD3>a4a|d6 z><7!kHSsmyMXb&e-%s*inc(>==8>Z0^CX?R{psdgC}_)eFFnp+;QCHcFdWt+sqNb# zGe*zS%yr*KhQ1PaE&HP-b;z3N~gyO7i-G!%tFXa%loBIBPyT4+to*E8J z@&312gO2%Qk>I0crQ_Gq^P&)FR8d@rn4KvEzfUqgARh_~2e9`+v+Y7Pl^W)d@q8;a>a!n`tk(MbQNhx^<=KFe9Pms&^L)V zIprJrEVt6V&C4Q$$m=tw{#^n7GCdIGrW&Vx2(jCegX?N~PKFM6D9mi^(qnz2JFDo9 zysmx~2@Ucb%>(w)ii?Gc6N6V6RyP8 z2eku4RattJa!fU|elbi4^9rJdVkuZV}ESKdI8r88) zoN-z>Jtahs3gas}3}6_y1o%njm_oRsk$x~46fQuf{GVEXPxINm8iX_tt&Q1sF zk52hKQZ%^VVm=Dkt>*D151H}#kVfpn&1&FbnsUJ`TN(eNs$dT?2#!Y?M3W60@>WY? zo!{^X7M++i^lOJ{&wRTVMJtZ1Dn;^9=9LluNYt>WqOQR<%!SipNeA6>6ruZ?k@?5! zYaOLesQmK6g$cQj%wLtZe(1UpW8Hy%CbY5#O;Vazx{n0+1aqbA=kRov9QI4$Hqomy< zt?gC=I0Ol*KfnmCTEwHFLDLNGcfhs{>|07Jm?RuIlBs2| z-8M+&LxEWCO`L_2*m6Ir+-D_=z)-lVaIQvqv4@_#9 z=O$V%$4Ii>C)NjcG6Q9Zj%uZi79*1^4Fngx7el`Vv0h_g4a@P|MU~k#u9TPgZu9R= z6~{h=m2R_6Nl&D(p=-u|x0I)iLyMoX71t9H?uX1d?Tf(rHak~cjU3?;iGn8BnSsb* zLg`otEBG*WH&&(<@`6F4%od#j zLzx`&oXX6;%&gie5mj`0hrS7~H%F$AKS?OC7HUlB#qLDue1L3#_AYfq`y7Xhd zbK{WaGQc5DR>#6UfYRJc`EIuhTr}#h$Xdsa#7ppyLdK)65jy+;D)HC`c;m9{4?jxk z$L8x}a&{C1Qs{O5x&$DhqNsgwYl&4{@K6P$4znD4&7GQKR5j}T<@9Dk zx%u|^RRo+iIl}Idsz=@$tG*n0xAodk=*-3-3=bT3h~fk;Z27Ao$`eWCP99>??YMzh zO2YF}Dp`S1#?^Rs2I zqxM#DnWG@WxpDF?!P31wF8rNv%avnMrA{x5hxdTD?KXKJDwc@*8&jc_H7MeQaDb8U zy7x2eF1#G#G9F$Bv>buYd(odAH=Lq&2HFPA$L=Lmm`jwtLar7orr2*L?^+nL%t~EA z;2wHu)0VYpWRA#!UQYmgG(vGyHmhf;>SQ}l%3Pu`CJ7WxZNO4Z!==@uZubr9dZ@!3 zT6vE%$p?Vd7NF#qX-nvmZjBWsg7c(A*NUXV1#Vf5qw`q!q#cY``T?{hnP(}vn~FP( z^cC}mNHpgVeMYW~pGr);`kfzoTKExGnzxgNi;Q{1nMn+nFi*50{#rn+p?Q$ez@4cf zGw32@@0E#FKBcmOz1Qu9LQ(^hJ<4tejpn4I+E8rc`Z^KzT%x>3Gt05)v>vv68TxO< z(SGi&=u_Du7KSv=U218-CvLh{A65fzpkNt(7u*P^nDiyht5(1@E*)EM>eJFJbt>Np)CO5{e2XSIsU0NFINve45WDGd@%sHmiaLvh5Od=l^ufE%j}y(b zovj~Id7T21d<3-tbYm*)Kry~bP{on=4#%3Y+v0NpBgHf6x zLU2e|L~fJX8}U``x_D`}b%y!~J%8V=p5~e-;BZ{(>byq1IV_vr$L5yasb05aUXv?u< zRSR~bUL6ZPsU;`-3`3V`4Fo^jZI+(dL<~#MvmZQnD{x~@i35BUMF4pCV!LgdvI!$RA?TCjBH*Og+~(xZq@Pv+hyWDI8Qi^~z($76?UoIN}WM3E(o%T|SYy$8i%gL>lm-xZ|{|g=8aH`g8 zQEjxIkMHL)od$a0G)?5j+g4z)Bd9B$O73?z97*C)$DQJz@f;R_h9{hYN93l86bb=a zJK5@DwX@vT)L^sdDn(uO1qgzO&|%Ql|A<%Rb2G@f%yL`#0szYvyf?nr>#Ci;KC>P2 z*2sk1@=t6^*BCbIs25E*(dTlWh87|AIkzMr3^N#~dzmM~47jT;S!$00XtLeK z)X~Jj!%3x}UkW{Dr9do-p6h(xVFRDTyienI^JYv!K@8vU%4+^Qq;5l@@49yFNoYUh zTcWGmFW<{M6lSL3OOsMUAt#|BSgS|sfBU4Nr@`;Ci`~RB>oy7yXQ0g~dq3pMeQKoX zDC2BkK6;of;+*_~8wTI*RmUDw>bErt9CtxqUatE6WwPtIDT*QyHlUVIC9TOP;I^jy zk-?KpU!HgemULpp2^#6@cBriTGi!6F`ps*y2SrO)4TyIX#6K;n0=^29gh zYJ*Vuq{oErti1?r3(H->t`TA3~lF6-m==}xD5gZ zo=o`uIH*hEek;dsA zbH$;T2}DC0r`CLX9-^G~V78tn4{)sTW6k`U!5k3tf;s3uMql!~*qxp-19zxWcYW+t zZG{+;B;3e5{1)8t_tC3VqdYm&Wkx3e!{271;R_I1W4E<_J>a#j% z79w9o{G@RP&{zMdXssxMm;>3;Bf!dIhjq^xpB@l>%-(Ech0DD7GJ~bU-Ms6kR z+I~q;64J?dwbc)eD(ekI02VmMvXuA#UitmCV8HtwLOyWKO&e+ogLVL*431=M#>@xP ztt_|f$~e~Vgou!`OLR@kuDbFb>xBhc)dpj|s>O;#X>T3!t#TH+f;48~;J`;T@B;xo zglr#z4ddq?f#3?lVI>f>8wPwu8@TGxOkNIGfse2kjvdDWKrpK|g)!;qJ4I|FfR9CO zT9cKXwG2E8tw;{<$izdNFO8wEHUX`{SwsWF^dn_AD;-a+Vbc~1Ue5Klj1U(&0^!7= z&nz8ySCbp^@UXFWM}Pu3AO7)tjehLMG#)ryi|7dj{R+8;#4|!{wpc#xgRbF98oSX6 zWqI>C*IX^GU4^^$TIFJSa~vX?N%2~DIGibaB+`x1JAJQ%ZymA(cI(>-GLjB?0s`A7 zl4t=q5%)v%%=~JBe!>su2}al50AwU6ZjQq_7*AZwLmA=0?+@Y2vs0T!n{lp-WKcUe z;YTwVFjC2O7{GUkMDhS7V^wf~)J4B+z*0*eV+N*BRDVDj?lnmx17Osjj@gSljf zh@rss#q&@5KClS zu5+^}2ia3-VmWqOa2D_`K5>LC68PBGbP3<>b1V)!wwnK(4cogqpHdpcE3I4G1)WdI zO&7HXkJL6u%-VhKFa~{H^L%RLfTA`v_=d9f|dH6R7+^9-e(G` zJ~d@;n0uf04G=FX%MJ8yOeqPwgw&cazFui=pMejA%?#v`yKs$wE7zJ}X#iqtUT!o? zq3mM9Q052-h}hk{81uzQeO*AX6-Sh0`^X9LHZapiXk}CSGaOC@Kh^ek;r*K4ec|Ra zR!JFz-Mj^z+7Iu(@izujmBb9X7S#kgd~hF;;!VRokKPG1HPR70{Z3I^w%@Xq-FS!p znjp}uOskrhzvxz{T@wk@$WW%aPw|60Y&SI!%CCA5D>g6y6?Z-C;2_Jp(KEjZTf}A| z+m_P^^yLP@6WMn`e!@)w)?&83s=ydlBLQM>%>9MKe1O+B{mB}^Es~j1D7mXk_U`iF zpbJHU_Z1zp3w_px>R?T9&&ehWbH+^d0LkKS~(QmiFCyv?9Tdi`H`OF}97u4(sIoqxaGeZ0LqVA$?L z(>2228EM4edm-p~_RhoW@57anwoleH3~Wg0L_7}Yqe@*6u;Q6_AX2S* zH=*lHO*}D%$YV7#+JfI4)4>RXf=n#XEDUfS(cLZfcU*Cr) ztpPqV^Ezos$(T2EO)H*OnMuKyq!17s1YKhO3~(lita4)Pf$(C;s{L!5SF3))Rh?2v z0iqSDE-*nwz3RutI{NTs69^TG7GBPxZ&${Twuk9{_`tKDM2@9j7O5-_vCh7e=*h~I zH*g`=H;UyOFf&J>y!tg{o#o#6h6+L}Z#D}72@`9BT=gd%o_uD-shCi+3WiKrE{yY% z$yyz=G%U31NtkHaJnc%Y^%&o7K10^vbn6)AfYH(9YrCAndLcY=j7Ik(woEh@c|)HI zjk#j;8#46VMOK&+MpY$<9L*C%^FI@U>XSZmV)*0&M35w@7RtCKc}TBLW*D#*`99+W zMLrOprpk!XD3&7)W^mgOq#!#9c@F;Vr($mw$5q(1;N56|uRDos(qGvuwcR`9K-RqM zP%eDWJe7h9Y#Ewd&vvuuht{#+-EUm9bzn5|Npuc%YaV+%%lSK}_R2$PElVGA(4~qS z%ZGBsiNDF^HKv|f>eWvM_byKw1WilOA=fgEHLF9d?JctfekxHP1F+%Z;;@beKW1@f zKF^Af{34mf@KA>C@@sP|z6|IfawK&F73SJK42HB0=gdzv|7k;&=PYA9mt-fDx!^IP zxt<#$@udC3j=6$;Q7_+siar3Z0`W&5Re{`e74AIjV5Hi?RCBKe6hTHNp8^xR{yARPG-Xd*mbBxVXJf~0}JNzB%0&iOA;x*7)v%we`1C zyEE%`z3P%<^MAjf%D$T7GtM`m<UT0NRGgtX@x*4%@kW;lMQ&eD86Qao?yw3MbeU*ioOh7y^7S`h}H?y`iwK!L{*9X`hiax^$3k9ubmS|*=%%tCz6fLAg zP_3LBqfj9#`s17d?#Ch`*}NxNFrbPL>?ZC?$tGUNRFSJMD=) zyt#R|GIA%Hx_LgTfYi{Fo1RG~CmjGm+?5Ki$umxBz6Uc`2J;H0XbLE+9Up8WuqxF1d; z#gY&FnDn34^##&vNZXOIEdE8=@gsr4S`r(v2UaxND&9kxW0{Lby6D!eP2N(_=}B4r zkLUfB4p7d7lJ`(`w@+7bu}?ev{_B~#0Y;~Ph0v1={hIsj8bAt4J_i1CKh!C(bb9k_PjQjbj50L4*|F0AWK5Y2< z)g~2)+k-ASJ_ zsZPXhUQ7Y;N4Q;ZW!QqICDu2#k_rirX$KmTPS4VYh+QzFTrHDKhW)zpER%}huM^r6 z6%b~vYa^Y!(2xPo78lytBUuj1fko&lmr`0Yq8O$ zkr;wRO?5?Gl*4>9oB{DJ^7H3Hz@}faSrAlsHD$rRjWrf-)X-@Kjh&CV*clu(Rxy56 ziI>+IYk0cx^`}iaw?`~RB}co{a)zc&d7ZOI)=k#l3TVYfUq`xtGOaGtGHWMmPr6`H z)8>>|>b-^MRx3~Cf~MKdDc>3YtcC$&(we)n4n0wFYn{5mk;7M)BDX59sj>rWmJx{z zbwY(iSlc*jIyo)0eYFietqV;7&?1nMm%h?%Q8$^-wv3UsZoM~5PE<62eqpXIst}_o zse$vOgNQPY`Y_@h*_h2%>y>uhVyk1qkI&9y_hT+cwWdu94Ki6H5<1ii!MC~0)WhsQ zsZSkNn>W_sG+I+UHU^TP0?0pKT@h_@uNtC@EOE71e>W$$kROcb)JWR8}K$``>ugC7sH|FK9@1QDK+aI>js)_jn>RwVd| zRRKdJ2LkHm6$$}%BoxQY)^w-e-|Yl*q?bBGVTizZYJaF0mrD!%6lbc9W8U&K{(u9h zID9|s6go9|$iK#jK(s=tNziQ$P~uPwBjE&k;1xxDtozCM`GsD3L$Q8jZ8FCDFlvJ* z3D%~5skt*k*KS}i+gUstxNubL(&OEgq{)vbXh}*B6V;3|zlD=D^20O!sgZx+gXg!* zDAkE+5s{EgawLY{5M;lAQc_)n+;OC{m9lZOw2ET3ro189TE-VFx{U>2&p(uUidb*L ze47%-^s@7rRi-O^5q$w?Jq|gE$HP+l^>aUDKtvHVqj;Tf8{f+f13fPsfq6g}^^FD~ zwE?W~A`T%Jl~N|Qy{rUd>@QeVT12WV91Pn;mM^=;jcmf2UbV3#_1rsgoiI_fENe(3 zoTIC9y~)oer2zpMkF{$C1%Ls@mzN%9y9u-uQZZ4N)20W{4VHs8vA{NeQ6lcosrBs^jUAaF(0FGB^iexd59 zwLj09{bA(M;p@joQo%Sy9v`8|M_&5tJ7WNAnBqwSZCZP>0O3<-{YHVr<4Pr$#pj_W zw3YD46Jtf|<-}0nPB(i|s$eAuAA{5@Ze+F%?!Kka`#?v$lrXdB(wz}#3#gGFj3hiD znSd@{CXC|x*TqlrmGJ1!8B)p*cG%H*RuPF5kr_Ws*pEm^Na8oYoSaz*trVY4xdQ2^ zQa)ZSXl^TMm4{aM*}n5ZUBgoa`xx-?{YMT-Fg?oe%km@{SuQ>3GWDJ+0D(XYrL(#P zdl1=D{-5ppx$vewIk@x$MII$0_A<{RL??nW_BHEET|}oSWg}%8ZGPO=W1mTUQD*t4 zkx37K7AN+cRs<@t%O4Wjdbvv}pO*YzDW-w}tXpkd<{oB(?=<6H@)f}J>`Stvjt>?~@~DIq7+%XUo2r3Fz!8hxp5z~W6 zaFvNwGLx%~QxHtPG(>A&bMxHeM!4njli17H(F)*GU8sRkWj%l2B;Ye$+jv^0U6{Uf zxq`hq<;;J9iO+V;Hs9b|$+_wzJnz%l>pgV}SgH_+TM+B3=G@#a_awjuepH`&KkY83 zV^oS!GM!tywqBV);6kwNy4BYqQy}yWM~gk0_qgvf*dL2IPGN6Gw!e%keyE3&GVTH< zQ3Wg17che&==E^oJ?9P!G;5vTG2WhnbicMwHzhIEIV^ulv$$Z;sMOHfJ*dk_WNK2A z)zEEm&t^lzfk0>QEeBRH8mMCDav1urwmV9$@~aa z`1<~b=PqlCha#!G571xT)x6%<_KPm5TeFcrSjYnYX3j}+SLtFgfFp~;WP1PDd|1>@ z<2lgs*o`bOxhwlsLdDa`#nu>|6gIYEsL7aaa>T#ev-rC!fjK#c$&7u{@dr~AaihDo z_;4}QyRI znoPR1IgdxL(;m-gllp9@Dg`t88fzVYoE3bv-TZSYWZ_f03A$U2TjnD&C2@LOY;~!h z4wb5G1W_?Ch2$*+aFz_NNM+J5D|N~aYnA*SHLs2(J~>k*PTPMz+Iak1ov;>@))zL9bO#XLGqnmW9eM zgLo-4mlR8Q^Nw^+I3jRFMOzy$(vYK*nM>D75Mdb|w0Kys*d(9>;xE2GF0|HeQbd~e{3(5+5|JeG8XV0w)fRFp8Hsoz%9JpY0GoGTxOAD8X-6Xw$x~Tzc#iT z37>sbN@hwWN4CJz-j$jT zyl38zOMb9bqEvu>enHD=9_n{2mQ5-Yt=CMx`*rYX-}Byso-oBjHdiW^__B$(cLHT# zDKwm3bW1N)XiT8}@rxbzN*C_l}LKAA0!vw%p<+rQ?ec7h)*lx}ra zeAf_l>OaWrMNp4)G~FLMBV0Aw-of*^zwJ@>0&sV z*{aD{!_;)+t+%bW6NvHAs!Twuq4z_nc1xMw*~UjL9bgQ(+Q8XF5uHXJ)Tvvp9SYoM z`i&67kuW4ve~DQ2rZnt0ud!Zi?N@}l`r~#a$N-n+9Wk7*f2dv?|HkKpXtH$=gH}=! zbXpU2V{OmKbnUOvZLqxWgJj*bb35nIP`*9QR@>2fkxb|aGIPQCds@jgcN?zFSM{4F zfHg6h+!C1jSbZ_yk%1@W*6Kz7V%&Qa-Yeq#9*g~Zeu!$;X8s`QIOY>nXgz<>BtSf{ zJl?D-cauEs);8|@_YYS2sc$?^4QEQWuv7x7m$yp3ss-re@n5_Vs^1%X}nF%oSZ}y zQjQ#H5#D!c-c9zpE#$irpg3&E^2$D32VC6i z(R!a;kJ$`oT*(VQfU8cnsNz+m_I>zb)^5{upE=l~2xW}UYVHwYNgVpqJ~_=0W>=TP z!@cm6f*VOR*w2YdhtI9Zim*N)F;v9CxT`*%-E3GkOR}x($6TFafw^l5h~w6-1;-r{ zNrh(m(`*7FPWb>)*#{jZW(SxbA}!tT@3td!^<>PI9(7hyy-R<2R@K_z9J=WlE+V>6 zZAh+QYy(TGk2c)-Aawe1q3Ve$mETB*zPI3+3XHqKZv_=xW~zL3mhJrNf@$n!w^99w z!)=a30<-I7Lb6>+w81D*1&*@)!x{~dkjZ8tvKo41M|)b;&gL$agLHJWDu1JWVuhp{ ztrtu$Y6bCdHCjIW6tI%+CSpHXRQkPiw;JzA%v0c3DiHq}CYO-Z7>{R1P>?fmeycE` zN1r<&^v8ni$k=l9Pwo22shmWKA@`DEdJU^qrev3Lt*`Hcznp6bye7X*Lzmfh3Hp%3 zGg;e+W3)j77CaR0bZ&jnS8ASc<&E(@!oS%`(CQyC|I^2Idh*vcc|}XOWMs_8LkvO^ z#TmLaNuGh##K+*_?ka^Ak&D+LKMYqw3-|^y#Anm`+FB_fPGKLyV)2}+k!GJ)Jc_p#d_^F_G@*Y5||2- zj9COt|L&Xuz6G1@dm8;#^($jOrgMw+BMPfW$x)N=fcd?OuDGPnZc!29EeeaSir?Ie z#@V30Y@Y>MexK)Z+#h2I`Lpi?Y#i8(0!{miSx$q|j}Da^(RdH&EnD208iofX+KXVw zc8gapD>&&trqq0=u3Q)?p>f&4jriCLK!Ev`(FR}EPnTp*(eTV9Y9c+ti`k7+!^n;)M>2I4N zoZNaY(k}={sA7G{!?Ii|!O2VgNgeX@j;{6t>pp*(aD^WuxS};UW*yWBFVgp^518CO zfj@m~ct`#bng#da@hVNddRZhRl>aOY0y(`VDxH01G2YA6oIo$H8SuDG$8GRj`-}ls z&-DKKWb$f7tKxW1e5!=09$4v`TLD_1Tv2dHLVdz))^p;~=A!{oR4Gsdct_ix#B zDGS#gcjS+~EiK;rK46*0#K4$hvaGKw8_kFE5MR{bHywX7GfG$wgSGh~z048J@HMfM zGU6xoXl|$L%?BL|SabC%1GP_Ui{|&qS~4}}lt|7$bV&SqpArVyBczJHu{XQq)H*uC(RuW{5^rpXfW83g0H@3YKXipwh zG>f@d&#B!)$Qj8CA25Xv&TCNLd;%U^VQ3__S01H-EibOocRMK7PppF2jI2|Uqv5AL zVB;Ju-_@_yf=@Z!5deRk>!=a~3>*FFeYq!@{l86A?_ugX#*u8rC6bIp2<|}nE>5+L zPdo$tbpUHL0Yx${0dcY=-fQ(_xfd^x8FJJOX&HS0Scw4+hn9NGe>}c4QebJGmv5XN zmIl%71QZDzsZ{8HqU88H=9L5a3dTR@NYFuwm{UFRgEy2A%l@6Lec`8w1s@m_UcA8t z81(O99(KLTMv_aR_V|}atHKM3I$r;QIOqYy$#^OTC7F{I`*(Mb#KW+D3LV$1pa7~FUr%sW1p3ow8?P?V0rJ*BMa5sPN#Qyav{ z{DoLXZM2n@jX>TM!{wZ}AOI^cZnA2VKFiOa7fR=^3^pe~TH;uJGA|LXV_%w%3DXl5 z!1@93Z6fTy%Lfmm;j>d>;zlPui8jES2BP4Vt+=*P5l$N55z7ML;l?+k?%_#JYt#_^ zA)TyWN4e#CXj7kw!V?_QhKbTPuqOmeysh}9M~F+QHuG}@@+C1XAs~pfo_-6!pZrN; zH8t|$8Y;{$1SkKU5#YEt+KMz`KIy`Nw(biyLVp5kKs+t}rM7xdlIBTL&p-|MM$wC` z;~?Ngc-B~u*=)@{LI8GN9-}adFhLzqJauUwwkcEa3#f_{0jOCn zU;~ZA*#MxHWRmvs`k#RI%}PemRkJeSFUt+4zkJ_6ShP#Jf$Tml?Uqs&5B(o^^Y?g> zOG`}+Yod~1#^4a;yx}0ME!+J?5WQ z0_chon4~Mdo=pN9qT~i*NsgBKU0xIn`#&@<{zKKijIC)X$~A{E!K6*9AZ{|(Q*#0) zsewT-C4RB}lY+lE3@W#$M~se^_B&pA$5jV86F*6M?b(UMQ}J;~Fh#M1WGpL=nv&_5 zPcEaj0eq}QxVPjXY&v+vL0-6<7}+Q4uFlHwH{p`Dis8^>WM5K0GLE_ z`Ru&YpY7e+PET)y5AtXK)bl*C5L9wn;UytM)BnS2@Xw+#BIx zl_SB15b#eUQfVN9UYYp!Uh5@efcu45&TzA+o>Atn|D&2S|A+GZ_qfmpSyPcDDf>2M z-?D^4_GK7jjUjt>vJ*-n+t|0PF}AT~9TH;f%h)Nh8%m9BEaygjALo0{_xu6p@tB`x z?wQBj*LB_Zbzjfd^L>$79&u<9T+e4=Rb?*lBRsx)ek#O4_bhG$-SESjidlM^DlwW^ z3;gF+;s#7wUqxPCv@(nV8t!%ru)^3P`rA$f5j+TQCt$JzK=_*fQ`nzA`nMTNzy(++ zDAzddL!|>YO}K8!7_JFBvXJc7sotnvOLCFStUEA()Ok7bnr1R)##&)_qaCQd4?L3h zupAZG(x(1I#{wg|sijL~?|_?gzHw+@3PVMsrkO#0b|uoNU+My9g6DzhHP895Ue82% zb(Dl7$`eQ_J<&yMK7AF^;6u7;SDvwmL0(8 zS3e(^^46hs8BD~-v*jlFQ4IVJ4F>_+W}n8GJGl5!lb%u=tPJ@5b;9Ce!;%A+^1SP( zm-Qg~K$$6O;Ku2k&`&-rpWV;X(;fCG=wbm-fLz#5m@xL)Nk*-HT1C(93rxeGg%N{@ zR~fZsPmd-8x&@gSm_o-*vC#2qyW7MKk!(ZweBZ&Swu9eeZTxZ#OfO$G`QtFcq*-%G z{Ybb5^)QbcY139eUNfhHjIf)k;j2jqbMcrhDFN7EA3ySGLXp2>K~n&FNe%gY>FPwI zO^A>^<`K7Hgb37fp?(zk^xI8Hg;$hrk&&^js4e^G`lkKQS19(b5eA2J9R7MMS|JCH z^{ccuYUrMqQRX(-l@GCMAgPZ|4?P8}OqwAQi9D#d5!-PE+Yx!cT2mQo!_vo@fho5x z&8XyGOFEroalq5ZLGDEGOJa}paXt2cle~1QR_aQQ=$L%$P9$2?{5w^mdC5NwN{eg4 zF#n&qAKh#_KW2w49zA|DlCNiFUAGcLZ82pF8}6vyo(&oM!VI5(xlT*iKJK#R=(0^2 z{iJ#l$EPT$#|9eQP6W-x#yCmwqv?C-ejjmt02gO$1o)cr+}U>Ff_ijntjvU$#+rsT z6~`*?4wt>VwLDET)e#{|xnq1hLJuc&3?EIJ9xDi8G74tWR2V}YhKwLkZ~S~G4wD6T zDqFXwzEE4XzxUpeUPf^PM0M;+Um}r4y%M+XTm2>K^d?k-Q&f81uHNpG#GJmWgkQ`3 zGj{=~_RO`!fh%F%LB?rsiQUJg(a=j8v>V zeiswMoH+NGvI4Dzui!=LT(mKt(PwJdh40KnYZzXZK!1JVK^rK_&pYuGO}f%_Iy7$pB_MJh)6w~uuRVGP+n)J=?wZ%8zLmBa3-lL{XtwI$= zR~!0a1JxW#I0?#OK4~~LrbqIq>|K}43M#hTs-2c$XGmV4^^&Fd?y)FVTEfz?so$J` z5w~16*WRtmBj}IUD(Qf?FQDAH%7A69MFjb40B1v0oz3w;8^cll%y0Bc5YVQF%`f)N z_ZRS>@9#UMJ-EiP3?9S-J$qOZu5rBCoAp(sReMxcGSHe0-6m2#MUBUqZ(xJGqCTvX zH4eqR$&&H_RD5VNhkdr{iWYSCCNUX?iXe=!lVu_zCr!%vkw=DB8vBYnQs2d@Q_(kX z(<}{e-8Iz?Gp#HvRHC6%?s6amfOEpkF4tS(?P%r&<{x%o{ul@*L`gYZ-UmI$SPNCQ zHI+b@nY_5C?ktWDf{D8KkS>>2VNkx`q!Z`4^_v?vCOw=cN)|2vHNdn6UYXL~#gp-1 z{7r5c8tcWJCW#ZBINa?RcQ%mho_~$40$UyLG`SAjw&|B*!Nye14)ht`#`cV021277 z^c&{Tdlf{O?lhY#mY<8G#XQ?f=uZSxGC&fec^}^ux}Mg z0+z{Lw!f$n=ZM!~O9dLH5sU5J948IH@hye3{Cvc8-pNSG?M>K4Z2a7Z_dFoc_i6<7 zEC8q`{B=+D%Kgd2d!Du^=Oe=j{0|+=je#-jBfj+AMBZdU<27L$2D|SH=sOcN?hUCW z`JUSK=#d@jO99d5^T=;5Z0ar+ zKt8i?^X037tyB`|#do3!*sl7Hv_Sw-nY20_>L)@Yh1ji(*Z4(c%-0T{v9)`gENqkJ zN8wn*fQo{Hjca)DtMFnSviNTsT{2UtmB)}Gi{VbcVlWn#dKCTKfqrAOxBedvsGnL% zo=$X}1$-_aXZQUmyey6^$Ah?A^~mPsO^+QaPek!;J0fsy>{>OW!I2S`7@ZES(rZ{; z?k7P9Gw3{>a`%`Wtyw7=MObg8K7gfBH12#J7e1K}CCOdL=9rXvXSVs9tfJ9i)n}_1 z2`vcO@LRD+Jv`E6*xgSJzOWEKeJAUnaZfpZy1q2VzLyRi+tN17@G*#ir(W_O-V?_M z0|`~w7r9OK?JkrF3hWdCbFlWWlt+yub96X@lF_W!IFUK+j1^BWW%au`bKV_mbCWlD zi2Qt2oXt6IZ7`8*yo)K5x%@;ByIkh57|K*q?-tDkve#hTbyxK^-=SeMj@r2U#Oj1= zeGE}<{PK;pM%+O|4e}sFq-#T_qu5fr!bPumgGumZArXhkZlPf$A264)8*50-|}dv?;5P>3g8@#UPIWbSxyBDj(Vq7MIA*H?zTf;Lrg7(%hc=bTJx1D~y zt|%Q8oU23QEb6l@HfCyUcfei1n_PWYBlT#y+cm6>P0V#(qr#p~;ufdcq}y8u`V-{L zWN=BLHM%ei?ue_=#9eAh`?(F zBTm|1=PyW0);=dm<4qA3hF`p#qRt@sn{prJN*$}UCB;`x$5rvKZ)+#s>DJiwtfG%FUr)I>|&SF6osGw_NV2xT|zKom+gF zN8$JYj@IN@c?=QzMLm<9yTgJU;F@a|mi2!jA`C8W$bDls10y@z*>d)ML)`@yVSbIWS)`XfEJ)Up2H=&_@17=bt&(*RDDZ&GxfBGWMiIcxQkF1ulY(Niuh7@C- zhdY+lerk0GLRiC@&D>qNeJ*mcWC_EVSUo!oWshl&$=$J^BKTYEC_`{etT_1IYgZ}o zu!r%6yqe(_?C}`O9p}aQ{hH94FXqA+r%7#Fv4P4V(w=S&Cw;th^`r#$qS1Ye6D-W(FM-L5@S# zh43aOa*sgr!F{gSSg;Z0fZif+>eeQa4*tHYymIa)f3I-VLsX(0q%)<0=+cuqstT#!ruxv3z8TP!t~3&Cd*HJ}wc|}e23tQu>(%Mx3d9>L zdZ?cVsnNuPnrNOucABsuZ3V!*`8M{_=1c#3PQ-r2bPlx4K;HZTh0o%*agV9ea7Mq7 zQef^hm@r7*ZcB7dKSI;@#d>4n71=H;9E!uH>7B$x;|x20Yeh2Y@bFdMIfnO6mD;2A z3oR8v9**?8NGKY8&c%N-?f$W(eoCxkOKkCi`N?nr zD6z`GhdqiXlfjX)*#lZaev+m=kA%qX&;)9Q{6v`({{mJ~1Eom~D#@=VLZXDp;s~s! zS`2vDNMpc5vp-bHm=HhQdO{0`wcPrll@2|%9W>_Mg(&u8&azo&M|(t!O5z%=4tML2 zrohp%*7o3n==icGzWgN{4#ybXHLTBsoo0eQ7Rrrn$821&13PY2+UXATMPYP1X{xew z$Fsfek$&{{sm1r(`2~xdm?v44H|}Ww3Om~p+pgN`C+Ttr4D`f75_B5gFNwoLv9U|O=hmdzWsHqwplO4>jSRbPY8Zg zz)}XuwDXp?9d)voDc1*?(vn+;v*lf(;0419U%!o^aut!tTg{NXdbPust94Ic%d(mh zS{0Md4Mtk=Ok~A&y{S!uT{IHvys3t?Keo547_ISABX%i_+wl9oDzeLP#lPH>CH`cg zz_D`1zZxN35xK4p9n42R<+tcjn2&F-ESTbLA;Oh8M0Qnj+wA&?caG>)Sm9(Dx$5Kr z@bVV8Bbd>C64E^~sSC;A1NQld4w>hp{(Yr&#?p{#%O}U|ZA@m>3@ZHQ0A32!ro6S~ zf1o#%x4a5w^f;6n2nhYDPWsa$s%@L6${9`Nq13qR_2$7$5XA~30#HFjldEcir5l5l zJ?>AG=?^%)OjghOILYjS5FX!~n`LF2m9ATHw)s{;oUK6L&sAeB?982=701$l=Si}8 zl!Emw;>a|QU&ATh*F#hmDty_?7senDF9DswhPY7~u0(LzwLBtih^3u?#CkT%T>)qO zR85GSEmYKtEunZc*3akYN#Dl>aq+L8-x#Sp&QpfHZV3h=Hcon(gP?2eW9`D3+1w#Ye|ulK*28Y7<=g@3OMgndg*lmKgayJ*5Wu`(EtRMZ`cmEIUFP6R40 zXH%H5*K8*C2cDT|Vd_5<*Er7bl1Bv8qBt( z4x13dKo;iiRVpFp$Gq_kMwzGu$FS4E(cxGKO zk;I$<^=nsf4n4!_!dnwj{i>m0%c-g$@fJH6X(XZ%e; zB4jbU=PAe~;>2?pI>SKOUdsU8Rhcw{!kV(#~W$VH1&-3f?Tbw@wvE%F2+w zuAfu2nI4WV>F0D2Or=pG3dqmBu1p*LH4oi&frZ4lY@{aEDMui$^f%z?Onp?T8Q8|Gn(|08Pg zUB6Fpe@TQQ$K`L>Q&0TqaPrmt#cNh1qNAZ ztg5ns=n4@U8mg_SNu%}&A$&$x1D*fq83SI$kn@N|HkYiBQ+}8z{=#YQb8%leUTMw( zA$5AVLPX&GS{8toepv78J_D93#CLuwU+png{6oxxRB7(bi}WZc{#A!*HP5x%yyq_G zodKZV(=ppEU8ZWpf1V1wm;cLiskHtIk#47b)(XH(5VHorq=A=NN?;6Rad0^lbhGWh zQP#hiiRS&JaPyQ`=0X{NX!*;>1abNlXQtz$T63?lNVYR;*5nH5FT1-P@reSIZAoq1 zWo6QgXR0SF4dC8R(L|8vv#2TnF!L;b3nXwOLV#e?Nx4q}s`n6(7rh~Wpyi$ zeEYRWo`8LP&8pMrU&$9M4Uhp0%gZ%<60$7xy`K2$>_5s1onB`nK@VR1rU3%c|D%62 zjm&#}?0OuYHIDNBu|9{+GRJEQx@6N~KvnizA$xGf`9Q^!U3X;+gWa%_d5AebSoZO$ z*Bak2Ogp2jGofGWXlygvSZ6;~qn59c=?JQzrkel?MstB}3p|`x8rz&_YE<3`qK+qlUc3|ig( z=t&+z!C@%jv}m+Wyw|gVxAZ`1S7>!X z31ekyUGaI_?A&N5^_EBJw$`p}&5zaxF%)*WAuFYErhwb8(?pNQt#j;Qa)zj<`t6rc zz>qJ>c~7aQ*i`9w`_3R&AE{!3KA+xf7E;$RK3N4Khx@?;{9Lued){`|Lf%nuHEZTq zyHc?a>$zUykYXYKF(W2@Z#{_I7}piphZnippi#Q5At; zU9!D4nLC-dCOnpq*OzDuk#pGQK~J%t{qkoheA3CK>zRC<5adiRe<%Bh6zFWL+!`se qKf~1ksABPAJRiFMA2;^i3+P12Mv}M}cAjpVudJx9Q2Nj;_`d+=T5S#h diff --git a/docs/images/webfunctions_cli.png b/docs/images/webfunctions_cli.png new file mode 100644 index 0000000000000000000000000000000000000000..8624666e20cc8eda6b36d00ec08769c1c362720d GIT binary patch literal 47946 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 literal 0 HcmV?d00001 From ce313aaa4a3e93ce482c474a162678ddb2595326 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 24 Oct 2023 08:22:51 -0300 Subject: [PATCH 168/201] chore: Add version to csprojs --- src/Application.Tests/Application.Tests.csproj | 4 ++++ src/Domain.Tests/Domain.Tests.csproj | 6 ++++++ src/Domain/Domain.csproj | 5 +++++ src/Infrastructure/WebAPI/WebAPI.csproj | 8 +++++++- src/Infrastructure/WebFunctions/WebFunctions.csproj | 2 +- 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Application.Tests/Application.Tests.csproj b/src/Application.Tests/Application.Tests.csproj index 2d8f129b..6fde1bc6 100644 --- a/src/Application.Tests/Application.Tests.csproj +++ b/src/Application.Tests/Application.Tests.csproj @@ -1,11 +1,14 @@ + net7.0 enable enable false true + 0.0.1 + @@ -24,6 +27,7 @@ + diff --git a/src/Domain.Tests/Domain.Tests.csproj b/src/Domain.Tests/Domain.Tests.csproj index ebc8cb55..3f251927 100644 --- a/src/Domain.Tests/Domain.Tests.csproj +++ b/src/Domain.Tests/Domain.Tests.csproj @@ -1,10 +1,13 @@ + net7.0 enable enable false + 0.0.1 + @@ -23,12 +26,15 @@ + + + \ No newline at end of file diff --git a/src/Domain/Domain.csproj b/src/Domain/Domain.csproj index ba9ab662..11c75cf0 100644 --- a/src/Domain/Domain.csproj +++ b/src/Domain/Domain.csproj @@ -1,24 +1,29 @@ + net7.0 enable enable 0.0.1 + + + + \ No newline at end of file diff --git a/src/Infrastructure/WebAPI/WebAPI.csproj b/src/Infrastructure/WebAPI/WebAPI.csproj index f5598dd2..9e52aaa4 100644 --- a/src/Infrastructure/WebAPI/WebAPI.csproj +++ b/src/Infrastructure/WebAPI/WebAPI.csproj @@ -1,11 +1,12 @@ + net7.0 enable enable ef326666-1cfa-4625-aae3-41ea85c01828 - 0.0.1 false + 0.0.1 @@ -15,15 +16,18 @@ bin\Debug\net7.0\Infrastructure.WebAPI.xml true + 4 bin\Release\net7.0\Infrastructure.WebAPI.xml true + + @@ -34,6 +38,7 @@ + @@ -41,4 +46,5 @@ PreserveNewest + \ No newline at end of file diff --git a/src/Infrastructure/WebFunctions/WebFunctions.csproj b/src/Infrastructure/WebFunctions/WebFunctions.csproj index 77225487..685a74e1 100644 --- a/src/Infrastructure/WebFunctions/WebFunctions.csproj +++ b/src/Infrastructure/WebFunctions/WebFunctions.csproj @@ -5,7 +5,7 @@ enable net7.0 v4 - 1.0.0 + 0.0.1 From 579bd04177fc910ba546297b8ca4f75e807453f9 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 24 Oct 2023 08:22:54 -0300 Subject: [PATCH 169/201] chore(release): 0.0.1 --- src/CHANGELOG.md | 262 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 src/CHANGELOG.md diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md new file mode 100644 index 00000000..6ad0c7cf --- /dev/null +++ b/src/CHANGELOG.md @@ -0,0 +1,262 @@ +# Change Log + +All notable changes to this project will be documented in this file. See [versionize](https://github.com/versionize/versionize) for commit guidelines. + + +## [0.0.1](https://www.github.com/eduardo-paes/DotnetGraphQl/releases/tag/v0.0.1) (2023-10-24) + +### Features + +* add .env support ([f9f0037](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/f9f0037296b70e86d1dafee1346456d41bf4bad1)) +* add acitivity type entity ([80837c5](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/80837c5e33d97824917b8ad55c6de5a4e177984b)) +* add activities implementation ([a0345e3](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a0345e3e973a2efa5660b03f4c6d02b1408eb342)) +* add activities seeder ([8dc8dee](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/8dc8dee3a4cf9acb8248e14f63321a8d3804b103)) +* add activities to project evaluation ([42609e4](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/42609e47e85769224cf51cda6a5c47b9fa101d30)) +* add all methods of userController ([a3d5e92](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a3d5e92adb12026760f51a7cdb8a6233ae24167f)) +* add application project ([374d8c4](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/374d8c4b23711b3d821b53d29fc0a9bbfe066f5a)) +* add area and mainArea dbsets ([6581e9b](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6581e9b7f8669a5e896aaf3fab59eada2907c69d)) +* add area and mainArea mappings ([efc2b25](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/efc2b25b9de9cc7597ac3321cb5d2b9aca25056c)) +* add area dtos, repositories and services ([9c975dd](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/9c975dd53dbdae78bd2e765ee436e5f7e3d894ab)) +* add area implementation ([d2a6499](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/d2a6499b685d0315a87dbefeabbce22314e20a0e)) +* add areaRepository ([c02d9ce](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c02d9ce7f68ec1b027185750f3757cceac5da9f8)) +* add areas seed to migrations ([6fbc02a](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6fbc02af55442d0b76b6e079657bb2cdb472bce5)) +* add assistance scolarship ([8778fd8](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/8778fd8142eef081e94b152cd38066cb38804805)) +* add auth basic methods to user repository and service ([1e2bafa](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/1e2bafac28095ce65ff3e72cf3bd9de64d8d34bb)) +* add autogenerate id to user ([e8e7ffc](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/e8e7ffce927b514836600f09e6d41e6d0d81b7cb)) +* add campus implementation ([6e903cd](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6e903cdbef19825a333e1064cf8de3535e5e3439)) +* add certificate url to project ([d694954](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/d6949548f3dbdf038e039477e467fe5855896bbd)) +* add ClosePendingProjects web function ([7f8401f](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/7f8401fc3135032b174c5fb5586e7aa538108d6a)) +* add confirm email user usecase ([789028b](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/789028bedefd4baff2cc921620095fe22cb8940c)) +* add controller documentation and simplify startup ([d264a61](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/d264a612423b94bc8e20faa90fc7226f42274a4d)) +* add coordinator name to certificate ([fbca60f](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/fbca60f95a2f36622e774e5030e30b96f72ae4e5)) +* add cors configuration ([4375b35](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/4375b354316d8f53cdefd61f435eb4fc55e2ec13)) +* add course controller tests ([ddffbf9](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/ddffbf939062e1e02e93eba6bcbd4d4677012b8d)) +* add course implementation ([c70a93c](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c70a93cbe53d34628fc1bbf263d7dc671020037f)) +* add data context initial configuration ([02c9de9](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/02c9de92404e5e7cbeec4b0f709ee2ca42005f01)) +* add description field on notice. ([a3ab36e](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a3ab36ea411ab09b1cf44537ce41e1cdb0ccb557)) +* add docker support ([5aca3ce](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/5aca3ce583bc717b001dc59e7b68f4a61f2289d6)) +* add docs to project ([331d668](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/331d668d8cbaf5efc1575085750dbf7e8644fe42)) +* add domain project and some validations to entities ([e9787b5](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/e9787b52d442c502fde77fc32f6656e88e33aa15)) +* add domain project to manage entities ([7ca5e90](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/7ca5e9077694ad99c601c7c7fba45e0aa6c422b2)) +* add evaluate appeal project usecase ([8341042](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/8341042fca7e4d66320884247411f1b118a902c8)) +* add evaluate submission project usecase ([5f52bb2](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/5f52bb2ced231398627d181ca8eb1e94ccb70f1b)) +* add files to seed data in migrations ([1ba39b8](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/1ba39b836a0835b0b80422cdeaf25c47731f276b)) +* add first version of auth endpoints and methods ([c919a83](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c919a8373ee93cce590de380e8cc38f8f55fed20)) +* add front-end url to emails ([7cedd17](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/7cedd17541557ee920ba06c69cd58da8aacbe7a9)) +* add GenerateCertificate usecase ([6e6efce](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6e6efceed5ea671d87148c498ec837b02027be80)) +* add generic crud service ([2ab86e1](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/2ab86e195c2e9ccdbd49cc35a21f8f28c8f4b36a)) +* add get user by cpf implementation ([3b16629](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/3b166298bcc20c2deb1e0f02f46ab596661360a6)) +* add get user by cpf in repository interface ([c556b33](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c556b334f098e9dfae6942ea60649d19bd1e9371)) +* add get user claims method ([596619f](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/596619f18fd5aca994437bca850348080646d780)) +* Add GetActivitiesByProjectId endpoint ([cc995ed](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/cc995ed2733a9dd5e7757fa8d61c0f25dd17635d)) +* add GetStudentByRegistrationCode endpoint ([a89c491](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a89c49144abbf4e6f53df15f0fbad3851624b949)) +* add gitattributes ([bbc8619](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/bbc8619cbd35a3d32720647fba4d0d1ad301c894)) +* add guid to entity ([6814b86](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6814b86f4f9809c735bed14d0fa9f88320d6e53c)) +* add impediment to opening a project for a suspended teacher ([502fb33](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/502fb33950973187a16492c5a7f44ff176f8df6f)) +* add infra-ioc reference to solution ([40f6c56](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/40f6c564dfda87aff246deb212412a9e050d4697)) +* add initial dbcontext ([6657f5e](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6657f5ea3c7f3b4cf86481b2140443f26a6bb480)) +* add instructions to readme file ([90b56b5](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/90b56b5c36c88c76dde668b3b9ad3da140000724)) +* add main appsettings ([a19f4e1](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a19f4e1bd153699fbd8dd7b31e74dc4dbd520355)) +* add main area implementations ([96d45fa](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/96d45fa56f3962ae471bada259859d983484482e)) +* add main area repository ([c026ed1](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c026ed18b36fd4d03eb8e8a8b8642e99f9ea7e9e)) +* add main area service ([6085260](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6085260a2ba4d9e5fd3d5eaa162f24f542ae84f7)) +* add make admin and coordinator endpoints ([6cd2e52](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6cd2e528b676824869aec0223746c87104d7198e)) +* add MakeAdmin usecase ([8a71658](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/8a71658b858dd0c8a0b9290f0a99435166324883)) +* add MakeCoordinator usecase ([6bf3a9a](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6bf3a9a9c06aefcb43e49d2700ddff6221dc085a)) +* add manual rate limit ([4b9be7c](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/4b9be7c620fbcd59ddcb6c5906e1cde8c4e6c2b1)) +* add migrations to git ([73351b9](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/73351b9be2287f57700449e2f8ad4ccb83a28ade)) +* add more info to ReportService ([e4be590](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/e4be59028a8a4e6e595e061e7330ed62edb4d2dd)) +* add more project usecases ([c81284c](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c81284c468f58e83ea2e39e5bc3b98520131a6bc)) +* add more validation to user model ([6c40f4f](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6c40f4fc7b4b52ee1b0c59f45d0c4f880b8f083b)) +* add notice implementation ([6871781](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6871781a02b757b43e8b756b69dc563b1d061c54)) +* add order to controllers tests ([4350c76](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/4350c76e5079a5a34ef5a3c7b15057f5508dc2be)) +* add pagination to routes ([632a63f](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/632a63f42e3c91d9317dce74255ded9d6d33d8ae)) +* add pagination to user repository ([7a90597](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/7a9059773802bb8b14608c09207c9b05bbf3240f)) +* add partial implementation of project class ([3c4fb2e](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/3c4fb2eff951eafb3c0f6981eb490cd2a6d4b879)) +* add partial implementation of ReportService ([f784c99](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/f784c99641d4d3c3584ec19ee4eeff5aaf82ee6d)) +* add postman integration ([be11cc2](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/be11cc2d905ca4db25702dba4140da9e8f888771)) +* Add ProfessorId or StudentId to JWT token ([6ea9f1e](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6ea9f1eda654838511d3598e130455fcc7e42190)) +* add program-type implementation ([cc1cd07](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/cc1cd0722d8c0231cec719a4add8ef2b55f1936e)) +* add programtype controller tests ([fab01e0](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/fab01e0202365813ed0a891d3cd2ce71c97465e5)) +* add ProjectActivities to Project usecases ([b57d8e7](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/b57d8e740e6f39795ea2e88efb60f05ef583c8b5)) +* add ProjectReport controller ([ad6b048](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/ad6b04803f785e82437b63cecbcce25073e5a633)) +* add ProjectReport usecases and entity ([315c042](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/315c0429d951a4794b256284e78b95c102eea530)) +* add RegistrationCode to student ([3341b9d](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/3341b9deb2217d840e58a32c94696e9bc8f93dce)) +* add ReportDeadlineNotificationFunction ([b9401ba](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/b9401ba4bb8985e800064517c0c2b2c9e41c199f)) +* add ReportService implementation ([9fbfad3](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/9fbfad33c8ad3929f943e751fcb6ee2ce74bb700)) +* add RequestStudentRegister endpoint ([8942901](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/8942901a99e016d0b6c02d43e3102fb01a8c74a6)) +* add search by main-area in area service ([cbf95db](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/cbf95db8cfbba61e8115edc4b5e215231ccf358f)) +* add separation between mappers on application layer ([8ec0cd3](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/8ec0cd39763746c5766273d5e2e495073fd7a170)) +* add serilog for logging service ([0fac1e3](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/0fac1e3db621c1ec3f402be145ce6169d964cd8c)) +* add setup to startup and program ([40827c8](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/40827c883bba2aa733501ee222a404af6584de9d)) +* add simple user model ([0e31a32](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/0e31a32c249a335874832201c996955273ebd541)) +* add skip/take validations for usecases ([0d47a93](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/0d47a93abaa316ce091d71147b6d4faf9594e330)) +* add some scoped classes ([169d686](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/169d686e1f52512cdcf9a8255f91ef16f9b96ba6)) +* add staging docker-compose ([af847b5](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/af847b555de6382a63af5fad872f3d7f8d974042)) +* add storage service implementation ([9b6c016](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/9b6c016db6401fa0aa2ed63eead3c9af895d1957)) +* add student class implementation ([992e681](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/992e681f3940b5fec97acb1080adeb5bf4fbe483)) +* add student implementation ([4e66556](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/4e6655684703f45cd295e121dd76952f1bad1a9a)) +* add StudentDocuments endpoints ([6805f0a](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6805f0a6068dd4596ffb9aa5d51b40378ab32a1b)) +* add subarea repositories and services ([2dc9d32](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/2dc9d32e6f732cfd09d011bb9c8037f96ccee1ce)) +* add support for migrations in infra.data project ([a9fcb67](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a9fcb6748d2934a7f8e3aa74a13c03db100e8e17)) +* add support to debug in vscode ([a18cafe](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a18cafe35f80895da490481510cf650f2f39aa85)) +* add swagger libraries ([927bf41](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/927bf41879cc78753097ab9e20e50dea8f337a5d)) +* add temporary folder creation ([b55803d](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/b55803d5cf4648fbe0612d1d0c018dc4a0ffe02a)) +* add unhandler exception ([bdde659](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/bdde659e9089aef27477a852a8657eeb1f967868)) +* add unit tests and entities fixing ([c604b23](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c604b2326dee72b6467e210ea5e234e8f2d31571)) +* add unit tests for user model ([27d4405](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/27d4405878568e334ddd288462ca01e1d2202904)) +* add user validations on register method ([a485993](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a485993c45f52e1e3b0bc7029ab3b0c81a50ca87)) +* add validations to attributes of area and mainArea ([41b0906](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/41b0906e62b8c5e1043cc359bcc1e234e6e0f917)) +* add validations to services and controllers ([58f2f76](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/58f2f76c59e0d29e04a5678062ac1668967394e2)) +* add voyager support ([1468441](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/1468441e46f54c47cb67bd215d7d9ccfee9cdfbe)) +* add web function to generate certificates ([c8540c1](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c8540c102685eadfd994d5e9ab938b1d6c3159d8)) +* adjust notice and activity relation ([6634ecd](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6634ecdafffe2501ce4cb82f24222fdaad1e337f)) +* conclude GenerateCertificate web function ([1e5d438](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/1e5d4380ff556a47cfcdd1234ee7a5f419b0a71c)) +* create directory for local storage if doesn't exist ([883b58b](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/883b58b3e0d47bbd95cbf80002f4dae9081d5f5d)) +* disable native rate limit ([bd1dbe5](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/bd1dbe561b07fecd7dd34141cdaa62759ef44bdf)) +* enable CORS ([64ed9d8](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/64ed9d8ec55ec39b45b7b282d75db80d565da0a5)) +* update TimerTrigger for tests ([e795b80](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/e795b8011ba96e932911ddeb0af1fcc5050f3d7e)) +* update web function for deployment ([241897b](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/241897be0ca9d581a052d9de7fe5a290761952c4)) +* **.env:** add .env file verification ([bff332a](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/bff332aa989f85aed287fd919fc75ae6111a35de)) +* **adapters:** add professor services ([9707b33](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/9707b338d7fca570af8d22f438677616f64686dc)) +* **adapters:** add user service implementation ([09851c5](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/09851c5ebb1144d48526a7789a10b1b308a17f3d)) +* **api:** add professor controller ([f1f26c3](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/f1f26c38ef2dcf3be104d9169267cf39c858ff51)) +* **application:** add main structures to user service ([c07819f](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c07819f996db9e02bbbb3875bf89674f1e497c5a)) +* **appsettings:** add azure secret support ([289b016](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/289b01662a8e9c6edee7a02c873f7951d3158456)) +* **auth:** add auth full implementations ([f2da049](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/f2da049c62ce83556b1ee5daec0a96f65320f3b9)) +* **auth:** add password set and reset methods ([5a67447](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/5a67447359bc52caf60e685a55a8362acbd7f3b7)) +* **azure:** add support to azure blob storage ([a09f431](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a09f431a6f5133bbce133a54d5b087b2c7ba8b79)) +* **CORS:** add CORS policy. ([ab75a24](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/ab75a240e303ea4cf0b0273aa76f4bc02ebc3e99)) +* **domain:** add user implementation ([395d353](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/395d35369e71a838231a8a6f27e32089b3057719)) +* **domain:** add user repository ([c818268](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c8182689f39d8a817e27e2497d8a1a5af7ff3748)) +* **dotenv:** add dotenv class to manage secrets ([3c13351](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/3c13351cbd089c78e905c1cdfff94df6338fd04f)) +* **entities:** add DeletedAt to ProjectEvaluation ([a494d2a](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a494d2a8293e5e26eb04f5f7deb3a0c3ab045bcf)) +* **entities:** add notices ([eb0c0d0](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/eb0c0d0148a45f4f11a6dcf63bd8733bc1c191e4)) +* **entities:** add ProjectActivity ([d757dac](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/d757dac09f9e8a8d58c4bb25f8a8c21173ec16ff)) +* **entities:** add SuspensionEndDate to professor ([12aa2c3](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/12aa2c32ae9dddd2b0f7215c28323dc4d7253a38)) +* **entity:** add activate entity control to class ([62013b7](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/62013b72a236b8fd79f166174e49c9699f1e5879)) +* **entity:** add StudentDocuments ([7cc6ee0](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/7cc6ee079248c06e63431de6ae4dee4e0fb10353)) +* **infra:** add professor implementations and dependencies ([d68e99f](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/d68e99fc08c1f7c776241618d64d86de6ff7018b)) +* **infra-data:** add database logic to infra-data project ([9a4229c](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/9a4229c6af2486c5b98a1b43ebc35db2d9a92532)) +* **infra-data:** add integration from user repository to database ([074f38e](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/074f38ec603b30f325a6ea3ae136a274f071c81d)) +* **infra-data:** add project reference to solution ([006f546](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/006f5464b08e1250f7c9af95f24c35128741d58c)) +* **infra-ioc:** add basic api dependency injection logics ([2ec556e](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/2ec556e05f8817f5f554b46266bd4f1fd6858b41)) +* **ioc:** add projects dependency injection ([7cfe692](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/7cfe692d581e953af2f83e5f22083872c5ca0e45)) +* **ioc:** add support to azure key vault ([00624c9](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/00624c9f65f5ca1a312ac34885e3f564f891c239)) +* **ioc:** update .env reading ([6ba86be](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6ba86be33dd5c9faf93012d25aaa5a9c525ab90a)) +* **jwt:** add authorization request in controllers ([1e2fc78](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/1e2fc78bd3efd364fc295b94a6d069b7cfa0f1fb)) +* **jwt:** add jwt implementation ([13f8e0a](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/13f8e0a3429220e93d71d186c3bd5c8fd0b23ce4)) +* **logging:** add seq support in azure ([40247c9](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/40247c92858f11bf54cdc44a57d4f35861f81f9d)) +* **logs:** add seq support for managing logs ([f22fc9c](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/f22fc9ca14b07cc35b4559ce8401840ed533830e)) +* **notice:** add more properties to notice ([958f8d2](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/958f8d2be1fcdd74030ac73bdded9f24e5fd42eb)) +* **persistence:** add notice configuration ([87e834b](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/87e834bda432d4ce7ff33859ac31fa101b2541e8)) +* **persistence:** add project configuration ([21deade](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/21deade02f0ecc90c62e5acf824e48baca787ec8)) +* **persistence:** add project implementation ([02778ca](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/02778ca6662bddf7972bb2e59f7ec62b6ff3dc50)) +* **persistence:** add soft-delete ([ca82e5b](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/ca82e5bb7c8b169788d05d302769a023b1d4e309)) +* **persistence:** add student-assistance repository ([ca9a086](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/ca9a086858a77bcce600d3570d588b424cd3c9ba)) +* **persistence:** add user seed ([cdaf8e8](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/cdaf8e8cdecb8801186a3bcfdc3315bad3fcd459)) +* **presenter-controllers:** add evaluation-project ([7e7e78e](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/7e7e78ee80d6a6716126a5deef0a5a2c65f613b4)) +* **presenter-controllers:** add student-documents ([6aa00ea](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6aa00eabb1ea9e6cd16295445466d95c167c864e)) +* **professor:** add service implementation ([a9896a5](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a9896a5df84d7a7bd74160a11fa5ba80109ed398)) +* **professor:** add usecase implementation ([6eb338b](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6eb338bf1dcc4e06e20bd5e4ff5d2a1cf6a3adeb)) +* **proj-activity:** add contracts and repository interface ([e230ab7](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/e230ab7d499a86484c191c0ae1a7992122cfb593)) +* **project:** add evaluation results to entity ([5bfab7e](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/5bfab7ecf838023e50019f35787bce8397a12d06)) +* **project:** add more properties to entity ([5a679b6](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/5a679b67bf8a48beea30855d47ed266f929bd219)) +* **project:** add presenters and controllers ([2146214](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/2146214792335b10fbe8f408e1ec0eb5f4cda6a3)) +* **project:** add some usecases ([a6d6710](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a6d67105376dd6c6fdb9802ec3464afec3a0caf2)) +* **Project:** add endpoint to get project to evaluate ([7f9c309](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/7f9c30975d3007473150097bfad0aec152604f1a)) +* **Project:** add ProjectPartialReport endpoints ([56c8c2b](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/56c8c2b5d43a5b7b7a38b2fc68299222b9fa8631)) +* **project-evaluation:** add usecase structures ([5a424d9](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/5a424d9a8eea8c572692d1a89a86c5862085205d)) +* **ProjectEvaluation:** add student documents evaluation ([24be4b9](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/24be4b946cb4b4844f22f7f7afec0b1ad7e57d61)) +* **ProjectReport:** add permission to deliver report 6 months ahead of schedule ([fa4f910](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/fa4f910a7c813629453016425c9b3823319fe97a)) +* **ProjectReport:** add persistence configuration ([8b52603](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/8b5260375c163d1d49080ef4284d8e544fe1dc6f)) +* **readme:** update .net version ([cb0b4c2](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/cb0b4c2d63c653d90837ce0b76346b6d900358b9)) +* **repositories:** add some implementations ([1280181](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/1280181c934b8c5b6e4a6a7a749706aaae10ab69)) +* **repositoris:** add order by to list methods ([d90efa8](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/d90efa8fdb777a4dc1be2a0bad1013b52a14da49)) +* **services:** add certificate template ([6ebf8b2](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6ebf8b2da9854c3107f3f8c455befbde7647b332)) +* **settings:** add launch config to debugger ([95ab95d](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/95ab95dd9894988f124583d110869910ed07bbd6)) +* **StorageFileService:** add UploadFileAsync by bytes ([0ed1b15](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/0ed1b156c6edd68a3ae2dcbaaacb2ad004eb75f7)) +* **student:** add email-service and crud ([7964e3b](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/7964e3b1211fc97357467f4ff5d7628e2c48d36d)) +* **tests:** add area unit tests ([ecd170c](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/ecd170c280c5e3354c2e18e96cffc347a0cb147f)) +* **tests:** add area usecases tests ([b75842f](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/b75842f2e3ea94e67148f6f8a003942cdd98e647)) +* **tests:** add assistance scholarship unit tests ([523be6c](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/523be6c2bd2985710e4afa658d5796609a3b3052)) +* **tests:** add campus unit tests ([28d4bed](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/28d4bedd686c318329dcae5525c00dcba96a79a3)) +* **tests:** add course unit tests ([271dccb](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/271dccb267eb68efd049d3ddb142daf054394054)) +* **tests:** add first domain test ([af74391](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/af74391f22375ee099ed457a9054e0680f36aad0)) +* **tests:** add mainarea unit tests ([decaa01](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/decaa015b0493f9b1a7bff6d7d4bd1546993dc54)) +* **tests:** add notice unit tests ([9bb0efc](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/9bb0efcfe9605e3ab0451ac6baa4a257cc54e285)) +* **tests:** add professor unit tests ([c6db754](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c6db754b041d0c47cdb5b60f4e04d92d4ef2d178)) +* **tests:** add program type unit tests ([057b5fa](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/057b5fa720b0950e60dbb05a33649188fb1e9e30)) +* **tests:** add project evaluation unit tests ([1588052](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/1588052c31c44475282980e6d118dc44a892bf25)) +* **tests:** add project unit tests ([578ac26](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/578ac2665e6f71fbeccb4b1102d5eb28a95226a0)) +* **tests:** add student unit tests ([8eb5d8c](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/8eb5d8c468f7db9e5c5f90360367d35eebc5a81c)) +* **tests:** add subarea unit tests ([7f4af70](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/7f4af706f7f2325a990a025382e9919fba9b7bd3)) +* **usecase:** add interfaces ([d35d891](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/d35d891a151f575b4812df78ee3c38a06f14537e)) +* **usecase:** add project contracts ([ea9a3f9](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/ea9a3f9b921cf92f34bd100f833f47d25e7c9e59)) +* **usecases:** add email alerts to Notice and ProjectEvaluation ([4e53848](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/4e53848cc77996cad46a231821e89c09888fa898)) +* **usecases:** add get evaluation by project id ([c8f8d3a](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c8f8d3ae039add9ba651c67436f2794b8b54b818)) +* **usecases:** add student documents ([1e6f6b3](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/1e6f6b3652f94325a2093d89c66bee8365d47dab)) +* **users:** add first query ([6f87bc6](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6f87bc6751abd08b46e627756c2f3f8beb578f35)) +* **web-api:** add project controller ([290da8b](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/290da8b1b66b36b80d770a8721d1e993505d3729)) +* **web-api:** add user controller ([2345922](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/2345922f3ce91d752288d1e6158e19b5ccb7ebbd)) +* **webapi:** add project evaluation controller ([507313e](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/507313e7d880fdc1ad6cbcf931687fbc715f7b92)) +* **webapi:** add rate limit support to endpoints ([68382a8](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/68382a84e2c42c69ffc805cf82527ee27b319363)) +* **webapi:** add role policies to endpoints ([d49032f](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/d49032f3dd8afa3f628ca2a1b18de101c618103c)) +* **webapi:** add version endpoint for tests ([c86cc60](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c86cc603e6f2408c2e6359738374d6d48ceec652)) + +### Bug Fixes + +* add area repository retrieves ([8215f9d](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/8215f9de0a414074f98b9e715f6177aeaca10a82)) +* add empty and protected constructor to user class ([3d14888](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/3d14888264e228acec1604f8ff4b75bba9808293)) +* add space before logo on email templates ([6ca37e9](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6ca37e93a496ac2ad7f9bb6da5e3d6d9cd59193a)) +* adjust activities seeder. ([33b2333](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/33b23331d810cc09fdbf9a8e8cf3c1f3ec561595)) +* Adjust admin user login and default seeding ([486a46c](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/486a46cd055f873eb40c7c94f09fc507ff1eec6d)) +* adjust all namespaces ([5aa712b](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/5aa712b1e5ee7d35b1b5c83571957ec2b8d7cc11)) +* adjust api endpoints ([993f624](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/993f624290c4621b3d351d976a06cf2937014498)) +* adjust Area namespaces ([fc00e73](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/fc00e73ac4a27a90a3b2b022f2389a9b62928000)) +* adjust CORS configuration ([d77df0f](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/d77df0f7f21ce52a49e2cd01b336fa7c062fa220)) +* adjust email sender and disable ssl for tests ([602fbd3](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/602fbd358d1a79df13b4eb186e99961c9628ade4)) +* adjust email service dependency injection ([fb947b0](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/fb947b0c36ecddb95a96bb3b136257c1f11737f5)) +* adjust GetProjectsToEvaluate endpoint returns ([4f45374](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/4f453742827ea61ee8061c6358ed062207d497f4)) +* adjust logs recording on seq ([508ff97](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/508ff9729073e93b236c980c0e91da28895b4b73)) +* adjust Notice seeder ([f391532](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/f391532cc089702996f41bb0cee1dcb6397e8e58)) +* adjust notice tests ([7262dcc](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/7262dcc88eb8526f6992a64211ca128f0342daca)) +* adjust NoticeUnitTests ([5aaa5e9](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/5aaa5e9ce089303d19eb7b0ce76585eba7b81ad7)) +* adjust oderby to avoid get errors ([ac207c4](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/ac207c4b34b11ae53b5f3bc226bb3ca16a0858ee)) +* adjust project evaluation usecases ([9db0791](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/9db07910f8ea3e8ca42543ee5137a85389a8aeba)) +* adjust project evalution usecases ([65e1d1c](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/65e1d1c60ed7ee74c0a7dd27bd32a2db2041f69a)) +* adjust project usecases ([3aebb17](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/3aebb17bc04c4a2d529d80af4cff3500e1f14059)) +* adjust ProjectEvaluationRepository ([e73ba88](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/e73ba881d9d43bf4ea9446b5f1874683a5ff75b0)) +* adjust repositories for new project entity ([6915fb3](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/6915fb32e86d2c89c23b05c2b7b7f422475a73a0)) +* adjust UpdateAreaInput namespace ([9d1e819](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/9d1e8190b336444dd1a14390be928a62e53837bd)) +* adjust user update ([23d01a4](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/23d01a4beb536cd5ddd519bc237506ace1189e48)) +* adjust user-seed password ([3919953](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/391995384ae343cf5df55cf4b809762a8ba9530c)) +* allow anonymous some endpoints ([0fc2623](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/0fc2623f61488c82c90acff847352a7141f4675f)) +* fix cpf and email validation ([8276427](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/8276427f5c867d0576e4eaff691b70db8fc080ab)) +* fix create user usecase ([7fe95c9](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/7fe95c93506902062610bd493570b7e40acc016a)) +* fix return of getall methods in services ([37a4ff7](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/37a4ff77cb5b643243953e5a5e94c228c4afc5cb)) +* merge with volumes ([ad6f276](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/ad6f2766f994690aa63802c985c4e3f63ac91851)) +* remove docker-compose duplication project ([4b6f6e7](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/4b6f6e7865764372a5f03571fc5968df8837e147)) +* remove ProfessorProjectTitle from certificate ([a188314](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a1883148bb1162e8c88233e28e738ad150d851c6)) +* remove unnecessary files ([956e65b](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/956e65b168acc3a771a83dccd4030995118aa5e4)) +* remove warnings ([cb67fe9](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/cb67fe93b8358d2ff67b3d92b17fea4b908996d0)) +* **adapters:** adjust GetSubAreasByArea return ([82a5af5](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/82a5af5593d48244b3b92d5f53dff98bb895fe61)) +* **area:** fix response mapping ([a558c9c](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a558c9c56439bf31e1658f2b81b24879c41b63fc)) +* **CreateStudentDocuments:** change project status ([87ffdeb](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/87ffdeb032a7cc452f895599da68b29f33d8b7d6)) +* **dbcontext:** fix dbcontext dispose bug ([3f839fc](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/3f839fcb1a09c8fd25b0a749240ef0f675290664)) +* **email-service:** enable ssl ([1965ed0](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/1965ed065cfdd0df22857d79dbcd80fa6d1e339e)) +* **entities:** change EF constructors ([9a6b525](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/9a6b5257be790b8104b4bbb93dd0f5b5c5e12d2c)) +* **entities:** remove evaluation fields from project ([418862c](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/418862c312e1b1b0d2fc34eb13fc4d31ec50273c)) +* **entity:** update assistance type name ([f1b4110](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/f1b4110da9a4f35e94f313b9314853ae503ef680)) +* **EvaluateAppealProject:** adjust inputs validation ([94fc0cc](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/94fc0cc98117484ff9917ed01a5b4d0fcb974414)) +* **GenerateCertificate:** adjust GetNoticeEndingAsync ([5b1348e](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/5b1348e0920d176277878618b6c1f1013f88de61)) +* **infra.ioc:** add authservice instance ([f875ad7](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/f875ad7aac833785ce05e3d2ade5af2bdceefd18)) +* **ioc:** adjust external services imports ([76dd9a5](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/76dd9a5fc07fe18384cf4ed55c7a2ca43c648e33)) +* **Notice:** adjust Description mapping ([e17da78](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/e17da78d80f55ac629632aeeabe4fa5fd5b13aeb)) +* **project:** adjust user-role validation ([510ba68](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/510ba68f1b59de7f07517a623a1809a8d07de9d4)) +* **project-evaluation:** fix usecase outputs ([c4704e6](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/c4704e6b4b40e3de26490190129ac66145ec22af)) +* **subarea:** fix mappings ([51f1dac](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/51f1daca5fdd985eb02766e7885622a18faaa092)) +* **tests:** adjust unit and integration tests ([adbfa51](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/adbfa515d0aaa53b49aee51a21c9b2cd16d59e93)) +* **usecases:** adjust notice creation ([3febd1f](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/3febd1f85464445197b95e01ef38b16f3c2234fa)) +* **webapi:** adjust error type in activity controller ([3ff2d36](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/3ff2d3654866da67cdd00b10d49eb483e3edf4b0)) + From dbb27a5d7b9418e2be1ca09579ae37ef85854146 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 24 Oct 2023 08:25:44 -0300 Subject: [PATCH 170/201] chore(ci): Reactive WebApp CI --- ...webapps-dotnet-core.yml.stop => azure-webapps-dotnet-core.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{azure-webapps-dotnet-core.yml.stop => azure-webapps-dotnet-core.yml} (100%) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml.stop b/.github/workflows/azure-webapps-dotnet-core.yml similarity index 100% rename from .github/workflows/azure-webapps-dotnet-core.yml.stop rename to .github/workflows/azure-webapps-dotnet-core.yml From 3cf8d8e36051cda9cd5855de7b1e3522c7ea1c89 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 24 Oct 2023 08:34:46 -0300 Subject: [PATCH 171/201] chore(ci): Update AZURE_WEBAPP_NAME --- .github/workflows/azure-webapps-dotnet-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index ff6dd862..583794d9 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -1,7 +1,7 @@ name: Build and deploy ASP.Net Core app to an Azure Web App env: - AZURE_WEBAPP_NAME: GPIC-Staging-WebAPI + AZURE_WEBAPP_NAME: GPIC-Stg-WebAPI AZURE_WEBAPP_PACKAGE_PATH: "." DOTNET_VERSION: "7.0" PROJECT_PATH: "src/Infrastructure/WebAPI/WebAPI.csproj" From 552171788b608c2b8cb8e007aba0ce5f2fd62c46 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 24 Oct 2023 08:49:49 -0300 Subject: [PATCH 172/201] chore(ci): Update WebAPI script --- .github/workflows/azure-functions-app-dotnet.yml.stop | 2 +- .github/workflows/azure-webapps-dotnet-core.yml | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/azure-functions-app-dotnet.yml.stop b/.github/workflows/azure-functions-app-dotnet.yml.stop index 3d530fe9..5a4fb3f3 100644 --- a/.github/workflows/azure-functions-app-dotnet.yml.stop +++ b/.github/workflows/azure-functions-app-dotnet.yml.stop @@ -1,4 +1,4 @@ -# name: Deploy DotNet project to Azure Function App +# name: Deploy WebFunctions to Azure # on: # push: diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 583794d9..648d5cdd 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -1,12 +1,12 @@ -name: Build and deploy ASP.Net Core app to an Azure Web App +name: Deploy WebAPI to Azure env: - AZURE_WEBAPP_NAME: GPIC-Stg-WebAPI + AZURE_WEBAPP_NAME: ${{ env.AZURE_WEBAPP_NAME }} AZURE_WEBAPP_PACKAGE_PATH: "." DOTNET_VERSION: "7.0" PROJECT_PATH: "src/Infrastructure/WebAPI/WebAPI.csproj" WEBAPI_PATH: "src/Infrastructure/WebAPI/" - ASPNETCORE_ENVIRONMENT: Development + ASPNETCORE_ENVIRONMENT: ${{ env.ASPNETCORE_ENVIRONMENT }} on: push: @@ -49,7 +49,8 @@ jobs: SEQ_API_KEY=${{ secrets.SEQ_API_KEY }} SEQ_URL=${{ secrets.SEQ_URL }} SMTP_EMAIL_PASSWORD=${{ secrets.SMTP_EMAIL_PASSWORD }} - SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }}" > src/Infrastructure/WebAPI/.env + SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }} + EXECUTE_MIGRATION=${{ secrets.EXECUTE_MIGRATION }}" > src/Infrastructure/WebAPI/.env - name: Set environment variable run: echo "ASPNETCORE_ENVIRONMENT=${{ env.ASPNETCORE_ENVIRONMENT }}" >> $GITHUB_ENV From dfa7349ca4f39ce4ed3dfc0d56c1d6d0fc0d3323 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 24 Oct 2023 08:53:12 -0300 Subject: [PATCH 173/201] chore(ci): Update WebAPI script --- .github/workflows/azure-functions-app-dotnet.yml.stop | 2 +- .github/workflows/azure-webapps-dotnet-core.yml | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/azure-functions-app-dotnet.yml.stop b/.github/workflows/azure-functions-app-dotnet.yml.stop index 3d530fe9..5a4fb3f3 100644 --- a/.github/workflows/azure-functions-app-dotnet.yml.stop +++ b/.github/workflows/azure-functions-app-dotnet.yml.stop @@ -1,4 +1,4 @@ -# name: Deploy DotNet project to Azure Function App +# name: Deploy WebFunctions to Azure # on: # push: diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 583794d9..d9b87f79 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -1,12 +1,12 @@ -name: Build and deploy ASP.Net Core app to an Azure Web App +name: Deploy WebAPI to Azure env: - AZURE_WEBAPP_NAME: GPIC-Stg-WebAPI + AZURE_WEBAPP_NAME: ${{ secrets.AZURE_WEBAPP_NAME }} AZURE_WEBAPP_PACKAGE_PATH: "." DOTNET_VERSION: "7.0" PROJECT_PATH: "src/Infrastructure/WebAPI/WebAPI.csproj" WEBAPI_PATH: "src/Infrastructure/WebAPI/" - ASPNETCORE_ENVIRONMENT: Development + ASPNETCORE_ENVIRONMENT: ${{ secrets.ASPNETCORE_ENVIRONMENT }} on: push: @@ -49,7 +49,8 @@ jobs: SEQ_API_KEY=${{ secrets.SEQ_API_KEY }} SEQ_URL=${{ secrets.SEQ_URL }} SMTP_EMAIL_PASSWORD=${{ secrets.SMTP_EMAIL_PASSWORD }} - SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }}" > src/Infrastructure/WebAPI/.env + SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }} + EXECUTE_MIGRATION=${{ secrets.EXECUTE_MIGRATION }}" > src/Infrastructure/WebAPI/.env - name: Set environment variable run: echo "ASPNETCORE_ENVIRONMENT=${{ env.ASPNETCORE_ENVIRONMENT }}" >> $GITHUB_ENV From eb8cde421b565331008d8719e335ee5b4b00d391 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 24 Oct 2023 10:23:16 -0300 Subject: [PATCH 174/201] feat: Add CORS configuration --- .../workflows/azure-functions-app-dotnet.yml | 55 ++++++++++++++ .../azure-functions-app-dotnet.yml.stop | 52 -------------- .../workflows/azure-webapps-dotnet-core.yml | 2 + src/Infrastructure/IoC/InfrastructureDI.cs | 28 +------- src/Infrastructure/IoC/Utils/DotEnvSecrets.cs | 72 ++++--------------- src/Infrastructure/WebAPI/Startup.cs | 33 ++++++++- src/Infrastructure/WebAPI/appsettings.json | 1 - src/Infrastructure/WebFunctions/Program.cs | 4 +- 8 files changed, 105 insertions(+), 142 deletions(-) create mode 100644 .github/workflows/azure-functions-app-dotnet.yml delete mode 100644 .github/workflows/azure-functions-app-dotnet.yml.stop diff --git a/.github/workflows/azure-functions-app-dotnet.yml b/.github/workflows/azure-functions-app-dotnet.yml new file mode 100644 index 00000000..051ad179 --- /dev/null +++ b/.github/workflows/azure-functions-app-dotnet.yml @@ -0,0 +1,55 @@ +name: Deploy WebFunctions to Azure + +on: + push: + branches: ["main"] + +env: + AZURE_FUNCTIONAPP_NAME: "GPIC-Stg-WebFunctions" # set this to your function app name on Azure + AZURE_FUNCTIONAPP_PACKAGE_PATH: "src" # set this to the path to your function app project, defaults to the repository root + DOTNET_VERSION: "7.0" # set this to the dotnet version to use (e.g. '2.1.x', '3.1.x', '5.0.x') + +jobs: + build-and-deploy: + runs-on: ubuntu-latest # For Linux, use ubuntu-latest + environment: dev + steps: + - name: "Checkout GitHub Action" + uses: actions/checkout@v3 + + - name: Setup DotNet ${{ env.DOTNET_VERSION }} Environment + uses: actions/setup-dotnet@v3 + with: + dotnet-version: ${{ env.DOTNET_VERSION }} + + - name: "Resolve Project Dependencies Using Dotnet" + shell: bash # For Linux, use bash + run: | + pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}' + dotnet build --configuration Release --output ./output + popd + + - name: Create env + run: | + echo "AZURE_BLOB_STORAGE_CONNECTION_STRING=${{ secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING }} + AZURE_BLOB_STORAGE_CONTAINER_NAME=${{ secrets.AZURE_BLOB_STORAGE_CONTAINER_NAME }} + POSTGRES_CONNECTION_STRING=${{ secrets.POSTGRES_CONNECTION_STRING }} + FRONTEND_URL=${{ secrets.FRONTEND_URL }} + ALLOW_ORIGINS=${{ secrets.ALLOW_ORIGINS }} + JWT_AUDIENCE=${{ secrets.JWT_AUDIENCE }} + JWT_EXPIRE_IN=${{ secrets.JWT_EXPIRE_IN }} + JWT_ISSUER=${{ secrets.JWT_ISSUER }} + JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }} + SEQ_API_KEY=${{ secrets.SEQ_API_KEY }} + SEQ_URL=${{ secrets.SEQ_URL }} + SMTP_EMAIL_PASSWORD=${{ secrets.SMTP_EMAIL_PASSWORD }} + SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }} + EXECUTE_MIGRATION=${{ secrets.EXECUTE_MIGRATION }}" > src/Infrastructure/WebAPI/.env + + - name: "Run Azure Functions Action" + uses: Azure/functions-action@v1 + id: fa + with: + app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }} + package: "${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}/output" + publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }} # Remove publish-profile to use Azure RBAC diff --git a/.github/workflows/azure-functions-app-dotnet.yml.stop b/.github/workflows/azure-functions-app-dotnet.yml.stop deleted file mode 100644 index 5a4fb3f3..00000000 --- a/.github/workflows/azure-functions-app-dotnet.yml.stop +++ /dev/null @@ -1,52 +0,0 @@ -# name: Deploy WebFunctions to Azure - -# on: -# push: -# branches: ["development"] - -# env: -# AZURE_FUNCTIONAPP_NAME: 'GPIC-Staging-WebFunctions' # set this to your function app name on Azure -# AZURE_FUNCTIONAPP_PACKAGE_PATH: 'src' # set this to the path to your function app project, defaults to the repository root -# DOTNET_VERSION: '7.0' # set this to the dotnet version to use (e.g. '2.1.x', '3.1.x', '5.0.x') - -# jobs: -# build-and-deploy: -# runs-on: ubuntu-latest # For Linux, use ubuntu-latest -# environment: dev -# steps: -# - name: 'Checkout GitHub Action' -# uses: actions/checkout@v3 - -# - name: Setup DotNet ${{ env.DOTNET_VERSION }} Environment -# uses: actions/setup-dotnet@v3 -# with: -# dotnet-version: ${{ env.DOTNET_VERSION }} - -# - name: 'Resolve Project Dependencies Using Dotnet' -# shell: bash # For Linux, use bash -# run: | -# pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}' -# dotnet build --configuration Release --output ./output -# popd - -# - name: Create env -# run: | -# echo "AZURE_BLOB_STORAGE_CONNECTION_STRING=${{ secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING }} -# AZURE_BLOB_STORAGE_CONTAINER_NAME=${{ secrets.AZURE_BLOB_STORAGE_CONTAINER_NAME }} -# POSTGRES_CONNECTION_STRING=${{ secrets.POSTGRES_CONNECTION_STRING }} -# JWT_AUDIENCE=${{ secrets.JWT_AUDIENCE }} -# JWT_EXPIRE_IN=${{ secrets.JWT_EXPIRE_IN }} -# JWT_ISSUER=${{ secrets.JWT_ISSUER }} -# JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }} -# SEQ_API_KEY=${{ secrets.SEQ_API_KEY }} -# SEQ_URL=${{ secrets.SEQ_URL }} -# SMTP_EMAIL_PASSWORD=${{ secrets.SMTP_EMAIL_PASSWORD }} -# SMTP_EMAIL_USERNAME=${{ secrets.SMTP_EMAIL_USERNAME }}" > src/Infrastructure/WebFunctions/.env - -# - name: 'Run Azure Functions Action' -# uses: Azure/functions-action@v1 -# id: fa -# with: -# app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }} -# package: '${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}/output' -# publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }} # Remove publish-profile to use Azure RBAC diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index d9b87f79..41e246c6 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -42,6 +42,8 @@ jobs: echo "AZURE_BLOB_STORAGE_CONNECTION_STRING=${{ secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING }} AZURE_BLOB_STORAGE_CONTAINER_NAME=${{ secrets.AZURE_BLOB_STORAGE_CONTAINER_NAME }} POSTGRES_CONNECTION_STRING=${{ secrets.POSTGRES_CONNECTION_STRING }} + FRONTEND_URL=${{ secrets.FRONTEND_URL }} + ALLOW_ORIGINS=${{ secrets.ALLOW_ORIGINS }} JWT_AUDIENCE=${{ secrets.JWT_AUDIENCE }} JWT_EXPIRE_IN=${{ secrets.JWT_EXPIRE_IN }} JWT_ISSUER=${{ secrets.JWT_ISSUER }} diff --git a/src/Infrastructure/IoC/InfrastructureDI.cs b/src/Infrastructure/IoC/InfrastructureDI.cs index b4e19211..c7de4e2f 100644 --- a/src/Infrastructure/IoC/InfrastructureDI.cs +++ b/src/Infrastructure/IoC/InfrastructureDI.cs @@ -11,11 +11,11 @@ namespace Infrastructure.IoC { public static class InfrastructureDI { - public static IServiceCollection AddInfrastructure(this IServiceCollection services, HostBuilderContext? hostContext = null) + public static IServiceCollection AddInfrastructure(this IServiceCollection services, ref IConfiguration? configuration, HostBuilderContext? hostContext = null) { #region AppSettings e DotEnv // Define valores das propriedades de configuração - IConfiguration configuration = SettingsConfiguration.GetConfiguration(hostContext); + configuration = SettingsConfiguration.GetConfiguration(hostContext); services.AddSingleton(configuration); // Carrega informações de ambiente (.env) @@ -35,30 +35,6 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi }); #endregion Serviço de Log - #region CORS - // TODO: Definir política de CORS - services.AddCors(options => - { - options.AddDefaultPolicy( - policy => - { - policy.AllowAnyOrigin() - .AllowAnyMethod() - .AllowAnyHeader(); - }); - }); - #endregion CORS - - #region Rate Limit - services.AddMemoryCache(); - services.AddInMemoryRateLimiting(); - services.Configure(configuration.GetSection("IpRateLimiting")); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - #endregion Rate Limit - return services; } } diff --git a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs index 7d536db0..38aaab23 100644 --- a/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs +++ b/src/Infrastructure/IoC/Utils/DotEnvSecrets.cs @@ -13,66 +13,18 @@ public DotEnvSecrets() _ = DotNetEnv.Env.Load(Path.Combine(basePath!, ".env")); } - public string GetFrontEndUrl() - { - return DotNetEnv.Env.GetString("FRONTEND_URL"); - } - - public string GetSeqUrl() - { - return DotNetEnv.Env.GetString("SEQ_URL"); - } - - public string GetSeqApiKey() - { - return DotNetEnv.Env.GetString("SEQ_API_KEY"); - } - - public string GetBlobStorageConnectionString() - { - return DotNetEnv.Env.GetString("AZURE_BLOB_STORAGE_CONNECTION_STRING"); - } - - public string GetBlobStorageContainerName() - { - return DotNetEnv.Env.GetString("AZURE_BLOB_STORAGE_CONTAINER_NAME"); - } - - public string GetDatabaseConnectionString() - { - return DotNetEnv.Env.GetString("POSTGRES_CONNECTION_STRING"); - } - - public string GetSmtpUserName() - { - return DotNetEnv.Env.GetString("SMTP_EMAIL_USERNAME"); - } - - public string GetSmtpUserPassword() - { - return DotNetEnv.Env.GetString("SMTP_EMAIL_PASSWORD"); - } - - public string GetJwtSecret() - { - return DotNetEnv.Env.GetString("JWT_SECRET_KEY"); - } - - public string GetJwtIssuer() - { - return DotNetEnv.Env.GetString("JWT_ISSUER"); - } - - public string GetJwtAudience() - { - return DotNetEnv.Env.GetString("JWT_AUDIENCE"); - } - - public string GetJwtExpirationTime() - { - return DotNetEnv.Env.GetString("JWT_EXPIRE_IN"); - } - + public string GetFrontEndUrl() => DotNetEnv.Env.GetString("FRONTEND_URL"); + public string GetSeqUrl() => DotNetEnv.Env.GetString("SEQ_URL"); + public string GetSeqApiKey() => DotNetEnv.Env.GetString("SEQ_API_KEY"); + public string GetBlobStorageConnectionString() => DotNetEnv.Env.GetString("AZURE_BLOB_STORAGE_CONNECTION_STRING"); + public string GetBlobStorageContainerName() => DotNetEnv.Env.GetString("AZURE_BLOB_STORAGE_CONTAINER_NAME"); + public string GetDatabaseConnectionString() => DotNetEnv.Env.GetString("POSTGRES_CONNECTION_STRING"); + public string GetSmtpUserName() => DotNetEnv.Env.GetString("SMTP_EMAIL_USERNAME"); + public string GetSmtpUserPassword() => DotNetEnv.Env.GetString("SMTP_EMAIL_PASSWORD"); + public string GetJwtSecret() => DotNetEnv.Env.GetString("JWT_SECRET_KEY"); + public string GetJwtIssuer() => DotNetEnv.Env.GetString("JWT_ISSUER"); + public string GetJwtAudience() => DotNetEnv.Env.GetString("JWT_AUDIENCE"); + public string GetJwtExpirationTime() => DotNetEnv.Env.GetString("JWT_EXPIRE_IN"); public bool ExecuteMigration() { try diff --git a/src/Infrastructure/WebAPI/Startup.cs b/src/Infrastructure/WebAPI/Startup.cs index 8900a94e..c4b39f1b 100644 --- a/src/Infrastructure/WebAPI/Startup.cs +++ b/src/Infrastructure/WebAPI/Startup.cs @@ -9,6 +9,9 @@ namespace WebAPI /// public class Startup { + private const string CORS_POLICY_NAME = "_allowSpecificOrigins"; + private IConfiguration? _configuration; + /// /// Realiza a configuração dos serviços de injeção de dependência. /// @@ -19,7 +22,7 @@ public void ConfigureServices(IServiceCollection services) services.AddControllers(); // Realiza comunicação com os demais Projetos. - services.AddInfrastructure(); + services.AddInfrastructure(ref _configuration); services.AddPersistence(); services.AddExternalServices(); services.AddApplication(); @@ -32,6 +35,32 @@ public void ConfigureServices(IServiceCollection services) // Permite que rotas sejam acessíveis em lowercase services.AddRouting(options => options.LowercaseUrls = true); + + #region CORS + // Definição de política de CORS + services.AddCors(options => + { + options.AddPolicy(name: CORS_POLICY_NAME, + policy => + { + // Busca os valores de ALLOW_ORIGINS do arquivo .env + policy.WithOrigins( + origins: Environment.GetEnvironmentVariable("ALLOW_ORIGINS").Split(',')!) + .AllowAnyHeader() + .AllowAnyMethod(); + }); + }); + #endregion CORS + + #region Rate Limit + services.AddMemoryCache(); + services.AddInMemoryRateLimiting(); + services.Configure(_configuration.GetSection("IpRateLimiting")); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + #endregion Rate Limit } /// @@ -66,7 +95,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseHttpsRedirection(); // Enable CORS - app.UseCors(); + app.UseCors(CORS_POLICY_NAME); // Enable routing for incoming requests app.UseRouting(); diff --git a/src/Infrastructure/WebAPI/appsettings.json b/src/Infrastructure/WebAPI/appsettings.json index d38d6351..68b88538 100644 --- a/src/Infrastructure/WebAPI/appsettings.json +++ b/src/Infrastructure/WebAPI/appsettings.json @@ -1,5 +1,4 @@ { - "SiteUrl": "https://localhost:5001", "Serilog": { "Using": ["Serilog.Sinks.Console", "Serilog.Sinks.File"], "MinimumLevel": { diff --git a/src/Infrastructure/WebFunctions/Program.cs b/src/Infrastructure/WebFunctions/Program.cs index b4b6026d..cd8517ec 100644 --- a/src/Infrastructure/WebFunctions/Program.cs +++ b/src/Infrastructure/WebFunctions/Program.cs @@ -1,11 +1,13 @@ using Microsoft.Extensions.Hosting; using Infrastructure.IoC; +using Microsoft.Extensions.Configuration; var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureServices((hostContext, services) => { - services.AddInfrastructure(hostContext); + IConfiguration? configuration = null; + services.AddInfrastructure(ref configuration, hostContext); services.AddPersistence(); services.AddExternalServices(); services.AddApplication(); From a5557d4a054820b3b39eb17993477e6f2f7e6268 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 24 Oct 2023 21:41:36 -0300 Subject: [PATCH 175/201] fix: Enable correct StorageFileService --- src/Infrastructure/IoC/ExternalServicesDI.cs | 4 ++-- src/Infrastructure/WebAPI/appsettings.json | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Infrastructure/IoC/ExternalServicesDI.cs b/src/Infrastructure/IoC/ExternalServicesDI.cs index 6a20c625..6242dbe7 100644 --- a/src/Infrastructure/IoC/ExternalServicesDI.cs +++ b/src/Infrastructure/IoC/ExternalServicesDI.cs @@ -35,8 +35,8 @@ public static IServiceCollection AddExternalServices(this IServiceCollection ser services.AddHttpContextAccessor(); services.AddScoped(); services.AddScoped(); - // services.AddScoped(); - services.AddScoped(); + services.AddScoped(); + // services.AddScoped(); services.AddScoped(); #endregion Demais Serviços diff --git a/src/Infrastructure/WebAPI/appsettings.json b/src/Infrastructure/WebAPI/appsettings.json index 68b88538..9f3ebc08 100644 --- a/src/Infrastructure/WebAPI/appsettings.json +++ b/src/Infrastructure/WebAPI/appsettings.json @@ -53,9 +53,6 @@ "AllowedExtensions": [".txt", ".pdf", ".doc", ".docx", ".png", ".jpg"], "MaxFileSizeInBytes": 10485760 }, - "Jwt": { - "ExpireIn": 60 - }, "SmtpConfiguration": { "Server": "smtp.office365.com", "Port": 587 From 98688510d106b00fd28f75f433854dace1bc6588 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 25 Oct 2023 09:02:58 -0300 Subject: [PATCH 176/201] fix: Disable CORS policy for tests --- src/Infrastructure/WebAPI/Startup.cs | 50 ++++++++++++++++++---------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/src/Infrastructure/WebAPI/Startup.cs b/src/Infrastructure/WebAPI/Startup.cs index c4b39f1b..ddaa4d23 100644 --- a/src/Infrastructure/WebAPI/Startup.cs +++ b/src/Infrastructure/WebAPI/Startup.cs @@ -40,26 +40,41 @@ public void ConfigureServices(IServiceCollection services) // Definição de política de CORS services.AddCors(options => { - options.AddPolicy(name: CORS_POLICY_NAME, - policy => - { - // Busca os valores de ALLOW_ORIGINS do arquivo .env - policy.WithOrigins( - origins: Environment.GetEnvironmentVariable("ALLOW_ORIGINS").Split(',')!) - .AllowAnyHeader() - .AllowAnyMethod(); - }); + // Permite qualquer origem, cabeçalho e método + options.AddDefaultPolicy( + builder => + { + builder.AllowAnyOrigin() + .AllowAnyHeader() + .AllowAnyMethod(); + }); + + // // Busca os valores de ALLOW_ORIGINS do arquivo .env + // var allowedOrigins = Environment.GetEnvironmentVariable("ALLOW_ORIGINS") + // ?? throw new Exception("ALLOW_ORIGINS não definido nas variáveis de ambiente."); + + // // Permite apenas as origens definidas no arquivo .env + // options.AddPolicy(name: CORS_POLICY_NAME, + // policy => + // { + // // Busca os valores de ALLOW_ORIGINS do arquivo .env + // policy.WithOrigins( + // origins: allowedOrigins.Split(',')!) + // .AllowAnyHeader() + // .AllowAnyMethod(); + // }); }); #endregion CORS #region Rate Limit - services.AddMemoryCache(); - services.AddInMemoryRateLimiting(); - services.Configure(_configuration.GetSection("IpRateLimiting")); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); + // Definido através do API Gateway + // services.AddMemoryCache(); + // services.AddInMemoryRateLimiting(); + // services.Configure(_configuration.GetSection("IpRateLimiting")); + // services.AddSingleton(); + // services.AddSingleton(); + // services.AddSingleton(); + // services.AddSingleton(); #endregion Rate Limit } @@ -95,7 +110,8 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseHttpsRedirection(); // Enable CORS - app.UseCors(CORS_POLICY_NAME); + app.UseCors(); + // app.UseCors(CORS_POLICY_NAME); // Enable routing for incoming requests app.UseRouting(); From 2283568bda84fed8416097fe9722e60491890473 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 25 Oct 2023 09:46:14 -0300 Subject: [PATCH 177/201] fix: Enable IpRateLimiting in Startup --- src/Infrastructure/IoC/InfrastructureDI.cs | 3 +-- src/Infrastructure/WebAPI/Startup.cs | 17 +++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Infrastructure/IoC/InfrastructureDI.cs b/src/Infrastructure/IoC/InfrastructureDI.cs index c7de4e2f..afe41016 100644 --- a/src/Infrastructure/IoC/InfrastructureDI.cs +++ b/src/Infrastructure/IoC/InfrastructureDI.cs @@ -1,5 +1,4 @@ -using AspNetCoreRateLimit; -using Infrastructure.IoC.Utils; +using Infrastructure.IoC.Utils; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; diff --git a/src/Infrastructure/WebAPI/Startup.cs b/src/Infrastructure/WebAPI/Startup.cs index ddaa4d23..4036ebbb 100644 --- a/src/Infrastructure/WebAPI/Startup.cs +++ b/src/Infrastructure/WebAPI/Startup.cs @@ -67,14 +67,15 @@ public void ConfigureServices(IServiceCollection services) #endregion CORS #region Rate Limit - // Definido através do API Gateway - // services.AddMemoryCache(); - // services.AddInMemoryRateLimiting(); - // services.Configure(_configuration.GetSection("IpRateLimiting")); - // services.AddSingleton(); - // services.AddSingleton(); - // services.AddSingleton(); - // services.AddSingleton(); + services.AddMemoryCache(); + services.AddInMemoryRateLimiting(); + var ipRateLimitingConfig = _configuration?.GetSection("IpRateLimiting"); + if (ipRateLimitingConfig is not null) + services.Configure(ipRateLimitingConfig); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); #endregion Rate Limit } From 05e2610f8239e1424b21adb8aec3cb7d7dba0719 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 28 Oct 2023 12:30:42 -0300 Subject: [PATCH 178/201] feat: Add user names to project GET endpoints --- src/Application/Mappings/ProjectMappings.cs | 6 +- .../Ports/Project/BaseProjectContract.cs | 5 ++ .../Repositories/ProjectRepository.cs | 66 +++++++------------ 3 files changed, 33 insertions(+), 44 deletions(-) diff --git a/src/Application/Mappings/ProjectMappings.cs b/src/Application/Mappings/ProjectMappings.cs index a6c0074d..3f461681 100644 --- a/src/Application/Mappings/ProjectMappings.cs +++ b/src/Application/Mappings/ProjectMappings.cs @@ -10,8 +10,12 @@ public ProjectMappings() { _ = CreateMap().ReverseMap(); _ = CreateMap().ReverseMap(); - _ = CreateMap().ReverseMap(); _ = CreateMap().ReverseMap(); + _ = CreateMap() + .ForMember(dest => dest.ProfessorName, opt => opt.MapFrom(src => src.Professor.User.Name)) + .ForMember(dest => dest.StudentName, opt => opt.MapFrom(src => src.Student.User.Name)) + .ReverseMap(); + } } } \ No newline at end of file diff --git a/src/Application/Ports/Project/BaseProjectContract.cs b/src/Application/Ports/Project/BaseProjectContract.cs index a8185a72..e025f684 100644 --- a/src/Application/Ports/Project/BaseProjectContract.cs +++ b/src/Application/Ports/Project/BaseProjectContract.cs @@ -37,5 +37,10 @@ public abstract class BaseProjectContract public string? CancellationReason { get; set; } public DateTime SendingDocumentationDeadline { get; set; } #endregion Informações de Controle + + #region Informações dos Envolvidos + public string? ProfessorName { get; set; } + public string? StudentName { get; set; } + #endregion Informações dos Envolvidos } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs index d8a61cfb..ba5ecc31 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs @@ -53,39 +53,29 @@ public async Task DeleteAsync(Guid? id) public async Task> GetProfessorProjectsAsync(int skip, int take, Guid? id, bool isClosed = false) { - return isClosed - ? await _context.Projects - .Include(x => x.Student) - .Include(x => x.Professor) - .Include(x => x.SubArea) - .Include(x => x.ProgramType) - .Include(x => x.Notice) - .IgnoreQueryFilters() - .AsAsyncEnumerable() - .Where(x => x.ProfessorId == id - && (x.Status == EProjectStatus.Closed - || x.Status == EProjectStatus.Canceled)) - .OrderByDescending(x => x.Notice?.RegistrationStartDate) // Traz os projetos mais recentes primeiro. - .ThenBy(x => x.Title) // Traz os projetos em ordem alfabética. - .Skip(skip) - .Take(take) - .ToListAsync() - : (IEnumerable)await _context.Projects + return await _context.Projects .Include(x => x.Student) + .Include(x => x.Student!.User) .Include(x => x.Professor) + .Include(x => x.Professor!.User) .Include(x => x.SubArea) .Include(x => x.ProgramType) .Include(x => x.Notice) .IgnoreQueryFilters() .AsAsyncEnumerable() - .Where(x => x.ProfessorId == id - && x.Status != EProjectStatus.Closed - && x.Status != EProjectStatus.Canceled) - .OrderByDescending(x => x.Notice?.RegistrationStartDate) // Traz os projetos mais recentes primeiro. + .Where(x => WhereClause(id, x)) + .OrderByDescending(x => (x.Notice?.RegistrationStartDate)) // Traz os projetos mais recentes primeiro. .ThenBy(x => x.Title) // Traz os projetos em ordem alfabética. .Skip(skip) .Take(take) .ToListAsync(); + + bool WhereClause(Guid? id, Project p) + { + return isClosed + ? p.ProfessorId == id && (p.Status == EProjectStatus.Closed || p.Status == EProjectStatus.Canceled) + : p.ProfessorId == id && p.Status != EProjectStatus.Closed && p.Status != EProjectStatus.Canceled; + } } public async Task> GetProjectsAsync(int skip, int take, bool isClosed = false) @@ -123,39 +113,29 @@ public async Task> GetProjectsAsync(int skip, int take, boo public async Task> GetStudentProjectsAsync(int skip, int take, Guid? id, bool isClosed = false) { - return isClosed - ? await _context.Projects - .Include(x => x.Student) - .Include(x => x.Professor) - .Include(x => x.SubArea) - .Include(x => x.ProgramType) - .Include(x => x.Notice) - .IgnoreQueryFilters() - .AsAsyncEnumerable() - .Where(x => x.StudentId == id - && (x.Status == EProjectStatus.Closed - || x.Status == EProjectStatus.Canceled)) - .OrderByDescending(x => x.Notice?.RegistrationStartDate) // Traz os projetos mais recentes primeiro. - .ThenBy(x => x.Title) // Traz os projetos em ordem alfabética. - .Skip(skip) - .Take(take) - .ToListAsync() - : (IEnumerable)await _context.Projects + return await _context.Projects .Include(x => x.Student) + .Include(x => x.Student!.User) .Include(x => x.Professor) + .Include(x => x.Professor!.User) .Include(x => x.SubArea) .Include(x => x.ProgramType) .Include(x => x.Notice) .IgnoreQueryFilters() .AsAsyncEnumerable() - .Where(x => x.StudentId == id - && x.Status != EProjectStatus.Closed - && x.Status != EProjectStatus.Canceled) + .Where(x => WhereClause(id, x)) .OrderByDescending(x => x.Notice?.RegistrationStartDate) // Traz os projetos mais recentes primeiro. .ThenBy(x => x.Title) // Traz os projetos em ordem alfabética. .Skip(skip) .Take(take) .ToListAsync(); + + bool WhereClause(Guid? id, Project p) + { + return isClosed + ? p.StudentId == id && (p.Status == EProjectStatus.Closed || p.Status == EProjectStatus.Canceled) + : p.StudentId == id && p.Status != EProjectStatus.Closed && p.Status != EProjectStatus.Canceled; + } } public async Task> GetProjectByNoticeAsync(Guid? noticeId) From e3e1d2d521264c48818333d4487c03e943bbc457 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 28 Oct 2023 12:31:01 -0300 Subject: [PATCH 179/201] docs: Add more images to docs folder --- docs/images/apim_gpic.png | Bin 0 -> 1179654 bytes docs/images/demo_rate_limit.png | Bin 0 -> 82060 bytes docs/images/seq_sample.png | Bin 257748 -> 206589 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/apim_gpic.png create mode 100644 docs/images/demo_rate_limit.png diff --git a/docs/images/apim_gpic.png b/docs/images/apim_gpic.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e53da8a76912999b869fa177c4d817dead285e GIT binary patch literal 1179654 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�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≻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 @&-q?8P_A%A} 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

SUWTHMNGJ+; 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 z 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
$=2|wB?kph8M~T>5jMw|+_&x@y4aLyr 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 literal 0 HcmV?d00001 diff --git a/docs/images/demo_rate_limit.png b/docs/images/demo_rate_limit.png new file mode 100644 index 0000000000000000000000000000000000000000..712a4ea9733090f777b50de69bcab94aa015ca98 GIT binary patch literal 82060 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 z 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⪻%ZKBN$+)O%9|1MNC5VX7E(cXphH(a`vH* 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%0A9+M$m222H;d^ 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%0DxrYfMQNCw;zKvsrql%%JYirGIf-x#ZkEp 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 literal 257748 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

}BLw3W@ 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 Date: Sat, 28 Oct 2023 15:09:00 -0300 Subject: [PATCH 180/201] test: Add more professor usecase tests --- .../Professor/GetProfessorByIdTests.cs | 50 +++++++++ .../UseCases/Professor/GetProfessorsTests.cs | 75 +++++++++++++ .../Professor/UpdateProfessorTests.cs | 106 ++++++++++++++++++ 3 files changed, 231 insertions(+) create mode 100644 src/Application.Tests/UseCases/Professor/GetProfessorByIdTests.cs create mode 100644 src/Application.Tests/UseCases/Professor/GetProfessorsTests.cs create mode 100644 src/Application.Tests/UseCases/Professor/UpdateProfessorTests.cs diff --git a/src/Application.Tests/UseCases/Professor/GetProfessorByIdTests.cs b/src/Application.Tests/UseCases/Professor/GetProfessorByIdTests.cs new file mode 100644 index 00000000..fc7c368e --- /dev/null +++ b/src/Application.Tests/UseCases/Professor/GetProfessorByIdTests.cs @@ -0,0 +1,50 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.UseCases.Professor; +using Application.Ports.Professor; +using Application.Validation; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.Professor; + +namespace Application.Tests.UseCases.Professor +{ + public class GetProfessorByIdTests + { + private readonly Mock _repositoryMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private IGetProfessorById CreateUseCase() => new GetProfessorById(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsDetailedReadProfessorOutput() + { + // Arrange + var useCase = CreateUseCase(); + Guid professorId = Guid.NewGuid(); + var professorEntity = new Domain.Entities.Professor("1234567", 12345); // Create a Professor entity for testing + var expectedOutput = new DetailedReadProfessorOutput(); // Create an expected output + + _repositoryMock.Setup(repo => repo.GetByIdAsync(professorId)).ReturnsAsync(professorEntity); + _mapperMock.Setup(mapper => mapper.Map(professorEntity)).Returns(expectedOutput); + + // Act + var result = await useCase.ExecuteAsync(professorId); + + // Assert + Assert.NotNull(result); + Assert.Same(expectedOutput, result); // Check if the expected output is returned + } + + [Fact] + public async Task ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? professorId = null; + + // Act & Assert + await Assert.ThrowsAsync(() => useCase.ExecuteAsync(professorId)); + } + } +} diff --git a/src/Application.Tests/UseCases/Professor/GetProfessorsTests.cs b/src/Application.Tests/UseCases/Professor/GetProfessorsTests.cs new file mode 100644 index 00000000..3b5b411f --- /dev/null +++ b/src/Application.Tests/UseCases/Professor/GetProfessorsTests.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AutoMapper; +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Application.UseCases.Professor; +using Application.Ports.Professor; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.Professor; + +namespace Application.Tests.UseCases.Professor +{ + public class GetProfessorsTests + { + private readonly Mock _repositoryMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + private static Domain.Entities.Professor MockValidProfessor() => new("1234567", 12345); + + private IGetProfessors CreateUseCase() => new GetProfessors(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidParameters_ReturnsQueryableOfResumedReadProfessorOutput() + { + // Arrange + var useCase = CreateUseCase(); + int skip = 0; + int take = 10; + var professorEntities = new List { MockValidProfessor(), MockValidProfessor() }.AsQueryable(); + var expectedOutput = professorEntities.Select(p => new ResumedReadProfessorOutput()).AsQueryable(); + + _repositoryMock.Setup(repo => repo.GetAllAsync(skip, take)).ReturnsAsync(professorEntities); + _mapperMock.Setup(mapper => mapper.Map>(professorEntities)).Returns(expectedOutput); + + // Act + var result = await useCase.ExecuteAsync(skip, take); + + // Assert + Assert.NotNull(result); + Assert.IsAssignableFrom>(result); + // Check if the collections have the same number of elements + Assert.Equal(expectedOutput.Count(), result.Count()); + } + + [Fact] + public void ExecuteAsync_InvalidSkip_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + int skip = -1; + int take = 10; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(skip, take)); + _repositoryMock.Verify(repo => repo.GetAllAsync(It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Never); + } + + [Fact] + public void ExecuteAsync_InvalidTake_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + int skip = 0; + int take = 0; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(skip, take)); + _repositoryMock.Verify(repo => repo.GetAllAsync(It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Professor/UpdateProfessorTests.cs b/src/Application.Tests/UseCases/Professor/UpdateProfessorTests.cs new file mode 100644 index 00000000..2a57e713 --- /dev/null +++ b/src/Application.Tests/UseCases/Professor/UpdateProfessorTests.cs @@ -0,0 +1,106 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Validation; +using Moq; +using Xunit; +using Application.UseCases.Professor; +using Application.Interfaces.UseCases.Professor; +using Application.Ports.Professor; + +namespace Application.Tests.UseCases.Professor +{ + public class UpdateProfessorTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IUpdateProfessor CreateUseCase() => new UpdateProfessor(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProfessorOutput() + { + // Arrange + var useCase = CreateUseCase(); + Guid professorId = Guid.NewGuid(); + var updateModel = new UpdateProfessorInput + { + IdentifyLattes = 1234567, + SIAPEEnrollment = "1234567" + }; + var professorEntity = new Domain.Entities.Professor + ( + id: professorId, + identifyLattes: 7654321, + siapeEnrollment: "1234567" + ); + var expectedOutput = new DetailedReadProfessorOutput(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(professorId)).ReturnsAsync(professorEntity); + _repositoryMock.Setup(repo => repo.UpdateAsync(professorEntity)).ReturnsAsync(professorEntity); + _mapperMock.Setup(mapper => mapper.Map(professorEntity)).Returns(expectedOutput); + + // Act + var result = await useCase.ExecuteAsync(professorId, updateModel); + + // Assert + Assert.NotNull(result); + Assert.Same(expectedOutput, result); + } + + [Fact] + public void ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? professorId = null; + var updateModel = new UpdateProfessorInput(); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(professorId, updateModel)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_ProfessorNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid professorId = Guid.NewGuid(); + var updateModel = new UpdateProfessorInput(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(professorId)).ReturnsAsync((Domain.Entities.Professor)null); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(professorId, updateModel)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(professorId), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_DeletedProfessor_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid professorId = Guid.NewGuid(); + var updateModel = new UpdateProfessorInput(); + var professorEntity = new Domain.Entities.Professor + ( + id: professorId, + identifyLattes: 7654321, + siapeEnrollment: "1234567" + ); + professorEntity.DeactivateEntity(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(professorId)).ReturnsAsync(professorEntity); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(professorId, updateModel)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(professorId), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} From ed53204d884c0bdb92acb742fe0d8be312466ad9 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 28 Oct 2023 15:22:05 -0300 Subject: [PATCH 181/201] test: Add program type usecase tests --- .../ProgramType/CreateProgramTypeTests.cs | 90 +++++++++++ .../ProgramType/DeleteProgramTypeTests.cs | 60 ++++++++ .../ProgramType/GetProgramTypeByIdTests.cs | 57 +++++++ .../ProgramType/GetProgramTypesTests.cs | 69 +++++++++ .../ProgramType/UpdateProgramTypeTests.cs | 141 ++++++++++++++++++ 5 files changed, 417 insertions(+) create mode 100644 src/Application.Tests/UseCases/ProgramType/CreateProgramTypeTests.cs create mode 100644 src/Application.Tests/UseCases/ProgramType/DeleteProgramTypeTests.cs create mode 100644 src/Application.Tests/UseCases/ProgramType/GetProgramTypeByIdTests.cs create mode 100644 src/Application.Tests/UseCases/ProgramType/GetProgramTypesTests.cs create mode 100644 src/Application.Tests/UseCases/ProgramType/UpdateProgramTypeTests.cs diff --git a/src/Application.Tests/UseCases/ProgramType/CreateProgramTypeTests.cs b/src/Application.Tests/UseCases/ProgramType/CreateProgramTypeTests.cs new file mode 100644 index 00000000..7a025ed9 --- /dev/null +++ b/src/Application.Tests/UseCases/ProgramType/CreateProgramTypeTests.cs @@ -0,0 +1,90 @@ +using AutoMapper; +using Application.UseCases.ProgramType; +using Application.Ports.ProgramType; +using Application.Validation; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.ProgramType; + +namespace Application.Tests.UseCases.ProgramType +{ + public class CreateProgramTypeTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private ICreateProgramType CreateUseCase() => new CreateProgramType(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProgramTypeOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateProgramTypeInput + { + Name = "New Program Type Name" + }; + var createdProgramType = new Domain.Entities.ProgramType + ( + id: Guid.NewGuid(), + name: "New Program Type Name", + description: "New Program Type Description" + ); + var expectedOutput = new DetailedReadProgramTypeOutput(); + + _repositoryMock.Setup(repo => repo.GetProgramTypeByNameAsync(input.Name)).ReturnsAsync((Domain.Entities.ProgramType)null); + _repositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(createdProgramType); + _mapperMock.Setup(mapper => mapper.Map(createdProgramType)).Returns(expectedOutput); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + Assert.Same(expectedOutput, result); + } + + [Fact] + public void ExecuteAsync_NullName_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateProgramTypeInput + { + Name = null + }; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(input)); + _repositoryMock.Verify(repo => repo.GetProgramTypeByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_ProgramTypeWithNameExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateProgramTypeInput + { + Name = "Existing Program Type Name" + }; + var existingProgramType = new Domain.Entities.ProgramType + ( + id: Guid.NewGuid(), + name: "Existing Program Type Name", + description: "Existing Program Type Description" + ); + + _repositoryMock.Setup(repo => repo.GetProgramTypeByNameAsync(input.Name)).ReturnsAsync(existingProgramType); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(input)); + _repositoryMock.Verify(repo => repo.GetProgramTypeByNameAsync(input.Name), Times.Once); + _repositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/ProgramType/DeleteProgramTypeTests.cs b/src/Application.Tests/UseCases/ProgramType/DeleteProgramTypeTests.cs new file mode 100644 index 00000000..697ae817 --- /dev/null +++ b/src/Application.Tests/UseCases/ProgramType/DeleteProgramTypeTests.cs @@ -0,0 +1,60 @@ +using System; +using System.Threading.Tasks; +using AutoMapper; +using Application.UseCases.ProgramType; +using Application.Ports.ProgramType; +using Application.Validation; +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.ProgramType; + +namespace Application.Tests.UseCases.ProgramType +{ + public class DeleteProgramTypeTests + { + private readonly Mock _repositoryMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private IDeleteProgramType CreateUseCase() => new DeleteProgramType(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsDetailedReadProgramTypeOutput() + { + // Arrange + var useCase = CreateUseCase(); + Guid id = Guid.NewGuid(); + var programType = new Domain.Entities.ProgramType + ( + id: Guid.NewGuid(), + name: "Program Type Name", + description: "Program Type Description" + ); + var expectedOutput = new DetailedReadProgramTypeOutput(); + + _repositoryMock.Setup(repo => repo.DeleteAsync(id)).ReturnsAsync(programType); + _mapperMock.Setup(mapper => mapper.Map(programType)).Returns(expectedOutput); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + Assert.Same(expectedOutput, result); + } + + [Fact] + public void ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(id)); + _repositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/ProgramType/GetProgramTypeByIdTests.cs b/src/Application.Tests/UseCases/ProgramType/GetProgramTypeByIdTests.cs new file mode 100644 index 00000000..7dde7a60 --- /dev/null +++ b/src/Application.Tests/UseCases/ProgramType/GetProgramTypeByIdTests.cs @@ -0,0 +1,57 @@ +using AutoMapper; +using Application.UseCases.ProgramType; +using Application.Ports.ProgramType; +using Application.Validation; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.ProgramType; + +namespace Application.Tests.UseCases.ProgramType +{ + public class GetProgramTypeByIdTests + { + private readonly Mock _repositoryMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private IGetProgramTypeById CreateUseCase() => new GetProgramTypeById(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsDetailedReadProgramTypeOutput() + { + // Arrange + var useCase = CreateUseCase(); + Guid id = Guid.NewGuid(); + var programType = new Domain.Entities.ProgramType + ( + id: Guid.NewGuid(), + name: "Program Type Name", + description: "Program Type Description" + ); + var expectedOutput = new DetailedReadProgramTypeOutput(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(programType); + _mapperMock.Setup(mapper => mapper.Map(programType)).Returns(expectedOutput); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + Assert.Same(expectedOutput, result); + } + + [Fact] + public void ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(id)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/ProgramType/GetProgramTypesTests.cs b/src/Application.Tests/UseCases/ProgramType/GetProgramTypesTests.cs new file mode 100644 index 00000000..eea460a8 --- /dev/null +++ b/src/Application.Tests/UseCases/ProgramType/GetProgramTypesTests.cs @@ -0,0 +1,69 @@ +using AutoMapper; +using Application.UseCases.ProgramType; +using Application.Ports.ProgramType; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.ProgramType; + +namespace Application.Tests.UseCases.ProgramType +{ + public class GetProgramTypesTests + { + private readonly Mock _repositoryMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private IGetProgramTypes CreateUseCase() => new GetProgramTypes(_repositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.ProgramType MockValidProgramType() => new("Program Name", "Program Description"); + + [Fact] + public async Task ExecuteAsync_ValidParameters_ReturnsQueryableOfResumedReadProgramTypeOutput() + { + // Arrange + var useCase = CreateUseCase(); + int skip = 0; + int take = 10; + var programTypeEntities = new List { MockValidProgramType(), MockValidProgramType() }.AsQueryable(); + var expectedOutput = programTypeEntities.Select(p => new ResumedReadProgramTypeOutput()).AsQueryable(); + + _repositoryMock.Setup(repo => repo.GetAllAsync(skip, take)).ReturnsAsync(programTypeEntities); + _mapperMock.Setup(mapper => mapper.Map>(programTypeEntities)).Returns(expectedOutput); + + // Act + var result = await useCase.ExecuteAsync(skip, take); + + // Assert + Assert.NotNull(result); + Assert.IsAssignableFrom>(result); + Assert.Equal(expectedOutput.Count(), result.Count()); + } + + [Fact] + public void ExecuteAsync_InvalidSkip_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + int skip = -1; + int take = 10; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(skip, take)); + _repositoryMock.Verify(repo => repo.GetAllAsync(It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Never); + } + + [Fact] + public void ExecuteAsync_InvalidTake_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + int skip = 0; + int take = 0; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(skip, take)); + _repositoryMock.Verify(repo => repo.GetAllAsync(It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/ProgramType/UpdateProgramTypeTests.cs b/src/Application.Tests/UseCases/ProgramType/UpdateProgramTypeTests.cs new file mode 100644 index 00000000..874bcefe --- /dev/null +++ b/src/Application.Tests/UseCases/ProgramType/UpdateProgramTypeTests.cs @@ -0,0 +1,141 @@ +using AutoMapper; +using Application.UseCases.ProgramType; +using Application.Ports.ProgramType; +using Application.Validation; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.ProgramType; + +namespace Application.Tests.UseCases.ProgramType +{ + public class UpdateProgramTypeTests + { + private readonly Mock _repositoryMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private IUpdateProgramType CreateUseCase() => new UpdateProgramType(_repositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.ProgramType MockValidProgramType() => new("Program Name", "Program Description"); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProgramTypeOutput() + { + // Arrange + var useCase = CreateUseCase(); + Guid id = Guid.NewGuid(); + var input = new UpdateProgramTypeInput + { + Name = "Updated Program Type Name", + Description = "Updated Program Type Description" + }; + var existingProgramType = MockValidProgramType(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingProgramType); + _repositoryMock.Setup(repo => repo.GetProgramTypeByNameAsync(input.Name)).ReturnsAsync((Domain.Entities.ProgramType)null); + _repositoryMock.Setup(repo => repo.UpdateAsync(It.IsAny())).ReturnsAsync(existingProgramType); + _mapperMock.Setup(mapper => mapper.Map(existingProgramType)) + .Returns(new DetailedReadProgramTypeOutput()); + + // Act + var result = await useCase.ExecuteAsync(id, input); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.GetProgramTypeByNameAsync(input.Name), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(existingProgramType), Times.Once); + } + + [Fact] + public void ExecuteAsync_InvalidId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + var input = new UpdateProgramTypeInput + { + Name = "Updated Program Type Name", + Description = "Updated Program Type Description" + }; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.GetProgramTypeByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_NameIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid id = Guid.NewGuid(); + var input = new UpdateProgramTypeInput + { + Name = null, + Description = "Updated Program Type Description" + }; + var existingProgramType = MockValidProgramType(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingProgramType); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Never); + _repositoryMock.Verify(repo => repo.GetProgramTypeByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_ProgramTypeNameExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid id = Guid.NewGuid(); + var input = new UpdateProgramTypeInput + { + Name = "Existing Program Type Name", + Description = "Updated Program Type Description" + }; + var existingProgramType = MockValidProgramType(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingProgramType); + _repositoryMock.Setup(repo => repo.GetProgramTypeByNameAsync(input.Name)).ReturnsAsync(existingProgramType); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.GetProgramTypeByNameAsync(input.Name), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_DeletedProgramType_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid id = Guid.NewGuid(); + var input = new UpdateProgramTypeInput + { + Name = "Updated Program Type Name", + Description = "Updated Program Type Description" + }; + var existingProgramType = MockValidProgramType(); + existingProgramType.DeactivateEntity(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(existingProgramType); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(id, input)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.GetProgramTypeByNameAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} From cd6ed40d52fc0f4a3a2856b33010cfac69ae2fc2 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 28 Oct 2023 17:44:10 -0300 Subject: [PATCH 182/201] test: Add user usecases tests --- .../UseCases/Auth/ConfirmEmailTests.cs | 14 +- .../UseCases/Auth/ForgotPasswordTests.cs | 8 +- .../UseCases/Auth/LoginTests.cs | 6 +- .../UseCases/Auth/ResetPasswordTests.cs | 16 +- .../Notice/ReportDeadlineNotificationTests.cs | 2 +- .../Professor/CreateProfessorTests.cs | 18 +- .../UseCases/User/ActivateUserTests.cs | 71 ++++++++ .../UseCases/User/DeactivateUserTests.cs | 74 ++++++++ .../UseCases/User/GetActiveUsersTests.cs | 55 ++++++ .../UseCases/User/GetInactiveUsersTests.cs | 55 ++++++ .../UseCases/User/GetUserByIdTests.cs | 67 ++++++++ .../UseCases/User/MakeAdminTests.cs | 161 ++++++++++++++++++ .../UseCases/User/MakeCoordinatorTests.cs | 156 +++++++++++++++++ .../UseCases/User/UpdateUserTests.cs | 101 +++++++++++ .../UseCases/User/MakeCoordinator.cs | 2 +- 15 files changed, 773 insertions(+), 33 deletions(-) create mode 100644 src/Application.Tests/UseCases/User/ActivateUserTests.cs create mode 100644 src/Application.Tests/UseCases/User/DeactivateUserTests.cs create mode 100644 src/Application.Tests/UseCases/User/GetActiveUsersTests.cs create mode 100644 src/Application.Tests/UseCases/User/GetInactiveUsersTests.cs create mode 100644 src/Application.Tests/UseCases/User/GetUserByIdTests.cs create mode 100644 src/Application.Tests/UseCases/User/MakeAdminTests.cs create mode 100644 src/Application.Tests/UseCases/User/MakeCoordinatorTests.cs create mode 100644 src/Application.Tests/UseCases/User/UpdateUserTests.cs diff --git a/src/Application.Tests/UseCases/Auth/ConfirmEmailTests.cs b/src/Application.Tests/UseCases/Auth/ConfirmEmailTests.cs index ff23b292..3e3ba984 100644 --- a/src/Application.Tests/UseCases/Auth/ConfirmEmailTests.cs +++ b/src/Application.Tests/UseCases/Auth/ConfirmEmailTests.cs @@ -15,7 +15,7 @@ public class ConfirmEmailTests private IConfirmEmail CreateUseCase() => new ConfirmEmail(_userRepositoryMock.Object); - private static User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); + private static Domain.Entities.User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); [Fact] public async Task ExecuteAsync_ValidInput_ReturnsSuccessMessage() @@ -49,7 +49,7 @@ public void ExecuteAsync_EmailIsNull_ThrowsUseCaseException() // Act & Assert Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email, token)); _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Never); - _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); } [Fact] @@ -63,7 +63,7 @@ public void ExecuteAsync_TokenIsNull_ThrowsUseCaseException() // Act & Assert Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email, token)); _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Never); - _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); } [Fact] @@ -74,12 +74,12 @@ public void ExecuteAsync_UserNotFound_ThrowsUseCaseException() var email = "test@example.com"; var token = "validtoken"; - _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(email)).ReturnsAsync((User)null); + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(email)).ReturnsAsync((Domain.Entities.User)null); // Act & Assert Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email, token)); _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(email), Times.Once); - _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); } [Fact] @@ -96,7 +96,7 @@ public void ExecuteAsync_InvalidToken_ThrowsUseCaseException() // Act & Assert Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email, token)); _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(email), Times.Once); - _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); } [Fact] @@ -114,7 +114,7 @@ public void ExecuteAsync_UserAlreadyConfirmed_ThrowsUseCaseException() // Act & Assert Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email, token)); _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(email), Times.Once); - _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); } } } diff --git a/src/Application.Tests/UseCases/Auth/ForgotPasswordTests.cs b/src/Application.Tests/UseCases/Auth/ForgotPasswordTests.cs index 8c6c0092..c8341d0f 100644 --- a/src/Application.Tests/UseCases/Auth/ForgotPasswordTests.cs +++ b/src/Application.Tests/UseCases/Auth/ForgotPasswordTests.cs @@ -17,7 +17,7 @@ public class ForgotPasswordTests private IForgotPassword CreateUseCase() => new ForgotPassword(_userRepositoryMock.Object, _emailServiceMock.Object); - private static User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); + private static Domain.Entities.User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); [Fact] public async Task ExecuteAsync_ValidInput_ReturnsSuccessMessage() @@ -50,7 +50,7 @@ public void ExecuteAsync_EmailIsNull_ThrowsUseCaseException() // Act & Assert Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email)); _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Never); - _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); _emailServiceMock.Verify(service => service.SendResetPasswordEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } @@ -61,12 +61,12 @@ public void ExecuteAsync_UserNotFound_ThrowsUseCaseException() var useCase = CreateUseCase(); var email = "test@example.com"; - _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(email)).ReturnsAsync((User)null); + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(email)).ReturnsAsync((Domain.Entities.User)null); // Act & Assert Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email)); _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(email), Times.Once); - _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); _emailServiceMock.Verify(service => service.SendResetPasswordEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } } diff --git a/src/Application.Tests/UseCases/Auth/LoginTests.cs b/src/Application.Tests/UseCases/Auth/LoginTests.cs index 00c233ac..1f49234e 100644 --- a/src/Application.Tests/UseCases/Auth/LoginTests.cs +++ b/src/Application.Tests/UseCases/Auth/LoginTests.cs @@ -21,8 +21,8 @@ public class LoginTests private readonly Mock _hashServiceMock = new Mock(); private ILogin CreateUseCase() => new Login(_tokenServiceMock.Object, _userRepositoryMock.Object, _professorRepositoryMock.Object, _studentRepositoryMock.Object, _hashServiceMock.Object); - private static User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); - private static User MockValidUserWithId() => new(Guid.NewGuid(), "John Doe", "ADMIN"); + private static Domain.Entities.User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); + private static Domain.Entities.User MockValidUserWithId() => new(Guid.NewGuid(), "John Doe", "ADMIN"); [Fact] public async Task ExecuteAsync_ValidInput_ReturnsUserLoginOutput() @@ -107,7 +107,7 @@ public void ExecuteAsync_UserNotFound_ThrowsUseCaseException() Password = "password" }; - _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(input.Email)).ReturnsAsync((User)null); + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(input.Email)).ReturnsAsync((Domain.Entities.User)null); // Act & Assert Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); diff --git a/src/Application.Tests/UseCases/Auth/ResetPasswordTests.cs b/src/Application.Tests/UseCases/Auth/ResetPasswordTests.cs index 5eb67123..4f0a7af4 100644 --- a/src/Application.Tests/UseCases/Auth/ResetPasswordTests.cs +++ b/src/Application.Tests/UseCases/Auth/ResetPasswordTests.cs @@ -17,8 +17,8 @@ public class ResetPasswordTests private readonly Mock _hashServiceMock = new Mock(); private IResetPassword CreateUseCase() => new ResetPassword(_userRepositoryMock.Object, _hashServiceMock.Object); - private static User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); - private static User MockValidUserWithId() => new(Guid.NewGuid(), "John Doe", "ADMIN"); + private static Domain.Entities.User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); + private static Domain.Entities.User MockValidUserWithId() => new(Guid.NewGuid(), "John Doe", "ADMIN"); [Fact] @@ -66,7 +66,7 @@ public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); - _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); } [Fact] @@ -85,7 +85,7 @@ public void ExecuteAsync_PasswordIsNull_ThrowsUseCaseException() Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); - _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); } [Fact] @@ -104,7 +104,7 @@ public void ExecuteAsync_TokenIsNull_ThrowsUseCaseException() Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); - _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); } [Fact] @@ -119,13 +119,13 @@ public void ExecuteAsync_UserNotFound_ThrowsUseCaseException() Token = "reset_token" }; - _userRepositoryMock.Setup(repo => repo.GetByIdAsync(input.Id.Value)).ReturnsAsync((User)null); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(input.Id.Value)).ReturnsAsync((Domain.Entities.User)null); // Act & Assert Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); _userRepositoryMock.Verify(repo => repo.GetByIdAsync(input.Id.Value), Times.Once); _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); - _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); } [Fact] @@ -148,7 +148,7 @@ public void ExecuteAsync_InvalidToken_ThrowsUseCaseException() Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); _userRepositoryMock.Verify(repo => repo.GetByIdAsync(input.Id.Value), Times.Once); _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Once); - _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); } } } diff --git a/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs b/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs index 4be3fb94..7145d3e4 100644 --- a/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs +++ b/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs @@ -41,7 +41,7 @@ private static Project MockValidProject() { Professor = new Domain.Entities.Professor("1234567", 1234567) { - User = new User("Name", "professor@email.com", "Password", "58411338029", Domain.Entities.Enums.ERole.ADMIN) + User = new Domain.Entities.User("Name", "professor@email.com", "Password", "58411338029", Domain.Entities.Enums.ERole.ADMIN) }, Notice = new( registrationStartDate: DateTime.UtcNow, diff --git a/src/Application.Tests/UseCases/Professor/CreateProfessorTests.cs b/src/Application.Tests/UseCases/Professor/CreateProfessorTests.cs index a34bd896..80d527ed 100644 --- a/src/Application.Tests/UseCases/Professor/CreateProfessorTests.cs +++ b/src/Application.Tests/UseCases/Professor/CreateProfessorTests.cs @@ -26,7 +26,7 @@ public class CreateProfessorTests _emailServiceMock.Object, _hashServiceMock.Object, _mapperMock.Object); - private static User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); + private static Domain.Entities.User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); [Fact] public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProfessorOutput() @@ -44,16 +44,16 @@ public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProfessorOutput() CPF = "58411338029" }; var hashedPassword = "HashedPassword123"; - var user = new User(Guid.NewGuid(), input.Name, input.Email, hashedPassword, input.CPF, ERole.PROFESSOR); + var user = new Domain.Entities.User(Guid.NewGuid(), input.Name, input.Email, hashedPassword, input.CPF, ERole.PROFESSOR); var professor = new Domain.Entities.Professor(input.SIAPEEnrollment, input.IdentifyLattes) { UserId = user.Id }; _hashServiceMock.Setup(hashService => hashService.HashPassword(input.Password)).Returns(hashedPassword); - _userRepositoryMock.Setup(userRepository => userRepository.GetUserByEmailAsync(input.Email)).ReturnsAsync((User)null); - _userRepositoryMock.Setup(userRepository => userRepository.GetUserByCPFAsync(input.CPF)).ReturnsAsync((User)null); - _userRepositoryMock.Setup(userRepository => userRepository.CreateAsync(It.IsAny())).ReturnsAsync(user); + _userRepositoryMock.Setup(userRepository => userRepository.GetUserByEmailAsync(input.Email)).ReturnsAsync((Domain.Entities.User)null); + _userRepositoryMock.Setup(userRepository => userRepository.GetUserByCPFAsync(input.CPF)).ReturnsAsync((Domain.Entities.User)null); + _userRepositoryMock.Setup(userRepository => userRepository.CreateAsync(It.IsAny())).ReturnsAsync(user); _professorRepositoryMock.Setup(professorRepository => professorRepository.CreateAsync(It.IsAny())).ReturnsAsync(professor); _emailServiceMock.Setup(emailService => emailService.SendConfirmationEmailAsync(user.Email, user.Name, user.ValidationCode)).Returns(Task.CompletedTask); _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadProfessorOutput()); @@ -66,7 +66,7 @@ public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProfessorOutput() _hashServiceMock.Verify(hashService => hashService.HashPassword(password), Times.Once); _userRepositoryMock.Verify(userRepository => userRepository.GetUserByEmailAsync(input.Email), Times.Once); _userRepositoryMock.Verify(userRepository => userRepository.GetUserByCPFAsync(input.CPF), Times.Once); - _userRepositoryMock.Verify(userRepository => userRepository.CreateAsync(It.IsAny()), Times.Once); + _userRepositoryMock.Verify(userRepository => userRepository.CreateAsync(It.IsAny()), Times.Once); _professorRepositoryMock.Verify(professorRepository => professorRepository.CreateAsync(It.IsAny()), Times.Once); _emailServiceMock.Verify(emailService => emailService.SendConfirmationEmailAsync(user.Email, user.Name, user.ValidationCode), Times.Once); _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); @@ -87,7 +87,7 @@ public void ExecuteAsync_PasswordIsNull_ThrowsUseCaseException() _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); _userRepositoryMock.Verify(userRepository => userRepository.GetUserByEmailAsync(It.IsAny()), Times.Never); _userRepositoryMock.Verify(userRepository => userRepository.GetUserByCPFAsync(It.IsAny()), Times.Never); - _userRepositoryMock.Verify(userRepository => userRepository.CreateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(userRepository => userRepository.CreateAsync(It.IsAny()), Times.Never); _professorRepositoryMock.Verify(professorRepository => professorRepository.CreateAsync(It.IsAny()), Times.Never); _emailServiceMock.Verify(emailService => emailService.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); @@ -115,7 +115,7 @@ public void ExecuteAsync_UserWithEmailExists_ThrowsUseCaseException() _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); _userRepositoryMock.Verify(userRepository => userRepository.GetUserByEmailAsync(input.Email), Times.Once); _userRepositoryMock.Verify(userRepository => userRepository.GetUserByCPFAsync(It.IsAny()), Times.Never); - _userRepositoryMock.Verify(userRepository => userRepository.CreateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(userRepository => userRepository.CreateAsync(It.IsAny()), Times.Never); _professorRepositoryMock.Verify(professorRepository => professorRepository.CreateAsync(It.IsAny()), Times.Never); _emailServiceMock.Verify(emailService => emailService.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); @@ -143,7 +143,7 @@ public void ExecuteAsync_UserWithCPFExists_ThrowsUseCaseException() _hashServiceMock.Verify(hashService => hashService.HashPassword(It.IsAny()), Times.Never); _userRepositoryMock.Verify(userRepository => userRepository.GetUserByEmailAsync(It.IsAny()), Times.Once); _userRepositoryMock.Verify(userRepository => userRepository.GetUserByCPFAsync(input.CPF), Times.Once); - _userRepositoryMock.Verify(userRepository => userRepository.CreateAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(userRepository => userRepository.CreateAsync(It.IsAny()), Times.Never); _professorRepositoryMock.Verify(professorRepository => professorRepository.CreateAsync(It.IsAny()), Times.Never); _emailServiceMock.Verify(emailService => emailService.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); diff --git a/src/Application.Tests/UseCases/User/ActivateUserTests.cs b/src/Application.Tests/UseCases/User/ActivateUserTests.cs new file mode 100644 index 00000000..0ea6de17 --- /dev/null +++ b/src/Application.Tests/UseCases/User/ActivateUserTests.cs @@ -0,0 +1,71 @@ +using AutoMapper; +using Application.UseCases.User; +using Application.Ports.User; +using Application.Validation; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.User; +using Domain.Entities.Enums; + +namespace Application.Tests.UseCases.User +{ + public class ActivateUserTests + { + private readonly Mock _repositoryMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private IActivateUser CreateUseCase() => new ActivateUser(_repositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsUserReadOutput() + { + // Arrange + var useCase = CreateUseCase(); + var user = MockValidUser(); + var id = user.Id; + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(user); + _repositoryMock.Setup(repo => repo.UpdateAsync(user)).ReturnsAsync(user); + _mapperMock.Setup(mapper => mapper.Map(user)).Returns(new UserReadOutput()); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(user), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(user), Times.Once); + } + + [Fact] + public void ExecuteAsync_InvalidId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(id)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid id = Guid.NewGuid(); + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync((Domain.Entities.User)null); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(id)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/User/DeactivateUserTests.cs b/src/Application.Tests/UseCases/User/DeactivateUserTests.cs new file mode 100644 index 00000000..764fb4ee --- /dev/null +++ b/src/Application.Tests/UseCases/User/DeactivateUserTests.cs @@ -0,0 +1,74 @@ +using System; +using System.Threading.Tasks; +using AutoMapper; +using Application.UseCases.User; +using Application.Ports.User; +using Application.Validation; +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.User; + +namespace Application.Tests.UseCases.User +{ + public class DeactivateUserTests + { + private readonly Mock _repositoryMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private IDeactivateUser CreateUseCase() => new DeactivateUser(_repositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsUserReadOutput() + { + // Arrange + var useCase = CreateUseCase(); + var user = MockValidUser(); + var id = user.Id; + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(user); + _repositoryMock.Setup(repo => repo.UpdateAsync(user)).ReturnsAsync(user); + _mapperMock.Setup(mapper => mapper.Map(user)).Returns(new UserReadOutput()); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(user), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(user), Times.Once); + } + + [Fact] + public void ExecuteAsync_InvalidId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(id)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid id = Guid.NewGuid(); + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync((Domain.Entities.User)null); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(id)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _repositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/User/GetActiveUsersTests.cs b/src/Application.Tests/UseCases/User/GetActiveUsersTests.cs new file mode 100644 index 00000000..43a4bf0d --- /dev/null +++ b/src/Application.Tests/UseCases/User/GetActiveUsersTests.cs @@ -0,0 +1,55 @@ +using AutoMapper; +using Application.UseCases.User; +using Application.Ports.User; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.User; + +namespace Application.Tests.UseCases.User +{ + public class GetActiveUsersTests + { + private readonly Mock _repositoryMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private IGetActiveUsers CreateUseCase() => new GetActiveUsers(_repositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsListOfUserReadOutput() + { + // Arrange + var useCase = CreateUseCase(); + int skip = 0; + int take = 10; + var users = new List { MockValidUser(), MockValidUser() }; + _repositoryMock.Setup(repo => repo.GetActiveUsersAsync(skip, take)).ReturnsAsync(users); + _mapperMock.Setup(mapper => mapper.Map>(users)).Returns(users.Select(u => new UserReadOutput()).ToList()); + + // Act + var result = await useCase.ExecuteAsync(skip, take); + + // Assert + Assert.NotNull(result); + Assert.IsAssignableFrom>(result); + Assert.Equal(users.Count, result.Count()); + _repositoryMock.Verify(repo => repo.GetActiveUsersAsync(skip, take), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(users), Times.Once); + } + + [Fact] + public void ExecuteAsync_InvalidSkipAndTake_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + int skip = -1; + int take = 0; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(skip, take)); + _repositoryMock.Verify(repo => repo.GetActiveUsersAsync(It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/User/GetInactiveUsersTests.cs b/src/Application.Tests/UseCases/User/GetInactiveUsersTests.cs new file mode 100644 index 00000000..192cabeb --- /dev/null +++ b/src/Application.Tests/UseCases/User/GetInactiveUsersTests.cs @@ -0,0 +1,55 @@ +using AutoMapper; +using Application.UseCases.User; +using Application.Ports.User; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.User; + +namespace Application.Tests.UseCases.User +{ + public class GetInactiveUsersTests + { + private readonly Mock _repositoryMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private IGetInactiveUsers CreateUseCase() => new GetInactiveUsers(_repositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsListOfUserReadOutput() + { + // Arrange + var useCase = CreateUseCase(); + int skip = 0; + int take = 10; + var users = new List { MockValidUser(), MockValidUser() }; + _repositoryMock.Setup(repo => repo.GetInactiveUsersAsync(skip, take)).ReturnsAsync(users); + _mapperMock.Setup(mapper => mapper.Map>(users)).Returns(users.Select(u => new UserReadOutput()).ToList()); + + // Act + var result = await useCase.ExecuteAsync(skip, take); + + // Assert + Assert.NotNull(result); + Assert.IsAssignableFrom>(result); + Assert.Equal(users.Count, result.Count()); + _repositoryMock.Verify(repo => repo.GetInactiveUsersAsync(skip, take), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(users), Times.Once); + } + + [Fact] + public void ExecuteAsync_InvalidSkipAndTake_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + int skip = -1; + int take = 0; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(skip, take)); + _repositoryMock.Verify(repo => repo.GetInactiveUsersAsync(It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/User/GetUserByIdTests.cs b/src/Application.Tests/UseCases/User/GetUserByIdTests.cs new file mode 100644 index 00000000..d81e1459 --- /dev/null +++ b/src/Application.Tests/UseCases/User/GetUserByIdTests.cs @@ -0,0 +1,67 @@ +using AutoMapper; +using Application.UseCases.User; +using Application.Ports.User; +using Application.Validation; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.User; + +namespace Application.Tests.UseCases.User +{ + public class GetUserByIdTests + { + private readonly Mock _repositoryMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private IGetUserById CreateUseCase() => new GetUserById(_repositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsUserReadOutput() + { + // Arrange + var useCase = CreateUseCase(); + var user = MockValidUser(); + var userId = user.Id; + _repositoryMock.Setup(repo => repo.GetByIdAsync(userId)).ReturnsAsync(user); + _mapperMock.Setup(mapper => mapper.Map(user)).Returns(new UserReadOutput()); + + // Act + var result = await useCase.ExecuteAsync(userId); + + // Assert + Assert.NotNull(result); + Assert.IsType(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(userId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(user), Times.Once); + } + + [Fact] + public void ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? userId = null; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(userId)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_NonexistentId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var userId = Guid.NewGuid(); + _repositoryMock.Setup(repo => repo.GetByIdAsync(userId)).ReturnsAsync((Domain.Entities.User)null); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(userId)); + _repositoryMock.Verify(repo => repo.GetByIdAsync(userId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/User/MakeAdminTests.cs b/src/Application.Tests/UseCases/User/MakeAdminTests.cs new file mode 100644 index 00000000..1c6c141f --- /dev/null +++ b/src/Application.Tests/UseCases/User/MakeAdminTests.cs @@ -0,0 +1,161 @@ +using System.Security.Claims; +using Application.Interfaces.UseCases.User; +using Application.UseCases.User; +using Application.Validation; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.User +{ + public class MakeAdminTests + { + private readonly Mock _userRepositoryMock = new Mock(); + private readonly Mock _professorRepositoryMock = new Mock(); + private readonly Mock _tokenAuthenticationServiceMock = new Mock(); + + private IMakeAdmin CreateUseCase() => + new MakeAdmin(_userRepositoryMock.Object, _professorRepositoryMock.Object, _tokenAuthenticationServiceMock.Object); + private static Domain.Entities.Professor MockValidProfessor() => new("1234567", 12345); + private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); + private static Dictionary MockUserClaims(Domain.Entities.User user) => new() { { (Guid)user.Id, user } }; + + [Fact] + public async Task ExecuteAsync_ValidUserId_ReturnsSuccessMessage() + { + // Arrange + var useCase = CreateUseCase(); + var adminUser = MockValidUser(); + var userToMakeAdmin = MockValidUser(); + userToMakeAdmin.Role = ERole.PROFESSOR; + + var userClaims = MockUserClaims(adminUser); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(adminUser.Id)).ReturnsAsync(adminUser); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(userToMakeAdmin.Id)).ReturnsAsync(userToMakeAdmin); + _professorRepositoryMock.Setup(repo => repo.GetByUserIdAsync(userToMakeAdmin.Id)).ReturnsAsync(MockValidProfessor()); + + // Act + var result = await useCase.ExecuteAsync(userToMakeAdmin.Id); + + // Assert + Assert.Equal($"Usuário {adminUser.Id} tornou administrador o usuário {userToMakeAdmin.Id}", result); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(userToMakeAdmin), Times.Once); + } + + [Fact] + public void ExecuteAsync_NullUserId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(null)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _professorRepositoryMock.Verify(repo => repo.GetByUserIdAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UnauthenticatedUser_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Dictionary userClaims = null; + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(Guid.NewGuid())); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _professorRepositoryMock.Verify(repo => repo.GetByUserIdAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_NonAdminUser_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var user = MockValidUser(); + user.Role = ERole.PROFESSOR; + + var userClaims = MockUserClaims(user); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(Guid.NewGuid())); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _professorRepositoryMock.Verify(repo => repo.GetByUserIdAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_AdminUserDoesNotExist_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var userToMakeAdmin = MockValidUser(); + userToMakeAdmin.Role = ERole.PROFESSOR; + + var adminUser = MockValidUser(); + var adminUserId = adminUser.Id; + var userClaims = MockUserClaims(adminUser); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(adminUserId)).ReturnsAsync((Domain.Entities.User)null); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(userToMakeAdmin.Id)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(adminUserId), Times.Once); + _professorRepositoryMock.Verify(repo => repo.GetByUserIdAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + + [Fact] + public void ExecuteAsync_UserToMakeAdminDoesNotExist_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var adminUser = MockValidUser(); + var userToMakeAdminId = Guid.NewGuid(); + var userClaims = MockUserClaims(adminUser); + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(adminUser.Id)).ReturnsAsync(adminUser); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(userToMakeAdminId)).ReturnsAsync((Domain.Entities.User)null); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(userToMakeAdminId)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(adminUser.Id), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(userToMakeAdminId), Times.Once); + _professorRepositoryMock.Verify(repo => repo.GetByUserIdAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserToMakeAdminIsNotProfessor_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var adminUser = MockValidUser(); + var userToMakeAdmin = MockValidUser(); + userToMakeAdmin.Role = ERole.PROFESSOR; + var userClaims = MockUserClaims(adminUser); + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(adminUser.Id)).ReturnsAsync(adminUser); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(userToMakeAdmin.Id)).ReturnsAsync(userToMakeAdmin); + _professorRepositoryMock.Setup(repo => repo.GetByUserIdAsync(userToMakeAdmin.Id)).ReturnsAsync((Domain.Entities.Professor)null); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(userToMakeAdmin.Id)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(adminUser.Id), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(userToMakeAdmin.Id), Times.Once); + _professorRepositoryMock.Verify(repo => repo.GetByUserIdAsync(userToMakeAdmin.Id), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/User/MakeCoordinatorTests.cs b/src/Application.Tests/UseCases/User/MakeCoordinatorTests.cs new file mode 100644 index 00000000..d05252a1 --- /dev/null +++ b/src/Application.Tests/UseCases/User/MakeCoordinatorTests.cs @@ -0,0 +1,156 @@ +using System.Security.Claims; +using Application.Interfaces.UseCases.User; +using Application.UseCases.User; +using Application.Validation; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.User +{ + public class MakeCoordinatorTests + { + private readonly Mock _userRepositoryMock = new Mock(); + private readonly Mock _tokenAuthenticationServiceMock = new Mock(); + + private IMakeCoordinator CreateUseCase() => new MakeCoordinator(_userRepositoryMock.Object, _tokenAuthenticationServiceMock.Object); + private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); + private static Dictionary MockUserClaims(Domain.Entities.User user) => new() { { (Guid)user.Id, user } }; + + [Fact] + public async Task ExecuteAsync_ValidUserId_ReturnsSuccessMessage() + { + // Arrange + var useCase = CreateUseCase(); + var adminUser = MockValidUser(); + adminUser.IsCoordinator = true; + var userToMakeCoordinator = MockValidUser(); + userToMakeCoordinator.IsCoordinator = false; + var userClaims = MockUserClaims(adminUser); + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(adminUser.Id)).ReturnsAsync(adminUser); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(userToMakeCoordinator.Id)).ReturnsAsync(userToMakeCoordinator); + + // Act + var result = await useCase.ExecuteAsync(userToMakeCoordinator.Id); + + // Assert + Assert.Equal($"Usuário {adminUser.Id} tornou coordenador o usuário {userToMakeCoordinator.Id}", result); + Assert.False(adminUser.IsCoordinator); + Assert.True(userToMakeCoordinator.IsCoordinator); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(adminUser), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(userToMakeCoordinator), Times.Once); + } + + [Fact] + public void ExecuteAsync_NullUserId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(null)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UnauthenticatedUser_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Dictionary userClaims = null; + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(Guid.NewGuid())); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_NonAdminUser_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var adminUser = MockValidUser(); + adminUser.Role = ERole.PROFESSOR; + var userClaims = MockUserClaims(adminUser); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(Guid.NewGuid())); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_AdminUserDoesNotExist_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var adminUser = MockValidUser(); + adminUser.IsCoordinator = true; + var adminUserId = adminUser.Id; + var userToMakeCoordinator = MockValidUser(); + userToMakeCoordinator.IsCoordinator = false; + var userClaims = MockUserClaims(adminUser); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(adminUserId)).ReturnsAsync((Domain.Entities.User)null); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(userToMakeCoordinator.Id)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(adminUserId), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserToMakeCoordinatorDoesNotExist_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var adminUser = MockValidUser(); + adminUser.IsCoordinator = true; + var userToMakeCoordinatorId = Guid.NewGuid(); + var userClaims = MockUserClaims(adminUser); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(adminUser.Id)).ReturnsAsync(adminUser); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(userToMakeCoordinatorId)).ReturnsAsync((Domain.Entities.User)null); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(userToMakeCoordinatorId)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(adminUser.Id), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(userToMakeCoordinatorId), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_AdminUserIsNotCoordinator_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var adminUser = MockValidUser(); + adminUser.IsCoordinator = false; + + var userToMakeCoordinator = MockValidUser(); + userToMakeCoordinator.IsCoordinator = false; + + var userClaims = MockUserClaims(adminUser); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(adminUser.Id)).ReturnsAsync(adminUser); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(userToMakeCoordinator.Id)).ReturnsAsync(userToMakeCoordinator); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(userToMakeCoordinator.Id)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(adminUser.Id), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(userToMakeCoordinator.Id), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/User/UpdateUserTests.cs b/src/Application.Tests/UseCases/User/UpdateUserTests.cs new file mode 100644 index 00000000..84e3484f --- /dev/null +++ b/src/Application.Tests/UseCases/User/UpdateUserTests.cs @@ -0,0 +1,101 @@ +using System.Security.Claims; +using Application.Interfaces.UseCases.User; +using Application.Ports.User; +using Application.UseCases.User; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.User +{ + public class UpdateUserTests + { + private readonly Mock _userRepositoryMock = new Mock(); + private readonly Mock _tokenAuthenticationServiceMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private IUpdateUser CreateUseCase() => + new UpdateUser(_userRepositoryMock.Object, _tokenAuthenticationServiceMock.Object, _mapperMock.Object); + private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); + private static Dictionary MockUserClaims(Domain.Entities.User user) => new() { { (Guid)user.Id, user } }; + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsUpdatedUser() + { + // Arrange + var useCase = CreateUseCase(); + var input = new UserUpdateInput + { + Name = "New Name", + CPF = "83278087020" + }; + var existingUser = MockValidUser(); + var userClaims = MockUserClaims(existingUser); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(existingUser); + _userRepositoryMock.Setup(repo => repo.UpdateAsync(It.IsAny())).ReturnsAsync(existingUser); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new UserReadOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + Assert.Equal(input.Name, existingUser.Name); + Assert.Equal(input.CPF, existingUser.CPF); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(existingUser), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(existingUser), Times.Once); + } + + [Fact] + public void ExecuteAsync_NullUserId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new UserUpdateInput + { + Name = "New Name", + CPF = "12345678901" + }; + Dictionary userClaims = null; + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(input)); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_UserDoesNotExist_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new UserUpdateInput + { + Name = "New Name", + CPF = "12345678901" + }; + var user = MockValidUser(); + var userId = user.Id; + var userClaims = MockUserClaims(user); + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(userId)).ReturnsAsync((Domain.Entities.User)null); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(input)); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(userId), Times.Once); + _userRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application/UseCases/User/MakeCoordinator.cs b/src/Application/UseCases/User/MakeCoordinator.cs index 2003848f..e1e9b014 100644 --- a/src/Application/UseCases/User/MakeCoordinator.cs +++ b/src/Application/UseCases/User/MakeCoordinator.cs @@ -40,7 +40,7 @@ public async Task ExecuteAsync(Guid? userId) UseCaseException.NotFoundEntityById(user is null, nameof(user)); // Verifica se usuário logado é coordenador - UseCaseException.BusinessRuleViolation(user!.IsCoordinator, + UseCaseException.BusinessRuleViolation(!user!.IsCoordinator, "Usuário não é coordenador"); // Obtém usuário que será tornado coordenador From e4774ed601ec0c27847732506047d653f7628ac8 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 28 Oct 2023 18:05:28 -0300 Subject: [PATCH 183/201] fix: Adjust GetUserById usecase * Returns empty if entity not found --- src/Application.Tests/UseCases/User/GetUserByIdTests.cs | 2 +- src/Application/UseCases/User/GetUserById.cs | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/Application.Tests/UseCases/User/GetUserByIdTests.cs b/src/Application.Tests/UseCases/User/GetUserByIdTests.cs index d81e1459..ce5093d7 100644 --- a/src/Application.Tests/UseCases/User/GetUserByIdTests.cs +++ b/src/Application.Tests/UseCases/User/GetUserByIdTests.cs @@ -61,7 +61,7 @@ public void ExecuteAsync_NonexistentId_ThrowsUseCaseException() // Act & Assert Assert.ThrowsAsync(() => useCase.ExecuteAsync(userId)); _repositoryMock.Verify(repo => repo.GetByIdAsync(userId), Times.Once); - _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); } } } diff --git a/src/Application/UseCases/User/GetUserById.cs b/src/Application/UseCases/User/GetUserById.cs index 0c1e5aed..0446f0db 100644 --- a/src/Application/UseCases/User/GetUserById.cs +++ b/src/Application/UseCases/User/GetUserById.cs @@ -20,14 +20,8 @@ public GetUserById(IUserRepository repository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { - // Verifica se o id informado é nulo UseCaseException.NotInformedParam(id is null, nameof(id)); - - // Busca usuário pelo id informado - Domain.Entities.User entity = await _repository.GetByIdAsync(id) - ?? throw UseCaseException.NotFoundEntityById(nameof(Domain.Entities.User)); - - // Retorna usuário encontrado + var entity = await _repository.GetByIdAsync(id); return _mapper.Map(entity); } } From 75ae476f8e013c1b5a2e0f36868e55131d77025a Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 28 Oct 2023 18:09:15 -0300 Subject: [PATCH 184/201] fix: Adjust subarea usecases --- src/Application/UseCases/SubArea/CreateSubArea.cs | 6 +++--- src/Application/UseCases/SubArea/GetSubAreaById.cs | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Application/UseCases/SubArea/CreateSubArea.cs b/src/Application/UseCases/SubArea/CreateSubArea.cs index e28e6f2e..f93b9b00 100644 --- a/src/Application/UseCases/SubArea/CreateSubArea.cs +++ b/src/Application/UseCases/SubArea/CreateSubArea.cs @@ -22,13 +22,13 @@ public CreateSubArea(ISubAreaRepository subAreaRepository, IAreaRepository areaR public async Task ExecuteAsync(CreateSubAreaInput input) { + // Verifica id da área + UseCaseException.NotInformedParam(input.AreaId == null, nameof(input.AreaId)); + var entity = await _subAreaRepository.GetByCodeAsync(input.Code); UseCaseException.BusinessRuleViolation(entity != null, "Já existe uma Subárea para o código informado."); - // Verifica id da área - UseCaseException.NotInformedParam(input.AreaId == null, nameof(input.AreaId)); - // Valida se existe área var area = await _areaRepository.GetByIdAsync(input.AreaId) ?? throw UseCaseException.NotFoundEntityByParams(nameof(Domain.Entities.Area)); diff --git a/src/Application/UseCases/SubArea/GetSubAreaById.cs b/src/Application/UseCases/SubArea/GetSubAreaById.cs index 9348aa9d..afea8b6f 100644 --- a/src/Application/UseCases/SubArea/GetSubAreaById.cs +++ b/src/Application/UseCases/SubArea/GetSubAreaById.cs @@ -2,6 +2,7 @@ using Domain.Interfaces.Repositories; using Application.Interfaces.UseCases.SubArea; using Application.Ports.SubArea; +using Application.Validation; namespace Application.UseCases.SubArea { @@ -19,7 +20,8 @@ public GetSubAreaById(ISubAreaRepository subAreaRepository, IMapper mapper) public async Task ExecuteAsync(Guid? id) { - Domain.Entities.SubArea? entity = await _subAreaRepository.GetByIdAsync(id); + UseCaseException.NotInformedParam(id is null, nameof(id)); + var entity = await _subAreaRepository.GetByIdAsync(id); return _mapper.Map(entity); } } From ef345cfe516defa6c74fba12591b1ac077c36249 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sat, 28 Oct 2023 18:09:36 -0300 Subject: [PATCH 185/201] test: Add subarea usecases tests --- .../UseCases/SubArea/CreateSubAreaTests.cs | 125 ++++++++++++++++++ .../UseCases/SubArea/DeleteSubAreaTests.cs | 53 ++++++++ .../UseCases/SubArea/GetSubAreaByIdTests.cs | 72 ++++++++++ .../SubArea/GetSubAreasByAreaTests.cs | 80 +++++++++++ 4 files changed, 330 insertions(+) create mode 100644 src/Application.Tests/UseCases/SubArea/CreateSubAreaTests.cs create mode 100644 src/Application.Tests/UseCases/SubArea/DeleteSubAreaTests.cs create mode 100644 src/Application.Tests/UseCases/SubArea/GetSubAreaByIdTests.cs create mode 100644 src/Application.Tests/UseCases/SubArea/GetSubAreasByAreaTests.cs diff --git a/src/Application.Tests/UseCases/SubArea/CreateSubAreaTests.cs b/src/Application.Tests/UseCases/SubArea/CreateSubAreaTests.cs new file mode 100644 index 00000000..415ffa2c --- /dev/null +++ b/src/Application.Tests/UseCases/SubArea/CreateSubAreaTests.cs @@ -0,0 +1,125 @@ +using Application.Interfaces.UseCases.SubArea; +using Application.Ports.SubArea; +using Application.UseCases.SubArea; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.SubArea +{ + public class CreateSubAreaTests + { + private readonly Mock _subAreaRepositoryMock = new(); + private readonly Mock _areaRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private ICreateSubArea CreateUseCase() => new CreateSubArea(_subAreaRepositoryMock.Object, _areaRepositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.SubArea MockValidSubArea() => new(Guid.NewGuid(), "ABC", "SubArea Name"); + private static Domain.Entities.Area MockValidArea(CreateSubAreaInput input) => new(input.AreaId, "ABC", "Area Name"); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadSubAreaOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateSubAreaInput + { + Code = "NewCode", + AreaId = Guid.NewGuid() + }; + Domain.Entities.SubArea? existingSubArea = null; + Domain.Entities.Area area = MockValidArea(input); + var createdSubArea = MockValidSubArea(); + createdSubArea.AreaId = input.AreaId; + createdSubArea.Code = input.Code; + + _subAreaRepositoryMock.Setup(repo => repo.GetByCodeAsync(input.Code)).ReturnsAsync(existingSubArea); + _areaRepositoryMock.Setup(repo => repo.GetByIdAsync(input.AreaId)).ReturnsAsync(area); + _subAreaRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(createdSubArea); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())) + .Returns(new DetailedReadSubAreaOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + _subAreaRepositoryMock.Verify(repo => repo.GetByCodeAsync(input.Code), Times.Once); + _areaRepositoryMock.Verify(repo => repo.GetByIdAsync(input.AreaId), Times.Once); + _subAreaRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public void ExecuteAsync_SubAreaWithSameCodeExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateSubAreaInput + { + Code = "ExistingCode", + AreaId = Guid.NewGuid() + }; + var existingSubArea = MockValidSubArea(); + existingSubArea.Code = input.Code; + existingSubArea.AreaId = input.AreaId; + var area = MockValidArea(input); + + _subAreaRepositoryMock.Setup(repo => repo.GetByCodeAsync(input.Code)).ReturnsAsync(existingSubArea); + _areaRepositoryMock.Setup(repo => repo.GetByIdAsync(input.AreaId)).ReturnsAsync(area); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(input)); + _subAreaRepositoryMock.Verify(repo => repo.GetByCodeAsync(input.Code), Times.Once); + _areaRepositoryMock.Verify(repo => repo.GetByIdAsync(input.AreaId), Times.Never); + _subAreaRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_NullAreaId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateSubAreaInput + { + Code = "NewCode", + AreaId = null + }; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(input)); + _subAreaRepositoryMock.Verify(repo => repo.GetByCodeAsync(input.Code), Times.Never); + _areaRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _subAreaRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_InactiveArea_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateSubAreaInput + { + Code = "NewCode", + AreaId = Guid.NewGuid() + }; + Domain.Entities.SubArea? existingSubArea = null; + var area = MockValidArea(input); + area.DeactivateEntity(); + + _subAreaRepositoryMock.Setup(repo => repo.GetByCodeAsync(input.Code)).ReturnsAsync(existingSubArea); + _areaRepositoryMock.Setup(repo => repo.GetByIdAsync(input.AreaId)).ReturnsAsync(area); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(input)); + _subAreaRepositoryMock.Verify(repo => repo.GetByCodeAsync(input.Code), Times.Once); + _areaRepositoryMock.Verify(repo => repo.GetByIdAsync(input.AreaId), Times.Once); + _subAreaRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/SubArea/DeleteSubAreaTests.cs b/src/Application.Tests/UseCases/SubArea/DeleteSubAreaTests.cs new file mode 100644 index 00000000..1b916ded --- /dev/null +++ b/src/Application.Tests/UseCases/SubArea/DeleteSubAreaTests.cs @@ -0,0 +1,53 @@ +using Application.Interfaces.UseCases.SubArea; +using Application.Ports.SubArea; +using Application.UseCases.SubArea; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.SubArea +{ + public class DeleteSubAreaTests + { + private readonly Mock _subAreaRepositoryMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private IDeleteSubArea CreateUseCase() => new DeleteSubArea(_subAreaRepositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.SubArea MockValidSubArea() => new(Guid.NewGuid(), "ABC", "SubArea Name"); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadSubAreaOutput() + { + // Arrange + var useCase = CreateUseCase(); + var subAreaToDelete = MockValidSubArea(); + var subAreaId = Guid.NewGuid(); + + _subAreaRepositoryMock.Setup(repo => repo.DeleteAsync(subAreaId)).ReturnsAsync(subAreaToDelete); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())) + .Returns(new DetailedReadSubAreaOutput()); + + // Act + var result = await useCase.ExecuteAsync(subAreaId); + + // Assert + Assert.NotNull(result); + _subAreaRepositoryMock.Verify(repo => repo.DeleteAsync(subAreaId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(null)); + _subAreaRepositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/SubArea/GetSubAreaByIdTests.cs b/src/Application.Tests/UseCases/SubArea/GetSubAreaByIdTests.cs new file mode 100644 index 00000000..3cc27cf2 --- /dev/null +++ b/src/Application.Tests/UseCases/SubArea/GetSubAreaByIdTests.cs @@ -0,0 +1,72 @@ +using Application.Interfaces.UseCases.SubArea; +using Application.Ports.SubArea; +using Application.UseCases.SubArea; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.SubArea +{ + public class GetSubAreaByIdTests + { + private readonly Mock _subAreaRepositoryMock = new Mock(); + private readonly Mock _mapperMock = new(); + + private IGetSubAreaById CreateUseCase() => new GetSubAreaById(_subAreaRepositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.SubArea MockValidSubArea() => new(Guid.NewGuid(), "ABC", "SubArea Name"); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsDetailedReadSubAreaOutput() + { + // Arrange + var useCase = CreateUseCase(); + var subAreaId = Guid.NewGuid(); + var subArea = MockValidSubArea(); + + _subAreaRepositoryMock.Setup(repo => repo.GetByIdAsync(subAreaId)).ReturnsAsync(subArea); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())) + .Returns(new DetailedReadSubAreaOutput()); + + // Act + var result = await useCase.ExecuteAsync(subAreaId); + + // Assert + Assert.NotNull(result); + _subAreaRepositoryMock.Verify(repo => repo.GetByIdAsync(subAreaId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_InvalidId_ReturnsNull() + { + // Arrange + var useCase = CreateUseCase(); + Guid subAreaId = Guid.NewGuid(); + _subAreaRepositoryMock.Setup(repo => repo.GetByIdAsync(subAreaId)).ReturnsAsync((Domain.Entities.SubArea)null); + + // Act + var result = await useCase.ExecuteAsync(subAreaId); + + // Assert + Assert.Null(result); + _subAreaRepositoryMock.Verify(repo => repo.GetByIdAsync(subAreaId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NullId_ReturnsNull() + { + // Arrange + var useCase = CreateUseCase(); + + // Act + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(null)); + + // Assert + _subAreaRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/SubArea/GetSubAreasByAreaTests.cs b/src/Application.Tests/UseCases/SubArea/GetSubAreasByAreaTests.cs new file mode 100644 index 00000000..7b859664 --- /dev/null +++ b/src/Application.Tests/UseCases/SubArea/GetSubAreasByAreaTests.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Application.Interfaces.UseCases.SubArea; +using Application.Ports.SubArea; +using Application.UseCases.SubArea; +using Application.Validation; +using AutoMapper; +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.SubArea +{ + public class GetSubAreasByAreaTests + { + private readonly Mock _subAreaRepositoryMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private IGetSubAreasByArea CreateUseCase() => new GetSubAreasByArea(_subAreaRepositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.SubArea MockValidSubArea() => new(Guid.NewGuid(), "ABC", "SubArea Name"); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsResumedReadSubAreaOutputs() + { + // Arrange + var useCase = CreateUseCase(); + Guid areaId = Guid.NewGuid(); + int skip = 0; + int take = 5; + var subAreas = new List { MockValidSubArea(), MockValidSubArea() }; + + _subAreaRepositoryMock.Setup(repo => repo.GetSubAreasByAreaAsync(areaId, skip, take)) + .ReturnsAsync(subAreas); + _mapperMock.Setup(mapper => mapper.Map>(It.IsAny>())) + .Returns(subAreas.Select(sa => new ResumedReadSubAreaOutput())); + + // Act + var result = await useCase.ExecuteAsync(areaId, skip, take); + + // Assert + Assert.NotNull(result); + Assert.Equal(2, result.Count()); // Check the expected count + _subAreaRepositoryMock.Verify(repo => repo.GetSubAreasByAreaAsync(areaId, skip, take), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Once); + } + + [Fact] + public void ExecuteAsync_InvalidSkipOrTake_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + Guid areaId = Guid.NewGuid(); + int skip = -1; // Invalid skip value + int take = 5; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(areaId, skip, take)); + _subAreaRepositoryMock.Verify(repo => repo.GetSubAreasByAreaAsync(areaId, skip, take), Times.Never); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Never); + } + + [Fact] + public void ExecuteAsync_NullAreaId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid areaId = Guid.NewGuid(); + int skip = 0; + int take = 5; + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(null, skip, take)); + _subAreaRepositoryMock.Verify(repo => repo.GetSubAreasByAreaAsync(areaId, skip, take), Times.Never); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Never); + } + } +} From dbdbc133512d989dd1b3078d43c7c763e502abb3 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sun, 29 Oct 2023 16:37:06 -0300 Subject: [PATCH 186/201] test: Add student documents usecases tests --- .../CreateStudentDocumentsTests.cs | 189 ++++++++++++++++++ .../DeleteStudentDocumentsTests.cs | 68 +++++++ .../GetStudentDocumentsByProjectIdTests.cs | 71 +++++++ .../GetStudentDocumentsByStudentIdTests.cs | 71 +++++++ .../UpdateStudentDocumentsTests.cs | 119 +++++++++++ .../CreateStudentDocuments.cs | 2 +- .../DeleteStudentDocuments.cs | 10 +- .../GetStudentDocumentsByProjectId.cs | 5 - .../GetStudentDocumentsByStudentId.cs | 5 - .../UpdateStudentDocuments.cs | 2 +- src/Domain/Entities/StudentDocuments.cs | 2 +- 11 files changed, 523 insertions(+), 21 deletions(-) create mode 100644 src/Application.Tests/UseCases/StudentDocuments/CreateStudentDocumentsTests.cs create mode 100644 src/Application.Tests/UseCases/StudentDocuments/DeleteStudentDocumentsTests.cs create mode 100644 src/Application.Tests/UseCases/StudentDocuments/GetStudentDocumentsByProjectIdTests.cs create mode 100644 src/Application.Tests/UseCases/StudentDocuments/GetStudentDocumentsByStudentIdTests.cs create mode 100644 src/Application.Tests/UseCases/StudentDocuments/UpdateStudentDocumentsTests.cs diff --git a/src/Application.Tests/UseCases/StudentDocuments/CreateStudentDocumentsTests.cs b/src/Application.Tests/UseCases/StudentDocuments/CreateStudentDocumentsTests.cs new file mode 100644 index 00000000..b7bf9d1f --- /dev/null +++ b/src/Application.Tests/UseCases/StudentDocuments/CreateStudentDocumentsTests.cs @@ -0,0 +1,189 @@ +using Application.Interfaces.UseCases.StudentDocuments; +using Application.Ports.StudentDocuments; +using Application.UseCases.StudentDocuments; +using Application.Validation; +using AutoMapper; +using Domain.Entities; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Microsoft.AspNetCore.Http; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.StudentDocuments +{ + public class CreateStudentDocumentsTests + { + private readonly Mock _studentDocumentRepositoryMock = new Mock(); + private readonly Mock _projectRepositoryMock = new Mock(); + private readonly Mock _storageFileServiceMock = new Mock(); + private readonly Mock _mapperMock = new Mock(); + + private ICreateStudentDocuments CreateUseCase() => new CreateStudentDocuments(_studentDocumentRepositoryMock.Object, _projectRepositoryMock.Object, + _storageFileServiceMock.Object, _mapperMock.Object); + private static Project MockValidProject() => new( + "Project Title", + "Keyword 1", + "Keyword 2", + "Keyword 3", + true, + "Objective", + "Methodology", + "Expected Results", + "Schedule", + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + EProjectStatus.Opened, + "Status Description", + "Appeal Observation", + DateTime.UtcNow, + DateTime.UtcNow, + DateTime.UtcNow, + "Cancellation Reason"); + private static Domain.Entities.StudentDocuments MockValidStudentDocuments() + { + return new Domain.Entities.StudentDocuments( + Guid.NewGuid(), + "123456", + "7890" + ); + } + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadStudentDocumentsOutput() + { + // Arrange + var useCase = CreateUseCase(); + var project = MockValidProject(); + project.Status = EProjectStatus.Accepted; + var input = new CreateStudentDocumentsInput + { + ProjectId = Guid.NewGuid(), + AgencyNumber = "123456", + AccountNumber = "7890", + IdentityDocument = CreateIFormFile(), + CPF = CreateIFormFile(), + Photo3x4 = CreateIFormFile(), + SchoolHistory = CreateIFormFile(), + ScholarCommitmentAgreement = CreateIFormFile(), + AccountOpeningProof = CreateIFormFile() + }; + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + _studentDocumentRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync((Domain.Entities.StudentDocuments)null); + _storageFileServiceMock.Setup(service => service.UploadFileAsync(It.IsAny(), null)).ReturnsAsync("file_url"); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())) + .Returns(new DetailedReadStudentDocumentsOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProjectId), Times.Once); + _studentDocumentRepositoryMock.Verify(repo => repo.GetByProjectIdAsync(input.ProjectId), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), null), Times.Exactly(6)); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public void ExecuteAsync_DocumentsExist_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateStudentDocumentsInput + { + ProjectId = Guid.NewGuid(), + IdentityDocument = CreateIFormFile(), + CPF = CreateIFormFile(), + Photo3x4 = CreateIFormFile(), + SchoolHistory = CreateIFormFile(), + ScholarCommitmentAgreement = CreateIFormFile(), + AccountOpeningProof = CreateIFormFile() + }; + + var existingDocuments = MockValidStudentDocuments(); + existingDocuments.ProjectId = input.ProjectId; + + _studentDocumentRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync(existingDocuments); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(input)); + _studentDocumentRepositoryMock.Verify(repo => repo.GetByProjectIdAsync(input.ProjectId), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProjectId), Times.Never); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), ""), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + + [Fact] + public void ExecuteAsync_ProjectNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new CreateStudentDocumentsInput + { + ProjectId = Guid.NewGuid(), + IdentityDocument = CreateIFormFile(), + CPF = CreateIFormFile(), + Photo3x4 = CreateIFormFile(), + SchoolHistory = CreateIFormFile(), + ScholarCommitmentAgreement = CreateIFormFile(), + AccountOpeningProof = CreateIFormFile() + }; + + _studentDocumentRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync((Domain.Entities.StudentDocuments)null); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync((Project)null); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(input)); + _studentDocumentRepositoryMock.Verify(repo => repo.GetByProjectIdAsync(input.ProjectId), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProjectId), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), ""), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_ProjectNotAccepted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var project = MockValidProject(); + project.Status = EProjectStatus.Pending; // Not Accepted + var input = new CreateStudentDocumentsInput + { + ProjectId = Guid.NewGuid(), + IdentityDocument = CreateIFormFile(), + CPF = CreateIFormFile(), + Photo3x4 = CreateIFormFile(), + SchoolHistory = CreateIFormFile(), + ScholarCommitmentAgreement = CreateIFormFile(), + AccountOpeningProof = CreateIFormFile() + }; + + _studentDocumentRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync((Domain.Entities.StudentDocuments)null); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + + // Act & Assert + Assert.ThrowsAsync(() => useCase.ExecuteAsync(input)); + _studentDocumentRepositoryMock.Verify(repo => repo.GetByProjectIdAsync(input.ProjectId), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProjectId), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), ""), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + private IFormFile CreateIFormFile() + { + // Create a mock IFormFile, you can adjust the implementation as needed. + var fileMock = new Mock(); + fileMock.Setup(file => file.FileName).Returns("file.txt"); + fileMock.Setup(file => file.Length).Returns(1024); + // Add other setup as needed. + return fileMock.Object; + } + } +} diff --git a/src/Application.Tests/UseCases/StudentDocuments/DeleteStudentDocumentsTests.cs b/src/Application.Tests/UseCases/StudentDocuments/DeleteStudentDocumentsTests.cs new file mode 100644 index 00000000..2e4a3388 --- /dev/null +++ b/src/Application.Tests/UseCases/StudentDocuments/DeleteStudentDocumentsTests.cs @@ -0,0 +1,68 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Ports.StudentDocuments; +using Application.Interfaces.UseCases.StudentDocuments; +using Application.Validation; +using Moq; +using Xunit; +using Application.UseCases.StudentDocuments; + +namespace Application.Tests.UseCases.StudentDocuments +{ + public class DeleteStudentDocumentsTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IDeleteStudentDocuments CreateUseCase() => new DeleteStudentDocuments(_repositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.StudentDocuments MockValidStudentDocuments() => new(Guid.NewGuid(), "123456", "7890"); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadStudentDocumentsOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var deletedStudentDocuments = MockValidStudentDocuments(); + + _repositoryMock.Setup(repo => repo.DeleteAsync(id)).ReturnsAsync(deletedStudentDocuments); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadStudentDocumentsOutput()); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.DeleteAsync(id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id)); + _repositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_RepositoryReturnsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + + _repositoryMock.Setup(repo => repo.DeleteAsync(id)).ReturnsAsync((Domain.Entities.StudentDocuments)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id)); + _repositoryMock.Verify(repo => repo.DeleteAsync(id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + } +} diff --git a/src/Application.Tests/UseCases/StudentDocuments/GetStudentDocumentsByProjectIdTests.cs b/src/Application.Tests/UseCases/StudentDocuments/GetStudentDocumentsByProjectIdTests.cs new file mode 100644 index 00000000..abe49ab2 --- /dev/null +++ b/src/Application.Tests/UseCases/StudentDocuments/GetStudentDocumentsByProjectIdTests.cs @@ -0,0 +1,71 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Ports.StudentDocuments; +using Application.Interfaces.UseCases.StudentDocuments; +using Application.Validation; +using Moq; +using Xunit; +using Application.UseCases.StudentDocuments; + +namespace Application.Tests.UseCases.StudentDocuments +{ + public class GetStudentDocumentsByProjectIdTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetStudentDocumentsByProjectId CreateUseCase() => new GetStudentDocumentsByProjectId(_repositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.StudentDocuments MockValidStudentDocuments() => new(Guid.NewGuid(), "123456", "7890"); + + [Fact] + public async Task ExecuteAsync_ValidProjectId_ReturnsResumedReadStudentDocumentsOutput() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + var studentDocuments = MockValidStudentDocuments(); + + _repositoryMock.Setup(repo => repo.GetByProjectIdAsync(projectId)).ReturnsAsync(studentDocuments); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new ResumedReadStudentDocumentsOutput()); + + // Act + var result = await useCase.ExecuteAsync(projectId); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByProjectIdAsync(projectId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public void ExecuteAsync_ProjectIdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? projectId = null; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId)); + _repositoryMock.Verify(repo => repo.GetByProjectIdAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_RepositoryReturnsNull_ReturnsNullOutput() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + + _repositoryMock.Setup(repo => repo.GetByProjectIdAsync(projectId)).ReturnsAsync((Domain.Entities.StudentDocuments)null); + + // Act + var result = useCase.ExecuteAsync(projectId).Result; + + // Assert + Assert.Null(result); + _repositoryMock.Verify(repo => repo.GetByProjectIdAsync(projectId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + } +} diff --git a/src/Application.Tests/UseCases/StudentDocuments/GetStudentDocumentsByStudentIdTests.cs b/src/Application.Tests/UseCases/StudentDocuments/GetStudentDocumentsByStudentIdTests.cs new file mode 100644 index 00000000..b62d8cb8 --- /dev/null +++ b/src/Application.Tests/UseCases/StudentDocuments/GetStudentDocumentsByStudentIdTests.cs @@ -0,0 +1,71 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Ports.StudentDocuments; +using Application.Interfaces.UseCases.StudentDocuments; +using Application.Validation; +using Moq; +using Xunit; +using Application.UseCases.StudentDocuments; + +namespace Application.Tests.UseCases.StudentDocuments +{ + public class GetStudentDocumentsByStudentIdTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetStudentDocumentsByStudentId CreateUseCase() => new GetStudentDocumentsByStudentId(_repositoryMock.Object, _mapperMock.Object); + private static Domain.Entities.StudentDocuments MockValidStudentDocuments() => new(Guid.NewGuid(), "123456", "7890"); + + [Fact] + public async Task ExecuteAsync_ValidStudentId_ReturnsResumedReadStudentDocumentsOutput() + { + // Arrange + var useCase = CreateUseCase(); + var studentId = Guid.NewGuid(); + var studentDocuments = MockValidStudentDocuments(); + + _repositoryMock.Setup(repo => repo.GetByStudentIdAsync(studentId)).ReturnsAsync(studentDocuments); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new ResumedReadStudentDocumentsOutput()); + + // Act + var result = await useCase.ExecuteAsync(studentId); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByStudentIdAsync(studentId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public void ExecuteAsync_StudentIdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? studentId = null; + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(studentId)); + _repositoryMock.Verify(repo => repo.GetByStudentIdAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_RepositoryReturnsNull_ReturnsNullOutput() + { + // Arrange + var useCase = CreateUseCase(); + var studentId = Guid.NewGuid(); + + _repositoryMock.Setup(repo => repo.GetByStudentIdAsync(studentId)).ReturnsAsync((Domain.Entities.StudentDocuments)null); + + // Act + var result = useCase.ExecuteAsync(studentId).Result; + + // Assert + Assert.Null(result); + _repositoryMock.Verify(repo => repo.GetByStudentIdAsync(studentId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + } +} diff --git a/src/Application.Tests/UseCases/StudentDocuments/UpdateStudentDocumentsTests.cs b/src/Application.Tests/UseCases/StudentDocuments/UpdateStudentDocumentsTests.cs new file mode 100644 index 00000000..33d7af86 --- /dev/null +++ b/src/Application.Tests/UseCases/StudentDocuments/UpdateStudentDocumentsTests.cs @@ -0,0 +1,119 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Application.Interfaces.UseCases.StudentDocuments; +using Application.Ports.StudentDocuments; +using Application.Validation; +using Microsoft.AspNetCore.Http; +using Moq; +using Xunit; +using Application.UseCases.StudentDocuments; +using Domain.Entities; +using Domain.Entities.Enums; + +namespace Application.Tests.UseCases.StudentDocuments +{ + public class UpdateStudentDocumentsTests + { + private readonly Mock _studentDocumentRepositoryMock = new(); + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _storageFileServiceMock = new(); + private readonly Mock _mapperMock = new(); + + private IUpdateStudentDocuments CreateUseCase() => + new UpdateStudentDocuments( + _studentDocumentRepositoryMock.Object, + _projectRepositoryMock.Object, + _storageFileServiceMock.Object, + _mapperMock.Object); + private static Domain.Entities.StudentDocuments MockValidStudentDocuments() => new(Guid.NewGuid(), "123456", "7890"); + private static Project MockValidProject() => new( + "Project Title", + "Keyword 1", + "Keyword 2", + "Keyword 3", + true, + "Objective", + "Methodology", + "Expected Results", + "Schedule", + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + EProjectStatus.Accepted, + "Status Description", + "Appeal Observation", + DateTime.UtcNow, + DateTime.UtcNow, + DateTime.UtcNow, + "Cancellation Reason"); + + [Fact] + public async Task ExecuteAsync_ValidIdAndInput_ReturnsDetailedReadStudentDocumentsOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateStudentDocumentsInput + { + AgencyNumber = "1234", + AccountNumber = "5678", + }; + var project = MockValidProject(); + var studentDocuments = MockValidStudentDocuments(); + studentDocuments.Project = project; + + _studentDocumentRepositoryMock.Setup(r => r.GetByIdAsync(id)).ReturnsAsync(studentDocuments); + _studentDocumentRepositoryMock.Setup(r => r.UpdateAsync(studentDocuments)).ReturnsAsync(studentDocuments); + _storageFileServiceMock.Setup(s => s.UploadFileAsync(It.IsAny(), It.IsAny())).ReturnsAsync("file_url"); + _projectRepositoryMock.Setup(r => r.GetByIdAsync(It.IsAny())).ReturnsAsync(project); + _mapperMock.Setup(m => m.Map(It.IsAny())).Returns(new DetailedReadStudentDocumentsOutput()); + + // Act + var result = await useCase.ExecuteAsync(id, input); + + // Assert + Assert.NotNull(result); + _studentDocumentRepositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.AtMostOnce); + _studentDocumentRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), It.IsAny()), Times.AtMost(7)); + } + + [Fact] + public void ExecuteAsync_IdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + var input = new UpdateStudentDocumentsInput(); + + // Act & Assert + var exception = Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _studentDocumentRepositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Never); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _studentDocumentRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), It.IsAny()), Times.Never); + } + + [Fact] + public void ExecuteAsync_StudentDocumentsNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateStudentDocumentsInput(); + + _studentDocumentRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync((Domain.Entities.StudentDocuments)null); + + // Act & Assert + Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _studentDocumentRepositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _studentDocumentRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application/UseCases/StudentDocuments/CreateStudentDocuments.cs b/src/Application/UseCases/StudentDocuments/CreateStudentDocuments.cs index 0577b9db..b1eda067 100644 --- a/src/Application/UseCases/StudentDocuments/CreateStudentDocuments.cs +++ b/src/Application/UseCases/StudentDocuments/CreateStudentDocuments.cs @@ -40,7 +40,7 @@ public async Task ExecuteAsync(CreateStudent { // Verifica se já há documentos para o projeto informado var documents = await _studentDocumentRepository.GetByProjectIdAsync(input.ProjectId!); - UseCaseException.BusinessRuleViolation(documents is null, + UseCaseException.BusinessRuleViolation(documents is not null, "Já existem documentos do aluno para o projeto indicado."); // Verifica se o projeto existe diff --git a/src/Application/UseCases/StudentDocuments/DeleteStudentDocuments.cs b/src/Application/UseCases/StudentDocuments/DeleteStudentDocuments.cs index 5553fd90..7be2f110 100644 --- a/src/Application/UseCases/StudentDocuments/DeleteStudentDocuments.cs +++ b/src/Application/UseCases/StudentDocuments/DeleteStudentDocuments.cs @@ -20,15 +20,9 @@ public DeleteStudentDocuments(IStudentDocumentsRepository repository, IMapper ma public async Task ExecuteAsync(Guid? id) { - // Verifica se o id foi informado - UseCaseException.NotInformedParam(id is null, nameof(id)); - - // Remove a entidade - Domain.Entities.StudentDocuments model = await _repository.DeleteAsync(id); - // TODO: Verificar se seria preciso remover os documentos do aluno caso fosse removido o registro de documentos do aluno - - // Retorna o tipo de programa removido + UseCaseException.NotInformedParam(id is null, nameof(id)); + var model = await _repository.DeleteAsync(id); return _mapper.Map(model); } } diff --git a/src/Application/UseCases/StudentDocuments/GetStudentDocumentsByProjectId.cs b/src/Application/UseCases/StudentDocuments/GetStudentDocumentsByProjectId.cs index 5298b280..67c368bb 100644 --- a/src/Application/UseCases/StudentDocuments/GetStudentDocumentsByProjectId.cs +++ b/src/Application/UseCases/StudentDocuments/GetStudentDocumentsByProjectId.cs @@ -22,13 +22,8 @@ public GetStudentDocumentsByProjectId( public async Task ExecuteAsync(Guid? projectId) { - // Verifica se o id foi informado UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); - - // Busca documentos do estudante pelo id do projeto Domain.Entities.StudentDocuments? entity = await _repository.GetByProjectIdAsync(projectId); - - // Retorna entidade mapeada return _mapper.Map(entity); } } diff --git a/src/Application/UseCases/StudentDocuments/GetStudentDocumentsByStudentId.cs b/src/Application/UseCases/StudentDocuments/GetStudentDocumentsByStudentId.cs index 002eea1c..7a2bbf8d 100644 --- a/src/Application/UseCases/StudentDocuments/GetStudentDocumentsByStudentId.cs +++ b/src/Application/UseCases/StudentDocuments/GetStudentDocumentsByStudentId.cs @@ -22,13 +22,8 @@ public GetStudentDocumentsByStudentId( public async Task ExecuteAsync(Guid? studentId) { - // Verifica se o id foi informado UseCaseException.NotInformedParam(studentId is null, nameof(studentId)); - - // Busca documentos do estudante pelo id do projeto Domain.Entities.StudentDocuments? entity = await _repository.GetByStudentIdAsync(studentId); - - // Retorna entidade mapeada return _mapper.Map(entity); } } diff --git a/src/Application/UseCases/StudentDocuments/UpdateStudentDocuments.cs b/src/Application/UseCases/StudentDocuments/UpdateStudentDocuments.cs index e20977ab..5120f7a6 100644 --- a/src/Application/UseCases/StudentDocuments/UpdateStudentDocuments.cs +++ b/src/Application/UseCases/StudentDocuments/UpdateStudentDocuments.cs @@ -36,7 +36,7 @@ public async Task ExecuteAsync(Guid? id, Upd // Verifica se já foram enviados documentos para o projeto informado Domain.Entities.StudentDocuments? studentDocuments = await _studentDocumentRepository.GetByIdAsync(id!); - UseCaseException.NotFoundEntityById(studentDocuments is not null, nameof(studentDocuments)); + UseCaseException.NotFoundEntityById(studentDocuments is null, nameof(studentDocuments)); // Verifica se o projeto se encontra em situação de submissão de documentos (Aceito ou Pendente do envio de documentação) UseCaseException.BusinessRuleViolation( diff --git a/src/Domain/Entities/StudentDocuments.cs b/src/Domain/Entities/StudentDocuments.cs index 9b741ff5..c43aa200 100644 --- a/src/Domain/Entities/StudentDocuments.cs +++ b/src/Domain/Entities/StudentDocuments.cs @@ -164,7 +164,7 @@ public string? AccountOpeningProof } #endregion BankData - public virtual Project? Project { get; } + public virtual Project? Project { get; set; } #endregion Properties ///

From 4ba3fc4cf1351d58ac320d53cfe21fe77c74b3ac Mon Sep 17 00:00:00 2001 From: eduardo Date: Sun, 29 Oct 2023 17:32:45 -0300 Subject: [PATCH 187/201] test: Add student usecases tests --- src/Application.Tests/Mocks/CampusMock.cs | 9 + src/Application.Tests/Mocks/CourseMock.cs | 9 + src/Application.Tests/Mocks/StudentMock.cs | 52 ++++ src/Application.Tests/Mocks/UserMock.cs | 10 + .../GetLastNoticeActivitiesTests.cs | 3 - .../UseCases/Student/CreateStudentTests.cs | 272 ++++++++++++++++++ .../UseCases/Student/DeleteStudentTests.cs | 133 +++++++++ .../UseCases/Student/GetStudentByIdTests.cs | 70 +++++ .../GetStudentByRegistrationCodeTests.cs | 69 +++++ .../UseCases/Student/GetStudentsTests.cs | 73 +++++ .../Student/RequestStudentRegisterTests.cs | 100 +++++++ .../UseCases/Student/UpdateStudentTests.cs | 119 ++++++++ src/Domain/Entities/Student.cs | 44 +++ 13 files changed, 960 insertions(+), 3 deletions(-) create mode 100644 src/Application.Tests/Mocks/CampusMock.cs create mode 100644 src/Application.Tests/Mocks/CourseMock.cs create mode 100644 src/Application.Tests/Mocks/StudentMock.cs create mode 100644 src/Application.Tests/Mocks/UserMock.cs create mode 100644 src/Application.Tests/UseCases/Student/CreateStudentTests.cs create mode 100644 src/Application.Tests/UseCases/Student/DeleteStudentTests.cs create mode 100644 src/Application.Tests/UseCases/Student/GetStudentByIdTests.cs create mode 100644 src/Application.Tests/UseCases/Student/GetStudentByRegistrationCodeTests.cs create mode 100644 src/Application.Tests/UseCases/Student/GetStudentsTests.cs create mode 100644 src/Application.Tests/UseCases/Student/RequestStudentRegisterTests.cs create mode 100644 src/Application.Tests/UseCases/Student/UpdateStudentTests.cs diff --git a/src/Application.Tests/Mocks/CampusMock.cs b/src/Application.Tests/Mocks/CampusMock.cs new file mode 100644 index 00000000..3cb91a56 --- /dev/null +++ b/src/Application.Tests/Mocks/CampusMock.cs @@ -0,0 +1,9 @@ +using Domain.Entities; + +namespace Application.Tests.Mocks +{ + public static class CampusMock + { + public static Campus MockValidCampus() => new("Campus Name"); + } +} \ No newline at end of file diff --git a/src/Application.Tests/Mocks/CourseMock.cs b/src/Application.Tests/Mocks/CourseMock.cs new file mode 100644 index 00000000..fbd22ec9 --- /dev/null +++ b/src/Application.Tests/Mocks/CourseMock.cs @@ -0,0 +1,9 @@ +using Domain.Entities; + +namespace Application.Tests.Mocks +{ + public static class CourseMock + { + public static Course MockValidCourse() => new("Course Name"); + } +} \ No newline at end of file diff --git a/src/Application.Tests/Mocks/StudentMock.cs b/src/Application.Tests/Mocks/StudentMock.cs new file mode 100644 index 00000000..e9611b86 --- /dev/null +++ b/src/Application.Tests/Mocks/StudentMock.cs @@ -0,0 +1,52 @@ +using Domain.Entities.Enums; + +namespace Application.Tests.Mocks +{ + public static class StudentMock + { + public static Domain.Entities.Student MockValidStudent() => new( + birthDate: new DateTime(2000, 1, 1), + rg: 123456789, + issuingAgency: "Agency", + dispatchDate: new DateTime(2020, 1, 1), + gender: EGender.M, + race: ERace.White, + homeAddress: "Street 1", + city: "City", + uf: "UF", + cep: 12345678, + phoneDDD: 11, + phone: 12345678, + cellPhoneDDD: 22, + cellPhone: 987654321, + campusId: Guid.NewGuid(), + courseId: Guid.NewGuid(), + startYear: "2022", + studentAssistanceProgramId: Guid.NewGuid(), + registrationCode: "GCOM1234567" + ); + + public static Domain.Entities.Student MockValidStudentWithId() => new( + id: Guid.NewGuid(), + birthDate: new DateTime(2000, 1, 1), + rg: 123456789, + issuingAgency: "Agency", + dispatchDate: new DateTime(2020, 1, 1), + gender: EGender.M, + race: ERace.White, + homeAddress: "Street 1", + city: "City", + uf: "UF", + cep: 12345678, + phoneDDD: 11, + phone: 12345678, + cellPhoneDDD: 22, + cellPhone: 987654321, + campusId: Guid.NewGuid(), + courseId: Guid.NewGuid(), + startYear: "2022", + studentAssistanceProgramId: Guid.NewGuid(), + registrationCode: "GCOM1234567" + ); + } +} \ No newline at end of file diff --git a/src/Application.Tests/Mocks/UserMock.cs b/src/Application.Tests/Mocks/UserMock.cs new file mode 100644 index 00000000..069f5ec9 --- /dev/null +++ b/src/Application.Tests/Mocks/UserMock.cs @@ -0,0 +1,10 @@ +using Domain.Entities.Enums; + +namespace Application.Tests.Mocks +{ + public static class UserMock + { + public static Domain.Entities.User MockValidUser() => new(Guid.NewGuid(), "John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); + + } +} \ No newline at end of file diff --git a/src/Application.Tests/UseCases/ActivityType/GetLastNoticeActivitiesTests.cs b/src/Application.Tests/UseCases/ActivityType/GetLastNoticeActivitiesTests.cs index 29ce99ff..759252c4 100644 --- a/src/Application.Tests/UseCases/ActivityType/GetLastNoticeActivitiesTests.cs +++ b/src/Application.Tests/UseCases/ActivityType/GetLastNoticeActivitiesTests.cs @@ -4,9 +4,6 @@ using Application.Interfaces.UseCases.ActivityType; using Application.UseCases.ActivityType; using Moq; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; using Xunit; namespace Application.Tests.UseCases.ActivityType diff --git a/src/Application.Tests/UseCases/Student/CreateStudentTests.cs b/src/Application.Tests/UseCases/Student/CreateStudentTests.cs new file mode 100644 index 00000000..4cfcd769 --- /dev/null +++ b/src/Application.Tests/UseCases/Student/CreateStudentTests.cs @@ -0,0 +1,272 @@ +using Application.Interfaces.UseCases.Student; +using Application.Ports.Student; +using Application.Tests.Mocks; +using Application.Validation; +using AutoMapper; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Student +{ + public class CreateStudentTests + { + private readonly Mock _studentRepositoryMock = new(); + private readonly Mock _userRepositoryMock = new(); + private readonly Mock _campusRepositoryMock = new(); + private readonly Mock _courseRepositoryMock = new(); + private readonly Mock _emailServiceMock = new(); + private readonly Mock _hashServiceMock = new(); + private readonly Mock _mapperMock = new(); + + private ICreateStudent CreateUseCase() => new Application.UseCases.Student.CreateStudent( + _studentRepositoryMock.Object, + _userRepositoryMock.Object, + _campusRepositoryMock.Object, + _courseRepositoryMock.Object, + _emailServiceMock.Object, + _hashServiceMock.Object, + _mapperMock.Object + ); + public static CreateStudentInput GetValidInput() + { + return new CreateStudentInput + { + // Required Properties + Name = "John Doe", + CPF = "76500130065", + Email = "john.doe@example.com", + Password = "SecurePassword", + RegistrationCode = "ABC123", + BirthDate = new DateTime(1990, 1, 1), + RG = 1234567, + IssuingAgency = "Agency", + DispatchDate = new DateTime(2000, 1, 1), + Gender = 0, // Assuming 1 represents a gender value + Race = 0, // Assuming 2 represents a race value + HomeAddress = "123 Main St", + City = "City", + UF = "CA", + CEP = 123456, + CampusId = Guid.NewGuid(), + CourseId = Guid.NewGuid(), + StartYear = "2023", + AssistanceTypeId = Guid.NewGuid(), + + // Optional Properties + PhoneDDD = 123, + Phone = 987654321, + CellPhoneDDD = 456, + CellPhone = 654321987 + }; + } + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadStudentOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var user = UserMock.MockValidUser(); + var student = StudentMock.MockValidStudent(); + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(input.Email)).ReturnsAsync((Domain.Entities.User)null); + _userRepositoryMock.Setup(repo => repo.GetUserByCPFAsync(input.CPF)).ReturnsAsync((Domain.Entities.User)null); + _courseRepositoryMock.Setup(repo => repo.GetByIdAsync(input.CourseId)).ReturnsAsync(CourseMock.MockValidCourse()); + _campusRepositoryMock.Setup(repo => repo.GetByIdAsync(input.CampusId)).ReturnsAsync(CampusMock.MockValidCampus()); + _hashServiceMock.Setup(service => service.HashPassword(input.Password)).Returns("hashedPassword"); + _userRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(user); + _studentRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(student); + _emailServiceMock.Setup(service => service.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny())); + _mapperMock.Setup(mapper => mapper.Map(student)).Returns(new DetailedReadStudentOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetUserByCPFAsync(It.IsAny()), Times.Once); + _courseRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _campusRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _hashServiceMock.Verify(service => service.HashPassword(It.IsAny()), Times.Once); + _userRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Once); + _studentRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Once); + _emailServiceMock.Verify(service => service.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(student), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_UserWithEmailExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var user = UserMock.MockValidUser(); + var student = StudentMock.MockValidStudent(); + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(input.Email)).ReturnsAsync(user); + _userRepositoryMock.Setup(repo => repo.GetUserByCPFAsync(input.CPF)).ReturnsAsync((Domain.Entities.User)null); + _courseRepositoryMock.Setup(repo => repo.GetByIdAsync(input.CourseId)).ReturnsAsync(CourseMock.MockValidCourse()); + _campusRepositoryMock.Setup(repo => repo.GetByIdAsync(input.CampusId)).ReturnsAsync(CampusMock.MockValidCampus()); + _hashServiceMock.Setup(service => service.HashPassword(input.Password)).Returns("hashedPassword"); + _userRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(user); + _studentRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(student); + _emailServiceMock.Setup(service => service.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny())); + _mapperMock.Setup(mapper => mapper.Map(student)).Returns(new DetailedReadStudentOutput()); + + // Act + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + + // Assert + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetUserByCPFAsync(It.IsAny()), Times.Never); + _courseRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _campusRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _hashServiceMock.Verify(service => service.HashPassword(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _studentRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _emailServiceMock.Verify(service => service.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(student), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_UserWithCPFExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var user = UserMock.MockValidUser(); + var student = StudentMock.MockValidStudent(); + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(input.Email)).ReturnsAsync((Domain.Entities.User)null); + _userRepositoryMock.Setup(repo => repo.GetUserByCPFAsync(input.CPF)).ReturnsAsync(user); + _courseRepositoryMock.Setup(repo => repo.GetByIdAsync(input.CourseId)).ReturnsAsync(CourseMock.MockValidCourse()); + _campusRepositoryMock.Setup(repo => repo.GetByIdAsync(input.CampusId)).ReturnsAsync(CampusMock.MockValidCampus()); + _hashServiceMock.Setup(service => service.HashPassword(input.Password)).Returns("hashedPassword"); + _userRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(user); + _studentRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(student); + _emailServiceMock.Setup(service => service.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny())); + _mapperMock.Setup(mapper => mapper.Map(student)).Returns(new DetailedReadStudentOutput()); + + // Act + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + + // Assert + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetUserByCPFAsync(It.IsAny()), Times.Once); + _courseRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _campusRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _hashServiceMock.Verify(service => service.HashPassword(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _studentRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _emailServiceMock.Verify(service => service.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(student), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_CourseNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var user = UserMock.MockValidUser(); + var student = StudentMock.MockValidStudent(); + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(input.Email)).ReturnsAsync((Domain.Entities.User)null); + _userRepositoryMock.Setup(repo => repo.GetUserByCPFAsync(input.CPF)).ReturnsAsync((Domain.Entities.User)null); + _courseRepositoryMock.Setup(repo => repo.GetByIdAsync(input.CourseId)).ReturnsAsync((Domain.Entities.Course)null); + _campusRepositoryMock.Setup(repo => repo.GetByIdAsync(input.CampusId)).ReturnsAsync(CampusMock.MockValidCampus()); + _hashServiceMock.Setup(service => service.HashPassword(input.Password)).Returns("hashedPassword"); + _userRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(user); + _studentRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(student); + _emailServiceMock.Setup(service => service.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny())); + _mapperMock.Setup(mapper => mapper.Map(student)).Returns(new DetailedReadStudentOutput()); + + // Act + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + + // Assert + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetUserByCPFAsync(It.IsAny()), Times.Once); + _courseRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _campusRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + _hashServiceMock.Verify(service => service.HashPassword(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _studentRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _emailServiceMock.Verify(service => service.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(student), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_CampusNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var user = UserMock.MockValidUser(); + var student = StudentMock.MockValidStudent(); + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(input.Email)).ReturnsAsync((Domain.Entities.User)null); + _userRepositoryMock.Setup(repo => repo.GetUserByCPFAsync(input.CPF)).ReturnsAsync((Domain.Entities.User)null); + _courseRepositoryMock.Setup(repo => repo.GetByIdAsync(input.CourseId)).ReturnsAsync(CourseMock.MockValidCourse()); + _campusRepositoryMock.Setup(repo => repo.GetByIdAsync(input.CampusId)).ReturnsAsync((Domain.Entities.Campus)null); + _hashServiceMock.Setup(service => service.HashPassword(input.Password)).Returns("hashedPassword"); + _userRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(user); + _studentRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(student); + _emailServiceMock.Setup(service => service.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny())); + _mapperMock.Setup(mapper => mapper.Map(student)).Returns(new DetailedReadStudentOutput()); + + // Act + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + + // Assert + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetUserByCPFAsync(It.IsAny()), Times.Once); + _courseRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _campusRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _hashServiceMock.Verify(service => service.HashPassword(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _studentRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _emailServiceMock.Verify(service => service.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(student), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_NullPassword_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var user = UserMock.MockValidUser(); + var student = StudentMock.MockValidStudent(); + input.Password = null; + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(input.Email)).ReturnsAsync((Domain.Entities.User)null); + _userRepositoryMock.Setup(repo => repo.GetUserByCPFAsync(input.CPF)).ReturnsAsync((Domain.Entities.User)null); + _courseRepositoryMock.Setup(repo => repo.GetByIdAsync(input.CourseId)).ReturnsAsync(CourseMock.MockValidCourse()); + _campusRepositoryMock.Setup(repo => repo.GetByIdAsync(input.CampusId)).ReturnsAsync(CampusMock.MockValidCampus()); + _hashServiceMock.Setup(service => service.HashPassword(input.Password)).Returns("hashedPassword"); + _userRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(user); + _studentRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(student); + _emailServiceMock.Setup(service => service.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny())); + _mapperMock.Setup(mapper => mapper.Map(student)).Returns(new DetailedReadStudentOutput()); + + // Act + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + + // Assert + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetUserByCPFAsync(It.IsAny()), Times.Once); + _courseRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _campusRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _hashServiceMock.Verify(service => service.HashPassword(It.IsAny()), Times.Never); + _userRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _studentRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _emailServiceMock.Verify(service => service.SendConfirmationEmailAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(student), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Student/DeleteStudentTests.cs b/src/Application.Tests/UseCases/Student/DeleteStudentTests.cs new file mode 100644 index 00000000..1bb1a3ec --- /dev/null +++ b/src/Application.Tests/UseCases/Student/DeleteStudentTests.cs @@ -0,0 +1,133 @@ +using Application.Interfaces.UseCases.Student; +using Application.Ports.Student; +using Application.Tests.Mocks; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Student +{ + public class DeleteStudentTests + { + private readonly Mock _studentRepositoryMock = new(); + private readonly Mock _userRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IDeleteStudent CreateUseCase() => new Application.UseCases.Student.DeleteStudent( + _studentRepositoryMock.Object, + _userRepositoryMock.Object, + _mapperMock.Object + ); + + [Fact] + public async Task ExecuteAsync_ValidId_DeletesStudentAndUser() + { + // Arrange + var useCase = CreateUseCase(); + var student = StudentMock.MockValidStudentWithId(); + var user = UserMock.MockValidUser(); + var studentId = student.Id; + var userId = student.UserId; + + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(studentId)).ReturnsAsync(student); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(userId)).ReturnsAsync(user); + _studentRepositoryMock.Setup(repo => repo.DeleteAsync(studentId)).ReturnsAsync(student); + _userRepositoryMock.Setup(repo => repo.DeleteAsync(userId)).ReturnsAsync(user); + _mapperMock.Setup(mapper => mapper.Map(student)).Returns(new DetailedReadStudentOutput()); + + // Act + var result = await useCase.ExecuteAsync(studentId); + + // Assert + Assert.NotNull(result); + _studentRepositoryMock.Verify(repo => repo.GetByIdAsync(studentId), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(userId), Times.Once); + _studentRepositoryMock.Verify(repo => repo.DeleteAsync(studentId), Times.Once); + _userRepositoryMock.Verify(repo => repo.DeleteAsync(userId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(student), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(null)); + } + + [Fact] + public async Task ExecuteAsync_InvalidStudentId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var studentId = Guid.NewGuid(); + + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(studentId)).ReturnsAsync((Domain.Entities.Student)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(studentId)); + _userRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_InvalidUserId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var student = StudentMock.MockValidStudentWithId(); + var user = UserMock.MockValidUser(); + var studentId = student.Id; + var userId = student.UserId; + + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(studentId)).ReturnsAsync(student); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(userId)).ReturnsAsync((Domain.Entities.User)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(studentId)); + _studentRepositoryMock.Verify(repo => repo.DeleteAsync(studentId), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_StudentNotDeleted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var student = StudentMock.MockValidStudentWithId(); + var user = UserMock.MockValidUser(); + var studentId = student.Id; + var userId = student.UserId; + + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(studentId)).ReturnsAsync(student); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(userId)).ReturnsAsync(UserMock.MockValidUser()); + _studentRepositoryMock.Setup(repo => repo.DeleteAsync(studentId)).ReturnsAsync((Domain.Entities.Student)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(studentId)); + _userRepositoryMock.Verify(repo => repo.DeleteAsync(userId), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_UserNotDeleted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var student = StudentMock.MockValidStudentWithId(); + var user = UserMock.MockValidUser(); + var studentId = student.Id; + var userId = student.UserId; + + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(studentId)).ReturnsAsync(student); + _userRepositoryMock.Setup(repo => repo.GetByIdAsync(userId)).ReturnsAsync(UserMock.MockValidUser()); + _studentRepositoryMock.Setup(repo => repo.DeleteAsync(studentId)).ReturnsAsync(student); + _userRepositoryMock.Setup(repo => repo.DeleteAsync(userId)).ReturnsAsync((Domain.Entities.User)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(studentId)); + _mapperMock.Verify(mapper => mapper.Map(student), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Student/GetStudentByIdTests.cs b/src/Application.Tests/UseCases/Student/GetStudentByIdTests.cs new file mode 100644 index 00000000..5cdaaf48 --- /dev/null +++ b/src/Application.Tests/UseCases/Student/GetStudentByIdTests.cs @@ -0,0 +1,70 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; +using Application.UseCases.Student; +using Application.Ports.Student; +using Application.Validation; +using Application.Tests.Mocks; +using Application.Interfaces.UseCases.Student; + +namespace Application.Tests.UseCases.Student +{ + public class GetStudentByIdTests + { + private readonly Mock _studentRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetStudentById CreateUseCase() => new GetStudentById( + _studentRepositoryMock.Object, + _mapperMock.Object + ); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsDetailedReadStudentOutput() + { + // Arrange + var useCase = CreateUseCase(); + var studentId = Guid.NewGuid(); + var student = StudentMock.MockValidStudent(); + + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(studentId)).ReturnsAsync(student); + _mapperMock.Setup(mapper => mapper.Map(student)).Returns(new DetailedReadStudentOutput()); + + // Act + var result = await useCase.ExecuteAsync(studentId); + + // Assert + Assert.NotNull(result); + _studentRepositoryMock.Verify(repo => repo.GetByIdAsync(studentId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(student), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(null)); + } + + [Fact] + public async Task ExecuteAsync_StudentNotFound_ReturnsNull() + { + // Arrange + var useCase = CreateUseCase(); + var studentId = Guid.NewGuid(); + + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(studentId)).ReturnsAsync((Domain.Entities.Student)null); + + // Act + var result = await useCase.ExecuteAsync(studentId); + + // Assert + Assert.Null(result); + _studentRepositoryMock.Verify(repo => repo.GetByIdAsync(studentId), Times.Once); + } + } +} diff --git a/src/Application.Tests/UseCases/Student/GetStudentByRegistrationCodeTests.cs b/src/Application.Tests/UseCases/Student/GetStudentByRegistrationCodeTests.cs new file mode 100644 index 00000000..52117884 --- /dev/null +++ b/src/Application.Tests/UseCases/Student/GetStudentByRegistrationCodeTests.cs @@ -0,0 +1,69 @@ +using Application.Interfaces.UseCases.Student; +using Application.Ports.Student; +using Application.Tests.Mocks; +using Application.UseCases.Student; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Student +{ + public class GetStudentByRegistrationCodeTests + { + private readonly Mock _studentRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetStudentByRegistrationCode CreateUseCase() => + new GetStudentByRegistrationCode(_studentRepositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_WithValidRegistrationCode_ReturnsDetailedReadStudentOutput() + { + // Arrange + var useCase = CreateUseCase(); + var registrationCode = "ABC123"; + var student = StudentMock.MockValidStudent(); + var expectedOutput = new DetailedReadStudentOutput(); + + _studentRepositoryMock.Setup(repo => repo.GetByRegistrationCodeAsync(registrationCode)).ReturnsAsync(student); + _mapperMock.Setup(mapper => mapper.Map(student)).Returns(expectedOutput); + + // Act + var result = await useCase.ExecuteAsync(registrationCode); + + // Assert + Assert.NotNull(result); + _studentRepositoryMock.Verify(repo => repo.GetByRegistrationCodeAsync(registrationCode), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(student), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_WithEmptyRegistrationCode_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + string registrationCode = string.Empty; + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(registrationCode)); + _studentRepositoryMock.Verify(repo => repo.GetByRegistrationCodeAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_WithInvalidRegistrationCode_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + string registrationCode = "InvalidCode"; + _studentRepositoryMock.Setup(repo => repo.GetByRegistrationCodeAsync(registrationCode)).ReturnsAsync((Domain.Entities.Student)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(registrationCode)); + _studentRepositoryMock.Verify(repo => repo.GetByRegistrationCodeAsync(registrationCode), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Student/GetStudentsTests.cs b/src/Application.Tests/UseCases/Student/GetStudentsTests.cs new file mode 100644 index 00000000..7edaf815 --- /dev/null +++ b/src/Application.Tests/UseCases/Student/GetStudentsTests.cs @@ -0,0 +1,73 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.Student; +using Application.Ports.Student; +using Moq; +using Xunit; +using Application.Tests.Mocks; + +namespace Application.Tests.UseCases.Student +{ + public class GetStudentsTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetStudents CreateUseCase() => new Application.UseCases.Student.GetStudents( + _repositoryMock.Object, + _mapperMock.Object + ); + + [Fact] + public async Task ExecuteAsync_ValidParameters_ReturnsQueryable() + { + // Arrange + var useCase = CreateUseCase(); + int skip = 0; + int take = 10; + var students = new List { StudentMock.MockValidStudent() }; + var mappedStudents = new List { new() }; + + _repositoryMock.Setup(repo => repo.GetAllAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(students); + _mapperMock.Setup(mapper => mapper.Map>(It.IsAny>())) + .Returns(mappedStudents.AsEnumerable()); + + // Act + var result = await useCase.ExecuteAsync(skip, take); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetAllAsync(skip, take), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(students), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_InvalidSkipValue_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + int skip = -1; + int take = 10; + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(skip, take)); + + // No need to verify any repository or mapper calls in this case. + } + + [Fact] + public async Task ExecuteAsync_InvalidTakeValue_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + int skip = 0; + int take = 0; + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(skip, take)); + + // No need to verify any repository or mapper calls in this case. + } + } +} diff --git a/src/Application.Tests/UseCases/Student/RequestStudentRegisterTests.cs b/src/Application.Tests/UseCases/Student/RequestStudentRegisterTests.cs new file mode 100644 index 00000000..b951915b --- /dev/null +++ b/src/Application.Tests/UseCases/Student/RequestStudentRegisterTests.cs @@ -0,0 +1,100 @@ +using Application.Interfaces.UseCases.Student; +using Application.Tests.Mocks; +using Application.UseCases.Student; +using Application.Validation; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Student +{ + public class RequestStudentRegisterTests + { + private readonly Mock _emailServiceMock = new(); + private readonly Mock _userRepositoryMock = new(); + + private IRequestStudentRegister CreateUseCase() => new RequestStudentRegister( + _emailServiceMock.Object, + _userRepositoryMock.Object + ); + + [Fact] + public async Task ExecuteAsync_ValidEmail_ReturnsSuccessMessage() + { + // Arrange + var useCase = CreateUseCase(); + var email = "john.doe@aluno.cefet-rj.br"; + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(email)).ReturnsAsync((Domain.Entities.User)null); + + // Act + var result = await useCase.ExecuteAsync(email); + + // Assert + Assert.Equal("Solicitação de registro enviada com sucesso.", result); + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(email), Times.Once); + _emailServiceMock.Verify(service => service.SendRequestStudentRegisterEmailAsync(email), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_EmptyEmail_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + string email = null; + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email)); + + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Never); + _emailServiceMock.Verify(service => service.SendRequestStudentRegisterEmailAsync(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_InvalidEmail_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var email = "invalid.email"; + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email)); + + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Never); + _emailServiceMock.Verify(service => service.SendRequestStudentRegisterEmailAsync(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_EmailAlreadyExists_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var email = "john.doe@aluno.cefet-rj.br"; + var user = UserMock.MockValidUser(); + + _userRepositoryMock.Setup(repo => repo.GetUserByEmailAsync(email)).ReturnsAsync(user); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email)); + + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(email), Times.Once); + _emailServiceMock.Verify(service => service.SendRequestStudentRegisterEmailAsync(It.IsAny()), Times.Never); + } + + [Theory] + [InlineData("jane.doe@domain.com")] + [InlineData("12345678912@invalid-domain.com")] + public async Task ExecuteAsync_InvalidStudentEmail_ThrowsUseCaseException(string email) + { + // Arrange + var useCase = CreateUseCase(); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(email)); + + _userRepositoryMock.Verify(repo => repo.GetUserByEmailAsync(It.IsAny()), Times.Never); + _emailServiceMock.Verify(service => service.SendRequestStudentRegisterEmailAsync(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Student/UpdateStudentTests.cs b/src/Application.Tests/UseCases/Student/UpdateStudentTests.cs new file mode 100644 index 00000000..f40c1d9c --- /dev/null +++ b/src/Application.Tests/UseCases/Student/UpdateStudentTests.cs @@ -0,0 +1,119 @@ +using AutoMapper; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.Student; +using Application.Ports.Student; +using Application.UseCases.Student; +using Application.Validation; +using Moq; +using System; +using System.Threading.Tasks; +using Xunit; +using Application.Tests.Mocks; + +namespace Application.Tests.UseCases.Student +{ + public class UpdateStudentTests + { + private readonly Mock _studentRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IUpdateStudent CreateUseCase() => new UpdateStudent(_studentRepositoryMock.Object, _mapperMock.Object); + public static UpdateStudentInput GetValidInput() + { + return new UpdateStudentInput + { + // Required Properties + RegistrationCode = "ABC123", + BirthDate = new DateTime(1990, 1, 1), + RG = 1234567, + IssuingAgency = "Agency", + DispatchDate = new DateTime(2000, 1, 1), + Gender = 0, // Assuming 1 represents a gender value + Race = 0, // Assuming 2 represents a race value + HomeAddress = "123 Main St", + City = "City", + UF = "CA", + CEP = 123456, + CampusId = Guid.NewGuid(), + CourseId = Guid.NewGuid(), + StartYear = "2023", + AssistanceTypeId = Guid.NewGuid(), + + // Optional Properties + PhoneDDD = 123, + Phone = 987654321, + CellPhoneDDD = 456, + CellPhone = 654321987 + }; + } + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadStudentOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = GetValidInput(); + var student = StudentMock.MockValidStudent(); + + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(student); + _studentRepositoryMock.Setup(repo => repo.UpdateAsync(student)).ReturnsAsync(student); + _mapperMock.Setup(mapper => mapper.Map(student)).Returns(new DetailedReadStudentOutput()); + + // Act + var result = await useCase.ExecuteAsync(id, input); + + // Assert + Assert.NotNull(result); + Assert.IsType(result); + _studentRepositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _studentRepositoryMock.Verify(repo => repo.UpdateAsync(student), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(student), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + var input = new UpdateStudentInput(); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + } + + [Fact] + public async Task ExecuteAsync_StudentNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateStudentInput(); + + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync((Domain.Entities.Student)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _studentRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_DeletedStudent_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateStudentInput(); + var student = StudentMock.MockValidStudent(); + student.DeactivateEntity(); + + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(student); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _studentRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Domain/Entities/Student.cs b/src/Domain/Entities/Student.cs index 9209aa32..880f284f 100644 --- a/src/Domain/Entities/Student.cs +++ b/src/Domain/Entities/Student.cs @@ -385,6 +385,50 @@ public Student( RegistrationCode = registrationCode; } + public Student( + Guid id, + DateTime birthDate, + long rg, + string? issuingAgency, + DateTime dispatchDate, + EGender? gender, + ERace? race, + string? homeAddress, + string? city, + string? uf, + long cep, + int? phoneDDD, + long? phone, + int? cellPhoneDDD, + long? cellPhone, + Guid? campusId, + Guid? courseId, + string? startYear, + Guid? studentAssistanceProgramId, + string? registrationCode) + { + Id = id; + BirthDate = birthDate; + RG = rg; + IssuingAgency = issuingAgency; + DispatchDate = dispatchDate; + Gender = gender; + Race = race; + HomeAddress = homeAddress; + City = city; + UF = uf; + CEP = cep; + PhoneDDD = phoneDDD; + Phone = phone; + CellPhoneDDD = cellPhoneDDD; + CellPhone = cellPhone; + CampusId = campusId; + CourseId = courseId; + StartYear = startYear; + AssistanceTypeId = studentAssistanceProgramId; + RegistrationCode = registrationCode; + } + /// /// Constructor to dbcontext EF instancing. /// From 2b54d9207466656f53e04354c905eb6001a53930 Mon Sep 17 00:00:00 2001 From: eduardo Date: Sun, 29 Oct 2023 17:44:50 -0300 Subject: [PATCH 188/201] refactor: Remove unnecessary usings --- src/Application/Ports/Course/CreateCourseInput.cs | 4 +--- .../Ports/ProjectFinalReport/CreateProjectFinalReportInput.cs | 1 - .../EntitiesConfiguration/MainAreaConfiguration.cs | 3 +-- .../Persistence/Migrations/20230907134628_Initialize.cs | 3 +-- src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs | 1 - src/Infrastructure/Services/Email/EmailService.cs | 1 - 6 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/Application/Ports/Course/CreateCourseInput.cs b/src/Application/Ports/Course/CreateCourseInput.cs index 7515809f..8b8907a9 100644 --- a/src/Application/Ports/Course/CreateCourseInput.cs +++ b/src/Application/Ports/Course/CreateCourseInput.cs @@ -1,6 +1,4 @@ -using Application.Ports.Course; - -namespace Application.Ports.Course +namespace Application.Ports.Course { public class CreateCourseInput : BaseCourseContract { diff --git a/src/Application/Ports/ProjectFinalReport/CreateProjectFinalReportInput.cs b/src/Application/Ports/ProjectFinalReport/CreateProjectFinalReportInput.cs index ab249190..2edd8449 100644 --- a/src/Application/Ports/ProjectFinalReport/CreateProjectFinalReportInput.cs +++ b/src/Application/Ports/ProjectFinalReport/CreateProjectFinalReportInput.cs @@ -1,5 +1,4 @@ using System.ComponentModel.DataAnnotations; -using Application.Ports.ProjectFinalReport; using Microsoft.AspNetCore.Http; namespace Application.Ports.ProjectFinalReport diff --git a/src/Infrastructure/Persistence/EntitiesConfiguration/MainAreaConfiguration.cs b/src/Infrastructure/Persistence/EntitiesConfiguration/MainAreaConfiguration.cs index d0e86b2f..49ea127f 100644 --- a/src/Infrastructure/Persistence/EntitiesConfiguration/MainAreaConfiguration.cs +++ b/src/Infrastructure/Persistence/EntitiesConfiguration/MainAreaConfiguration.cs @@ -1,5 +1,4 @@ -using System; -using Domain.Entities; +using Domain.Entities; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; diff --git a/src/Infrastructure/Persistence/Migrations/20230907134628_Initialize.cs b/src/Infrastructure/Persistence/Migrations/20230907134628_Initialize.cs index 7d653390..647af457 100644 --- a/src/Infrastructure/Persistence/Migrations/20230907134628_Initialize.cs +++ b/src/Infrastructure/Persistence/Migrations/20230907134628_Initialize.cs @@ -1,5 +1,4 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations; #nullable disable diff --git a/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs b/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs index 275f1716..9a92da0d 100644 --- a/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs +++ b/src/Infrastructure/Persistence/Seeds/ActivitiesSeeder.cs @@ -1,4 +1,3 @@ -using Domain.Entities; using Microsoft.EntityFrameworkCore.Migrations; namespace Persistence.Seeds diff --git a/src/Infrastructure/Services/Email/EmailService.cs b/src/Infrastructure/Services/Email/EmailService.cs index 29b2858e..cac1bd1c 100644 --- a/src/Infrastructure/Services/Email/EmailService.cs +++ b/src/Infrastructure/Services/Email/EmailService.cs @@ -1,7 +1,6 @@ using System.Net; using System.Net.Mail; using Domain.Interfaces.Services; -using Microsoft.Extensions.Configuration; namespace Services.Email { From 50f53c025749cd25a49717104a1031b2069fbccc Mon Sep 17 00:00:00 2001 From: eduardo Date: Sun, 29 Oct 2023 17:47:05 -0300 Subject: [PATCH 189/201] refactor: Remove all unnecessary usings --- .../GetAssistanceTypeByIdTests.cs | 3 - .../UpdateAssistanceTypeTests.cs | 2 +- .../UseCases/Auth/ConfirmEmailTests.cs | 3 +- .../UseCases/Auth/ForgotPasswordTests.cs | 5 +- .../UseCases/Auth/LoginTests.cs | 12 ++-- .../UseCases/Auth/ResetPasswordTests.cs | 5 +- .../UseCases/Course/DeleteCourseTests.cs | 2 - .../UseCases/Course/GetCoursesTests.cs | 12 ++-- .../UseCases/Notice/CreateNoticeTests.cs | 4 +- .../Notice/ReportDeadlineNotificationTests.cs | 55 ++----------------- .../Professor/CreateProfessorTests.cs | 1 - .../Professor/GetProfessorByIdTests.cs | 4 +- .../UseCases/Professor/GetProfessorsTests.cs | 9 +-- .../ProgramType/DeleteProgramTypeTests.cs | 7 +-- .../ProgramType/GetProgramTypeByIdTests.cs | 4 +- .../ProgramType/GetProgramTypesTests.cs | 4 +- .../UseCases/Student/CreateStudentTests.cs | 1 - .../UseCases/Student/UpdateStudentTests.cs | 3 - .../CreateStudentDocumentsTests.cs | 47 +++------------- .../UpdateStudentDocumentsTests.cs | 27 +-------- .../UseCases/SubArea/DeleteSubAreaTests.cs | 4 +- .../UseCases/SubArea/GetSubAreaByIdTests.cs | 2 +- .../SubArea/GetSubAreasByAreaTests.cs | 9 +-- .../UseCases/User/ActivateUserTests.cs | 5 +- .../UseCases/User/DeactivateUserTests.cs | 7 +-- .../UseCases/User/GetActiveUsersTests.cs | 4 +- .../UseCases/User/GetInactiveUsersTests.cs | 4 +- .../UseCases/User/GetUserByIdTests.cs | 4 +- .../UseCases/User/MakeAdminTests.cs | 7 +-- .../UseCases/User/MakeCoordinatorTests.cs | 5 +- .../UseCases/User/UpdateUserTests.cs | 7 +-- src/Domain.Tests/Entities/AreaUnitTests.cs | 1 - .../Entities/AssistanceTypeUnitTests.cs | 1 - .../Entities/ProfessorUnitTests.cs | 1 - .../Entities/ProjectActivityUnitTests.cs | 1 - .../Entities/ProjectPartialReportUnitTests.cs | 1 - src/Domain.Tests/Entities/SubAreaUnitTests.cs | 1 - src/Domain.Tests/Entities/UserUnitTests.cs | 4 +- 38 files changed, 69 insertions(+), 209 deletions(-) diff --git a/src/Application.Tests/UseCases/AssistanceType/GetAssistanceTypeByIdTests.cs b/src/Application.Tests/UseCases/AssistanceType/GetAssistanceTypeByIdTests.cs index 8d96a633..3a794f5d 100644 --- a/src/Application.Tests/UseCases/AssistanceType/GetAssistanceTypeByIdTests.cs +++ b/src/Application.Tests/UseCases/AssistanceType/GetAssistanceTypeByIdTests.cs @@ -3,11 +3,8 @@ using Application.UseCases.AssistanceType; using Application.Validation; using AutoMapper; -using Domain.Entities; using Domain.Interfaces.Repositories; using Moq; -using System; -using System.Threading.Tasks; using Xunit; namespace Application.Tests.UseCases.AssistanceType diff --git a/src/Application.Tests/UseCases/AssistanceType/UpdateAssistanceTypeTests.cs b/src/Application.Tests/UseCases/AssistanceType/UpdateAssistanceTypeTests.cs index 960fa78b..e84755e1 100644 --- a/src/Application.Tests/UseCases/AssistanceType/UpdateAssistanceTypeTests.cs +++ b/src/Application.Tests/UseCases/AssistanceType/UpdateAssistanceTypeTests.cs @@ -20,7 +20,7 @@ private IUpdateAssistanceType CreateUseCase() } private Domain.Entities.AssistanceType MockValidAssistanceType() => new("AssistanceTypeName1", "AssistanceTypeDescription"); - private UpdateAssistanceTypeInput MockValidAssistanceTypeInput() => new UpdateAssistanceTypeInput + private UpdateAssistanceTypeInput MockValidAssistanceTypeInput() => new() { Name = "AssistanceTypeName2", Description = "AssistanceTypeDescription" diff --git a/src/Application.Tests/UseCases/Auth/ConfirmEmailTests.cs b/src/Application.Tests/UseCases/Auth/ConfirmEmailTests.cs index 3e3ba984..8da642c4 100644 --- a/src/Application.Tests/UseCases/Auth/ConfirmEmailTests.cs +++ b/src/Application.Tests/UseCases/Auth/ConfirmEmailTests.cs @@ -1,7 +1,6 @@ using Application.Interfaces.UseCases.Auth; using Application.UseCases.Auth; using Application.Validation; -using Domain.Entities; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Moq; @@ -11,7 +10,7 @@ namespace Application.Tests.UseCases.Auth { public class ConfirmEmailTests { - private readonly Mock _userRepositoryMock = new Mock(); + private readonly Mock _userRepositoryMock = new(); private IConfirmEmail CreateUseCase() => new ConfirmEmail(_userRepositoryMock.Object); diff --git a/src/Application.Tests/UseCases/Auth/ForgotPasswordTests.cs b/src/Application.Tests/UseCases/Auth/ForgotPasswordTests.cs index c8341d0f..9d265885 100644 --- a/src/Application.Tests/UseCases/Auth/ForgotPasswordTests.cs +++ b/src/Application.Tests/UseCases/Auth/ForgotPasswordTests.cs @@ -1,7 +1,6 @@ using Application.Interfaces.UseCases.Auth; using Application.UseCases.Auth; using Application.Validation; -using Domain.Entities; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; @@ -12,8 +11,8 @@ namespace Application.Tests.UseCases.Auth { public class ForgotPasswordTests { - private readonly Mock _userRepositoryMock = new Mock(); - private readonly Mock _emailServiceMock = new Mock(); + private readonly Mock _userRepositoryMock = new(); + private readonly Mock _emailServiceMock = new(); private IForgotPassword CreateUseCase() => new ForgotPassword(_userRepositoryMock.Object, _emailServiceMock.Object); diff --git a/src/Application.Tests/UseCases/Auth/LoginTests.cs b/src/Application.Tests/UseCases/Auth/LoginTests.cs index 1f49234e..52eaf671 100644 --- a/src/Application.Tests/UseCases/Auth/LoginTests.cs +++ b/src/Application.Tests/UseCases/Auth/LoginTests.cs @@ -2,23 +2,21 @@ using Application.Ports.Auth; using Application.UseCases.Auth; using Application.Validation; -using Domain.Entities; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; using Moq; -using System.Threading.Tasks; using Xunit; namespace Application.Tests.UseCases.Auth { public class LoginTests { - private readonly Mock _tokenServiceMock = new Mock(); - private readonly Mock _userRepositoryMock = new Mock(); - private readonly Mock _professorRepositoryMock = new Mock(); - private readonly Mock _studentRepositoryMock = new Mock(); - private readonly Mock _hashServiceMock = new Mock(); + private readonly Mock _tokenServiceMock = new(); + private readonly Mock _userRepositoryMock = new(); + private readonly Mock _professorRepositoryMock = new(); + private readonly Mock _studentRepositoryMock = new(); + private readonly Mock _hashServiceMock = new(); private ILogin CreateUseCase() => new Login(_tokenServiceMock.Object, _userRepositoryMock.Object, _professorRepositoryMock.Object, _studentRepositoryMock.Object, _hashServiceMock.Object); private static Domain.Entities.User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); diff --git a/src/Application.Tests/UseCases/Auth/ResetPasswordTests.cs b/src/Application.Tests/UseCases/Auth/ResetPasswordTests.cs index 4f0a7af4..8a8fd521 100644 --- a/src/Application.Tests/UseCases/Auth/ResetPasswordTests.cs +++ b/src/Application.Tests/UseCases/Auth/ResetPasswordTests.cs @@ -2,7 +2,6 @@ using Application.Ports.Auth; using Application.UseCases.Auth; using Application.Validation; -using Domain.Entities; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; @@ -13,8 +12,8 @@ namespace Application.Tests.UseCases.Auth { public class ResetPasswordTests { - private readonly Mock _userRepositoryMock = new Mock(); - private readonly Mock _hashServiceMock = new Mock(); + private readonly Mock _userRepositoryMock = new(); + private readonly Mock _hashServiceMock = new(); private IResetPassword CreateUseCase() => new ResetPassword(_userRepositoryMock.Object, _hashServiceMock.Object); private static Domain.Entities.User MockValidUser() => new("John Doe", "john.doe@example.com", "strongpassword", "92114660087", ERole.ADMIN); diff --git a/src/Application.Tests/UseCases/Course/DeleteCourseTests.cs b/src/Application.Tests/UseCases/Course/DeleteCourseTests.cs index 38f3dd3b..3097dd12 100644 --- a/src/Application.Tests/UseCases/Course/DeleteCourseTests.cs +++ b/src/Application.Tests/UseCases/Course/DeleteCourseTests.cs @@ -4,8 +4,6 @@ using Application.Interfaces.UseCases.Course; using Application.Validation; using Moq; -using System; -using System.Threading.Tasks; using Xunit; using Application.UseCases.Course; diff --git a/src/Application.Tests/UseCases/Course/GetCoursesTests.cs b/src/Application.Tests/UseCases/Course/GetCoursesTests.cs index 3bc8be75..a6c539dc 100644 --- a/src/Application.Tests/UseCases/Course/GetCoursesTests.cs +++ b/src/Application.Tests/UseCases/Course/GetCoursesTests.cs @@ -24,17 +24,17 @@ public async Task ExecuteAsync_ValidInput_ReturnsQueryableResumedReadCourseOutpu var take = 10; var expectedCourses = new List { - new Domain.Entities.Course("Course 1"), - new Domain.Entities.Course("Course 2"), - new Domain.Entities.Course("Course 3") + new("Course 1"), + new("Course 2"), + new("Course 3") }; _repositoryMock.Setup(repo => repo.GetAllAsync(skip, take)).ReturnsAsync(expectedCourses); _mapperMock.Setup(mapper => mapper.Map>(expectedCourses)).Returns( new List { - new ResumedReadCourseOutput(), - new ResumedReadCourseOutput(), - new ResumedReadCourseOutput() + new(), + new(), + new() }); // Act diff --git a/src/Application.Tests/UseCases/Notice/CreateNoticeTests.cs b/src/Application.Tests/UseCases/Notice/CreateNoticeTests.cs index 3b2dfcb4..410baa04 100644 --- a/src/Application.Tests/UseCases/Notice/CreateNoticeTests.cs +++ b/src/Application.Tests/UseCases/Notice/CreateNoticeTests.cs @@ -34,7 +34,7 @@ public class CreateNoticeTests _mapperMock.Object, _loggerMock.Object); - private CreateNoticeInput MockValidNoticeInput() => new CreateNoticeInput + private CreateNoticeInput MockValidNoticeInput() => new() { RegistrationStartDate = DateTime.UtcNow, RegistrationEndDate = DateTime.UtcNow.AddDays(7), @@ -100,7 +100,7 @@ public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadNoticeOutput() var input = MockValidNoticeInput(); var professors = new List() { - new Domain.Entities.Professor("1234567", 12345) + new("1234567", 12345) }; _repositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(notice); diff --git a/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs b/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs index 7145d3e4..d783a3c8 100644 --- a/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs +++ b/src/Application.Tests/UseCases/Notice/ReportDeadlineNotificationTests.cs @@ -4,7 +4,7 @@ using Moq; using Xunit; using Application.UseCases.Notice; -using Domain.Entities; +using Application.Tests.Mocks; namespace Application.Tests.UseCases.Notice { @@ -14,51 +14,6 @@ public class ReportDeadlineNotificationTests private readonly Mock _emailServiceMock = new(); private IReportDeadlineNotification CreateUseCase() => new ReportDeadlineNotification(_projectRepositoryMock.Object, _emailServiceMock.Object); - private static Project MockValidProject() - { - return new( - "Project Title", - "Keyword 1", - "Keyword 2", - "Keyword 3", - true, - "Objective", - "Methodology", - "Expected Results", - "Schedule", - Guid.NewGuid(), - Guid.NewGuid(), - Guid.NewGuid(), - Guid.NewGuid(), - Guid.NewGuid(), - Domain.Entities.Enums.EProjectStatus.Opened, - "Status Description", - "Appeal Observation", - DateTime.UtcNow, - DateTime.UtcNow, - DateTime.UtcNow, - "Cancellation Reason") - { - Professor = new Domain.Entities.Professor("1234567", 1234567) - { - User = new Domain.Entities.User("Name", "professor@email.com", "Password", "58411338029", Domain.Entities.Enums.ERole.ADMIN) - }, - Notice = new( - registrationStartDate: DateTime.UtcNow, - registrationEndDate: DateTime.UtcNow.AddDays(7), - evaluationStartDate: DateTime.UtcNow.AddDays(8), - evaluationEndDate: DateTime.UtcNow.AddDays(14), - appealStartDate: DateTime.UtcNow.AddDays(15), - appealFinalDate: DateTime.UtcNow.AddDays(21), - sendingDocsStartDate: DateTime.UtcNow.AddDays(22), - sendingDocsEndDate: DateTime.UtcNow.AddDays(28), - partialReportDeadline: DateTime.UtcNow.AddDays(29), - finalReportDeadline: DateTime.UtcNow.AddDays(35), - description: "Edital de teste", - suspensionYears: 1 - ) - }; - } [Fact] public async Task ExecuteAsync_ProjectsWithCloseReportDueDate_ReturnsSuccessMessage() @@ -68,10 +23,10 @@ public async Task ExecuteAsync_ProjectsWithCloseReportDueDate_ReturnsSuccessMess var nextWeek = DateTime.UtcNow.AddDays(7).Date; var nextMonth = DateTime.UtcNow.AddMonths(1).Date; - var projects = new List + var projects = new List { - MockValidProject(), - MockValidProject() + ProjectMock.MockValidProjectProfessorAndNotice(), + ProjectMock.MockValidProjectProfessorAndNotice() }; _projectRepositoryMock.Setup(repo => repo.GetProjectsWithCloseReportDueDateAsync()).ReturnsAsync(projects); @@ -105,7 +60,7 @@ public async Task ExecuteAsync_NoProjects_ReturnsNoProjectsMessage() { // Arrange var useCase = CreateUseCase(); - var projects = new List(); + var projects = new List(); _projectRepositoryMock.Setup(repo => repo.GetProjectsWithCloseReportDueDateAsync()).ReturnsAsync(projects); diff --git a/src/Application.Tests/UseCases/Professor/CreateProfessorTests.cs b/src/Application.Tests/UseCases/Professor/CreateProfessorTests.cs index 80d527ed..a9e4d853 100644 --- a/src/Application.Tests/UseCases/Professor/CreateProfessorTests.cs +++ b/src/Application.Tests/UseCases/Professor/CreateProfessorTests.cs @@ -3,7 +3,6 @@ using Application.UseCases.Professor; using Application.Validation; using AutoMapper; -using Domain.Entities; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; diff --git a/src/Application.Tests/UseCases/Professor/GetProfessorByIdTests.cs b/src/Application.Tests/UseCases/Professor/GetProfessorByIdTests.cs index fc7c368e..ca8cb67a 100644 --- a/src/Application.Tests/UseCases/Professor/GetProfessorByIdTests.cs +++ b/src/Application.Tests/UseCases/Professor/GetProfessorByIdTests.cs @@ -11,8 +11,8 @@ namespace Application.Tests.UseCases.Professor { public class GetProfessorByIdTests { - private readonly Mock _repositoryMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); private IGetProfessorById CreateUseCase() => new GetProfessorById(_repositoryMock.Object, _mapperMock.Object); diff --git a/src/Application.Tests/UseCases/Professor/GetProfessorsTests.cs b/src/Application.Tests/UseCases/Professor/GetProfessorsTests.cs index 3b5b411f..48578bd7 100644 --- a/src/Application.Tests/UseCases/Professor/GetProfessorsTests.cs +++ b/src/Application.Tests/UseCases/Professor/GetProfessorsTests.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using AutoMapper; -using Domain.Entities; using Domain.Interfaces.Repositories; using Application.UseCases.Professor; using Application.Ports.Professor; @@ -15,8 +10,8 @@ namespace Application.Tests.UseCases.Professor { public class GetProfessorsTests { - private readonly Mock _repositoryMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); private static Domain.Entities.Professor MockValidProfessor() => new("1234567", 12345); private IGetProfessors CreateUseCase() => new GetProfessors(_repositoryMock.Object, _mapperMock.Object); diff --git a/src/Application.Tests/UseCases/ProgramType/DeleteProgramTypeTests.cs b/src/Application.Tests/UseCases/ProgramType/DeleteProgramTypeTests.cs index 697ae817..a9f8363e 100644 --- a/src/Application.Tests/UseCases/ProgramType/DeleteProgramTypeTests.cs +++ b/src/Application.Tests/UseCases/ProgramType/DeleteProgramTypeTests.cs @@ -1,10 +1,7 @@ -using System; -using System.Threading.Tasks; using AutoMapper; using Application.UseCases.ProgramType; using Application.Ports.ProgramType; using Application.Validation; -using Domain.Entities; using Domain.Interfaces.Repositories; using Moq; using Xunit; @@ -14,8 +11,8 @@ namespace Application.Tests.UseCases.ProgramType { public class DeleteProgramTypeTests { - private readonly Mock _repositoryMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); private IDeleteProgramType CreateUseCase() => new DeleteProgramType(_repositoryMock.Object, _mapperMock.Object); diff --git a/src/Application.Tests/UseCases/ProgramType/GetProgramTypeByIdTests.cs b/src/Application.Tests/UseCases/ProgramType/GetProgramTypeByIdTests.cs index 7dde7a60..4201fdf3 100644 --- a/src/Application.Tests/UseCases/ProgramType/GetProgramTypeByIdTests.cs +++ b/src/Application.Tests/UseCases/ProgramType/GetProgramTypeByIdTests.cs @@ -11,8 +11,8 @@ namespace Application.Tests.UseCases.ProgramType { public class GetProgramTypeByIdTests { - private readonly Mock _repositoryMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); private IGetProgramTypeById CreateUseCase() => new GetProgramTypeById(_repositoryMock.Object, _mapperMock.Object); diff --git a/src/Application.Tests/UseCases/ProgramType/GetProgramTypesTests.cs b/src/Application.Tests/UseCases/ProgramType/GetProgramTypesTests.cs index eea460a8..4bfbdcb3 100644 --- a/src/Application.Tests/UseCases/ProgramType/GetProgramTypesTests.cs +++ b/src/Application.Tests/UseCases/ProgramType/GetProgramTypesTests.cs @@ -10,8 +10,8 @@ namespace Application.Tests.UseCases.ProgramType { public class GetProgramTypesTests { - private readonly Mock _repositoryMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); private IGetProgramTypes CreateUseCase() => new GetProgramTypes(_repositoryMock.Object, _mapperMock.Object); private static Domain.Entities.ProgramType MockValidProgramType() => new("Program Name", "Program Description"); diff --git a/src/Application.Tests/UseCases/Student/CreateStudentTests.cs b/src/Application.Tests/UseCases/Student/CreateStudentTests.cs index 4cfcd769..f000ce0f 100644 --- a/src/Application.Tests/UseCases/Student/CreateStudentTests.cs +++ b/src/Application.Tests/UseCases/Student/CreateStudentTests.cs @@ -3,7 +3,6 @@ using Application.Tests.Mocks; using Application.Validation; using AutoMapper; -using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; using Moq; diff --git a/src/Application.Tests/UseCases/Student/UpdateStudentTests.cs b/src/Application.Tests/UseCases/Student/UpdateStudentTests.cs index f40c1d9c..fdb834c6 100644 --- a/src/Application.Tests/UseCases/Student/UpdateStudentTests.cs +++ b/src/Application.Tests/UseCases/Student/UpdateStudentTests.cs @@ -1,13 +1,10 @@ using AutoMapper; -using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Application.Interfaces.UseCases.Student; using Application.Ports.Student; using Application.UseCases.Student; using Application.Validation; using Moq; -using System; -using System.Threading.Tasks; using Xunit; using Application.Tests.Mocks; diff --git a/src/Application.Tests/UseCases/StudentDocuments/CreateStudentDocumentsTests.cs b/src/Application.Tests/UseCases/StudentDocuments/CreateStudentDocumentsTests.cs index b7bf9d1f..0d04858a 100644 --- a/src/Application.Tests/UseCases/StudentDocuments/CreateStudentDocumentsTests.cs +++ b/src/Application.Tests/UseCases/StudentDocuments/CreateStudentDocumentsTests.cs @@ -1,9 +1,9 @@ using Application.Interfaces.UseCases.StudentDocuments; using Application.Ports.StudentDocuments; +using Application.Tests.Mocks; using Application.UseCases.StudentDocuments; using Application.Validation; using AutoMapper; -using Domain.Entities; using Domain.Entities.Enums; using Domain.Interfaces.Repositories; using Domain.Interfaces.Services; @@ -15,50 +15,21 @@ namespace Application.Tests.UseCases.StudentDocuments { public class CreateStudentDocumentsTests { - private readonly Mock _studentDocumentRepositoryMock = new Mock(); - private readonly Mock _projectRepositoryMock = new Mock(); - private readonly Mock _storageFileServiceMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _studentDocumentRepositoryMock = new(); + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _storageFileServiceMock = new(); + private readonly Mock _mapperMock = new(); private ICreateStudentDocuments CreateUseCase() => new CreateStudentDocuments(_studentDocumentRepositoryMock.Object, _projectRepositoryMock.Object, _storageFileServiceMock.Object, _mapperMock.Object); - private static Project MockValidProject() => new( - "Project Title", - "Keyword 1", - "Keyword 2", - "Keyword 3", - true, - "Objective", - "Methodology", - "Expected Results", - "Schedule", - Guid.NewGuid(), - Guid.NewGuid(), - Guid.NewGuid(), - Guid.NewGuid(), - Guid.NewGuid(), - EProjectStatus.Opened, - "Status Description", - "Appeal Observation", - DateTime.UtcNow, - DateTime.UtcNow, - DateTime.UtcNow, - "Cancellation Reason"); - private static Domain.Entities.StudentDocuments MockValidStudentDocuments() - { - return new Domain.Entities.StudentDocuments( - Guid.NewGuid(), - "123456", - "7890" - ); - } + private static Domain.Entities.StudentDocuments MockValidStudentDocuments() => new(Guid.NewGuid(), "123456", "7890"); [Fact] public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadStudentDocumentsOutput() { // Arrange var useCase = CreateUseCase(); - var project = MockValidProject(); + var project = ProjectMock.MockValidProject(); project.Status = EProjectStatus.Accepted; var input = new CreateStudentDocumentsInput { @@ -137,7 +108,7 @@ public void ExecuteAsync_ProjectNotFound_ThrowsUseCaseException() }; _studentDocumentRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync((Domain.Entities.StudentDocuments)null); - _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync((Project)null); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync((Domain.Entities.Project)null); // Act & Assert Assert.ThrowsAsync(() => useCase.ExecuteAsync(input)); @@ -152,7 +123,7 @@ public void ExecuteAsync_ProjectNotAccepted_ThrowsUseCaseException() { // Arrange var useCase = CreateUseCase(); - var project = MockValidProject(); + var project = ProjectMock.MockValidProject(); project.Status = EProjectStatus.Pending; // Not Accepted var input = new CreateStudentDocumentsInput { diff --git a/src/Application.Tests/UseCases/StudentDocuments/UpdateStudentDocumentsTests.cs b/src/Application.Tests/UseCases/StudentDocuments/UpdateStudentDocumentsTests.cs index 33d7af86..0b4fe9bb 100644 --- a/src/Application.Tests/UseCases/StudentDocuments/UpdateStudentDocumentsTests.cs +++ b/src/Application.Tests/UseCases/StudentDocuments/UpdateStudentDocumentsTests.cs @@ -8,8 +8,7 @@ using Moq; using Xunit; using Application.UseCases.StudentDocuments; -using Domain.Entities; -using Domain.Entities.Enums; +using Application.Tests.Mocks; namespace Application.Tests.UseCases.StudentDocuments { @@ -27,28 +26,6 @@ private IUpdateStudentDocuments CreateUseCase() => _storageFileServiceMock.Object, _mapperMock.Object); private static Domain.Entities.StudentDocuments MockValidStudentDocuments() => new(Guid.NewGuid(), "123456", "7890"); - private static Project MockValidProject() => new( - "Project Title", - "Keyword 1", - "Keyword 2", - "Keyword 3", - true, - "Objective", - "Methodology", - "Expected Results", - "Schedule", - Guid.NewGuid(), - Guid.NewGuid(), - Guid.NewGuid(), - Guid.NewGuid(), - Guid.NewGuid(), - EProjectStatus.Accepted, - "Status Description", - "Appeal Observation", - DateTime.UtcNow, - DateTime.UtcNow, - DateTime.UtcNow, - "Cancellation Reason"); [Fact] public async Task ExecuteAsync_ValidIdAndInput_ReturnsDetailedReadStudentDocumentsOutput() @@ -61,7 +38,7 @@ public async Task ExecuteAsync_ValidIdAndInput_ReturnsDetailedReadStudentDocumen AgencyNumber = "1234", AccountNumber = "5678", }; - var project = MockValidProject(); + var project = ProjectMock.MockValidProject(); var studentDocuments = MockValidStudentDocuments(); studentDocuments.Project = project; diff --git a/src/Application.Tests/UseCases/SubArea/DeleteSubAreaTests.cs b/src/Application.Tests/UseCases/SubArea/DeleteSubAreaTests.cs index 1b916ded..6c01a409 100644 --- a/src/Application.Tests/UseCases/SubArea/DeleteSubAreaTests.cs +++ b/src/Application.Tests/UseCases/SubArea/DeleteSubAreaTests.cs @@ -11,8 +11,8 @@ namespace Application.Tests.UseCases.SubArea { public class DeleteSubAreaTests { - private readonly Mock _subAreaRepositoryMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _subAreaRepositoryMock = new(); + private readonly Mock _mapperMock = new(); private IDeleteSubArea CreateUseCase() => new DeleteSubArea(_subAreaRepositoryMock.Object, _mapperMock.Object); private static Domain.Entities.SubArea MockValidSubArea() => new(Guid.NewGuid(), "ABC", "SubArea Name"); diff --git a/src/Application.Tests/UseCases/SubArea/GetSubAreaByIdTests.cs b/src/Application.Tests/UseCases/SubArea/GetSubAreaByIdTests.cs index 3cc27cf2..b2576429 100644 --- a/src/Application.Tests/UseCases/SubArea/GetSubAreaByIdTests.cs +++ b/src/Application.Tests/UseCases/SubArea/GetSubAreaByIdTests.cs @@ -11,7 +11,7 @@ namespace Application.Tests.UseCases.SubArea { public class GetSubAreaByIdTests { - private readonly Mock _subAreaRepositoryMock = new Mock(); + private readonly Mock _subAreaRepositoryMock = new(); private readonly Mock _mapperMock = new(); private IGetSubAreaById CreateUseCase() => new GetSubAreaById(_subAreaRepositoryMock.Object, _mapperMock.Object); diff --git a/src/Application.Tests/UseCases/SubArea/GetSubAreasByAreaTests.cs b/src/Application.Tests/UseCases/SubArea/GetSubAreasByAreaTests.cs index 7b859664..5dc435a1 100644 --- a/src/Application.Tests/UseCases/SubArea/GetSubAreasByAreaTests.cs +++ b/src/Application.Tests/UseCases/SubArea/GetSubAreasByAreaTests.cs @@ -1,13 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Application.Interfaces.UseCases.SubArea; using Application.Ports.SubArea; using Application.UseCases.SubArea; using Application.Validation; using AutoMapper; -using Domain.Entities; using Domain.Interfaces.Repositories; using Moq; using Xunit; @@ -16,8 +11,8 @@ namespace Application.Tests.UseCases.SubArea { public class GetSubAreasByAreaTests { - private readonly Mock _subAreaRepositoryMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _subAreaRepositoryMock = new(); + private readonly Mock _mapperMock = new(); private IGetSubAreasByArea CreateUseCase() => new GetSubAreasByArea(_subAreaRepositoryMock.Object, _mapperMock.Object); private static Domain.Entities.SubArea MockValidSubArea() => new(Guid.NewGuid(), "ABC", "SubArea Name"); diff --git a/src/Application.Tests/UseCases/User/ActivateUserTests.cs b/src/Application.Tests/UseCases/User/ActivateUserTests.cs index 0ea6de17..b04cfe52 100644 --- a/src/Application.Tests/UseCases/User/ActivateUserTests.cs +++ b/src/Application.Tests/UseCases/User/ActivateUserTests.cs @@ -6,14 +6,13 @@ using Moq; using Xunit; using Application.Interfaces.UseCases.User; -using Domain.Entities.Enums; namespace Application.Tests.UseCases.User { public class ActivateUserTests { - private readonly Mock _repositoryMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); private IActivateUser CreateUseCase() => new ActivateUser(_repositoryMock.Object, _mapperMock.Object); private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); diff --git a/src/Application.Tests/UseCases/User/DeactivateUserTests.cs b/src/Application.Tests/UseCases/User/DeactivateUserTests.cs index 764fb4ee..b728abdb 100644 --- a/src/Application.Tests/UseCases/User/DeactivateUserTests.cs +++ b/src/Application.Tests/UseCases/User/DeactivateUserTests.cs @@ -1,10 +1,7 @@ -using System; -using System.Threading.Tasks; using AutoMapper; using Application.UseCases.User; using Application.Ports.User; using Application.Validation; -using Domain.Entities; using Domain.Interfaces.Repositories; using Moq; using Xunit; @@ -14,8 +11,8 @@ namespace Application.Tests.UseCases.User { public class DeactivateUserTests { - private readonly Mock _repositoryMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); private IDeactivateUser CreateUseCase() => new DeactivateUser(_repositoryMock.Object, _mapperMock.Object); private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); diff --git a/src/Application.Tests/UseCases/User/GetActiveUsersTests.cs b/src/Application.Tests/UseCases/User/GetActiveUsersTests.cs index 43a4bf0d..59912f68 100644 --- a/src/Application.Tests/UseCases/User/GetActiveUsersTests.cs +++ b/src/Application.Tests/UseCases/User/GetActiveUsersTests.cs @@ -10,8 +10,8 @@ namespace Application.Tests.UseCases.User { public class GetActiveUsersTests { - private readonly Mock _repositoryMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); private IGetActiveUsers CreateUseCase() => new GetActiveUsers(_repositoryMock.Object, _mapperMock.Object); private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); diff --git a/src/Application.Tests/UseCases/User/GetInactiveUsersTests.cs b/src/Application.Tests/UseCases/User/GetInactiveUsersTests.cs index 192cabeb..d4736393 100644 --- a/src/Application.Tests/UseCases/User/GetInactiveUsersTests.cs +++ b/src/Application.Tests/UseCases/User/GetInactiveUsersTests.cs @@ -10,8 +10,8 @@ namespace Application.Tests.UseCases.User { public class GetInactiveUsersTests { - private readonly Mock _repositoryMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); private IGetInactiveUsers CreateUseCase() => new GetInactiveUsers(_repositoryMock.Object, _mapperMock.Object); private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); diff --git a/src/Application.Tests/UseCases/User/GetUserByIdTests.cs b/src/Application.Tests/UseCases/User/GetUserByIdTests.cs index ce5093d7..8c2a209b 100644 --- a/src/Application.Tests/UseCases/User/GetUserByIdTests.cs +++ b/src/Application.Tests/UseCases/User/GetUserByIdTests.cs @@ -11,8 +11,8 @@ namespace Application.Tests.UseCases.User { public class GetUserByIdTests { - private readonly Mock _repositoryMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); private IGetUserById CreateUseCase() => new GetUserById(_repositoryMock.Object, _mapperMock.Object); private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); diff --git a/src/Application.Tests/UseCases/User/MakeAdminTests.cs b/src/Application.Tests/UseCases/User/MakeAdminTests.cs index 1c6c141f..71331b60 100644 --- a/src/Application.Tests/UseCases/User/MakeAdminTests.cs +++ b/src/Application.Tests/UseCases/User/MakeAdminTests.cs @@ -1,4 +1,3 @@ -using System.Security.Claims; using Application.Interfaces.UseCases.User; using Application.UseCases.User; using Application.Validation; @@ -12,9 +11,9 @@ namespace Application.Tests.UseCases.User { public class MakeAdminTests { - private readonly Mock _userRepositoryMock = new Mock(); - private readonly Mock _professorRepositoryMock = new Mock(); - private readonly Mock _tokenAuthenticationServiceMock = new Mock(); + private readonly Mock _userRepositoryMock = new(); + private readonly Mock _professorRepositoryMock = new(); + private readonly Mock _tokenAuthenticationServiceMock = new(); private IMakeAdmin CreateUseCase() => new MakeAdmin(_userRepositoryMock.Object, _professorRepositoryMock.Object, _tokenAuthenticationServiceMock.Object); diff --git a/src/Application.Tests/UseCases/User/MakeCoordinatorTests.cs b/src/Application.Tests/UseCases/User/MakeCoordinatorTests.cs index d05252a1..677390f5 100644 --- a/src/Application.Tests/UseCases/User/MakeCoordinatorTests.cs +++ b/src/Application.Tests/UseCases/User/MakeCoordinatorTests.cs @@ -1,4 +1,3 @@ -using System.Security.Claims; using Application.Interfaces.UseCases.User; using Application.UseCases.User; using Application.Validation; @@ -12,8 +11,8 @@ namespace Application.Tests.UseCases.User { public class MakeCoordinatorTests { - private readonly Mock _userRepositoryMock = new Mock(); - private readonly Mock _tokenAuthenticationServiceMock = new Mock(); + private readonly Mock _userRepositoryMock = new(); + private readonly Mock _tokenAuthenticationServiceMock = new(); private IMakeCoordinator CreateUseCase() => new MakeCoordinator(_userRepositoryMock.Object, _tokenAuthenticationServiceMock.Object); private static Domain.Entities.User MockValidUser() => new(id: Guid.NewGuid(), name: "Test", role: "ADMIN"); diff --git a/src/Application.Tests/UseCases/User/UpdateUserTests.cs b/src/Application.Tests/UseCases/User/UpdateUserTests.cs index 84e3484f..5ae3d5e6 100644 --- a/src/Application.Tests/UseCases/User/UpdateUserTests.cs +++ b/src/Application.Tests/UseCases/User/UpdateUserTests.cs @@ -1,4 +1,3 @@ -using System.Security.Claims; using Application.Interfaces.UseCases.User; using Application.Ports.User; using Application.UseCases.User; @@ -13,9 +12,9 @@ namespace Application.Tests.UseCases.User { public class UpdateUserTests { - private readonly Mock _userRepositoryMock = new Mock(); - private readonly Mock _tokenAuthenticationServiceMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _userRepositoryMock = new(); + private readonly Mock _tokenAuthenticationServiceMock = new(); + private readonly Mock _mapperMock = new(); private IUpdateUser CreateUseCase() => new UpdateUser(_userRepositoryMock.Object, _tokenAuthenticationServiceMock.Object, _mapperMock.Object); diff --git a/src/Domain.Tests/Entities/AreaUnitTests.cs b/src/Domain.Tests/Entities/AreaUnitTests.cs index d07eff90..15eba6d5 100644 --- a/src/Domain.Tests/Entities/AreaUnitTests.cs +++ b/src/Domain.Tests/Entities/AreaUnitTests.cs @@ -1,5 +1,4 @@ using Domain.Entities; -using Domain.Entities.Enums; using Domain.Validation; using FluentAssertions; using Xunit; diff --git a/src/Domain.Tests/Entities/AssistanceTypeUnitTests.cs b/src/Domain.Tests/Entities/AssistanceTypeUnitTests.cs index 8e45d6f5..1d816db7 100644 --- a/src/Domain.Tests/Entities/AssistanceTypeUnitTests.cs +++ b/src/Domain.Tests/Entities/AssistanceTypeUnitTests.cs @@ -1,7 +1,6 @@ using Domain.Entities; using Domain.Validation; using FluentAssertions; -using System; using Xunit; namespace Domain.Tests.Entities diff --git a/src/Domain.Tests/Entities/ProfessorUnitTests.cs b/src/Domain.Tests/Entities/ProfessorUnitTests.cs index d5b20644..3bb0ef44 100644 --- a/src/Domain.Tests/Entities/ProfessorUnitTests.cs +++ b/src/Domain.Tests/Entities/ProfessorUnitTests.cs @@ -1,7 +1,6 @@ using Domain.Entities; using Domain.Validation; using FluentAssertions; -using System; using Xunit; namespace Domain.Tests.Entities diff --git a/src/Domain.Tests/Entities/ProjectActivityUnitTests.cs b/src/Domain.Tests/Entities/ProjectActivityUnitTests.cs index cffda1e0..a2b12fc3 100644 --- a/src/Domain.Tests/Entities/ProjectActivityUnitTests.cs +++ b/src/Domain.Tests/Entities/ProjectActivityUnitTests.cs @@ -1,7 +1,6 @@ using Domain.Entities; using Domain.Validation; using FluentAssertions; -using System; using Xunit; namespace Domain.Tests.Entities diff --git a/src/Domain.Tests/Entities/ProjectPartialReportUnitTests.cs b/src/Domain.Tests/Entities/ProjectPartialReportUnitTests.cs index 864641a6..13e230bd 100644 --- a/src/Domain.Tests/Entities/ProjectPartialReportUnitTests.cs +++ b/src/Domain.Tests/Entities/ProjectPartialReportUnitTests.cs @@ -3,7 +3,6 @@ using Domain.Validation; using FluentAssertions; using Xunit; -using System; namespace Domain.Tests.Entities { diff --git a/src/Domain.Tests/Entities/SubAreaUnitTests.cs b/src/Domain.Tests/Entities/SubAreaUnitTests.cs index 28e5aee3..4ef0b787 100644 --- a/src/Domain.Tests/Entities/SubAreaUnitTests.cs +++ b/src/Domain.Tests/Entities/SubAreaUnitTests.cs @@ -1,7 +1,6 @@ using Domain.Entities; using Domain.Validation; using FluentAssertions; -using System; using Xunit; namespace Domain.Tests.Entities diff --git a/src/Domain.Tests/Entities/UserUnitTests.cs b/src/Domain.Tests/Entities/UserUnitTests.cs index 2995bbec..8b0649dd 100644 --- a/src/Domain.Tests/Entities/UserUnitTests.cs +++ b/src/Domain.Tests/Entities/UserUnitTests.cs @@ -1,6 +1,4 @@ -using System; -using System.Reflection; -using Domain.Entities; +using Domain.Entities; using Domain.Entities.Enums; using Domain.Validation; using Xunit; From 2b0a8364a068e058a819684d2eea8688c2286d53 Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 31 Oct 2023 21:21:48 -0300 Subject: [PATCH 190/201] test: Add project usecases tests --- .../Application.Tests.csproj | 6 + .../Mocks/ActivityTypeMock.cs | 12 + src/Application.Tests/Mocks/ClaimsMock.cs | 7 + src/Application.Tests/Mocks/FileMock.cs | 18 ++ src/Application.Tests/Mocks/NoticeMock.cs | 38 +++ .../Mocks/ProgramTypeMock.cs | 9 + .../Mocks/ProjectActivityMock.cs | 9 + src/Application.Tests/Mocks/ProjectMock.cs | 105 +++++++ src/Application.Tests/Mocks/SubAreaMock.cs | 9 + src/Application.Tests/Samples/sample.pdf | Bin 0 -> 294599 bytes .../ProgramType/UpdateProgramTypeTests.cs | 4 +- .../UseCases/Project/AppealProjectTests.cs | 99 +++++++ .../UseCases/Project/CancelProjectTests.cs | 93 +++++++ .../Project/ClosePendingProjectsTests.cs | 81 ++++++ .../Project/GenerateCertificateTests.cs | 149 ++++++++++ .../Project/GetActivitiesByProjectIdTests.cs | 78 ++++++ .../Project/GetClosedProjectsTests.cs | 97 +++++++ .../UseCases/Project/GetOpenProjectsTests.cs | 90 ++++++ .../UseCases/Project/GetProjectByIdTests.cs | 58 ++++ .../Project/GetProjectsToEvaluateTests.cs | 71 +++++ .../UseCases/Project/OpenProjectTests.cs | 257 ++++++++++++++++++ .../UseCases/Project/SubmitProjectTests.cs | 118 ++++++++ .../UseCases/Project/UpdateProjectTests.cs | 257 ++++++++++++++++++ .../CreateStudentDocumentsTests.cs | 58 ++-- .../UpdateStudentDocumentsTests.cs | 1 + .../UseCases/Project/ClosePendingProjects.cs | 22 +- .../Project/GetActivitiesByProjectId.cs | 6 +- .../UseCases/Project/GetClosedProjects.cs | 4 +- .../UseCases/Project/GetOpenProjects.cs | 4 +- .../UseCases/Project/OpenProject.cs | 4 + src/Domain/Entities/Project.cs | 32 ++- .../Repositories/IProjectRepository.cs | 13 +- .../Repositories/ProjectRepository.cs | 36 +-- 33 files changed, 1772 insertions(+), 73 deletions(-) create mode 100644 src/Application.Tests/Mocks/ActivityTypeMock.cs create mode 100644 src/Application.Tests/Mocks/ClaimsMock.cs create mode 100644 src/Application.Tests/Mocks/FileMock.cs create mode 100644 src/Application.Tests/Mocks/NoticeMock.cs create mode 100644 src/Application.Tests/Mocks/ProgramTypeMock.cs create mode 100644 src/Application.Tests/Mocks/ProjectActivityMock.cs create mode 100644 src/Application.Tests/Mocks/ProjectMock.cs create mode 100644 src/Application.Tests/Mocks/SubAreaMock.cs create mode 100644 src/Application.Tests/Samples/sample.pdf create mode 100644 src/Application.Tests/UseCases/Project/AppealProjectTests.cs create mode 100644 src/Application.Tests/UseCases/Project/CancelProjectTests.cs create mode 100644 src/Application.Tests/UseCases/Project/ClosePendingProjectsTests.cs create mode 100644 src/Application.Tests/UseCases/Project/GenerateCertificateTests.cs create mode 100644 src/Application.Tests/UseCases/Project/GetActivitiesByProjectIdTests.cs create mode 100644 src/Application.Tests/UseCases/Project/GetClosedProjectsTests.cs create mode 100644 src/Application.Tests/UseCases/Project/GetOpenProjectsTests.cs create mode 100644 src/Application.Tests/UseCases/Project/GetProjectByIdTests.cs create mode 100644 src/Application.Tests/UseCases/Project/GetProjectsToEvaluateTests.cs create mode 100644 src/Application.Tests/UseCases/Project/OpenProjectTests.cs create mode 100644 src/Application.Tests/UseCases/Project/SubmitProjectTests.cs create mode 100644 src/Application.Tests/UseCases/Project/UpdateProjectTests.cs diff --git a/src/Application.Tests/Application.Tests.csproj b/src/Application.Tests/Application.Tests.csproj index 6fde1bc6..3d919d6f 100644 --- a/src/Application.Tests/Application.Tests.csproj +++ b/src/Application.Tests/Application.Tests.csproj @@ -41,4 +41,10 @@ + + + PreserveNewest + + + \ No newline at end of file diff --git a/src/Application.Tests/Mocks/ActivityTypeMock.cs b/src/Application.Tests/Mocks/ActivityTypeMock.cs new file mode 100644 index 00000000..f74a20ec --- /dev/null +++ b/src/Application.Tests/Mocks/ActivityTypeMock.cs @@ -0,0 +1,12 @@ +using Domain.Entities; + +namespace Application.Tests.Mocks +{ + public static class ActivityTypeMock + { + public static ActivityType MockValidActivityType() + { + return new ActivityType("Activity Type Name", "Activity Type Description", Guid.NewGuid()); + } + } +} diff --git a/src/Application.Tests/Mocks/ClaimsMock.cs b/src/Application.Tests/Mocks/ClaimsMock.cs new file mode 100644 index 00000000..c70bc288 --- /dev/null +++ b/src/Application.Tests/Mocks/ClaimsMock.cs @@ -0,0 +1,7 @@ +namespace Application.Tests.Mocks +{ + public static class ClaimsMock + { + public static Dictionary MockValidClaims() => new() { { Guid.NewGuid(), UserMock.MockValidUser() } }; + } +} \ No newline at end of file diff --git a/src/Application.Tests/Mocks/FileMock.cs b/src/Application.Tests/Mocks/FileMock.cs new file mode 100644 index 00000000..2b7d2145 --- /dev/null +++ b/src/Application.Tests/Mocks/FileMock.cs @@ -0,0 +1,18 @@ +using Microsoft.AspNetCore.Http; +using Moq; + +namespace Application.Tests.Mocks +{ + public static class FileMock + { + public static IFormFile CreateIFormFile() + { + // Create a mock IFormFile, you can adjust the implementation as needed. + var fileMock = new Mock(); + fileMock.Setup(file => file.FileName).Returns("file.txt"); + fileMock.Setup(file => file.Length).Returns(1024); + // Add other setup as needed. + return fileMock.Object; + } + } +} \ No newline at end of file diff --git a/src/Application.Tests/Mocks/NoticeMock.cs b/src/Application.Tests/Mocks/NoticeMock.cs new file mode 100644 index 00000000..40ca8f73 --- /dev/null +++ b/src/Application.Tests/Mocks/NoticeMock.cs @@ -0,0 +1,38 @@ +using Domain.Entities; + +namespace Application.Tests.Mocks +{ + public static class NoticeMock + { + public static Notice MockValidNotice() => new( + registrationStartDate: DateTime.UtcNow, + registrationEndDate: DateTime.UtcNow.AddDays(7), + evaluationStartDate: DateTime.UtcNow.AddDays(8), + evaluationEndDate: DateTime.UtcNow.AddDays(14), + appealStartDate: DateTime.UtcNow.AddDays(15), + appealFinalDate: DateTime.UtcNow.AddDays(21), + sendingDocsStartDate: DateTime.UtcNow.AddDays(22), + sendingDocsEndDate: DateTime.UtcNow.AddDays(28), + partialReportDeadline: DateTime.UtcNow.AddDays(29), + finalReportDeadline: DateTime.UtcNow.AddDays(35), + description: "Edital de teste", + suspensionYears: 1 + ); + + public static Notice MockValidNoticeWithId() => new( + id: Guid.NewGuid(), + registrationStartDate: DateTime.UtcNow, + registrationEndDate: DateTime.UtcNow.AddDays(7), + evaluationStartDate: DateTime.UtcNow.AddDays(8), + evaluationEndDate: DateTime.UtcNow.AddDays(14), + appealStartDate: DateTime.UtcNow.AddDays(15), + appealFinalDate: DateTime.UtcNow.AddDays(21), + sendingDocsStartDate: DateTime.UtcNow.AddDays(22), + sendingDocsEndDate: DateTime.UtcNow.AddDays(28), + partialReportDeadline: DateTime.UtcNow.AddDays(29), + finalReportDeadline: DateTime.UtcNow.AddDays(35), + description: "Edital de teste", + suspensionYears: 1 + ); + } +} \ No newline at end of file diff --git a/src/Application.Tests/Mocks/ProgramTypeMock.cs b/src/Application.Tests/Mocks/ProgramTypeMock.cs new file mode 100644 index 00000000..f46d4159 --- /dev/null +++ b/src/Application.Tests/Mocks/ProgramTypeMock.cs @@ -0,0 +1,9 @@ +using Domain.Entities; + +namespace Application.Tests.Mocks +{ + public static class ProgramTypeMock + { + public static ProgramType MockValidProgramType() => new("Program Name", "Program Description"); + } +} \ No newline at end of file diff --git a/src/Application.Tests/Mocks/ProjectActivityMock.cs b/src/Application.Tests/Mocks/ProjectActivityMock.cs new file mode 100644 index 00000000..2ea34fee --- /dev/null +++ b/src/Application.Tests/Mocks/ProjectActivityMock.cs @@ -0,0 +1,9 @@ +using Domain.Entities; + +namespace Application.Tests.Mocks +{ + public static class ProjectActivityMock + { + public static ProjectActivity MockValidProjectActivity() => new(Guid.NewGuid(), Guid.NewGuid(), 5, 3); + } +} \ No newline at end of file diff --git a/src/Application.Tests/Mocks/ProjectMock.cs b/src/Application.Tests/Mocks/ProjectMock.cs new file mode 100644 index 00000000..69dfdc7e --- /dev/null +++ b/src/Application.Tests/Mocks/ProjectMock.cs @@ -0,0 +1,105 @@ +using Domain.Entities; +using Domain.Entities.Enums; + +namespace Application.Tests.Mocks +{ + public static class ProjectMock + { + public static Project MockValidProject() => new( + "Project Title", + "Keyword 1", + "Keyword 2", + "Keyword 3", + true, + "Objective", + "Methodology", + "Expected Results", + "Schedule", + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + EProjectStatus.Opened, + "Status Description", + "Appeal Observation", + DateTime.UtcNow, + DateTime.UtcNow, + DateTime.UtcNow, + "Cancellation Reason"); + + public static Project MockValidProjectWithId() => new( + Guid.NewGuid(), + "Project Title", + "Keyword 1", + "Keyword 2", + "Keyword 3", + true, + "Objective", + "Methodology", + "Expected Results", + "Schedule", + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + EProjectStatus.Opened, + "Status Description", + "Appeal Observation", + DateTime.UtcNow, + DateTime.UtcNow, + DateTime.UtcNow, + "Cancellation Reason"); + + public static Project MockValidProjectProfessorAndNotice() + { + return new( + Guid.NewGuid(), + "Project Title", + "Keyword 1", + "Keyword 2", + "Keyword 3", + true, + "Objective", + "Methodology", + "Expected Results", + "Schedule", + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + Guid.NewGuid(), + EProjectStatus.Opened, + "Status Description", + "Appeal Observation", + DateTime.UtcNow, + DateTime.UtcNow, + DateTime.UtcNow, + "Cancellation Reason") + { + SubArea = new SubArea(Guid.NewGuid(), "SubArea Name", "SubArea Code"), + ProgramType = new ProgramType("Program Type Name", "Program Type Description"), + Professor = new Professor("1234567", 1234567) + { + User = new User("Name", "professor@email.com", "Password", "58411338029", ERole.ADMIN) + }, + Notice = new( + id: Guid.NewGuid(), + registrationStartDate: DateTime.UtcNow, + registrationEndDate: DateTime.UtcNow.AddDays(7), + evaluationStartDate: DateTime.UtcNow.AddDays(8), + evaluationEndDate: DateTime.UtcNow.AddDays(14), + appealStartDate: DateTime.UtcNow.AddDays(15), + appealFinalDate: DateTime.UtcNow.AddDays(21), + sendingDocsStartDate: DateTime.UtcNow.AddDays(22), + sendingDocsEndDate: DateTime.UtcNow.AddDays(28), + partialReportDeadline: DateTime.UtcNow.AddDays(29), + finalReportDeadline: DateTime.UtcNow.AddDays(35), + description: "Edital de teste", + suspensionYears: 1 + ) + }; + } + } +} \ No newline at end of file diff --git a/src/Application.Tests/Mocks/SubAreaMock.cs b/src/Application.Tests/Mocks/SubAreaMock.cs new file mode 100644 index 00000000..9a723876 --- /dev/null +++ b/src/Application.Tests/Mocks/SubAreaMock.cs @@ -0,0 +1,9 @@ +using Domain.Entities; + +namespace Application.Tests.Mocks +{ + public static class SubAreaMock + { + public static SubArea MockValidSubArea() => new(Guid.NewGuid(), "ABC", "SubArea Name"); + } +} \ No newline at end of file diff --git a/src/Application.Tests/Samples/sample.pdf b/src/Application.Tests/Samples/sample.pdf new file mode 100644 index 0000000000000000000000000000000000000000..334df3a141783caf8e85e6fa302df68e0ca1ec54 GIT binary patch literal 294599 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�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

;TBP^M|9iAl6@-Z5%4#dXD{?$vaB4pG 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�ggXA;tMc8zLXz=vh6N; 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 _repositoryMock = new Mock(); - private readonly Mock _mapperMock = new Mock(); + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); private IUpdateProgramType CreateUseCase() => new UpdateProgramType(_repositoryMock.Object, _mapperMock.Object); private static Domain.Entities.ProgramType MockValidProgramType() => new("Program Name", "Program Description"); diff --git a/src/Application.Tests/UseCases/Project/AppealProjectTests.cs b/src/Application.Tests/UseCases/Project/AppealProjectTests.cs new file mode 100644 index 00000000..8238a1d2 --- /dev/null +++ b/src/Application.Tests/UseCases/Project/AppealProjectTests.cs @@ -0,0 +1,99 @@ +using AutoMapper; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Validation; +using Moq; +using Xunit; +using Application.Tests.Mocks; +using Application.UseCases.Project; + +namespace Application.Tests.UseCases.Project +{ + public class AppealProjectTests + { + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IAppealProject CreateUseCase() => new AppealProject( + _projectRepositoryMock.Object, + _mapperMock.Object + ); + + [Fact] + public async Task ExecuteAsync_ValidData_ReturnsResumedReadProjectOutput() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + var appealDescription = "Sample appeal description"; + var project = ProjectMock.MockValidProject(); + project.Status = EProjectStatus.Rejected; + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync(project); + _projectRepositoryMock.Setup(repo => repo.UpdateAsync(project)).ReturnsAsync(project); + _mapperMock.Setup(mapper => mapper.Map(project)).Returns(new ResumedReadProjectOutput()); + + // Act + var result = await useCase.ExecuteAsync(projectId, appealDescription); + + // Assert + Assert.NotNull(result); + Assert.IsType(result); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(projectId), Times.Once); + _projectRepositoryMock.Verify(repo => repo.UpdateAsync(project), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(project), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NoProjectFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + var appealDescription = "Sample appeal description"; + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync((Domain.Entities.Project)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId, appealDescription)); + } + + [Fact] + public async Task ExecuteAsync_NotInAppealPhase_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + var appealDescription = "Sample appeal description"; + var project = ProjectMock.MockValidProject(); + var notice = NoticeMock.MockValidNotice(); + notice.AppealStartDate = DateTime.UtcNow.AddDays(2); // Future date + notice.AppealEndDate = DateTime.UtcNow.AddDays(1); // Future date + project.Notice = notice; + project.Status = EProjectStatus.Rejected; + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId, appealDescription)); + } + + [Fact] + public async Task ExecuteAsync_ProjectNotRejected_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + var appealDescription = "Sample appeal description"; + var project = ProjectMock.MockValidProject(); + project.Status = EProjectStatus.Accepted; + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId, appealDescription)); + } + } +} diff --git a/src/Application.Tests/UseCases/Project/CancelProjectTests.cs b/src/Application.Tests/UseCases/Project/CancelProjectTests.cs new file mode 100644 index 00000000..53d817d0 --- /dev/null +++ b/src/Application.Tests/UseCases/Project/CancelProjectTests.cs @@ -0,0 +1,93 @@ +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Tests.Mocks; +using Application.Validation; +using AutoMapper; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Project +{ + public class CancelProjectTests + { + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private ICancelProject CreateUseCase() => new Application.UseCases.Project.CancelProject( + _projectRepositoryMock.Object, + _mapperMock.Object + ); + + [Theory] + [InlineData(EProjectStatus.Accepted)] + [InlineData(EProjectStatus.DocumentAnalysis)] + [InlineData(EProjectStatus.Evaluation)] + [InlineData(EProjectStatus.Opened)] + [InlineData(EProjectStatus.Pending)] + [InlineData(EProjectStatus.Rejected)] + [InlineData(EProjectStatus.Started)] + [InlineData(EProjectStatus.Submitted)] + public async Task ExecuteAsync_ValidInput_ReturnsResumedReadProjectOutput(EProjectStatus status) + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + var observation = "Cancellation reason"; + + var project = ProjectMock.MockValidProjectWithId(); + project.Status = status; + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync(project); + _projectRepositoryMock.Setup(repo => repo.UpdateAsync(project)).ReturnsAsync(project); + _mapperMock.Setup(mapper => mapper.Map(project)).Returns(new ResumedReadProjectOutput()); + + // Act + var result = await useCase.ExecuteAsync(projectId, observation); + + // Assert + Assert.NotNull(result); + Assert.Equal(EProjectStatus.Canceled, project.Status); + Assert.Equal(EProjectStatus.Canceled.GetDescription(), project.StatusDescription); + Assert.Equal(observation, project.CancellationReason); + Assert.NotNull(project.CancellationDate); + _projectRepositoryMock.Verify(repo => repo.UpdateAsync(project), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(project), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(project), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_ProjectNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + var observation = "Cancellation reason"; + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync((Domain.Entities.Project)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId, observation)); + } + + [Theory] + [InlineData(EProjectStatus.Closed)] + [InlineData(EProjectStatus.Canceled)] + public async Task ExecuteAsync_ProjectConcluded_ThrowsUseCaseException(EProjectStatus status) + { + // Arrange + var useCase = CreateUseCase(); + var observation = "Cancellation reason"; + + var project = ProjectMock.MockValidProjectWithId(); + var projectId = project.Id; + project.Status = status; + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId, observation)); + } + } +} diff --git a/src/Application.Tests/UseCases/Project/ClosePendingProjectsTests.cs b/src/Application.Tests/UseCases/Project/ClosePendingProjectsTests.cs new file mode 100644 index 00000000..705252d9 --- /dev/null +++ b/src/Application.Tests/UseCases/Project/ClosePendingProjectsTests.cs @@ -0,0 +1,81 @@ +using Application.Interfaces.UseCases.Project; +using Application.Tests.Mocks; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Project +{ + public class ClosePendingProjectsTests + { + + private readonly Mock _projectRepositoryMock = new(); + private IClosePendingProjects CreateUseCase() => new Application.UseCases.Project.ClosePendingProjects( + _projectRepositoryMock.Object + ); + + [Fact] + public async Task ExecuteAsync_NoPendingProjects_ReturnsSuccessMessage() + { + // Arrange + var useCase = CreateUseCase(); + var projects = new List(); + + _projectRepositoryMock.Setup(repo => repo.GetPendingAndOverdueProjectsAsync()).ReturnsAsync(projects); + + // Act + var result = await useCase.ExecuteAsync(); + + // Assert + Assert.Equal("Nenhum projeto pendente e com prazo vencido foi encontrado.", result); + } + + [Fact] + public async Task ExecuteAsync_CancelProjects_SuccessfullyCancelsProjects() + { + // Arrange + var useCase = CreateUseCase(); + var project1 = ProjectMock.MockValidProjectWithId(); + var project2 = ProjectMock.MockValidProjectWithId(); + var projects = new List { project1, project2 }; + + _projectRepositoryMock.Setup(repo => repo.GetPendingAndOverdueProjectsAsync()).ReturnsAsync(projects); + _projectRepositoryMock.Setup(repo => repo.UpdateManyAsync(It.IsAny>())).ReturnsAsync(projects.Count); + + // Act + var result = await useCase.ExecuteAsync(); + + // Assert + _projectRepositoryMock.Verify(repo => repo.UpdateManyAsync(It.IsAny>()), Times.Once); + Assert.Equal($"{projects.Count} projetos pendentes e com prazo de resolução vencido foram cancelados com sucesso.", result); + Assert.All(projects, project => + { + Assert.Equal(EProjectStatus.Canceled, project.Status); + Assert.Equal("Projeto cancelado automaticamente por falta de ação dentro do prazo estipulado.", project.StatusDescription); + }); + } + + [Fact] + public async Task ExecuteAsync_CancelProjects_PartiallyCancelsProjects() + { + // Arrange + var useCase = CreateUseCase(); + var project1 = ProjectMock.MockValidProjectWithId(); + project1.Status = EProjectStatus.Pending; + var project2 = ProjectMock.MockValidProjectWithId(); + project2.Status = EProjectStatus.Rejected; + var projects = new List { project1, project2 }; + + _projectRepositoryMock.Setup(repo => repo.GetPendingAndOverdueProjectsAsync()).ReturnsAsync(projects); + _projectRepositoryMock.Setup(repo => repo.UpdateManyAsync(It.IsAny>())).ReturnsAsync(1); // Simulate a partial update + + // Act + var result = await useCase.ExecuteAsync(); + + // Assert + _projectRepositoryMock.Verify(repo => repo.UpdateManyAsync(It.IsAny>()), Times.Once); + Assert.Equal($"Ocorreu um erro ao cancelar os projetos pendentes e com prazo vencido. Foram cancelados 1 de {projects.Count} projetos.", result); + } + } +} diff --git a/src/Application.Tests/UseCases/Project/GenerateCertificateTests.cs b/src/Application.Tests/UseCases/Project/GenerateCertificateTests.cs new file mode 100644 index 00000000..59d3e121 --- /dev/null +++ b/src/Application.Tests/UseCases/Project/GenerateCertificateTests.cs @@ -0,0 +1,149 @@ +using Application.Interfaces.UseCases.Project; +using Application.Tests.Mocks; +using Application.UseCases.Project; +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Project +{ + public class GenerateCertificateTests + { + private readonly Mock _noticeRepositoryMock = new(); + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _professorRepositoryMock = new(); + private readonly Mock _userRepositoryMock = new(); + private readonly Mock _projectReportRepositoryMock = new(); + private readonly Mock _reportServiceMock = new(); + private readonly Mock _storageFileServiceMock = new(); + + private IGenerateCertificate CreateUseCase() => new GenerateCertificate( + projectRepository: _projectRepositoryMock.Object, + noticeRepository: _noticeRepositoryMock.Object, + projectReportRepository: _projectReportRepositoryMock.Object, + professorRepository: _professorRepositoryMock.Object, + userRepository: _userRepositoryMock.Object, + reportService: _reportServiceMock.Object, + storageFileService: _storageFileServiceMock.Object + ); + + [Fact] + public async Task ExecuteAsync_NoticeNotFound_ReturnsErrorMessage() + { + // Arrange + var useCase = CreateUseCase(); + _noticeRepositoryMock.Setup(repo => repo.GetNoticeEndingAsync()).ReturnsAsync((Domain.Entities.Notice)null); + + // Act + var result = await useCase.ExecuteAsync(); + + // Assert + Assert.Equal("Nenhum edital em estágio de encerramento encontrado.", result); + } + + [Fact] + public async Task ExecuteAsync_NoProjectsFound_ReturnsErrorMessage() + { + // Arrange + var useCase = CreateUseCase(); + + _noticeRepositoryMock.Setup(repo => repo.GetNoticeEndingAsync()).ReturnsAsync(NoticeMock.MockValidNotice()); + _projectRepositoryMock.Setup(repo => repo.GetProjectByNoticeAsync(It.IsAny())).ReturnsAsync(Enumerable.Empty()); + + // Act + var result = await useCase.ExecuteAsync(); + + // Assert + Assert.Equal("Nenhum projeto em estágio de encerramento encontrado.", result); + } + + [Fact] + public async Task ExecuteAsync_CoordinatorNotFound_ReturnsErrorMessage() + { + // Arrange + var useCase = CreateUseCase(); + var projects = new[] { ProjectMock.MockValidProjectProfessorAndNotice() }; + var notice = NoticeMock.MockValidNoticeWithId(); + + _noticeRepositoryMock.Setup(repo => repo.GetNoticeEndingAsync()).ReturnsAsync(notice); + _projectRepositoryMock.Setup(repo => repo.GetProjectByNoticeAsync(It.IsAny())).ReturnsAsync(projects); + _userRepositoryMock.Setup(repo => repo.GetCoordinatorAsync()).ReturnsAsync((Domain.Entities.User)null); + + // Act + var result = await useCase.ExecuteAsync(); + + // Assert + Assert.Equal("Nenhum coordenador encontrado.", result); + } + + [Fact] + public async Task ExecuteAsync_ProjectWithoutFinalReport_ClosesProjectAndSuspendsProfessor() + { + // Arrange + var useCase = CreateUseCase(); + var projects = new[] { ProjectMock.MockValidProjectProfessorAndNotice() }; + var notice = NoticeMock.MockValidNoticeWithId(); + var coordinator = UserMock.MockValidUser(); + + _noticeRepositoryMock.Setup(repo => repo.GetNoticeEndingAsync()).ReturnsAsync(notice); + _projectRepositoryMock.Setup(repo => repo.GetProjectByNoticeAsync(It.IsAny())).ReturnsAsync(projects); + _userRepositoryMock.Setup(repo => repo.GetCoordinatorAsync()).ReturnsAsync(coordinator); + _projectRepositoryMock.Setup(repo => repo.UpdateAsync(It.IsAny())).ReturnsAsync((Domain.Entities.Project project) => project); + _projectReportRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(It.IsAny())).ReturnsAsync((ProjectFinalReport)null); + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync((Domain.Entities.Professor)null); + + // Act + var result = await useCase.ExecuteAsync(); + + // Assert + Assert.Equal("Certificados gerados com sucesso.", result); + + // Verify project status and professor suspension + _noticeRepositoryMock.Verify(repo => repo.GetNoticeEndingAsync(), Times.Once); + _projectRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetCoordinatorAsync(), Times.Once); + _projectReportRepositoryMock.Verify(repo => repo.GetByProjectIdAsync(It.IsAny()), Times.Once); + _professorRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _professorRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_ProjectWithFinalReport_GeneratesCertificateAndClosesProject() + { + // Arrange + var useCase = CreateUseCase(); + var coordinator = UserMock.MockValidUser(); + var notice = NoticeMock.MockValidNoticeWithId(); + var projects = new[] { ProjectMock.MockValidProjectProfessorAndNotice() }; + var projectFinalReport = new ProjectFinalReport(Guid.NewGuid(), Guid.NewGuid()); + var file = FileMock.CreateIFormFile(); + var path = "./Samples/sample.pdf"; + var bytes = File.ReadAllBytes(path); + + _noticeRepositoryMock.Setup(repo => repo.GetNoticeEndingAsync()).ReturnsAsync(notice); + _projectRepositoryMock.Setup(repo => repo.GetProjectByNoticeAsync(It.IsAny())).ReturnsAsync(projects); + _userRepositoryMock.Setup(repo => repo.GetCoordinatorAsync()).ReturnsAsync(coordinator); + _projectRepositoryMock.Setup(repo => repo.UpdateAsync(It.IsAny())).ReturnsAsync((Domain.Entities.Project project) => project); + _projectReportRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(It.IsAny())).ReturnsAsync(projectFinalReport); + _reportServiceMock.Setup(service => service.GenerateCertificateAsync(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(path); + _storageFileServiceMock.Setup(service => service.UploadFileAsync(bytes, path)).ReturnsAsync("certificate_url"); + + // Act + var result = await useCase.ExecuteAsync(); + + // Assert + Assert.Equal("Certificados gerados com sucesso.", result); + + // Verify project status and certificate generation + _noticeRepositoryMock.Verify(repo => repo.GetNoticeEndingAsync(), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetProjectByNoticeAsync(It.IsAny()), Times.Once); + _userRepositoryMock.Verify(repo => repo.GetCoordinatorAsync(), Times.Once); + _projectReportRepositoryMock.Verify(repo => repo.GetByProjectIdAsync(It.IsAny()), Times.Once); + _reportServiceMock.Verify(service => service.GenerateCertificateAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(bytes, path), Times.Once); + _projectRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Once); + } + } +} diff --git a/src/Application.Tests/UseCases/Project/GetActivitiesByProjectIdTests.cs b/src/Application.Tests/UseCases/Project/GetActivitiesByProjectIdTests.cs new file mode 100644 index 00000000..7858a290 --- /dev/null +++ b/src/Application.Tests/UseCases/Project/GetActivitiesByProjectIdTests.cs @@ -0,0 +1,78 @@ +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.Project; +using Domain.Entities; +using Application.Tests.Mocks; +using Application.UseCases.Project; + +namespace Application.Tests.UseCases.Project +{ + public class GetActivitiesByProjectIdTests + { + private readonly Mock _projectActivityRepositoryMock = new(); + + private IGetActivitiesByProjectId CreateUseCase() => new GetActivitiesByProjectId(_projectActivityRepositoryMock.Object); + + [Fact] + public async Task ExecuteAsync_ProjectIdIsNull_ReturnsEmptyList() + { + // Arrange + var useCase = CreateUseCase(); + Guid? projectId = null; + + // Act + var result = await useCase.ExecuteAsync(projectId); + + // Assert + Assert.NotNull(result); + Assert.Empty(result); + } + + [Fact] + public async Task ExecuteAsync_NoProjectActivities_ReturnsEmptyList() + { + // Arrange + var useCase = CreateUseCase(); + Guid projectId = Guid.NewGuid(); + + _projectActivityRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(projectId)).ReturnsAsync(new List()); + + // Act + var result = await useCase.ExecuteAsync(projectId); + + // Assert + Assert.NotNull(result); + Assert.Empty(result); + } + + [Fact] + public async Task ExecuteAsync_ProjectActivitiesExist_ReturnsMappedList() + { + // Arrange + var useCase = CreateUseCase(); + Guid projectId = Guid.NewGuid(); + var projectActivities = new List + { + ProjectActivityMock.MockValidProjectActivity() + }; + + _projectActivityRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(projectId)).ReturnsAsync(projectActivities); + + // Act + var result = await useCase.ExecuteAsync(projectId); + var outputs = result.ToList(); + + // Assert + Assert.NotNull(result); + Assert.NotEmpty(result); + Assert.Single(result); + Assert.Equal(projectActivities[0].Id, outputs[0].Id); + Assert.Equal(projectActivities[0].ActivityId, outputs[0].ActivityId); + Assert.Equal(projectActivities[0].ProjectId, outputs[0].ProjectId); + Assert.Equal(projectActivities[0].InformedActivities, outputs[0].InformedActivities); + Assert.Equal(projectActivities[0].DeletedAt, outputs[0].DeletedAt); + Assert.Equal(projectActivities[0].FoundActivities, outputs[0].FoundActivities); + } + } +} diff --git a/src/Application.Tests/UseCases/Project/GetClosedProjectsTests.cs b/src/Application.Tests/UseCases/Project/GetClosedProjectsTests.cs new file mode 100644 index 00000000..f24132e5 --- /dev/null +++ b/src/Application.Tests/UseCases/Project/GetClosedProjectsTests.cs @@ -0,0 +1,97 @@ +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Tests.Mocks; +using Application.UseCases.Project; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Project +{ + public class GetClosedProjectsTests + { + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _tokenAuthenticationServiceMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetClosedProjects CreateUseCase() => new GetClosedProjects( + _projectRepositoryMock.Object, + _tokenAuthenticationServiceMock.Object, + _mapperMock.Object + ); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsResumedReadProjectOutputList() + { + // Arrange + var useCase = CreateUseCase(); + var skip = 0; + var take = 10; + var professorId = Guid.NewGuid(); + var userClaims = ClaimsMock.MockValidClaims(); + var projects = new List + { + ProjectMock.MockValidProject(), + ProjectMock.MockValidProject() + }; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetProfessorProjectsAsync(skip, take, It.IsAny(), true)) + .ReturnsAsync(projects); + _mapperMock.Setup(mapper => mapper.Map>(projects)) + .Returns(new List { new(), new() }); + + // Act + var result = await useCase.ExecuteAsync(skip, take); + + // Assert + Assert.NotNull(result); + Assert.NotEmpty(result); + Assert.Equal(2, result.Count); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetProfessorProjectsAsync(skip, take, It.IsAny(), true), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(projects), Times.Once); + } + + + + [Fact] + public async Task ExecuteAsync_InvalidSkipAndTake_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + var skip = -1; + var take = 0; + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(skip, take)); + + // Additional assertions + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Never); + _projectRepositoryMock.Verify(repo => repo.GetProfessorProjectsAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_UnauthorizedUser_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var skip = 0; + var take = 10; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(null as Dictionary); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(skip, take)); + + // Additional assertions + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetProfessorProjectsAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Project/GetOpenProjectsTests.cs b/src/Application.Tests/UseCases/Project/GetOpenProjectsTests.cs new file mode 100644 index 00000000..dbe7eec5 --- /dev/null +++ b/src/Application.Tests/UseCases/Project/GetOpenProjectsTests.cs @@ -0,0 +1,90 @@ +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Tests.Mocks; +using Application.UseCases.Project; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Project +{ + public class GetOpenProjectsTests + { + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _tokenAuthenticationServiceMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetOpenProjects CreateUseCase() => new GetOpenProjects( + _projectRepositoryMock.Object, + _tokenAuthenticationServiceMock.Object, + _mapperMock.Object + ); + + [Fact] + public async Task ExecuteAsync_WithValidInput_ReturnsProjectList() + { + // Arrange + var userClaims = ClaimsMock.MockValidClaims(); + var useCase = CreateUseCase(); + + var skip = 0; + var take = 10; + var onlyMyProjects = true; + + _projectRepositoryMock.Setup(repo => repo.GetProfessorProjectsAsync(skip, take, It.IsAny(), false)) + .ReturnsAsync(new List()); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()) + .Returns(userClaims); + + _mapperMock.Setup(mapper => mapper.Map>(It.IsAny>())) + .Returns(new List()); + + // Act + var result = await useCase.ExecuteAsync(skip, take, onlyMyProjects); + + // Assert + Assert.NotNull(result); + Assert.IsType>(result); + _projectRepositoryMock.Verify(repo => repo.GetProfessorProjectsAsync(skip, take, It.IsAny(), false), Times.Once); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_InvalidSkipOrTake_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + + var skip = -1; // Invalid skip value + var take = 0; // Invalid take value + var onlyMyProjects = true; + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(skip, take, onlyMyProjects)); + } + + [Fact] + public async Task ExecuteAsync_UnauthorizedUser_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var skip = 0; + var take = 10; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(null as Dictionary); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(skip, take)); + + // Additional assertions + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetProfessorProjectsAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Project/GetProjectByIdTests.cs b/src/Application.Tests/UseCases/Project/GetProjectByIdTests.cs new file mode 100644 index 00000000..a8812774 --- /dev/null +++ b/src/Application.Tests/UseCases/Project/GetProjectByIdTests.cs @@ -0,0 +1,58 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Application.UseCases.Project; +using Application.Ports.Project; +using Application.Validation; +using Moq; +using System; +using System.Threading.Tasks; +using Xunit; +using Application.Interfaces.UseCases.Project; +using Application.Tests.Mocks; + +namespace Application.Tests.UseCases.Project +{ + public class GetProjectByIdTests + { + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetProjectById CreateUseCase() => new GetProjectById(_projectRepositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsDetailedReadProjectOutput() + { + // Arrange + var useCase = CreateUseCase(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + var projectId = project.Id; + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync(project); + _mapperMock.Setup(mapper => mapper.Map(project)).Returns(new DetailedReadProjectOutput()); + + // Act + var result = await useCase.ExecuteAsync(projectId); + + // Assert + Assert.NotNull(result); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(projectId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(project), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_InvalidId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync((Domain.Entities.Project)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId)); + + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(projectId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Project/GetProjectsToEvaluateTests.cs b/src/Application.Tests/UseCases/Project/GetProjectsToEvaluateTests.cs new file mode 100644 index 00000000..6fa575ab --- /dev/null +++ b/src/Application.Tests/UseCases/Project/GetProjectsToEvaluateTests.cs @@ -0,0 +1,71 @@ +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Tests.Mocks; +using Application.UseCases.Project; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Project +{ + public class GetProjectsToEvaluateTests + { + private readonly Mock _tokenAuthenticationServiceMock = new(); + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetProjectsToEvaluate CreateUseCase() => new GetProjectsToEvaluate( + _tokenAuthenticationServiceMock.Object, + _projectRepositoryMock.Object, + _mapperMock.Object + ); + + [Fact] + public async Task ExecuteAsync_InvalidParameters_ThrowsArgumentException() + { + // Arrange + var useCase = CreateUseCase(); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(-1, 0)); + } + + [Fact] + public async Task ExecuteAsync_UserNotAdminOrProfessor_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var userClaims = ClaimsMock.MockValidClaims(); + userClaims.First().Value.Role = Domain.Entities.Enums.ERole.STUDENT; + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(0, 1)); + } + + [Fact] + public async Task ExecuteAsync_ValidUser_GetProjectsToEvaluate() + { + // Arrange + var useCase = CreateUseCase(); + var userClaims = ClaimsMock.MockValidClaims(); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetProjectsToEvaluateAsync(0, 1, It.IsAny())) + .ReturnsAsync(new List()); + _mapperMock.Setup(mapper => mapper.Map>(It.IsAny>())) + .Returns(new List()); + + // Act + var result = await useCase.ExecuteAsync(0, 1); + + // Assert + _projectRepositoryMock.Verify(repo => repo.GetProjectsToEvaluateAsync(0, 1, It.IsAny()), Times.Once); + Assert.NotNull(result); + _mapperMock.Verify(mapper => mapper.Map>(It.IsAny>()), Times.Once); + } + } +} diff --git a/src/Application.Tests/UseCases/Project/OpenProjectTests.cs b/src/Application.Tests/UseCases/Project/OpenProjectTests.cs new file mode 100644 index 00000000..745c461b --- /dev/null +++ b/src/Application.Tests/UseCases/Project/OpenProjectTests.cs @@ -0,0 +1,257 @@ +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Ports.ProjectActivity; +using Application.Tests.Mocks; +using Application.UseCases.Project; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Project +{ + public class OpenProjectTests + { + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _studentRepositoryMock = new(); + private readonly Mock _professorRepositoryMock = new(); + private readonly Mock _noticeRepositoryMock = new(); + private readonly Mock _subAreaRepositoryMock = new(); + private readonly Mock _programTypeRepositoryMock = new(); + private readonly Mock _activityTypeRepositoryMock = new(); + private readonly Mock _projectActivityRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IOpenProject CreateUseCase() => new OpenProject( + _projectRepositoryMock.Object, + _studentRepositoryMock.Object, + _professorRepositoryMock.Object, + _noticeRepositoryMock.Object, + _subAreaRepositoryMock.Object, + _programTypeRepositoryMock.Object, + _activityTypeRepositoryMock.Object, + _projectActivityRepositoryMock.Object, + _mapperMock.Object + ); + + public static OpenProjectInput GetValidInput() + { + return new OpenProjectInput + { + Title = "My Project Title", + KeyWord1 = "Keyword1", + KeyWord2 = "Keyword2", + KeyWord3 = "Keyword3", + IsScholarshipCandidate = true, + Objective = "Project Objective", + Methodology = "Project Methodology", + ExpectedResults = "Expected Results", + ActivitiesExecutionSchedule = "Activity Schedule", + Activities = new List + { + new() { + ActivityId = Guid.NewGuid(), + InformedActivities = 10 + }, + new() { + ActivityId = Guid.NewGuid(), + InformedActivities = 10 + } + }, + ProgramTypeId = Guid.NewGuid(), + ProfessorId = Guid.NewGuid(), + SubAreaId = Guid.NewGuid(), + NoticeId = Guid.NewGuid(), + StudentId = Guid.NewGuid() + }; + } + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsResumedReadProjectOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + var notice = NoticeMock.MockValidNoticeWithId(); + var student = StudentMock.MockValidStudentWithId(); + var activityType = new List { ActivityTypeMock.MockValidActivityType() }; + var projectActivity = ProjectActivityMock.MockValidProjectActivity(); + + _noticeRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(notice); + _subAreaRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project.SubArea); + _programTypeRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project.ProgramType); + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project.Professor); + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(student); + _projectRepositoryMock.Setup(repo => repo.GetStudentProjectsAsync(0, 1, It.IsAny(), false)).ReturnsAsync(new List()); + _activityTypeRepositoryMock.Setup(repo => repo.GetByNoticeIdAsync(It.IsAny())).ReturnsAsync(activityType); + _projectRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(project); + _projectActivityRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(projectActivity); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new ResumedReadProjectOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + + _noticeRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _subAreaRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _programTypeRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _professorRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _studentRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetStudentProjectsAsync(0, 1, It.IsAny(), false), Times.Once); + _activityTypeRepositoryMock.Verify(repo => repo.GetByNoticeIdAsync(It.IsAny()), Times.Once); + _projectRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Once); + _projectActivityRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.AtMostOnce); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_ProjectOutsideRegistrationPeriod_ThrowsBusinessRuleViolation() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var notice = NoticeMock.MockValidNotice(); + notice.RegistrationStartDate = DateTime.Now.AddDays(-2); + notice.RegistrationEndDate = DateTime.Now.AddDays(-1); + + // Setup your mocks here + _noticeRepositoryMock.Setup(repo => repo.GetByIdAsync(input.NoticeId)).ReturnsAsync(notice); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _noticeRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _subAreaRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_SubAreaNotFound_ThrowsNotFoundEntityById() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + + // Setup your mocks here + _noticeRepositoryMock.Setup(repo => repo.GetByIdAsync(input.NoticeId)).ReturnsAsync(project.Notice); + _subAreaRepositoryMock.Setup(repo => repo.GetByIdAsync(input.SubAreaId)).ReturnsAsync((Domain.Entities.SubArea)null); + // Set up other necessary mock setups + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _subAreaRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _programTypeRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_ProgramTypeNotFound_ThrowsNotFoundEntityById() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + + // Setup your mocks here + _noticeRepositoryMock.Setup(repo => repo.GetByIdAsync(input.NoticeId)).ReturnsAsync(project.Notice); + _subAreaRepositoryMock.Setup(repo => repo.GetByIdAsync(input.SubAreaId)).ReturnsAsync(project.SubArea); + _programTypeRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProgramTypeId)).ReturnsAsync((Domain.Entities.ProgramType)null); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _programTypeRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _professorRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_ProfessorNotFound_ThrowsNotFoundEntityById() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + + // Setup your mocks here + _noticeRepositoryMock.Setup(repo => repo.GetByIdAsync(input.NoticeId)).ReturnsAsync(project.Notice); + _subAreaRepositoryMock.Setup(repo => repo.GetByIdAsync(input.SubAreaId)).ReturnsAsync(project.SubArea); + _programTypeRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProgramTypeId)).ReturnsAsync(project.ProgramType); + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProfessorId)).ReturnsAsync((Domain.Entities.Professor)null); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _professorRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _studentRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_StudentNotFound_ThrowsNotFoundEntityById() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + + // Setup your mocks here + _noticeRepositoryMock.Setup(repo => repo.GetByIdAsync(input.NoticeId)).ReturnsAsync(project.Notice); + _subAreaRepositoryMock.Setup(repo => repo.GetByIdAsync(input.SubAreaId)).ReturnsAsync(project.SubArea); + _programTypeRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProgramTypeId)).ReturnsAsync(project.ProgramType); + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProfessorId)).ReturnsAsync(project.Professor); + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(input.StudentId)).ReturnsAsync((Domain.Entities.Student)null); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _studentRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetStudentProjectsAsync(0, 1, It.IsAny(), false), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_StudentAlreadyHasProject_ThrowsBusinessRuleViolation() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + var student = StudentMock.MockValidStudentWithId(); + + // Setup your mocks here + _noticeRepositoryMock.Setup(repo => repo.GetByIdAsync(input.NoticeId)).ReturnsAsync(project.Notice); + _subAreaRepositoryMock.Setup(repo => repo.GetByIdAsync(input.SubAreaId)).ReturnsAsync(project.SubArea); + _programTypeRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProgramTypeId)).ReturnsAsync(project.ProgramType); + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProfessorId)).ReturnsAsync(project.Professor); + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(input.StudentId)).ReturnsAsync(student); + _projectRepositoryMock.Setup(repo => repo.GetStudentProjectsAsync(0, 1, It.IsAny(), false)).ReturnsAsync(new List { project }); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _studentRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetStudentProjectsAsync(0, 1, It.IsAny(), false), Times.Once); + _projectRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_ActivityTypeNotFound_ThrowsNotFoundEntityById() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + var student = StudentMock.MockValidStudentWithId(); + + // Setup your mocks here + _noticeRepositoryMock.Setup(repo => repo.GetByIdAsync(input.NoticeId)).ReturnsAsync(project.Notice); + _subAreaRepositoryMock.Setup(repo => repo.GetByIdAsync(input.SubAreaId)).ReturnsAsync(project.SubArea); + _programTypeRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProgramTypeId)).ReturnsAsync(project.ProgramType); + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProfessorId)).ReturnsAsync(project.Professor); + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(input.StudentId)).ReturnsAsync(student); + _projectRepositoryMock.Setup(repo => repo.GetStudentProjectsAsync(0, 1, It.IsAny(), false)).ReturnsAsync(new List()); + _activityTypeRepositoryMock.Setup(repo => repo.GetByNoticeIdAsync(It.IsAny())).ReturnsAsync(new List()); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _activityTypeRepositoryMock.Verify(repo => repo.GetByNoticeIdAsync(It.IsAny()), Times.Once); + _projectRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/Project/SubmitProjectTests.cs b/src/Application.Tests/UseCases/Project/SubmitProjectTests.cs new file mode 100644 index 00000000..e0afe742 --- /dev/null +++ b/src/Application.Tests/UseCases/Project/SubmitProjectTests.cs @@ -0,0 +1,118 @@ +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Tests.Mocks; +using Application.UseCases.Project; +using Application.Validation; +using AutoMapper; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Project +{ + public class SubmitProjectTests + { + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private ISubmitProject CreateUseCase() => new SubmitProject(_projectRepositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidProjectId_ReturnsResumedReadProjectOutput() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = EProjectStatus.Opened; + project.Student = StudentMock.MockValidStudent(); + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync(project); + _projectRepositoryMock.Setup(repo => repo.UpdateAsync(project)).ReturnsAsync(project); + _mapperMock.Setup(mapper => mapper.Map(project)).Returns(new ResumedReadProjectOutput()); + + // Act + var result = await useCase.ExecuteAsync(projectId); + + // Assert + Assert.NotNull(result); + Assert.Equal(EProjectStatus.Submitted, project.Status); + Assert.Equal(EProjectStatus.Submitted.GetDescription(), project.StatusDescription); + Assert.NotNull(project.SubmissionDate); + _projectRepositoryMock.Verify(repo => repo.UpdateAsync(project), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(project), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_ProjectIdIsNull_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? projectId = null; + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId)); + } + + [Fact] + public async Task ExecuteAsync_ProjectNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync((Domain.Entities.Project)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId)); + } + + [Fact] + public async Task ExecuteAsync_NoticeNotInRegistrationPhase_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Notice.RegistrationStartDate = DateTime.UtcNow.AddHours(1); + project.Notice.RegistrationEndDate = DateTime.UtcNow.AddHours(2); + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId)); + } + + [Fact] + public async Task ExecuteAsync_ProjectWithoutStudent_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.StudentId = null; + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId)); + } + + [Fact] + public async Task ExecuteAsync_ProjectNotOpened_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = EProjectStatus.Submitted; + project.Student = StudentMock.MockValidStudent(); + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId)); + } + } +} diff --git a/src/Application.Tests/UseCases/Project/UpdateProjectTests.cs b/src/Application.Tests/UseCases/Project/UpdateProjectTests.cs new file mode 100644 index 00000000..6a883439 --- /dev/null +++ b/src/Application.Tests/UseCases/Project/UpdateProjectTests.cs @@ -0,0 +1,257 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Application.Interfaces.UseCases.Project; +using Application.Ports.Project; +using Application.Ports.ProjectActivity; +using Application.Tests.Mocks; +using Application.UseCases.Project; +using Application.Validation; +using AutoMapper; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Microsoft.VisualBasic; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.Project +{ + public class UpdateProjectTests + { + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _studentRepositoryMock = new(); + private readonly Mock _professorRepositoryMock = new(); + private readonly Mock _noticeRepositoryMock = new(); + private readonly Mock _subAreaRepositoryMock = new(); + private readonly Mock _programTypeRepositoryMock = new(); + private readonly Mock _activityTypeRepositoryMock = new(); + private readonly Mock _projectActivityRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IUpdateProject CreateUseCase() => new UpdateProject( + _projectRepositoryMock.Object, + _studentRepositoryMock.Object, + _professorRepositoryMock.Object, + _noticeRepositoryMock.Object, + _subAreaRepositoryMock.Object, + _programTypeRepositoryMock.Object, + _activityTypeRepositoryMock.Object, + _projectActivityRepositoryMock.Object, + _mapperMock.Object + ); + + public static UpdateProjectInput GetValidInput() + { + return new UpdateProjectInput + { + Title = "Sample Project Title", + KeyWord1 = "Keyword1", + KeyWord2 = "Keyword2", + KeyWord3 = "Keyword3", + IsScholarshipCandidate = true, + Objective = "Sample project objective.", + Methodology = "Sample project methodology.", + ExpectedResults = "Sample expected results.", + ActivitiesExecutionSchedule = "Sample execution schedule", + Activities = new List + { + new UpdateProjectActivityInput + { + ActivityId = Guid.NewGuid(), + InformedActivities = 10 + }, + new UpdateProjectActivityInput + { + ActivityId = Guid.NewGuid(), + InformedActivities = 10 + } + }, + ProgramTypeId = Guid.NewGuid(), + SubAreaId = Guid.NewGuid(), + StudentId = Guid.NewGuid() + }; + } + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsResumedReadProjectOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = GetValidInput(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = EProjectStatus.Opened; + var notice = NoticeMock.MockValidNoticeWithId(); + var student = StudentMock.MockValidStudentWithId(); + var activityType = new List { ActivityTypeMock.MockValidActivityType() }; + var projectActivity = ProjectActivityMock.MockValidProjectActivity(); + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(project); + _noticeRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(notice); + _subAreaRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project.SubArea); + _programTypeRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project.ProgramType); + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project.Professor); + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(student); + _projectRepositoryMock.Setup(repo => repo.GetStudentProjectsAsync(0, 1, It.IsAny(), false)).ReturnsAsync(new List()); + _activityTypeRepositoryMock.Setup(repo => repo.GetByNoticeIdAsync(It.IsAny())).ReturnsAsync(activityType); + _projectRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(project); + _projectActivityRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(projectActivity); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new ResumedReadProjectOutput()); + + // Act + var result = await useCase.ExecuteAsync(id, input); + + // Assert + Assert.NotNull(result); + // Add more assertions for the returned result and repository interactions + } + + [Fact] + public async Task ExecuteAsync_ProjectNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = GetValidInput(); + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync((Domain.Entities.Project)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _subAreaRepositoryMock.Verify(repo => repo.GetByIdAsync(input.SubAreaId), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_OutsideRegistrationPeriod_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = GetValidInput(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Notice.RegistrationStartDate = DateTime.UtcNow.AddMinutes(30); // Registration period has ended + project.Notice.RegistrationEndDate = DateTime.UtcNow.AddMinutes(30); // Registration period has ended + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _subAreaRepositoryMock.Verify(repo => repo.GetByIdAsync(input.SubAreaId), Times.Never); + } + + [Theory] + [InlineData(EProjectStatus.Closed)] + [InlineData(EProjectStatus.Canceled)] + public async Task ExecuteAsync_ProjectConcluded_ThrowsUseCaseException(EProjectStatus status) + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = GetValidInput(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = status; + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _subAreaRepositoryMock.Verify(repo => repo.GetByIdAsync(input.SubAreaId), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_SubAreaNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = GetValidInput(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + var notice = NoticeMock.MockValidNoticeWithId(); + var student = StudentMock.MockValidStudentWithId(); + var activityType = new List { ActivityTypeMock.MockValidActivityType() }; + var projectActivity = ProjectActivityMock.MockValidProjectActivity(); + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(project); + _noticeRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(notice); + _subAreaRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync((Domain.Entities.SubArea)null); + _programTypeRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project.ProgramType); + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project.Professor); + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(student); + _projectRepositoryMock.Setup(repo => repo.GetStudentProjectsAsync(0, 1, It.IsAny(), false)).ReturnsAsync(new List()); + _activityTypeRepositoryMock.Setup(repo => repo.GetByNoticeIdAsync(It.IsAny())).ReturnsAsync(activityType); + _projectRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(project); + _projectActivityRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(projectActivity); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _subAreaRepositoryMock.Verify(repo => repo.GetByIdAsync(input.SubAreaId), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_ProgramTypeNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = GetValidInput(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + var notice = NoticeMock.MockValidNoticeWithId(); + var student = StudentMock.MockValidStudentWithId(); + var activityType = new List { ActivityTypeMock.MockValidActivityType() }; + var projectActivity = ProjectActivityMock.MockValidProjectActivity(); + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(project); + _noticeRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(notice); + _subAreaRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project.SubArea); + _programTypeRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync((Domain.Entities.ProgramType)null); + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project.Professor); + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(student); + _projectRepositoryMock.Setup(repo => repo.GetStudentProjectsAsync(0, 1, It.IsAny(), false)).ReturnsAsync(new List()); + _activityTypeRepositoryMock.Setup(repo => repo.GetByNoticeIdAsync(It.IsAny())).ReturnsAsync(activityType); + _projectRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(project); + _projectActivityRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(projectActivity); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _subAreaRepositoryMock.Verify(repo => repo.GetByIdAsync(input.SubAreaId), Times.Once); + _programTypeRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProgramTypeId), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_StudentNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = GetValidInput(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + var notice = NoticeMock.MockValidNoticeWithId(); + var activityType = new List { ActivityTypeMock.MockValidActivityType() }; + var projectActivity = ProjectActivityMock.MockValidProjectActivity(); + + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(project); + _noticeRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(notice); + _subAreaRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project.SubArea); + _programTypeRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project.ProgramType); + _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project.Professor); + _studentRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync((Domain.Entities.Student)null); + _projectRepositoryMock.Setup(repo => repo.GetStudentProjectsAsync(0, 1, It.IsAny(), false)).ReturnsAsync(new List()); + _activityTypeRepositoryMock.Setup(repo => repo.GetByNoticeIdAsync(It.IsAny())).ReturnsAsync(activityType); + _projectRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(project); + _projectActivityRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(projectActivity); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _subAreaRepositoryMock.Verify(repo => repo.GetByIdAsync(input.SubAreaId), Times.Once); + _programTypeRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProgramTypeId), Times.Once); + _studentRepositoryMock.Verify(repo => repo.GetByIdAsync(input.StudentId.Value), Times.Once); + } + } +} diff --git a/src/Application.Tests/UseCases/StudentDocuments/CreateStudentDocumentsTests.cs b/src/Application.Tests/UseCases/StudentDocuments/CreateStudentDocumentsTests.cs index 0d04858a..36ba5baf 100644 --- a/src/Application.Tests/UseCases/StudentDocuments/CreateStudentDocumentsTests.cs +++ b/src/Application.Tests/UseCases/StudentDocuments/CreateStudentDocumentsTests.cs @@ -36,12 +36,12 @@ public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadStudentDocumentsOut ProjectId = Guid.NewGuid(), AgencyNumber = "123456", AccountNumber = "7890", - IdentityDocument = CreateIFormFile(), - CPF = CreateIFormFile(), - Photo3x4 = CreateIFormFile(), - SchoolHistory = CreateIFormFile(), - ScholarCommitmentAgreement = CreateIFormFile(), - AccountOpeningProof = CreateIFormFile() + IdentityDocument = FileMock.CreateIFormFile(), + CPF = FileMock.CreateIFormFile(), + Photo3x4 = FileMock.CreateIFormFile(), + SchoolHistory = FileMock.CreateIFormFile(), + ScholarCommitmentAgreement = FileMock.CreateIFormFile(), + AccountOpeningProof = FileMock.CreateIFormFile() }; _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); @@ -69,12 +69,12 @@ public void ExecuteAsync_DocumentsExist_ThrowsUseCaseException() var input = new CreateStudentDocumentsInput { ProjectId = Guid.NewGuid(), - IdentityDocument = CreateIFormFile(), - CPF = CreateIFormFile(), - Photo3x4 = CreateIFormFile(), - SchoolHistory = CreateIFormFile(), - ScholarCommitmentAgreement = CreateIFormFile(), - AccountOpeningProof = CreateIFormFile() + IdentityDocument = FileMock.CreateIFormFile(), + CPF = FileMock.CreateIFormFile(), + Photo3x4 = FileMock.CreateIFormFile(), + SchoolHistory = FileMock.CreateIFormFile(), + ScholarCommitmentAgreement = FileMock.CreateIFormFile(), + AccountOpeningProof = FileMock.CreateIFormFile() }; var existingDocuments = MockValidStudentDocuments(); @@ -99,12 +99,12 @@ public void ExecuteAsync_ProjectNotFound_ThrowsUseCaseException() var input = new CreateStudentDocumentsInput { ProjectId = Guid.NewGuid(), - IdentityDocument = CreateIFormFile(), - CPF = CreateIFormFile(), - Photo3x4 = CreateIFormFile(), - SchoolHistory = CreateIFormFile(), - ScholarCommitmentAgreement = CreateIFormFile(), - AccountOpeningProof = CreateIFormFile() + IdentityDocument = FileMock.CreateIFormFile(), + CPF = FileMock.CreateIFormFile(), + Photo3x4 = FileMock.CreateIFormFile(), + SchoolHistory = FileMock.CreateIFormFile(), + ScholarCommitmentAgreement = FileMock.CreateIFormFile(), + AccountOpeningProof = FileMock.CreateIFormFile() }; _studentDocumentRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync((Domain.Entities.StudentDocuments)null); @@ -128,12 +128,12 @@ public void ExecuteAsync_ProjectNotAccepted_ThrowsUseCaseException() var input = new CreateStudentDocumentsInput { ProjectId = Guid.NewGuid(), - IdentityDocument = CreateIFormFile(), - CPF = CreateIFormFile(), - Photo3x4 = CreateIFormFile(), - SchoolHistory = CreateIFormFile(), - ScholarCommitmentAgreement = CreateIFormFile(), - AccountOpeningProof = CreateIFormFile() + IdentityDocument = FileMock.CreateIFormFile(), + CPF = FileMock.CreateIFormFile(), + Photo3x4 = FileMock.CreateIFormFile(), + SchoolHistory = FileMock.CreateIFormFile(), + ScholarCommitmentAgreement = FileMock.CreateIFormFile(), + AccountOpeningProof = FileMock.CreateIFormFile() }; _studentDocumentRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync((Domain.Entities.StudentDocuments)null); @@ -146,15 +146,5 @@ public void ExecuteAsync_ProjectNotAccepted_ThrowsUseCaseException() _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), ""), Times.Never); _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); } - - private IFormFile CreateIFormFile() - { - // Create a mock IFormFile, you can adjust the implementation as needed. - var fileMock = new Mock(); - fileMock.Setup(file => file.FileName).Returns("file.txt"); - fileMock.Setup(file => file.Length).Returns(1024); - // Add other setup as needed. - return fileMock.Object; - } } } diff --git a/src/Application.Tests/UseCases/StudentDocuments/UpdateStudentDocumentsTests.cs b/src/Application.Tests/UseCases/StudentDocuments/UpdateStudentDocumentsTests.cs index 0b4fe9bb..fd77d6a5 100644 --- a/src/Application.Tests/UseCases/StudentDocuments/UpdateStudentDocumentsTests.cs +++ b/src/Application.Tests/UseCases/StudentDocuments/UpdateStudentDocumentsTests.cs @@ -40,6 +40,7 @@ public async Task ExecuteAsync_ValidIdAndInput_ReturnsDetailedReadStudentDocumen }; var project = ProjectMock.MockValidProject(); var studentDocuments = MockValidStudentDocuments(); + project.Status = Domain.Entities.Enums.EProjectStatus.Accepted; studentDocuments.Project = project; _studentDocumentRepositoryMock.Setup(r => r.GetByIdAsync(id)).ReturnsAsync(studentDocuments); diff --git a/src/Application/UseCases/Project/ClosePendingProjects.cs b/src/Application/UseCases/Project/ClosePendingProjects.cs index 8557f7cf..28c57cae 100644 --- a/src/Application/UseCases/Project/ClosePendingProjects.cs +++ b/src/Application/UseCases/Project/ClosePendingProjects.cs @@ -1,4 +1,5 @@ using Application.Interfaces.UseCases.Project; +using Domain.Entities.Enums; using Domain.Interfaces.Repositories; namespace Application.UseCases.Project @@ -22,7 +23,26 @@ public async Task ExecuteAsync() // - Projetos rejeitados e com o prazo de recurso vencido; // - Projetos aprovados e com entrega de documentação do aluno vencida; // - Projetos pendentes de documentação e com o prazo de entrega vencido. - return await _projectRepository.ClosePendingAndOverdueProjectsAsync(); + var projects = await _projectRepository.GetPendingAndOverdueProjectsAsync(); + + // Verifica se existem projetos pendentes e com prazo vencido + if (projects.Count == 0) + return "Nenhum projeto pendente e com prazo vencido foi encontrado."; + + // Atualiza status dos projetos + foreach (var project in projects) + { + project.Status = EProjectStatus.Canceled; + project.StatusDescription = "Projeto cancelado automaticamente por falta de ação dentro do prazo estipulado."; + } + + // Atualiza projetos no banco de dados + var cancelledProjects = await _projectRepository.UpdateManyAsync(projects); + if (cancelledProjects != projects.Count) + return $"Ocorreu um erro ao cancelar os projetos pendentes e com prazo vencido. Foram cancelados {cancelledProjects} de {projects.Count} projetos."; + + // Retorna mensagem de sucesso + return $"{projects.Count} projetos pendentes e com prazo de resolução vencido foram cancelados com sucesso."; } } } \ No newline at end of file diff --git a/src/Application/UseCases/Project/GetActivitiesByProjectId.cs b/src/Application/UseCases/Project/GetActivitiesByProjectId.cs index b6a6c9c8..a2cebc8f 100644 --- a/src/Application/UseCases/Project/GetActivitiesByProjectId.cs +++ b/src/Application/UseCases/Project/GetActivitiesByProjectId.cs @@ -3,16 +3,14 @@ using Application.Ports.ProjectActivity; using Application.Interfaces.UseCases.Project; -namespace Application.UseCases.ActivityType +namespace Application.UseCases.Project { public class GetActivitiesByProjectId : IGetActivitiesByProjectId { private readonly IProjectActivityRepository _projectActivityRepository; - private readonly IMapper _mapper; - public GetActivitiesByProjectId(IProjectActivityRepository projectActivityRepository, IMapper mapper) + public GetActivitiesByProjectId(IProjectActivityRepository projectActivityRepository) { _projectActivityRepository = projectActivityRepository; - _mapper = mapper; } public async Task> ExecuteAsync(Guid? projectId) diff --git a/src/Application/UseCases/Project/GetClosedProjects.cs b/src/Application/UseCases/Project/GetClosedProjects.cs index f9154445..7bc10e2e 100644 --- a/src/Application/UseCases/Project/GetClosedProjects.cs +++ b/src/Application/UseCases/Project/GetClosedProjects.cs @@ -34,8 +34,8 @@ public async Task> ExecuteAsync(int skip, int ta var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Obtém id do usuário e id de acordo com perfil logado - var userClaim = userClaims!.Values.FirstOrDefault(); - var actorId = userClaims.Keys.FirstOrDefault(); + var userClaim = userClaims?.Values.FirstOrDefault(); + var actorId = userClaims?.Keys.FirstOrDefault(); // Se o usuário não estiver autenticado, lança uma exceção. UseCaseException.BusinessRuleViolation(userClaim == null || userClaim.Role == null, diff --git a/src/Application/UseCases/Project/GetOpenProjects.cs b/src/Application/UseCases/Project/GetOpenProjects.cs index 3468a050..21236a61 100644 --- a/src/Application/UseCases/Project/GetOpenProjects.cs +++ b/src/Application/UseCases/Project/GetOpenProjects.cs @@ -34,8 +34,8 @@ public async Task> ExecuteAsync(int skip, int ta var userClaims = _tokenAuthenticationService.GetUserAuthenticatedClaims(); // Obtém id do usuário e id de acordo com perfil logado - var userClaim = userClaims!.Values.FirstOrDefault(); - var actorId = userClaims.Keys.FirstOrDefault(); + var userClaim = userClaims?.Values.FirstOrDefault(); + var actorId = userClaims?.Keys.FirstOrDefault(); // Se o usuário não estiver autenticado, lança uma exceção. UseCaseException.BusinessRuleViolation(userClaim == null || userClaim.Role == null, diff --git a/src/Application/UseCases/Project/OpenProject.cs b/src/Application/UseCases/Project/OpenProject.cs index d9bf6f46..9a2f73f1 100644 --- a/src/Application/UseCases/Project/OpenProject.cs +++ b/src/Application/UseCases/Project/OpenProject.cs @@ -119,6 +119,10 @@ public async Task ExecuteAsync(OpenProjectInput input) // Obtém atividades do Edital var noticeActivities = await _activityTypeRepository.GetByNoticeIdAsync(notice.Id); + if (noticeActivities == null || !noticeActivities.Any()) + { + throw UseCaseException.BusinessRuleViolation("Edital não possui atividades cadastradas."); + } // Valida se todas as atividades do projeto foram informadas corretamente List newProjectActivities = new(); diff --git a/src/Domain/Entities/Project.cs b/src/Domain/Entities/Project.cs index 2823940b..16d656f8 100644 --- a/src/Domain/Entities/Project.cs +++ b/src/Domain/Entities/Project.cs @@ -272,7 +272,37 @@ public Project(string? title, string? keyWord1, string? keyWord2, string? keyWor DateTime? submitionDate, DateTime? ressubmissionDate, DateTime? cancellationDate, string? cancellationReason) { - // Inicializar as propriedades + Title = title; + KeyWord1 = keyWord1; + KeyWord2 = keyWord2; + KeyWord3 = keyWord3; + IsScholarshipCandidate = isScholarshipCandidate; + Objective = objective; + Methodology = methodology; + ExpectedResults = expectedResults; + ActivitiesExecutionSchedule = activitiesExecutionSchedule; + StudentId = studentId; + ProgramTypeId = programTypeId; + ProfessorId = professorId; + SubAreaId = subAreaId; + NoticeId = noticeId; + Status = status; + StatusDescription = statusDescription; + AppealObservation = appealDescription; + SubmissionDate = submitionDate; + AppealDate = ressubmissionDate; + CancellationDate = cancellationDate; + CancellationReason = cancellationReason; + } + + public Project(Guid? id, string? title, string? keyWord1, string? keyWord2, string? keyWord3, bool isScholarshipCandidate, + string? objective, string? methodology, string? expectedResults, string? activitiesExecutionSchedule, + Guid? studentId, Guid? programTypeId, Guid? professorId, Guid? subAreaId, Guid? noticeId, + EProjectStatus? status, string? statusDescription, string? appealDescription, + DateTime? submitionDate, DateTime? ressubmissionDate, DateTime? cancellationDate, + string? cancellationReason) + { + Id = id; Title = title; KeyWord1 = keyWord1; KeyWord2 = keyWord2; diff --git a/src/Domain/Interfaces/Repositories/IProjectRepository.cs b/src/Domain/Interfaces/Repositories/IProjectRepository.cs index 7be2dd1a..96f2b14c 100644 --- a/src/Domain/Interfaces/Repositories/IProjectRepository.cs +++ b/src/Domain/Interfaces/Repositories/IProjectRepository.cs @@ -70,6 +70,13 @@ public interface IProjectRepository /// Projeto atualizado. Task UpdateAsync(Project model); + ///

+ /// Atualiza vários projetos. + /// + /// Projetos a serem atualizados. + /// Quantidade de projetos atualizados. + Task UpdateManyAsync(IList projects); + /// /// Obtém projeto pelo Id do Edital informado. /// @@ -87,9 +94,9 @@ public interface IProjectRepository Task> GetProjectsWithCloseReportDueDateAsync(); /// - /// Obtém projetos com alguma pendência e cujo prazo de resolução da pendência esteja vencido. + /// Obtém projetos pendentes e cujo prazo de resolução da pendência esteja vencido. /// - /// Resultado do processo de encerramento dos projetos. - Task ClosePendingAndOverdueProjectsAsync(); + /// Projetos encontrados. + Task> GetPendingAndOverdueProjectsAsync(); } } \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs index ba5ecc31..7c870b2c 100644 --- a/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs +++ b/src/Infrastructure/Persistence/Repositories/ProjectRepository.cs @@ -16,18 +16,24 @@ public ProjectRepository(ApplicationDbContext context) public async Task CreateAsync(Project project) { - _ = _context.Add(project); - _ = await _context.SaveChangesAsync(); + _context.Add(project); + await _context.SaveChangesAsync(); return project; } public async Task UpdateAsync(Project project) { - _ = _context.Update(project); - _ = await _context.SaveChangesAsync(); + _context.Update(project); + await _context.SaveChangesAsync(); return project; } + public async Task UpdateManyAsync(IList projects) + { + _context.Update(projects); + return await _context.SaveChangesAsync(); + } + public async Task DeleteAsync(Guid? id) { Project project = await GetByIdAsync(id) @@ -197,13 +203,13 @@ x.Status is EProjectStatus.Started .ToListAsync(); } - public async Task ClosePendingAndOverdueProjectsAsync() + public async Task> GetPendingAndOverdueProjectsAsync() { // Obtém data atual em UTC para comparação DateTime currentDate = DateTime.UtcNow; // Obtém projetos pendentes e com o prazo de resolução vencido - var projects = await _context.Projects + return await _context.Projects .Include(x => x.Notice) .AsAsyncEnumerable() .Where(x => @@ -216,24 +222,6 @@ public async Task ClosePendingAndOverdueProjectsAsync() // Projetos pendentes de documentação e com o prazo de entrega vencido (x.Status is EProjectStatus.Pending && x.Notice!.SendingDocsEndDate < currentDate)) .ToListAsync(); - - // Verifica se existem projetos pendentes e com prazo vencido - if (projects.Count == 0) - return "Nenhum projeto pendente e com prazo vencido foi encontrado."; - - // Atualiza status dos projetos - projects.ForEach(x => - { - x.Status = EProjectStatus.Canceled; - x.StatusDescription = "Projeto cancelado automaticamente por falta de ação dentro do prazo estipulado."; - }); - - // Atualiza modificações realizadas no banco - _context.UpdateRange(projects); - _ = await _context.SaveChangesAsync(); - - // Retorna mensagem de sucesso - return $"{projects.Count} projetos pendentes e com prazo de resolução vencido foram cancelados com sucesso."; } } } \ No newline at end of file From 1fd41549cb4937bdf1ca4782384e212a61a4c09d Mon Sep 17 00:00:00 2001 From: eduardo Date: Tue, 31 Oct 2023 22:11:47 -0300 Subject: [PATCH 191/201] test: Add ProjectEvaluation usecases tests --- .../Mocks/ProjectEvaluationMock.cs | 23 ++ .../EvaluateAppealProjectTests.cs | 120 +++++++++ .../EvaluateStudentDocumentsTests.cs | 253 ++++++++++++++++++ .../EvaluateSubmissionProjectTests.cs | 128 +++++++++ .../GetEvaluationByProjectIdTests.cs | 73 +++++ .../EvaluateAppealProject.cs | 2 +- .../EvaluateStudentDocuments.cs | 2 +- .../EvaluateSubmissionProject.cs | 17 +- .../GetEvaluationByProjectId.cs | 5 - src/Domain/Entities/Project.cs | 4 +- src/Domain/Entities/ProjectEvaluation.cs | 2 +- 11 files changed, 615 insertions(+), 14 deletions(-) create mode 100644 src/Application.Tests/Mocks/ProjectEvaluationMock.cs create mode 100644 src/Application.Tests/UseCases/ProjectEvaluation/EvaluateAppealProjectTests.cs create mode 100644 src/Application.Tests/UseCases/ProjectEvaluation/EvaluateStudentDocumentsTests.cs create mode 100644 src/Application.Tests/UseCases/ProjectEvaluation/EvaluateSubmissionProjectTests.cs create mode 100644 src/Application.Tests/UseCases/ProjectEvaluation/GetEvaluationByProjectIdTests.cs diff --git a/src/Application.Tests/Mocks/ProjectEvaluationMock.cs b/src/Application.Tests/Mocks/ProjectEvaluationMock.cs new file mode 100644 index 00000000..370b4dad --- /dev/null +++ b/src/Application.Tests/Mocks/ProjectEvaluationMock.cs @@ -0,0 +1,23 @@ +using Domain.Entities; +using Domain.Entities.Enums; + +namespace Application.Tests.Mocks +{ + public static class ProjectEvaluationMock + { + public static ProjectEvaluation MockValidProjectEvaluation() => + new( + Guid.NewGuid(), + true, + Guid.NewGuid(), + EProjectStatus.Accepted, + DateTime.UtcNow, + "Valid Submission Evaluation Description", + EQualification.Doctor, + EScore.Excellent, + EScore.Excellent, + EScore.Excellent, + EScore.Excellent, + 10.0); + } +} \ No newline at end of file diff --git a/src/Application.Tests/UseCases/ProjectEvaluation/EvaluateAppealProjectTests.cs b/src/Application.Tests/UseCases/ProjectEvaluation/EvaluateAppealProjectTests.cs new file mode 100644 index 00000000..30faeaee --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectEvaluation/EvaluateAppealProjectTests.cs @@ -0,0 +1,120 @@ +using Application.Interfaces.UseCases.ProjectEvaluation; +using Application.Ports.Project; +using Application.Ports.ProjectEvaluation; +using Application.Tests.Mocks; +using Application.Validation; +using AutoMapper; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.ProjectEvaluation +{ + public class EvaluateAppealProjectTests + { + private readonly Mock _mapperMock = new(); + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _emailServiceMock = new(); + private readonly Mock _tokenAuthenticationServiceMock = new(); + private readonly Mock _projectEvaluationRepositoryMock = new(); + + private IEvaluateAppealProject CreateUseCase() + { + return new Application.UseCases.ProjectEvaluation.EvaluateAppealProject( + _mapperMock.Object, + _projectRepositoryMock.Object, + _emailServiceMock.Object, + _tokenAuthenticationServiceMock.Object, + _projectEvaluationRepositoryMock.Object + ); + } + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProjectOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = new EvaluateAppealProjectInput + { + AppealEvaluationStatus = 4, // Accepted + AppealEvaluationDescription = "Accepted appeal description", + ProjectId = Guid.NewGuid(), + }; + + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = EProjectStatus.Evaluation; + project.Notice.AppealStartDate = DateTime.Now.AddDays(-1); + project.Notice.AppealEndDate = DateTime.Now.AddDays(1); + + var projectEvaluation = ProjectEvaluationMock.MockValidProjectEvaluation(); + projectEvaluation.Project = project; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectEvaluationRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync(projectEvaluation); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + _emailServiceMock.Setup(service => service.SendProjectNotificationEmailAsync( + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); + _projectEvaluationRepositoryMock.Setup(repo => repo.UpdateAsync(It.IsAny())).ReturnsAsync(projectEvaluation); + _projectRepositoryMock.Setup(repo => repo.UpdateAsync(It.IsAny())).ReturnsAsync(project); + _mapperMock.Setup(mapper => mapper.Map(project)).Returns(new DetailedReadProjectOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _projectEvaluationRepositoryMock.Verify(repo => repo.GetByProjectIdAsync(input.ProjectId), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProjectId), Times.Once); + _emailServiceMock.Verify(service => service.SendProjectNotificationEmailAsync( + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Once); + _projectEvaluationRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Once); + _projectRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(project), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_UserNotEvaluator_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new EvaluateAppealProjectInput + { + AppealEvaluationStatus = 4, // Accepted + AppealEvaluationDescription = "Accepted appeal description", + ProjectId = Guid.NewGuid(), + }; + + var userClaims = ClaimsMock.MockValidClaims(); + userClaims.Values.First().Role = ERole.STUDENT; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + + [Fact] + public async Task ExecuteAsync_AppealStatusNotInformed_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = new EvaluateAppealProjectInput + { + AppealEvaluationStatus = null, + AppealEvaluationDescription = "Appeal description", + ProjectId = Guid.NewGuid(), + }; + + var userClaims = ClaimsMock.MockValidClaims(); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + } +} diff --git a/src/Application.Tests/UseCases/ProjectEvaluation/EvaluateStudentDocumentsTests.cs b/src/Application.Tests/UseCases/ProjectEvaluation/EvaluateStudentDocumentsTests.cs new file mode 100644 index 00000000..9e86b910 --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectEvaluation/EvaluateStudentDocumentsTests.cs @@ -0,0 +1,253 @@ +using Application.Interfaces.UseCases.ProjectEvaluation; +using Application.Ports.Project; +using Application.Ports.ProjectEvaluation; +using Application.Tests.Mocks; +using Application.UseCases.ProjectEvaluation; +using Application.Validation; +using AutoMapper; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.ProjectEvaluation +{ + public class EvaluateStudentDocumentsTests + { + private readonly Mock _mapperMock = new(); + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _emailServiceMock = new(); + private readonly Mock _tokenAuthenticationServiceMock = new(); + private readonly Mock _projectEvaluationRepositoryMock = new(); + + private IEvaluateStudentDocuments CreateUseCase() => new EvaluateStudentDocuments( + _mapperMock.Object, + _projectRepositoryMock.Object, + _emailServiceMock.Object, + _tokenAuthenticationServiceMock.Object, + _projectEvaluationRepositoryMock.Object + ); + + public static EvaluateStudentDocumentsInput GetValidInput() + { + var input = new EvaluateStudentDocumentsInput + { + IsDocumentsApproved = true, + DocumentsEvaluationDescription = "Documents approved", + ProjectId = Guid.NewGuid(), + }; + + return input; + } + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProjectOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = EProjectStatus.DocumentAnalysis; + project.Notice.SendingDocsStartDate = DateTime.UtcNow.AddDays(-1); + project.Notice.SendingDocsEndDate = DateTime.UtcNow.AddDays(1); + var projectEvaluation = ProjectEvaluationMock.MockValidProjectEvaluation(); + projectEvaluation.Project = project; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + _projectEvaluationRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync(projectEvaluation); + _emailServiceMock.Setup(service => service.SendProjectNotificationEmailAsync( + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadProjectOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + // Add additional assertions here + } + + [Fact] + public async Task ExecuteAsync_UserNotEvaluator_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var userClaims = ClaimsMock.MockValidClaims(); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NotInformedIsDocumentsApproved_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var userClaims = ClaimsMock.MockValidClaims(); + + input.IsDocumentsApproved = null; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + + [Fact] + public async Task ExecuteAsync_DocumentsEvaluationDescriptionNotInformed_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var userClaims = ClaimsMock.MockValidClaims(); + + input.DocumentsEvaluationDescription = ""; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + + [Fact] + public async Task ExecuteAsync_AvaliadorIsProfessorOrientador_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var userClaims = ClaimsMock.MockValidClaims(); + + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + var projectEvaluation = ProjectEvaluationMock.MockValidProjectEvaluation(); + projectEvaluation.Project = project; + projectEvaluation.Project.ProfessorId = userClaims.Values.First().Id; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + _projectEvaluationRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync(projectEvaluation); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + + [Fact] + public async Task ExecuteAsync_ProjectNotInDocumentAnalysisPhase_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var userClaims = ClaimsMock.MockValidClaims(); + + var project = ProjectMock.MockValidProject(); + var projectEvaluation = ProjectEvaluationMock.MockValidProjectEvaluation(); + project.Status = EProjectStatus.Canceled; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + _projectEvaluationRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync(projectEvaluation); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + + [Fact] + public async Task ExecuteAsync_NotInDocumentAnalysisPhase_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var userClaims = ClaimsMock.MockValidClaims(); + + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + var projectEvaluation = ProjectEvaluationMock.MockValidProjectEvaluation(); + project.Notice.SendingDocsStartDate = DateTime.UtcNow.AddDays(1); // Set a future date + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + _projectEvaluationRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync(projectEvaluation); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + + [Fact] + public async Task ExecuteAsync_ProjectNotInDatabase_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var userClaims = ClaimsMock.MockValidClaims(); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync((Domain.Entities.Project)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + + [Fact] + public async Task ExecuteAsync_SuccessfulEvaluationApprovedStatus_ReturnsDetailedReadProjectOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = EProjectStatus.DocumentAnalysis; + project.Notice.SendingDocsStartDate = DateTime.UtcNow.AddDays(-1); + project.Notice.SendingDocsEndDate = DateTime.UtcNow.AddDays(1); + var projectEvaluation = ProjectEvaluationMock.MockValidProjectEvaluation(); + projectEvaluation.Project = project; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + _projectEvaluationRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync(projectEvaluation); + _emailServiceMock.Setup(service => service.SendProjectNotificationEmailAsync( + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadProjectOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + } + + [Fact] + public async Task ExecuteAsync_SuccessfulEvaluationNotApprovedStatus_ReturnsDetailedReadProjectOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = EProjectStatus.DocumentAnalysis; + project.Notice.SendingDocsStartDate = DateTime.UtcNow.AddDays(-1); + project.Notice.SendingDocsEndDate = DateTime.UtcNow.AddDays(1); + var projectEvaluation = ProjectEvaluationMock.MockValidProjectEvaluation(); + projectEvaluation.Project = project; + input.IsDocumentsApproved = false; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + _projectEvaluationRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync(projectEvaluation); + _emailServiceMock.Setup(service => service.SendProjectNotificationEmailAsync( + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadProjectOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + } + } +} diff --git a/src/Application.Tests/UseCases/ProjectEvaluation/EvaluateSubmissionProjectTests.cs b/src/Application.Tests/UseCases/ProjectEvaluation/EvaluateSubmissionProjectTests.cs new file mode 100644 index 00000000..bab61c47 --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectEvaluation/EvaluateSubmissionProjectTests.cs @@ -0,0 +1,128 @@ +using Xunit; +using Moq; +using AutoMapper; +using System; +using System.Collections.Generic; +using Application.UseCases.ProjectEvaluation; +using Application.Ports.Project; +using Application.Ports.ProjectEvaluation; +using Application.Validation; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Application.Tests.Mocks; +using Application.Interfaces.UseCases.ProjectEvaluation; +using Application.Ports.ProjectActivity; +using Domain.Entities; + +namespace Application.Tests.UseCases.ProjectEvaluation +{ + public class EvaluateSubmissionProjectTests + { + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _tokenAuthenticationServiceMock = new(); + private readonly Mock _projectActivityRepositoryMock = new(); + private readonly Mock _activityTypeRepositoryMock = new(); + private readonly Mock _emailServiceMock = new(); + private readonly Mock _projectEvaluationRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IEvaluateSubmissionProject CreateUseCase() => new EvaluateSubmissionProject( + _mapperMock.Object, + _projectRepositoryMock.Object, + _tokenAuthenticationServiceMock.Object, + _projectActivityRepositoryMock.Object, + _activityTypeRepositoryMock.Object, + _emailServiceMock.Object, + _projectEvaluationRepositoryMock.Object + ); + + public static EvaluateSubmissionProjectInput GetValidInput() + { + return new EvaluateSubmissionProjectInput + { + ProjectId = Guid.NewGuid(), + IsProductivityFellow = true, + SubmissionEvaluationStatus = 1, + SubmissionEvaluationDescription = "This is a valid description.", + Activities = new List + { + new EvaluateProjectActivityInput + { + ActivityId = Guid.NewGuid(), + FoundActivities = 3 + }, + }, + Qualification = 1, + ProjectProposalObjectives = 1, + AcademicScientificProductionCoherence = 2, + ProposalMethodologyAdaptation = 3, + EffectiveContributionToResearch = 4 + }; + } + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProjectOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Notice.EvaluationStartDate = DateTime.Now.AddDays(-1); + project.Notice.EvaluationEndDate = DateTime.Now.AddDays(1); + project.Status = EProjectStatus.Submitted; + var activityTypes = new List() { ActivityTypeMock.MockValidActivityType() }; + var projectActivities = new List() { ProjectActivityMock.MockValidProjectActivity() }; + + // Setup Mocks as needed + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectEvaluationRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync((Domain.Entities.ProjectEvaluation)null); + _projectRepositoryMock.Setup>(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + _activityTypeRepositoryMock.Setup(repo => repo.GetByNoticeIdAsync(It.IsAny())).ReturnsAsync(activityTypes); + _projectActivityRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(It.IsAny())).ReturnsAsync(projectActivities); + _projectActivityRepositoryMock.Setup(repo => repo.UpdateAsync(It.IsAny())).ReturnsAsync(ProjectActivityMock.MockValidProjectActivity()); + _projectEvaluationRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(ProjectEvaluationMock.MockValidProjectEvaluation()); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadProjectOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + } + + [Fact] + public async Task ExecuteAsync_UserNotEvaluator_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + + // Set user claims to a non-evaluator role + var userClaims = ClaimsMock.MockValidClaims(); + userClaims.Values.FirstOrDefault().Role = ERole.STUDENT; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + + [Fact] + public async Task ExecuteAsync_ProjectAlreadyEvaluated_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var projectEvaluation = ProjectEvaluationMock.MockValidProjectEvaluation(); + var userClaims = ClaimsMock.MockValidClaims(); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectEvaluationRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(input.ProjectId)).ReturnsAsync(projectEvaluation); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + } +} diff --git a/src/Application.Tests/UseCases/ProjectEvaluation/GetEvaluationByProjectIdTests.cs b/src/Application.Tests/UseCases/ProjectEvaluation/GetEvaluationByProjectIdTests.cs new file mode 100644 index 00000000..5e393312 --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectEvaluation/GetEvaluationByProjectIdTests.cs @@ -0,0 +1,73 @@ +using System; +using System.Threading.Tasks; +using Application.Interfaces.UseCases.ProjectEvaluation; +using Application.Ports.ProjectEvaluation; +using Application.Tests.Mocks; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.ProjectEvaluation +{ + public class GetEvaluationByProjectIdTests + { + private readonly Mock _mapperMock = new Mock(); + private readonly Mock _repositoryMock = new Mock(); + + private IGetEvaluationByProjectId CreateUseCase() => new Application.UseCases.ProjectEvaluation.GetEvaluationByProjectId( + _mapperMock.Object, + _repositoryMock.Object + ); + + [Fact] + public async Task ExecuteAsync_ValidProjectId_ReturnsDetailedReadProjectEvaluationOutput() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + var projectEvaluationEntity = ProjectEvaluationMock.MockValidProjectEvaluation(); + + _repositoryMock.Setup(repo => repo.GetByProjectIdAsync(projectId)).ReturnsAsync(projectEvaluationEntity); + _mapperMock.Setup(mapper => mapper.Map(projectEvaluationEntity)).Returns(new DetailedReadProjectEvaluationOutput()); + + // Act + var result = await useCase.ExecuteAsync(projectId); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByProjectIdAsync(projectId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(projectEvaluationEntity), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NullProjectId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? projectId = null; + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId)); + } + + [Fact] + public async Task ExecuteAsync_ProjectNotFound_ReturnsNull() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + + _repositoryMock.Setup(repo => repo.GetByProjectIdAsync(projectId)).ReturnsAsync((Domain.Entities.ProjectEvaluation)null); + + // Act + var result = await useCase.ExecuteAsync(projectId); + + // Assert + Assert.Null(result); + _repositoryMock.Verify(repo => repo.GetByProjectIdAsync(projectId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + } +} diff --git a/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs b/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs index 13eebf61..b310b8c6 100644 --- a/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs +++ b/src/Application/UseCases/ProjectEvaluation/EvaluateAppealProject.cs @@ -40,7 +40,7 @@ public async Task ExecuteAsync(EvaluateAppealProjectI var userClaim = userClaims!.Values.FirstOrDefault(); // Verifica se o usuário logado é um avaliador. - UseCaseException.BusinessRuleViolation(userClaim!.Role != ERole.ADMIN || userClaim.Role != ERole.PROFESSOR, + UseCaseException.BusinessRuleViolation(userClaim!.Role != ERole.ADMIN && userClaim.Role != ERole.PROFESSOR, "O usuário não é um avaliador."); // Verifica se o status da avaliação foi informado. diff --git a/src/Application/UseCases/ProjectEvaluation/EvaluateStudentDocuments.cs b/src/Application/UseCases/ProjectEvaluation/EvaluateStudentDocuments.cs index 949e3dc5..41f6addb 100644 --- a/src/Application/UseCases/ProjectEvaluation/EvaluateStudentDocuments.cs +++ b/src/Application/UseCases/ProjectEvaluation/EvaluateStudentDocuments.cs @@ -41,7 +41,7 @@ public async Task ExecuteAsync(EvaluateStudentDocumen var actorId = userClaims.Keys.FirstOrDefault(); // Verifica se o usuário logado é um avaliador. - UseCaseException.BusinessRuleViolation(userClaim!.Role != ERole.ADMIN || userClaim.Role != ERole.PROFESSOR, + UseCaseException.BusinessRuleViolation(userClaim!.Role != ERole.ADMIN && userClaim.Role != ERole.PROFESSOR, "O usuário não é um avaliador."); // Verifica se o status da avaliação foi informado. diff --git a/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs index 320cfd20..3e3f697b 100644 --- a/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -47,8 +47,7 @@ public async Task ExecuteAsync(EvaluateSubmissionProj var actorId = userClaims.Keys.FirstOrDefault(); // Verifica se o usuário logado é um avaliador. - UseCaseException.BusinessRuleViolation(userClaim!.Role != ERole.ADMIN - || userClaim.Role != ERole.PROFESSOR, + UseCaseException.BusinessRuleViolation(userClaim!.Role != ERole.ADMIN && userClaim.Role != ERole.PROFESSOR, "O usuário não é um avaliador."); // Verifica se já existe alguma avaliação para o projeto. @@ -70,7 +69,7 @@ public async Task ExecuteAsync(EvaluateSubmissionProj // Verifica se o edital está em fase de avaliação. UseCaseException.BusinessRuleViolation(project.Notice?.EvaluationStartDate > DateTime.UtcNow || project.Notice?.EvaluationEndDate < DateTime.UtcNow, - "Edital encerrado."); + "Fora do intervalo de avaliação do edital."); // Verifica se o status da avaliação foi informado. UseCaseException.NotInformedParam(input.SubmissionEvaluationStatus is null, @@ -92,6 +91,8 @@ public async Task ExecuteAsync(EvaluateSubmissionProj // Obtém atividades do Edital var noticeActivities = await _activityTypeRepository.GetByNoticeIdAsync(project.Notice!.Id); + if (noticeActivities is null || noticeActivities.Count == 0) + throw UseCaseException.BusinessRuleViolation("Não foram encontradas atividades para o edital."); // Obtém atividades do projeto var projectActivities = await _projectActivityRepository.GetByProjectIdAsync(project.Id); @@ -166,12 +167,20 @@ private static T TryCastEnum(object? value) try { UseCaseException.NotInformedParam(value is null, typeof(T).ToString()); - return (T)Enum.Parse(typeof(T), value?.ToString()!); + foreach (T enumValue in Enum.GetValues(typeof(T))) + { + if (enumValue.GetHashCode().Equals(value)) + { + return (T)Enum.Parse(typeof(T), value?.ToString()!); + } + } } catch (Exception) { throw UseCaseException.BusinessRuleViolation($"Não foi possível converter o valor {value} para o tipo {typeof(T)}."); } + + throw UseCaseException.BusinessRuleViolation($"Valor {value} fora do intervalo permitido para o tipo {typeof(T)}."); } } } \ No newline at end of file diff --git a/src/Application/UseCases/ProjectEvaluation/GetEvaluationByProjectId.cs b/src/Application/UseCases/ProjectEvaluation/GetEvaluationByProjectId.cs index a04c84c3..406096d7 100644 --- a/src/Application/UseCases/ProjectEvaluation/GetEvaluationByProjectId.cs +++ b/src/Application/UseCases/ProjectEvaluation/GetEvaluationByProjectId.cs @@ -21,13 +21,8 @@ public GetEvaluationByProjectId(IMapper mapper, public async Task ExecuteAsync(Guid? projectId) { - // Verifica se Id foi informado. UseCaseException.NotInformedParam(projectId is null, nameof(projectId)); - - // Obtém a avaliação do projeto pelo Id do projeto. var entity = await _repository.GetByProjectIdAsync(projectId); - - // Converte e retorna o resultado. return _mapper.Map(entity); } } diff --git a/src/Domain/Entities/Project.cs b/src/Domain/Entities/Project.cs index 16d656f8..de7e23fa 100644 --- a/src/Domain/Entities/Project.cs +++ b/src/Domain/Entities/Project.cs @@ -161,7 +161,7 @@ public Guid? ProgramTypeId public Guid? ProfessorId { get => _professorId; - private set + set { { EntityExceptionValidation.When(value == null, @@ -189,7 +189,7 @@ public Guid? SubAreaId public Guid? NoticeId { get => _noticeId; - private set + set { { EntityExceptionValidation.When(value == null, diff --git a/src/Domain/Entities/ProjectEvaluation.cs b/src/Domain/Entities/ProjectEvaluation.cs index e071d26f..a1e1f0db 100644 --- a/src/Domain/Entities/ProjectEvaluation.cs +++ b/src/Domain/Entities/ProjectEvaluation.cs @@ -140,7 +140,7 @@ public DateTime? DocumentsEvaluationDate ///

public string? DocumentsEvaluationDescription { get; set; } - public virtual Project? Project { get; } + public virtual Project? Project { get; set; } public virtual User? SubmissionEvaluator { get; } public virtual User? AppealEvaluator { get; } public virtual User? DocumentsEvaluator { get; } From 47e057e8c35603b981e8054b8d193dfe38ccbae9 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 1 Nov 2023 10:47:37 -0300 Subject: [PATCH 192/201] test: Add ProjectFinalReport usecases tests --- .../Mocks/ProjectFinalReportMock.cs | 25 ++ .../Project/GenerateCertificateTests.cs | 4 +- .../CreateProjectFinalReportTests.cs | 223 ++++++++++++++++++ .../DeleteProjectFinalReportTests.cs | 58 +++++ .../GetProjectFinalReportByIdTests.cs | 70 ++++++ .../GetProjectFinalReportByProjectIdTests.cs | 58 +++++ .../UpdateProjectFinalReportTests.cs | 103 ++++++++ .../CreateProjectFinalReport.cs | 26 +- .../DeleteProjectFinalReport.cs | 5 - src/Domain/Entities/ProjectFinalReport.cs | 9 + 10 files changed, 553 insertions(+), 28 deletions(-) create mode 100644 src/Application.Tests/Mocks/ProjectFinalReportMock.cs create mode 100644 src/Application.Tests/UseCases/ProjectFinalReport/CreateProjectFinalReportTests.cs create mode 100644 src/Application.Tests/UseCases/ProjectFinalReport/DeleteProjectFinalReportTests.cs create mode 100644 src/Application.Tests/UseCases/ProjectFinalReport/GetProjectFinalReportByIdTests.cs create mode 100644 src/Application.Tests/UseCases/ProjectFinalReport/GetProjectFinalReportByProjectIdTests.cs create mode 100644 src/Application.Tests/UseCases/ProjectFinalReport/UpdateProjectFinalReportTests.cs diff --git a/src/Application.Tests/Mocks/ProjectFinalReportMock.cs b/src/Application.Tests/Mocks/ProjectFinalReportMock.cs new file mode 100644 index 00000000..fff03133 --- /dev/null +++ b/src/Application.Tests/Mocks/ProjectFinalReportMock.cs @@ -0,0 +1,25 @@ +using Domain.Entities; + +namespace Application.Tests.Mocks +{ + public static class ProjectFinalReportMock + { + public static ProjectFinalReport MockValidProjectFinalReport() + { + return new ProjectFinalReport(Guid.NewGuid(), Guid.NewGuid()) + { + ReportUrl = "https://example.com/report", + SendDate = DateTime.UtcNow + }; + } + + public static ProjectFinalReport MockValidProjectFinalReportWithId() + { + return new ProjectFinalReport(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()) + { + ReportUrl = "https://example.com/report", + SendDate = DateTime.UtcNow + }; + } + } +} \ No newline at end of file diff --git a/src/Application.Tests/UseCases/Project/GenerateCertificateTests.cs b/src/Application.Tests/UseCases/Project/GenerateCertificateTests.cs index 59d3e121..cc30d81f 100644 --- a/src/Application.Tests/UseCases/Project/GenerateCertificateTests.cs +++ b/src/Application.Tests/UseCases/Project/GenerateCertificateTests.cs @@ -91,7 +91,7 @@ public async Task ExecuteAsync_ProjectWithoutFinalReport_ClosesProjectAndSuspend _projectRepositoryMock.Setup(repo => repo.GetProjectByNoticeAsync(It.IsAny())).ReturnsAsync(projects); _userRepositoryMock.Setup(repo => repo.GetCoordinatorAsync()).ReturnsAsync(coordinator); _projectRepositoryMock.Setup(repo => repo.UpdateAsync(It.IsAny())).ReturnsAsync((Domain.Entities.Project project) => project); - _projectReportRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(It.IsAny())).ReturnsAsync((ProjectFinalReport)null); + _projectReportRepositoryMock.Setup(repo => repo.GetByProjectIdAsync(It.IsAny())).ReturnsAsync((Domain.Entities.ProjectFinalReport)null); _professorRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync((Domain.Entities.Professor)null); // Act @@ -117,7 +117,7 @@ public async Task ExecuteAsync_ProjectWithFinalReport_GeneratesCertificateAndClo var coordinator = UserMock.MockValidUser(); var notice = NoticeMock.MockValidNoticeWithId(); var projects = new[] { ProjectMock.MockValidProjectProfessorAndNotice() }; - var projectFinalReport = new ProjectFinalReport(Guid.NewGuid(), Guid.NewGuid()); + var projectFinalReport = new Domain.Entities.ProjectFinalReport(Guid.NewGuid(), Guid.NewGuid()); var file = FileMock.CreateIFormFile(); var path = "./Samples/sample.pdf"; var bytes = File.ReadAllBytes(path); diff --git a/src/Application.Tests/UseCases/ProjectFinalReport/CreateProjectFinalReportTests.cs b/src/Application.Tests/UseCases/ProjectFinalReport/CreateProjectFinalReportTests.cs new file mode 100644 index 00000000..f8465669 --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectFinalReport/CreateProjectFinalReportTests.cs @@ -0,0 +1,223 @@ +using Application.Interfaces.UseCases.ProjectFinalReport; +using Application.Ports.ProjectFinalReport; +using Application.Tests.Mocks; +using Application.UseCases.ProjectFinalReport; +using Application.Validation; +using AutoMapper; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Microsoft.AspNetCore.Http; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.ProjectFinalReport +{ + public class CreateProjectFinalReportTests + { + private readonly Mock _projectReportRepositoryMock = new(); + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _storageFileServiceMock = new(); + private readonly Mock _tokenAuthenticationServiceMock = new(); + private readonly Mock _mapperMock = new(); + + private ICreateProjectFinalReport CreateUseCase() => new CreateProjectFinalReport( + _projectReportRepositoryMock.Object, + _projectRepositoryMock.Object, + _storageFileServiceMock.Object, + _tokenAuthenticationServiceMock.Object, + _mapperMock.Object + ); + + public static CreateProjectFinalReportInput GetValidInput() + { + // Create and return a valid input for testing + var input = new CreateProjectFinalReportInput + { + ProjectId = Guid.NewGuid(), + ReportFile = FileMock.CreateIFormFile() + }; + return input; + } + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProjectFinalReportOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + + var userClaims = ClaimsMock.MockValidClaims(); + var userClaim = userClaims.Values.FirstOrDefault(); + var actorId = userClaims.Keys.FirstOrDefault(); + var projectFinalReport = ProjectFinalReportMock.MockValidProjectFinalReport(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = EProjectStatus.Started; + project.ProfessorId = actorId; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + _storageFileServiceMock.Setup(service => service.UploadFileAsync(input.ReportFile, null)).ReturnsAsync("file-url"); + _projectReportRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())).ReturnsAsync(projectFinalReport); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadProjectFinalReportOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProjectId), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(input.ReportFile, null), Times.Once); + _projectReportRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_ProjectNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var userClaims = ClaimsMock.MockValidClaims(); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync((Domain.Entities.Project)null); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProjectId), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), null), Times.Never); + + _projectReportRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_ProjectDeleted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.DeactivateEntity(); + input.ProjectId = project.Id; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProjectId), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), null), Times.Never); + _projectReportRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_ProjectNotStarted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = EProjectStatus.Opened; + input.ProjectId = project.Id; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProjectId), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), null), Times.Never); + _projectReportRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_ActorNotStudentOrProfessor_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = EProjectStatus.Started; + input.ProjectId = project.Id; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProjectId), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), null), Times.Never); + _projectReportRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_ReportOutsideDeadline_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = EProjectStatus.Started; + project.Notice!.FinalReportDeadline = DateTime.UtcNow.AddMonths(-7); + input.ProjectId = project.Id; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProjectId), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), null), Times.Never); + _projectReportRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + + [Fact] + public async Task ExecuteAsync_ReportFileInvalid_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + input.ReportFile = null; + + var userClaims = ClaimsMock.MockValidClaims(); + var userClaim = userClaims.Values.FirstOrDefault(); + var actorId = userClaims.Keys.FirstOrDefault(); + var projectFinalReport = ProjectFinalReportMock.MockValidProjectFinalReport(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = EProjectStatus.Started; + project.ProfessorId = actorId; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + _storageFileServiceMock.Setup(service => service.UploadFileAsync(input.ReportFile, null)).ReturnsAsync((string)null); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProjectId), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(input.ReportFile, null), Times.Never); + _projectReportRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/ProjectFinalReport/DeleteProjectFinalReportTests.cs b/src/Application.Tests/UseCases/ProjectFinalReport/DeleteProjectFinalReportTests.cs new file mode 100644 index 00000000..d10e6149 --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectFinalReport/DeleteProjectFinalReportTests.cs @@ -0,0 +1,58 @@ +using Application.Interfaces.UseCases.ProjectFinalReport; +using Application.Ports.ProjectFinalReport; +using Application.Tests.Mocks; +using Application.UseCases.ProjectFinalReport; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.ProjectFinalReport +{ + public class DeleteProjectFinalReportTests + { + private readonly Mock _projectReportRepositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IDeleteProjectFinalReport CreateUseCase() => new DeleteProjectFinalReport( + _projectReportRepositoryMock.Object, + _mapperMock.Object + ); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsDetailedReadProjectFinalReportOutput() + { + // Arrange + var useCase = CreateUseCase(); + var projectId = Guid.NewGuid(); + var projectFinalReport = ProjectFinalReportMock.MockValidProjectFinalReport(); + projectFinalReport.ProjectId = projectId; + var detailedReadOutput = new DetailedReadProjectFinalReportOutput(); + + _projectReportRepositoryMock.Setup(repo => repo.DeleteAsync(projectId)).ReturnsAsync(projectFinalReport); + _mapperMock.Setup(mapper => mapper.Map(projectFinalReport)).Returns(detailedReadOutput); + + // Act + var result = await useCase.ExecuteAsync(projectId); + + // Assert + Assert.NotNull(result); + Assert.Equal(detailedReadOutput, result); + _projectReportRepositoryMock.Verify(repo => repo.DeleteAsync(projectId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(projectFinalReport), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(null)); + _projectReportRepositoryMock.Verify(repo => repo.DeleteAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/ProjectFinalReport/GetProjectFinalReportByIdTests.cs b/src/Application.Tests/UseCases/ProjectFinalReport/GetProjectFinalReportByIdTests.cs new file mode 100644 index 00000000..474588c5 --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectFinalReport/GetProjectFinalReportByIdTests.cs @@ -0,0 +1,70 @@ +using Application.Interfaces.UseCases.ProjectFinalReport; +using Application.Ports.ProjectFinalReport; +using Application.Tests.Mocks; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.ProjectFinalReport +{ + public class GetProjectFinalReportByIdTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetProjectFinalReportById CreateUseCase() => + new Application.UseCases.ProjectFinalReport.GetProjectFinalReportById(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsDetailedReadProjectFinalReportOutput() + { + // Arrange + var useCase = CreateUseCase(); + var projectFinalReport = ProjectFinalReportMock.MockValidProjectFinalReportWithId(); + var id = projectFinalReport.Id; + var detailedReadProjectFinalReportOutput = new DetailedReadProjectFinalReportOutput(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(projectFinalReport); + _mapperMock.Setup(mapper => mapper.Map(projectFinalReport)) + .Returns(detailedReadProjectFinalReportOutput); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + Assert.Same(detailedReadProjectFinalReportOutput, result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(projectFinalReport), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id)); + } + + [Fact] + public async Task ExecuteAsync_NonExistentId_ReturnsNull() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync((Domain.Entities.ProjectFinalReport)null); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.Null(result); + } + } +} diff --git a/src/Application.Tests/UseCases/ProjectFinalReport/GetProjectFinalReportByProjectIdTests.cs b/src/Application.Tests/UseCases/ProjectFinalReport/GetProjectFinalReportByProjectIdTests.cs new file mode 100644 index 00000000..5379b7b3 --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectFinalReport/GetProjectFinalReportByProjectIdTests.cs @@ -0,0 +1,58 @@ +using Application.Interfaces.UseCases.ProjectFinalReport; +using Application.Ports.ProjectFinalReport; +using Application.Tests.Mocks; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.ProjectFinalReport +{ + public class GetProjectFinalReportByProjectIdTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetProjectFinalReportByProjectId CreateUseCase() => new Application.UseCases.ProjectFinalReport.GetProjectFinalReportByProjectId( + _repositoryMock.Object, + _mapperMock.Object + ); + + [Fact] + public async Task ExecuteAsync_ValidProjectId_ReturnsDetailedReadProjectFinalReportOutput() + { + // Arrange + var useCase = CreateUseCase(); + var report = ProjectFinalReportMock.MockValidProjectFinalReportWithId(); + var projectId = report.ProjectId; + + _repositoryMock.Setup(repo => repo.GetByProjectIdAsync(projectId)).ReturnsAsync(report); + _mapperMock.Setup(mapper => mapper.Map(report)).Returns(new DetailedReadProjectFinalReportOutput()); + + // Act + var result = await useCase.ExecuteAsync(projectId); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByProjectIdAsync(It.IsAny()), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(report), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NullProjectId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? projectId = null; + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(projectId)); + + // Assert + UseCaseException.NotInformedParam(It.IsAny(), It.IsAny()); // Make sure this method is called with any boolean and string. + _repositoryMock.Verify(repo => repo.GetByProjectIdAsync(It.IsAny()), Times.Never); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Never); + } + } +} diff --git a/src/Application.Tests/UseCases/ProjectFinalReport/UpdateProjectFinalReportTests.cs b/src/Application.Tests/UseCases/ProjectFinalReport/UpdateProjectFinalReportTests.cs new file mode 100644 index 00000000..daa260d3 --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectFinalReport/UpdateProjectFinalReportTests.cs @@ -0,0 +1,103 @@ +using Xunit; +using Moq; +using Application.UseCases.ProjectFinalReport; +using Application.Interfaces.UseCases.ProjectFinalReport; +using Application.Ports.ProjectFinalReport; +using System; +using System.Threading.Tasks; +using Application.Validation; +using AutoMapper; +using Domain.Entities; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Domain.Entities.Enums; +using Application.Tests.Mocks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Http; + +namespace Application.Tests.UseCases.ProjectFinalReport +{ + public class UpdateProjectFinalReportTests + { + private readonly Mock _projectReportRepositoryMock = new(); + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _storageFileServiceMock = new(); + private readonly Mock _tokenAuthenticationServiceMock = new(); + private readonly Mock _mapperMock = new(); + + private IUpdateProjectFinalReport CreateUseCase() => new UpdateProjectFinalReport( + _projectReportRepositoryMock.Object, + _projectRepositoryMock.Object, + _storageFileServiceMock.Object, + _tokenAuthenticationServiceMock.Object, + _mapperMock.Object + ); + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProjectFinalReportOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateProjectFinalReportInput + { + ReportFile = FileMock.CreateIFormFile() + }; + var report = ProjectFinalReportMock.MockValidProjectFinalReportWithId(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = EProjectStatus.Started; + + var userClaims = ClaimsMock.MockValidClaims(); + project.ProfessorId = userClaims.Keys.FirstOrDefault(); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectReportRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(report); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(It.IsAny())).ReturnsAsync(project); + _storageFileServiceMock.Setup(service => service.UploadFileAsync(It.IsAny(), It.IsAny())); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())) + .Returns(new DetailedReadProjectFinalReportOutput()); + + // Act + var result = await useCase.ExecuteAsync(id, input); + + // Assert + Assert.NotNull(result); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _projectReportRepositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(It.IsAny()), Times.Once); + _storageFileServiceMock.Verify(service => service.UploadFileAsync(It.IsAny(), It.IsAny()), Times.Once); + _projectReportRepositoryMock.Verify(repo => repo.UpdateAsync(It.IsAny()), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NoId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + var input = new UpdateProjectFinalReportInput + { + ReportFile = FileMock.CreateIFormFile() + }; + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + } + + [Fact] + public async Task ExecuteAsync_NoReportFile_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var input = new UpdateProjectFinalReportInput + { + ReportFile = null // No report file provided + }; + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + } + } +} diff --git a/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs b/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs index 6edf8b9f..03a03970 100644 --- a/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs +++ b/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs @@ -40,9 +40,9 @@ public async Task ExecuteAsync(CreateProje // Cria entidade a partir do modelo Domain.Entities.ProjectFinalReport report = new( - input.ProjectId, + projectId: input.ProjectId, // Salva o Id do usuário logado no relatório - userClaim!.Id + userId: userClaim!.Id ); // Verifica se o projeto existe @@ -70,6 +70,9 @@ public async Task ExecuteAsync(CreateProje UseCaseException.BusinessRuleViolation(isBeforeDeadline, "Relatório enviado fora do prazo estipulado no edital."); + // Lança exceção caso o arquivo não tenha sido enviado + UseCaseException.BusinessRuleViolation(input.ReportFile is null, "O arquivo do relatório é obrigatório."); + // Tenta salvar o relatório no repositório de arquivos na núvem string? fileUrl = await _storageFileService.UploadFileAsync(input.ReportFile!); @@ -82,24 +85,5 @@ public async Task ExecuteAsync(CreateProje // Salva entidade no banco return _mapper.Map(report); } - - /// - /// Tenta converter um objeto para um tipo Enum. - /// - /// Valor a ser convertido. - /// Tipo para o qual ser convertido. - /// Objeto com tipo convertido. - private static T TryCastEnum(object? value) - { - try - { - UseCaseException.NotInformedParam(value is null, typeof(T).ToString()); - return (T)Enum.Parse(typeof(T), value?.ToString()!); - } - catch (Exception) - { - throw UseCaseException.BusinessRuleViolation($"Não foi possível converter o valor {value} para o tipo {typeof(T)}."); - } - } } } \ No newline at end of file diff --git a/src/Application/UseCases/ProjectFinalReport/DeleteProjectFinalReport.cs b/src/Application/UseCases/ProjectFinalReport/DeleteProjectFinalReport.cs index 140dfd34..97533dc6 100644 --- a/src/Application/UseCases/ProjectFinalReport/DeleteProjectFinalReport.cs +++ b/src/Application/UseCases/ProjectFinalReport/DeleteProjectFinalReport.cs @@ -20,13 +20,8 @@ public DeleteProjectFinalReport(IProjectFinalReportRepository repository, IMappe public async Task ExecuteAsync(Guid? id) { - // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); - - // Remove a entidade Domain.Entities.ProjectFinalReport model = await _repository.DeleteAsync(id); - - // Retorna o curso removido return _mapper.Map(model); } } diff --git a/src/Domain/Entities/ProjectFinalReport.cs b/src/Domain/Entities/ProjectFinalReport.cs index 7cd7afc8..67966c16 100644 --- a/src/Domain/Entities/ProjectFinalReport.cs +++ b/src/Domain/Entities/ProjectFinalReport.cs @@ -62,6 +62,15 @@ public ProjectFinalReport(Guid? projectId, Guid? userId) { SendDate = DateTime.UtcNow; ProjectId = projectId; + UserId = userId; + } + + public ProjectFinalReport(Guid? id, Guid? projectId, Guid? userId) + { + Id = id; + SendDate = DateTime.UtcNow; + ProjectId = projectId; + UserId = userId; } /// From f26b0b2abb8a2642af2a6a118d52534dc48fd567 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 1 Nov 2023 11:57:32 -0300 Subject: [PATCH 193/201] test: Add ProjectPartialReport usecases tests --- .../Mocks/ProjectPartialReportMock.cs | 17 ++ .../CreateProjectPartialReportTests.cs | 162 ++++++++++++ .../DeleteProjectPartialReportTests.cs | 52 ++++ .../GetProjectPartialReportByIdTests.cs | 70 ++++++ ...GetProjectPartialReportByProjectIdTests.cs | 49 ++++ .../UpdateProjectPartialReportTests.cs | 237 ++++++++++++++++++ .../EvaluateSubmissionProject.cs | 39 +-- .../CreateProjectFinalReport.cs | 4 +- .../UpdateProjectFinalReport.cs | 4 +- .../CreateProjectPartialReport.cs | 25 +- .../DeleteProjectPartialReport.cs | 5 - .../UpdateProjectPartialReport.cs | 25 +- src/Domain/Entities/Enums/EnumExtensions.cs | 28 +++ 13 files changed, 631 insertions(+), 86 deletions(-) create mode 100644 src/Application.Tests/Mocks/ProjectPartialReportMock.cs create mode 100644 src/Application.Tests/UseCases/ProjectPartialReport/CreateProjectPartialReportTests.cs create mode 100644 src/Application.Tests/UseCases/ProjectPartialReport/DeleteProjectPartialReportTests.cs create mode 100644 src/Application.Tests/UseCases/ProjectPartialReport/GetProjectPartialReportByIdTests.cs create mode 100644 src/Application.Tests/UseCases/ProjectPartialReport/GetProjectPartialReportByProjectIdTests.cs create mode 100644 src/Application.Tests/UseCases/ProjectPartialReport/UpdateProjectPartialReportTests.cs diff --git a/src/Application.Tests/Mocks/ProjectPartialReportMock.cs b/src/Application.Tests/Mocks/ProjectPartialReportMock.cs new file mode 100644 index 00000000..8f98e8e8 --- /dev/null +++ b/src/Application.Tests/Mocks/ProjectPartialReportMock.cs @@ -0,0 +1,17 @@ +using Domain.Entities.Enums; + +namespace Application.Tests.Mocks +{ + public class ProjectPartialReportMock + { + public static Domain.Entities.ProjectPartialReport MockValidProjectPartialReport() + { + return new Domain.Entities.ProjectPartialReport( + projectId: Guid.NewGuid(), + currentDevelopmentStage: 1, + scholarPerformance: EScholarPerformance.Good, + additionalInfo: "Additional Information", + userId: Guid.NewGuid()); + } + } +} \ No newline at end of file diff --git a/src/Application.Tests/UseCases/ProjectPartialReport/CreateProjectPartialReportTests.cs b/src/Application.Tests/UseCases/ProjectPartialReport/CreateProjectPartialReportTests.cs new file mode 100644 index 00000000..f74dd615 --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectPartialReport/CreateProjectPartialReportTests.cs @@ -0,0 +1,162 @@ +using Application.Interfaces.UseCases.ProjectPartialReport; +using Application.Ports.ProjectPartialReport; +using Application.Tests.Mocks; +using Application.UseCases.ProjectPartialReport; +using Application.Validation; +using AutoMapper; +using Domain.Entities.Enums; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.ProjectPartialReport +{ + public class CreateProjectPartialReportTests + { + private readonly Mock _projectReportRepositoryMock = new(); + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _tokenAuthenticationServiceMock = new(); + private readonly Mock _mapperMock = new(); + + private ICreateProjectPartialReport CreateUseCase() => + new CreateProjectPartialReport(_projectReportRepositoryMock.Object, _projectRepositoryMock.Object, _tokenAuthenticationServiceMock.Object, _mapperMock.Object); + + private CreateProjectPartialReportInput GetValidInput() + { + return new CreateProjectPartialReportInput + { + ProjectId = Guid.NewGuid(), + CurrentDevelopmentStage = 1, + ScholarPerformance = 0, + AdditionalInfo = "Additional Information", + }; + } + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProjectPartialReportOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.StudentId = userClaims.Keys.FirstOrDefault(); + project.Status = EProjectStatus.Started; + input.ProjectId = project.Id; + var report = ProjectPartialReportMock.MockValidProjectPartialReport(); + report.UserId = userClaims.Values.FirstOrDefault().Id; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + _projectReportRepositoryMock.Setup(repo => repo.CreateAsync(It.IsAny())) + .ReturnsAsync(report); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())) + .Returns(new DetailedReadProjectPartialReportOutput()); + + // Act + var result = await useCase.ExecuteAsync(input); + + // Assert + Assert.NotNull(result); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(input.ProjectId), Times.Once); + _projectReportRepositoryMock.Verify(repo => repo.CreateAsync(It.IsAny()), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_ProjectNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + + var userClaims = ClaimsMock.MockValidClaims(); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync((Domain.Entities.Project)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + + [Fact] + public async Task ExecuteAsync_ProjectDeleted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.DeactivateEntity(); + input.ProjectId = project.Id; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + + [Fact] + public async Task ExecuteAsync_ProjectNotStarted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.StudentId = userClaims.Keys.FirstOrDefault(); + project.Status = EProjectStatus.Opened; + input.ProjectId = project.Id; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + + [Fact] + public async Task ExecuteAsync_NotAllowedActor_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + input.ProjectId = project.Id; + project.Status = EProjectStatus.Started; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + + [Fact] + public async Task ExecuteAsync_ReportOutsideDeadline_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + + var userClaims = ClaimsMock.MockValidClaims(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Notice.PartialReportDeadline = DateTime.UtcNow.AddMonths(12); + project.StudentId = userClaims.Keys.FirstOrDefault(); + project.Status = EProjectStatus.Started; + input.ProjectId = project.Id; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(input.ProjectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(input)); + } + } +} diff --git a/src/Application.Tests/UseCases/ProjectPartialReport/DeleteProjectPartialReportTests.cs b/src/Application.Tests/UseCases/ProjectPartialReport/DeleteProjectPartialReportTests.cs new file mode 100644 index 00000000..184fced0 --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectPartialReport/DeleteProjectPartialReportTests.cs @@ -0,0 +1,52 @@ +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; +using Application.Interfaces.UseCases.ProjectPartialReport; +using Application.UseCases.ProjectPartialReport; +using Application.Ports.ProjectPartialReport; +using Application.Validation; +using Application.Tests.Mocks; + +namespace Application.Tests.UseCases.ProjectPartialReport +{ + public class DeleteProjectPartialReportTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IDeleteProjectPartialReport CreateUseCase() => + new DeleteProjectPartialReport(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsDetailedReadProjectPartialReportOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var projectPartialReport = ProjectPartialReportMock.MockValidProjectPartialReport(); + + _repositoryMock.Setup(repo => repo.DeleteAsync(id)).ReturnsAsync(projectPartialReport); + _mapperMock.Setup(mapper => mapper.Map(projectPartialReport)) + .Returns(new DetailedReadProjectPartialReportOutput()); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.DeleteAsync(id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(projectPartialReport), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(null)); + } + } +} \ No newline at end of file diff --git a/src/Application.Tests/UseCases/ProjectPartialReport/GetProjectPartialReportByIdTests.cs b/src/Application.Tests/UseCases/ProjectPartialReport/GetProjectPartialReportByIdTests.cs new file mode 100644 index 00000000..5fc8349f --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectPartialReport/GetProjectPartialReportByIdTests.cs @@ -0,0 +1,70 @@ +using Application.Interfaces.UseCases.ProjectPartialReport; +using Application.Ports.ProjectPartialReport; +using Application.Tests.Mocks; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.ProjectPartialReport +{ + public class GetProjectPartialReportByIdTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetProjectPartialReportById CreateUseCase() => new Application.UseCases.ProjectPartialReport.GetProjectPartialReportById(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidId_ReturnsDetailedReadProjectPartialReportOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + var projectPartialReport = ProjectPartialReportMock.MockValidProjectPartialReport(); + var detailedReadProjectPartialReportOutput = new DetailedReadProjectPartialReportOutput(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(projectPartialReport); + _mapperMock.Setup(mapper => mapper.Map(projectPartialReport)).Returns(detailedReadProjectPartialReportOutput); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(projectPartialReport), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NullId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + Guid? id = null; + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id)); + } + + [Fact] + public async Task ExecuteAsync_IdNotFound_ReturnsDetailedReadProjectPartialReportOutput() + { + // Arrange + var useCase = CreateUseCase(); + var id = Guid.NewGuid(); + + _repositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync((Domain.Entities.ProjectPartialReport)null); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())).Returns(new DetailedReadProjectPartialReportOutput()); + + // Act + var result = await useCase.ExecuteAsync(id); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + } +} diff --git a/src/Application.Tests/UseCases/ProjectPartialReport/GetProjectPartialReportByProjectIdTests.cs b/src/Application.Tests/UseCases/ProjectPartialReport/GetProjectPartialReportByProjectIdTests.cs new file mode 100644 index 00000000..e0b9ca34 --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectPartialReport/GetProjectPartialReportByProjectIdTests.cs @@ -0,0 +1,49 @@ +using Application.Interfaces.UseCases.ProjectPartialReport; +using Application.Ports.ProjectPartialReport; +using Application.Tests.Mocks; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.ProjectPartialReport +{ + public class GetProjectPartialReportByProjectIdTests + { + private readonly Mock _repositoryMock = new(); + private readonly Mock _mapperMock = new(); + + private IGetProjectPartialReportByProjectId CreateUseCase() => new Application.UseCases.ProjectPartialReport.GetProjectPartialReportByProjectId(_repositoryMock.Object, _mapperMock.Object); + + [Fact] + public async Task ExecuteAsync_ValidProjectId_ReturnsDetailedReadProjectPartialReportOutput() + { + // Arrange + var projectId = Guid.NewGuid(); + var useCase = CreateUseCase(); + var projectPartialReport = ProjectPartialReportMock.MockValidProjectPartialReport(); + + _repositoryMock.Setup(repo => repo.GetByProjectIdAsync(projectId)).ReturnsAsync(projectPartialReport); + _mapperMock.Setup(mapper => mapper.Map(projectPartialReport)).Returns(new DetailedReadProjectPartialReportOutput()); + + // Act + var result = await useCase.ExecuteAsync(projectId); + + // Assert + Assert.NotNull(result); + _repositoryMock.Verify(repo => repo.GetByProjectIdAsync(projectId), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(projectPartialReport), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_NullProjectId_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + + // Act & Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(null)); + } + } +} diff --git a/src/Application.Tests/UseCases/ProjectPartialReport/UpdateProjectPartialReportTests.cs b/src/Application.Tests/UseCases/ProjectPartialReport/UpdateProjectPartialReportTests.cs new file mode 100644 index 00000000..66b98475 --- /dev/null +++ b/src/Application.Tests/UseCases/ProjectPartialReport/UpdateProjectPartialReportTests.cs @@ -0,0 +1,237 @@ +using Application.Interfaces.UseCases.ProjectPartialReport; +using Application.Ports.ProjectPartialReport; +using Application.Tests.Mocks; +using Application.UseCases.ProjectPartialReport; +using Application.Validation; +using AutoMapper; +using Domain.Interfaces.Repositories; +using Domain.Interfaces.Services; +using Moq; +using Xunit; + +namespace Application.Tests.UseCases.ProjectPartialReport +{ + public class UpdateProjectPartialReportTests + { + private readonly Mock _projectReportRepositoryMock = new(); + private readonly Mock _projectRepositoryMock = new(); + private readonly Mock _tokenAuthenticationServiceMock = new(); + private readonly Mock _mapperMock = new(); + + private IUpdateProjectPartialReport CreateUseCase() => new UpdateProjectPartialReport( + _projectReportRepositoryMock.Object, + _projectRepositoryMock.Object, + _tokenAuthenticationServiceMock.Object, + _mapperMock.Object + ); + + private static UpdateProjectPartialReportInput GetValidInput() + { + return new UpdateProjectPartialReportInput + { + CurrentDevelopmentStage = 1, + ScholarPerformance = 2, + AdditionalInfo = "Additional info" + }; + } + + [Fact] + public async Task ExecuteAsync_ValidInput_ReturnsDetailedReadProjectPartialReportOutput() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var id = Guid.NewGuid(); + var userClaims = ClaimsMock.MockValidClaims(); + + var projectReport = ProjectPartialReportMock.MockValidProjectPartialReport(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = Domain.Entities.Enums.EProjectStatus.Started; + project.StudentId = userClaims.Keys.FirstOrDefault(); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectReportRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(projectReport); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectReport.ProjectId)).ReturnsAsync(project); + _projectReportRepositoryMock.Setup(repo => repo.UpdateAsync(projectReport)).ReturnsAsync(projectReport); + _mapperMock.Setup(mapper => mapper.Map(It.IsAny())) + .Returns(new DetailedReadProjectPartialReportOutput()); + + // Act + var result = await useCase.ExecuteAsync(id, input); + + // Assert + Assert.NotNull(result); + _tokenAuthenticationServiceMock.Verify(service => service.GetUserAuthenticatedClaims(), Times.Once); + _projectReportRepositoryMock.Verify(repo => repo.GetByIdAsync(id), Times.Once); + _projectRepositoryMock.Verify(repo => repo.GetByIdAsync(projectReport.ProjectId), Times.Once); + _projectReportRepositoryMock.Verify(repo => repo.UpdateAsync(projectReport), Times.Once); + _mapperMock.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + } + + [Fact] + public async Task ExecuteAsync_ReportNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var id = Guid.NewGuid(); + var userClaims = ClaimsMock.MockValidClaims(); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectReportRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync((Domain.Entities.ProjectPartialReport)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + } + + [Fact] + public async Task ExecuteAsync_ReportDeleted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var id = Guid.NewGuid(); + var userClaims = ClaimsMock.MockValidClaims(); + + var projectReport = ProjectPartialReportMock.MockValidProjectPartialReport(); + projectReport.DeactivateEntity(); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectReportRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(projectReport); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + } + + [Fact] + public async Task ExecuteAsync_ProjectNotFound_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var id = Guid.NewGuid(); + var userClaims = ClaimsMock.MockValidClaims(); + + var projectReport = ProjectPartialReportMock.MockValidProjectPartialReport(); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectReportRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(projectReport); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectReport.ProjectId)).ReturnsAsync((Domain.Entities.Project)null); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + } + + [Fact] + public async Task ExecuteAsync_ProjectDeleted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var id = Guid.NewGuid(); + var userClaims = ClaimsMock.MockValidClaims(); + + var projectReport = ProjectPartialReportMock.MockValidProjectPartialReport(); + var project = ProjectMock.MockValidProject(); + project.DeactivateEntity(); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectReportRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(projectReport); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectReport.ProjectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + } + + [Fact] + public async Task ExecuteAsync_ProjectNotStarted_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + var id = Guid.NewGuid(); + var userClaims = ClaimsMock.MockValidClaims(); + + var projectReport = ProjectPartialReportMock.MockValidProjectPartialReport(); + var project = ProjectMock.MockValidProject(); + project.Status = Domain.Entities.Enums.EProjectStatus.Opened; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectReportRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(projectReport); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectReport.ProjectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + } + + [Fact] + public async Task ExecuteAsync_UserNotAuthorized_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + input.CurrentDevelopmentStage = 0; + var id = Guid.NewGuid(); + var userClaims = ClaimsMock.MockValidClaims(); + + var projectReport = ProjectPartialReportMock.MockValidProjectPartialReport(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = Domain.Entities.Enums.EProjectStatus.Started; + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectReportRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(projectReport); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectReport.ProjectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + } + + [Fact] + public async Task ExecuteAsync_StageOutOfRange_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + input.CurrentDevelopmentStage = 0; + var id = Guid.NewGuid(); + var userClaims = ClaimsMock.MockValidClaims(); + + var projectReport = ProjectPartialReportMock.MockValidProjectPartialReport(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = Domain.Entities.Enums.EProjectStatus.Started; + project.StudentId = userClaims.Keys.FirstOrDefault(); + project.Notice.PartialReportDeadline = DateTime.Now.AddMonths(7); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectReportRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(projectReport); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectReport.ProjectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + } + + [Fact] + public async Task ExecuteAsync_ReportSentAfterDeadline_ThrowsUseCaseException() + { + // Arrange + var useCase = CreateUseCase(); + var input = GetValidInput(); + input.CurrentDevelopmentStage = 0; + var id = Guid.NewGuid(); + var userClaims = ClaimsMock.MockValidClaims(); + + var projectReport = ProjectPartialReportMock.MockValidProjectPartialReport(); + var project = ProjectMock.MockValidProjectProfessorAndNotice(); + project.Status = Domain.Entities.Enums.EProjectStatus.Started; + project.StudentId = userClaims.Keys.FirstOrDefault(); + project.Notice.PartialReportDeadline = DateTime.Now.AddMonths(-7); + + _tokenAuthenticationServiceMock.Setup(service => service.GetUserAuthenticatedClaims()).Returns(userClaims); + _projectReportRepositoryMock.Setup(repo => repo.GetByIdAsync(id)).ReturnsAsync(projectReport); + _projectRepositoryMock.Setup(repo => repo.GetByIdAsync(projectReport.ProjectId)).ReturnsAsync(project); + + // Act and Assert + await Assert.ThrowsAsync(async () => await useCase.ExecuteAsync(id, input)); + } + } +} diff --git a/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs b/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs index 3e3f697b..91dfb207 100644 --- a/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs +++ b/src/Application/UseCases/ProjectEvaluation/EvaluateSubmissionProject.cs @@ -79,14 +79,14 @@ public async Task ExecuteAsync(EvaluateSubmissionProj projectEvaluation = new Domain.Entities.ProjectEvaluation(input.ProjectId, input.IsProductivityFellow, userClaim.Id, // Id do avaliador logado. - TryCastEnum(input.SubmissionEvaluationStatus), + EnumExtensions.TryCastEnum(input.SubmissionEvaluationStatus), DateTime.UtcNow, input.SubmissionEvaluationDescription, - TryCastEnum(input.Qualification), - TryCastEnum(input.ProjectProposalObjectives), - TryCastEnum(input.AcademicScientificProductionCoherence), - TryCastEnum(input.ProposalMethodologyAdaptation), - TryCastEnum(input.EffectiveContributionToResearch), + EnumExtensions.TryCastEnum(input.Qualification), + EnumExtensions.TryCastEnum(input.ProjectProposalObjectives), + EnumExtensions.TryCastEnum(input.AcademicScientificProductionCoherence), + EnumExtensions.TryCastEnum(input.ProposalMethodologyAdaptation), + EnumExtensions.TryCastEnum(input.EffectiveContributionToResearch), 0); // Obtém atividades do Edital @@ -155,32 +155,5 @@ await _emailService.SendProjectNotificationEmailAsync( // Mapeia dados de saída e retorna. return _mapper.Map(output); } - - /// - /// Tenta converter um objeto para um tipo Enum. - /// - /// Valor a ser convertido. - /// Tipo para o qual ser convertido. - /// Objeto com tipo convertido. - private static T TryCastEnum(object? value) - { - try - { - UseCaseException.NotInformedParam(value is null, typeof(T).ToString()); - foreach (T enumValue in Enum.GetValues(typeof(T))) - { - if (enumValue.GetHashCode().Equals(value)) - { - return (T)Enum.Parse(typeof(T), value?.ToString()!); - } - } - } - catch (Exception) - { - throw UseCaseException.BusinessRuleViolation($"Não foi possível converter o valor {value} para o tipo {typeof(T)}."); - } - - throw UseCaseException.BusinessRuleViolation($"Valor {value} fora do intervalo permitido para o tipo {typeof(T)}."); - } } } \ No newline at end of file diff --git a/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs b/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs index 03a03970..5ad7c91d 100644 --- a/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs +++ b/src/Application/UseCases/ProjectFinalReport/CreateProjectFinalReport.cs @@ -63,8 +63,8 @@ public async Task ExecuteAsync(CreateProje // Verifica se o relatório está sendo enviado dentro do prazo // Relatórios podem ser entregues até 6 meses antes do prazo final - var isBeforeDeadline = project.Notice?.FinalReportDeadline <= DateTime.UtcNow - && project.Notice?.FinalReportDeadline.Value.AddMonths(-6) >= DateTime.UtcNow; + var deadline = project.Notice?.FinalReportDeadline ?? throw UseCaseException.BusinessRuleViolation("O prazo para envio de relatório parcial não foi definido."); + var isBeforeDeadline = deadline < DateTime.UtcNow || deadline.AddMonths(-6) > DateTime.UtcNow; // Lança exceção caso o relatório esteja sendo enviado fora do prazo UseCaseException.BusinessRuleViolation(isBeforeDeadline, diff --git a/src/Application/UseCases/ProjectFinalReport/UpdateProjectFinalReport.cs b/src/Application/UseCases/ProjectFinalReport/UpdateProjectFinalReport.cs index ae935b2c..d76b6de7 100644 --- a/src/Application/UseCases/ProjectFinalReport/UpdateProjectFinalReport.cs +++ b/src/Application/UseCases/ProjectFinalReport/UpdateProjectFinalReport.cs @@ -70,8 +70,8 @@ public async Task ExecuteAsync(Guid? id, U // Verifica se o relatório está sendo enviado dentro do prazo // Relatórios podem ser entregues até 6 meses antes do prazo final - var isBeforeDeadline = project.Notice?.FinalReportDeadline <= DateTime.UtcNow - && project.Notice?.FinalReportDeadline.Value.AddMonths(-6) >= DateTime.UtcNow; + var deadline = project.Notice?.FinalReportDeadline ?? throw UseCaseException.BusinessRuleViolation("O prazo para envio de relatório parcial não foi definido."); + var isBeforeDeadline = deadline < DateTime.UtcNow || deadline.AddMonths(-6) > DateTime.UtcNow; // Lança exceção caso o relatório esteja sendo enviado fora do prazo UseCaseException.BusinessRuleViolation(isBeforeDeadline, diff --git a/src/Application/UseCases/ProjectPartialReport/CreateProjectPartialReport.cs b/src/Application/UseCases/ProjectPartialReport/CreateProjectPartialReport.cs index c6c260f7..703f92fb 100644 --- a/src/Application/UseCases/ProjectPartialReport/CreateProjectPartialReport.cs +++ b/src/Application/UseCases/ProjectPartialReport/CreateProjectPartialReport.cs @@ -40,7 +40,7 @@ public async Task ExecuteAsync(CreatePro Domain.Entities.ProjectPartialReport report = new( input.ProjectId, input.CurrentDevelopmentStage, - TryCastEnum(input.ScholarPerformance), + EnumExtensions.TryCastEnum(input.ScholarPerformance), input.AdditionalInfo, userClaim!.Id ); @@ -63,8 +63,8 @@ public async Task ExecuteAsync(CreatePro // Verifica se o relatório está sendo enviado dentro do prazo // Relatórios podem ser entregues até 6 meses antes do prazo final - var isBeforeDeadline = project.Notice?.PartialReportDeadline <= DateTime.UtcNow - && project.Notice?.PartialReportDeadline.Value.AddMonths(-6) >= DateTime.UtcNow; + var deadline = project.Notice?.PartialReportDeadline ?? throw UseCaseException.BusinessRuleViolation("O prazo para envio de relatório parcial não foi definido."); + var isBeforeDeadline = deadline < DateTime.UtcNow || deadline.AddMonths(-6) > DateTime.UtcNow; // Lança exceção caso o relatório esteja sendo enviado fora do prazo UseCaseException.BusinessRuleViolation(isBeforeDeadline, @@ -76,24 +76,5 @@ public async Task ExecuteAsync(CreatePro // Salva entidade no banco return _mapper.Map(report); } - - /// - /// Tenta converter um objeto para um tipo Enum. - /// - /// Valor a ser convertido. - /// Tipo para o qual ser convertido. - /// Objeto com tipo convertido. - private static T TryCastEnum(object? value) - { - try - { - UseCaseException.NotInformedParam(value is null, typeof(T).ToString()); - return (T)Enum.Parse(typeof(T), value?.ToString()!); - } - catch (Exception) - { - throw UseCaseException.BusinessRuleViolation($"Não foi possível converter o valor {value} para o tipo {typeof(T)}."); - } - } } } \ No newline at end of file diff --git a/src/Application/UseCases/ProjectPartialReport/DeleteProjectPartialReport.cs b/src/Application/UseCases/ProjectPartialReport/DeleteProjectPartialReport.cs index 564fe3bb..4899cba0 100644 --- a/src/Application/UseCases/ProjectPartialReport/DeleteProjectPartialReport.cs +++ b/src/Application/UseCases/ProjectPartialReport/DeleteProjectPartialReport.cs @@ -20,13 +20,8 @@ public DeleteProjectPartialReport(IProjectPartialReportRepository repository, IM public async Task ExecuteAsync(Guid? id) { - // Verifica se o id foi informado UseCaseException.NotInformedParam(id is null, nameof(id)); - - // Remove a entidade Domain.Entities.ProjectPartialReport model = await _repository.DeleteAsync(id); - - // Retorna a entidade removida return _mapper.Map(model); } } diff --git a/src/Application/UseCases/ProjectPartialReport/UpdateProjectPartialReport.cs b/src/Application/UseCases/ProjectPartialReport/UpdateProjectPartialReport.cs index 42d57862..c8e38629 100644 --- a/src/Application/UseCases/ProjectPartialReport/UpdateProjectPartialReport.cs +++ b/src/Application/UseCases/ProjectPartialReport/UpdateProjectPartialReport.cs @@ -65,8 +65,8 @@ public async Task ExecuteAsync(Guid? id, // Verifica se o relatório está sendo enviado dentro do prazo // Relatórios podem ser entregues até 6 meses antes do prazo final - var isBeforeDeadline = project.Notice?.PartialReportDeadline <= DateTime.UtcNow - && project.Notice?.PartialReportDeadline.Value.AddMonths(-6) >= DateTime.UtcNow; + var deadline = project.Notice?.PartialReportDeadline ?? throw UseCaseException.BusinessRuleViolation("O prazo para envio de relatório parcial não foi definido."); + var isBeforeDeadline = deadline < DateTime.UtcNow || deadline.AddMonths(-6) > DateTime.UtcNow; // Lança exceção caso o relatório esteja sendo enviado fora do prazo UseCaseException.BusinessRuleViolation(isBeforeDeadline, @@ -76,7 +76,7 @@ public async Task ExecuteAsync(Guid? id, if (input.CurrentDevelopmentStage is not null) report.CurrentDevelopmentStage = (int)input.CurrentDevelopmentStage; if (input.ScholarPerformance is not null) - report.ScholarPerformance = TryCastEnum(input.ScholarPerformance); + report.ScholarPerformance = EnumExtensions.TryCastEnum(input.ScholarPerformance); if (input.AdditionalInfo is not null) report.AdditionalInfo = input.AdditionalInfo; @@ -89,24 +89,5 @@ public async Task ExecuteAsync(Guid? id, // Mapeia entidade para o modelo de saída e retorna return _mapper.Map(report); } - - /// - /// Tenta converter um objeto para um tipo Enum. - /// - /// Valor a ser convertido. - /// Tipo para o qual ser convertido. - /// Objeto com tipo convertido. - private static T TryCastEnum(object? value) - { - try - { - UseCaseException.NotInformedParam(value is null, typeof(T).ToString()); - return (T)Enum.Parse(typeof(T), value?.ToString()!); - } - catch (Exception) - { - throw UseCaseException.BusinessRuleViolation($"Não foi possível converter o valor {value} para o tipo {typeof(T)}."); - } - } } } \ No newline at end of file diff --git a/src/Domain/Entities/Enums/EnumExtensions.cs b/src/Domain/Entities/Enums/EnumExtensions.cs index 547eef88..91796a02 100644 --- a/src/Domain/Entities/Enums/EnumExtensions.cs +++ b/src/Domain/Entities/Enums/EnumExtensions.cs @@ -1,5 +1,6 @@ using System.ComponentModel; using System.Reflection; +using Domain.Validation; namespace Domain.Entities.Enums; public static class EnumExtensions @@ -26,4 +27,31 @@ public static string GetDescription(this Enum value) return value.ToString(); } + + /// + /// Tenta converter um objeto para um tipo Enum. + /// + /// Valor a ser convertido. + /// Tipo para o qual ser convertido. + /// Objeto com tipo convertido. + public static T TryCastEnum(object? value) + { + try + { + EntityExceptionValidation.When(value is null, $"Valor não informado para o tipo Enum {typeof(T).ToString()}."); + foreach (T enumValue in Enum.GetValues(typeof(T))) + { + if (enumValue.GetHashCode().Equals(value)) + { + return (T)Enum.Parse(typeof(T), value?.ToString()!); + } + } + } + catch (Exception) + { + throw new EntityExceptionValidation($"Não foi possível converter o valor {value} para o tipo {typeof(T)}."); + } + + throw new EntityExceptionValidation($"Valor {value} fora do intervalo permitido para o tipo {typeof(T)}."); + } } \ No newline at end of file From 29218aa455d0ddef1efaf5502ea0c8a0e23be44b Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 1 Nov 2023 12:04:06 -0300 Subject: [PATCH 194/201] chore(ci): Add tests to WebAPI --- .../workflows/azure-webapps-dotnet-core.yml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 41e246c6..f4124fca 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -6,6 +6,8 @@ env: DOTNET_VERSION: "7.0" PROJECT_PATH: "src/Infrastructure/WebAPI/WebAPI.csproj" WEBAPI_PATH: "src/Infrastructure/WebAPI/" + UNIT_TESTS_PROJ: "src/Domain.Tests/Domain.Tests.csproj" + INTEGRATION_TESTS_PROJ: "src/Application.Tests/Application.Tests.csproj" ASPNETCORE_ENVIRONMENT: ${{ secrets.ASPNETCORE_ENVIRONMENT }} on: @@ -72,6 +74,24 @@ jobs: name: .net-app path: ${{env.DOTNET_ROOT}}/myapp + test: + runs-on: ubuntu-latest + needs: build + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up .NET Core + uses: actions/setup-dotnet@v2 + with: + dotnet-version: ${{ env.DOTNET_VERSION }} + + - name: Run Unit Tests + run: dotnet test ${{ env.UNIT_TESTS_PROJ }} --configuration Release + + - name: Run Integration Tests + run: dotnet test ${{ env.INTEGRATION_TESTS_PROJ }} --configuration Release + deploy: permissions: contents: none From 76b6ede2674d775b4b8490177904289f081a43a0 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 1 Nov 2023 12:04:14 -0300 Subject: [PATCH 195/201] chore(release): 0.1.0 --- src/Application.Tests/Application.Tests.csproj | 2 +- src/Application/Application.csproj | 2 +- src/CHANGELOG.md | 17 +++++++++++++++++ src/Domain.Tests/Domain.Tests.csproj | 2 +- src/Domain/Domain.csproj | 2 +- src/Infrastructure/IoC/IoC.csproj | 2 +- .../Persistence/Persistence.csproj | 2 +- src/Infrastructure/Services/Services.csproj | 2 +- src/Infrastructure/WebAPI/WebAPI.csproj | 2 +- .../WebFunctions/WebFunctions.csproj | 2 +- 10 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/Application.Tests/Application.Tests.csproj b/src/Application.Tests/Application.Tests.csproj index 3d919d6f..27c75bb2 100644 --- a/src/Application.Tests/Application.Tests.csproj +++ b/src/Application.Tests/Application.Tests.csproj @@ -6,7 +6,7 @@ enable false true - 0.0.1 + 0.1.0 diff --git a/src/Application/Application.csproj b/src/Application/Application.csproj index a65809f6..e637f60d 100644 --- a/src/Application/Application.csproj +++ b/src/Application/Application.csproj @@ -4,7 +4,7 @@ net7.0 enable enable - 0.0.1 + 0.1.0 diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md index 6ad0c7cf..3e68fd4c 100644 --- a/src/CHANGELOG.md +++ b/src/CHANGELOG.md @@ -2,6 +2,23 @@ All notable changes to this project will be documented in this file. See [versionize](https://github.com/versionize/versionize) for commit guidelines. + +## [0.1.0](https://www.github.com/eduardo-paes/DotnetGraphQl/releases/tag/v0.1.0) (2023-11-1) + +### Features + +* Add CORS configuration ([eb8cde4](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/eb8cde421b565331008d8719e335ee5b4b00d391)) +* Add user names to project GET endpoints ([05e2610](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/05e2610f8239e1424b21adb8aec3cb7d7dba0719)) + +### Bug Fixes + +* Adjust GetUserById usecase ([e4774ed](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/e4774ed601ec0c27847732506047d653f7628ac8)) +* Adjust subarea usecases ([75ae476](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/75ae476f8e013c1b5a2e0f36868e55131d77025a)) +* Correction on project opening. ([8d258a8](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/8d258a8339c0e248bfcb8122cecb175df5f192e3)) +* Disable CORS policy for tests ([9868851](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/98688510d106b00fd28f75f433854dace1bc6588)) +* Enable correct StorageFileService ([a5557d4](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/a5557d4a054820b3b39eb17993477e6f2f7e6268)) +* Enable IpRateLimiting in Startup ([2283568](https://www.github.com/eduardo-paes/DotnetGraphQl/commit/2283568bda84fed8416097fe9722e60491890473)) + ## [0.0.1](https://www.github.com/eduardo-paes/DotnetGraphQl/releases/tag/v0.0.1) (2023-10-24) diff --git a/src/Domain.Tests/Domain.Tests.csproj b/src/Domain.Tests/Domain.Tests.csproj index 3f251927..f54c4a16 100644 --- a/src/Domain.Tests/Domain.Tests.csproj +++ b/src/Domain.Tests/Domain.Tests.csproj @@ -5,7 +5,7 @@ enable enable false - 0.0.1 + 0.1.0 diff --git a/src/Domain/Domain.csproj b/src/Domain/Domain.csproj index 11c75cf0..9d07fa04 100644 --- a/src/Domain/Domain.csproj +++ b/src/Domain/Domain.csproj @@ -4,7 +4,7 @@ net7.0 enable enable - 0.0.1 + 0.1.0 diff --git a/src/Infrastructure/IoC/IoC.csproj b/src/Infrastructure/IoC/IoC.csproj index 02c414af..bcfd766a 100644 --- a/src/Infrastructure/IoC/IoC.csproj +++ b/src/Infrastructure/IoC/IoC.csproj @@ -3,7 +3,7 @@ net7.0 enable enable - 0.0.1 + 0.1.0 diff --git a/src/Infrastructure/Persistence/Persistence.csproj b/src/Infrastructure/Persistence/Persistence.csproj index c7219c04..3defe0fc 100644 --- a/src/Infrastructure/Persistence/Persistence.csproj +++ b/src/Infrastructure/Persistence/Persistence.csproj @@ -4,7 +4,7 @@ net7.0 enable enable - 0.0.1 + 0.1.0 diff --git a/src/Infrastructure/Services/Services.csproj b/src/Infrastructure/Services/Services.csproj index cf011a87..6e5407d2 100644 --- a/src/Infrastructure/Services/Services.csproj +++ b/src/Infrastructure/Services/Services.csproj @@ -3,7 +3,7 @@ net7.0 enable enable - 0.0.1 + 0.1.0 diff --git a/src/Infrastructure/WebAPI/WebAPI.csproj b/src/Infrastructure/WebAPI/WebAPI.csproj index 9e52aaa4..7a4111cf 100644 --- a/src/Infrastructure/WebAPI/WebAPI.csproj +++ b/src/Infrastructure/WebAPI/WebAPI.csproj @@ -6,7 +6,7 @@ enable ef326666-1cfa-4625-aae3-41ea85c01828 false - 0.0.1 + 0.1.0 diff --git a/src/Infrastructure/WebFunctions/WebFunctions.csproj b/src/Infrastructure/WebFunctions/WebFunctions.csproj index 685a74e1..19299062 100644 --- a/src/Infrastructure/WebFunctions/WebFunctions.csproj +++ b/src/Infrastructure/WebFunctions/WebFunctions.csproj @@ -5,7 +5,7 @@ enable net7.0 v4 - 0.0.1 + 0.1.0 From a639b44e654a029057f739d54d0376de6bc0de2d Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 1 Nov 2023 12:09:21 -0300 Subject: [PATCH 196/201] chore(ci): Update WebAPI yaml --- .github/workflows/azure-webapps-dotnet-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index f4124fca..8549bdd9 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -96,7 +96,7 @@ jobs: permissions: contents: none runs-on: ubuntu-latest - needs: build + needs: test environment: name: STAGING url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} From 7023ca62c0470b42b902f76a45a87118f83a7fde Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 1 Nov 2023 12:26:40 -0300 Subject: [PATCH 197/201] chore(ci): Update WebAPI YAML --- .github/workflows/azure-webapps-dotnet-core.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 8549bdd9..286b9e85 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -75,11 +75,13 @@ jobs: path: ${{env.DOTNET_ROOT}}/myapp test: - runs-on: ubuntu-latest needs: build + runs-on: ubuntu-latest + environment: STAGING + steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Set up .NET Core uses: actions/setup-dotnet@v2 From 3ac0bbe99b339c141ee73d9a0317e1e04b33ce17 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 1 Nov 2023 12:32:36 -0300 Subject: [PATCH 198/201] chore(ci): Disable tests --- .../workflows/azure-webapps-dotnet-core.yml | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 286b9e85..470dc4c8 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -74,31 +74,31 @@ jobs: name: .net-app path: ${{env.DOTNET_ROOT}}/myapp - test: - needs: build - runs-on: ubuntu-latest - environment: STAGING + # test: + # needs: build + # runs-on: ubuntu-latest + # environment: STAGING - steps: - - name: Checkout code - uses: actions/checkout@v3 + # steps: + # - name: Checkout code + # uses: actions/checkout@v3 - - name: Set up .NET Core - uses: actions/setup-dotnet@v2 - with: - dotnet-version: ${{ env.DOTNET_VERSION }} + # - name: Set up .NET Core + # uses: actions/setup-dotnet@v2 + # with: + # dotnet-version: ${{ env.DOTNET_VERSION }} - - name: Run Unit Tests - run: dotnet test ${{ env.UNIT_TESTS_PROJ }} --configuration Release + # - name: Run Unit Tests + # run: dotnet test ${{ env.UNIT_TESTS_PROJ }} --configuration Release - - name: Run Integration Tests - run: dotnet test ${{ env.INTEGRATION_TESTS_PROJ }} --configuration Release + # - name: Run Integration Tests + # run: dotnet test ${{ env.INTEGRATION_TESTS_PROJ }} --configuration Release deploy: permissions: contents: none runs-on: ubuntu-latest - needs: test + needs: build environment: name: STAGING url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} From 55c9fe720ba95b8d9ce78847c7b502f725527842 Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 1 Nov 2023 20:57:29 -0300 Subject: [PATCH 199/201] chore(ci): Re-enable tests in YAML --- .../workflows/azure-webapps-dotnet-core.yml | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 286b9e85..470dc4c8 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -74,31 +74,31 @@ jobs: name: .net-app path: ${{env.DOTNET_ROOT}}/myapp - test: - needs: build - runs-on: ubuntu-latest - environment: STAGING + # test: + # needs: build + # runs-on: ubuntu-latest + # environment: STAGING - steps: - - name: Checkout code - uses: actions/checkout@v3 + # steps: + # - name: Checkout code + # uses: actions/checkout@v3 - - name: Set up .NET Core - uses: actions/setup-dotnet@v2 - with: - dotnet-version: ${{ env.DOTNET_VERSION }} + # - name: Set up .NET Core + # uses: actions/setup-dotnet@v2 + # with: + # dotnet-version: ${{ env.DOTNET_VERSION }} - - name: Run Unit Tests - run: dotnet test ${{ env.UNIT_TESTS_PROJ }} --configuration Release + # - name: Run Unit Tests + # run: dotnet test ${{ env.UNIT_TESTS_PROJ }} --configuration Release - - name: Run Integration Tests - run: dotnet test ${{ env.INTEGRATION_TESTS_PROJ }} --configuration Release + # - name: Run Integration Tests + # run: dotnet test ${{ env.INTEGRATION_TESTS_PROJ }} --configuration Release deploy: permissions: contents: none runs-on: ubuntu-latest - needs: test + needs: build environment: name: STAGING url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} From 5ed36febbdd830af1af4f9180a897e9b97e063db Mon Sep 17 00:00:00 2001 From: eduardo Date: Wed, 1 Nov 2023 21:00:09 -0300 Subject: [PATCH 200/201] Revert "chore(ci): Disable tests" This reverts commit 3ac0bbe99b339c141ee73d9a0317e1e04b33ce17. --- .../workflows/azure-webapps-dotnet-core.yml | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/azure-webapps-dotnet-core.yml b/.github/workflows/azure-webapps-dotnet-core.yml index 470dc4c8..286b9e85 100644 --- a/.github/workflows/azure-webapps-dotnet-core.yml +++ b/.github/workflows/azure-webapps-dotnet-core.yml @@ -74,31 +74,31 @@ jobs: name: .net-app path: ${{env.DOTNET_ROOT}}/myapp - # test: - # needs: build - # runs-on: ubuntu-latest - # environment: STAGING + test: + needs: build + runs-on: ubuntu-latest + environment: STAGING - # steps: - # - name: Checkout code - # uses: actions/checkout@v3 + steps: + - name: Checkout code + uses: actions/checkout@v3 - # - name: Set up .NET Core - # uses: actions/setup-dotnet@v2 - # with: - # dotnet-version: ${{ env.DOTNET_VERSION }} + - name: Set up .NET Core + uses: actions/setup-dotnet@v2 + with: + dotnet-version: ${{ env.DOTNET_VERSION }} - # - name: Run Unit Tests - # run: dotnet test ${{ env.UNIT_TESTS_PROJ }} --configuration Release + - name: Run Unit Tests + run: dotnet test ${{ env.UNIT_TESTS_PROJ }} --configuration Release - # - name: Run Integration Tests - # run: dotnet test ${{ env.INTEGRATION_TESTS_PROJ }} --configuration Release + - name: Run Integration Tests + run: dotnet test ${{ env.INTEGRATION_TESTS_PROJ }} --configuration Release deploy: permissions: contents: none runs-on: ubuntu-latest - needs: build + needs: test environment: name: STAGING url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} From 20d7090696ed042ed4f0dd78a9cb57215aa3ab0f Mon Sep 17 00:00:00 2001 From: eduardo Date: Thu, 2 Nov 2023 15:56:49 -0300 Subject: [PATCH 201/201] docs: Add more images to public folder --- docs/images/app_tests.png | Bin 0 -> 74289 bytes docs/images/ci-cd.png | Bin 0 -> 203134 bytes docs/images/domain_tests.png | Bin 0 -> 66807 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/app_tests.png create mode 100644 docs/images/ci-cd.png create mode 100644 docs/images/domain_tests.png diff --git a/docs/images/app_tests.png b/docs/images/app_tests.png new file mode 100644 index 0000000000000000000000000000000000000000..7f2400033dda170d1824aea57b669733154f9c92 GIT binary patch literal 74289 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 HRrdg`mDYm#T$1}AD{cY{ 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

l~7nW+4PQ1INc=AtFg0jr59(!|NFjaYK0dtD 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%0AO_K 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

)!&^;FDA)e+u?XiG6h*VceL_EXHA;gI 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 X3OZm}j{?T|=#heqigfv_cY*&0wJRT< literal 0 HcmV?d00001

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