From 3596b1b4c3fe761079cfbf62349c05269cb71124 Mon Sep 17 00:00:00 2001 From: Bruno Albuquerque <126733239+BrunoAlbuquerqu3@users.noreply.github.com> Date: Wed, 6 Aug 2025 00:52:49 -0300 Subject: [PATCH] =?UTF-8?q?Conclui=20a=20implementa=C3=A7=C3=A3o=20do=20pr?= =?UTF-8?q?ojeto=20pr=C3=A1tico=20de=20Minimal=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- Api/Dominio/DTOs/AdministradorDTO.cs | 9 +- Api/Dominio/DTOs/LoginDTO.cs | 7 +- Api/Dominio/DTOs/VeiculoDTO.cs | 9 +- Api/Dominio/Entidades/Administrador.cs | 12 +- Api/Dominio/Entidades/Veiculo.cs | 12 +- Api/Dominio/Enuns/Perfil.cs | 2 +- .../Interfaces/IAdministradorServico.cs | 12 +- Api/Dominio/Interfaces/IVeiculoServico.cs | 6 +- Api/Dominio/ModelViews/AdministradorLogado.cs | 10 +- Api/Dominio/Servicos/AdministradorServico.cs | 48 +- Api/Dominio/Servicos/VeiculoServico.cs | 18 +- Api/Program.cs | 25 +- Api/Startup.cs | 548 ++++++++++-------- Api/appsettings.json | 4 +- Api/mininal-api.csproj | 15 +- 16 files changed, 411 insertions(+), 329 deletions(-) diff --git a/.gitignore b/.gitignore index 1a6e4a5..e72f927 100644 --- a/.gitignore +++ b/.gitignore @@ -103,4 +103,5 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk -# End of https://www.toptal.com/developers/gitignore/api/windows,macos,linux,dotnetcore,visualstudiocode \ No newline at end of file +# End of https://www.toptal.com/developers/gitignore/api/windows,macos,linux,dotnetcore,visualstudiocode +.fake \ No newline at end of file diff --git a/Api/Dominio/DTOs/AdministradorDTO.cs b/Api/Dominio/DTOs/AdministradorDTO.cs index 54b74d9..1a0cee1 100644 --- a/Api/Dominio/DTOs/AdministradorDTO.cs +++ b/Api/Dominio/DTOs/AdministradorDTO.cs @@ -1,10 +1,9 @@ - using MinimalApi.Dominio.Enuns; namespace MinimalApi.DTOs; public class AdministradorDTO { - public string Email { get;set; } = default!; - public string Senha { get;set; } = default!; - public Perfil? Perfil { get;set; } = default!; -} \ No newline at end of file + public string Email { get; set; } = default!; + public string Senha { get; set; } = default!; + public Perfil? Perfil { get; set; } = default!; +} diff --git a/Api/Dominio/DTOs/LoginDTO.cs b/Api/Dominio/DTOs/LoginDTO.cs index 3976d28..1c8081e 100644 --- a/Api/Dominio/DTOs/LoginDTO.cs +++ b/Api/Dominio/DTOs/LoginDTO.cs @@ -1,7 +1,6 @@ - namespace MinimalApi.DTOs; public class LoginDTO { - public string Email { get;set; } = default!; - public string Senha { get;set; } = default!; -} \ No newline at end of file + public string Email { get; set; } = default!; + public string Senha { get; set; } = default!; +} diff --git a/Api/Dominio/DTOs/VeiculoDTO.cs b/Api/Dominio/DTOs/VeiculoDTO.cs index a136958..4fc8fa2 100644 --- a/Api/Dominio/DTOs/VeiculoDTO.cs +++ b/Api/Dominio/DTOs/VeiculoDTO.cs @@ -1,8 +1,7 @@ - namespace MinimalApi.DTOs; public record VeiculoDTO { - public string Nome { get;set; } = default!; - public string Marca { get;set; } = default!; - public int Ano { get;set; } = default!; -} \ No newline at end of file + public string Nome { get; set; } = default!; + public string Marca { get; set; } = default!; + public int Ano { get; set; } = default!; +} diff --git a/Api/Dominio/Entidades/Administrador.cs b/Api/Dominio/Entidades/Administrador.cs index 3f1abc2..e628b11 100644 --- a/Api/Dominio/Entidades/Administrador.cs +++ b/Api/Dominio/Entidades/Administrador.cs @@ -7,17 +7,17 @@ public class Administrador { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int Id { get;set; } = default!; + public int Id { get; set; } = default!; [Required] [StringLength(255)] - public string Email { get;set; } = default!; + public string Email { get; set; } = default!; [Required] [StringLength(50)] - public string Senha { get;set; } = default!; - + public string Senha { get; set; } = default!; + [Required] [StringLength(10)] - public string Perfil { get;set; } = default!; -} \ No newline at end of file + public string Perfil { get; set; } = default!; +} diff --git a/Api/Dominio/Entidades/Veiculo.cs b/Api/Dominio/Entidades/Veiculo.cs index 3a927e4..31905cb 100644 --- a/Api/Dominio/Entidades/Veiculo.cs +++ b/Api/Dominio/Entidades/Veiculo.cs @@ -7,16 +7,16 @@ public class Veiculo { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int Id { get;set; } = default!; + public int Id { get; set; } = default!; [Required] [StringLength(150)] - public string Nome { get;set; } = default!; + public string Nome { get; set; } = default!; [Required] [StringLength(100)] - public string Marca { get;set; } = default!; - + public string Marca { get; set; } = default!; + [Required] - public int Ano { get;set; } = default!; -} \ No newline at end of file + public int Ano { get; set; } = default!; +} diff --git a/Api/Dominio/Enuns/Perfil.cs b/Api/Dominio/Enuns/Perfil.cs index 08f3153..00f358e 100644 --- a/Api/Dominio/Enuns/Perfil.cs +++ b/Api/Dominio/Enuns/Perfil.cs @@ -4,4 +4,4 @@ public enum Perfil { Adm, Editor -} \ No newline at end of file +} diff --git a/Api/Dominio/Interfaces/IAdministradorServico.cs b/Api/Dominio/Interfaces/IAdministradorServico.cs index 2464eca..ae4dfc6 100644 --- a/Api/Dominio/Interfaces/IAdministradorServico.cs +++ b/Api/Dominio/Interfaces/IAdministradorServico.cs @@ -1,13 +1,15 @@ - using MinimalApi.Dominio.Entidades; using MinimalApi.DTOs; +using System.Collections.Generic; namespace MinimalApi.Dominio.Interfaces; public interface IAdministradorServico { Administrador? Login(LoginDTO loginDTO); - Administrador Incluir(Administrador administrador); - Administrador? BuscaPorId(int id); - List Todos(int? pagina); -} \ No newline at end of file + Administrador? Incluir(Administrador administrador); + List Todos(int? pagina = 1); + Administrador? BuscarPorId(int id); + void Atualizar(Administrador administrador); + void Apagar(Administrador administrador); +} diff --git a/Api/Dominio/Interfaces/IVeiculoServico.cs b/Api/Dominio/Interfaces/IVeiculoServico.cs index 6566c52..b43aa1a 100644 --- a/Api/Dominio/Interfaces/IVeiculoServico.cs +++ b/Api/Dominio/Interfaces/IVeiculoServico.cs @@ -1,14 +1,14 @@ - using MinimalApi.Dominio.Entidades; using MinimalApi.DTOs; +using System.Collections.Generic; namespace MinimalApi.Dominio.Interfaces; public interface IVeiculoServico { List Todos(int? pagina = 1, string? nome = null, string? marca = null); - Veiculo? BuscaPorId(int id); + Veiculo? BuscarPorId(int id); void Incluir(Veiculo veiculo); void Atualizar(Veiculo veiculo); void Apagar(Veiculo veiculo); -} \ No newline at end of file +} diff --git a/Api/Dominio/ModelViews/AdministradorLogado.cs b/Api/Dominio/ModelViews/AdministradorLogado.cs index 9bc8078..1c609fc 100644 --- a/Api/Dominio/ModelViews/AdministradorLogado.cs +++ b/Api/Dominio/ModelViews/AdministradorLogado.cs @@ -1,10 +1,8 @@ -using MinimalApi.Dominio.Enuns; - namespace MinimalApi.Dominio.ModelViews; public record AdministradorLogado { - public string Email { get;set; } = default!; - public string Perfil { get;set; } = default!; - public string Token { get;set; } = default!; -} \ No newline at end of file + public string Email { get; set; } = default!; + public string Perfil { get; set; } = default!; + public string Token { get; set; } = default!; +} diff --git a/Api/Dominio/Servicos/AdministradorServico.cs b/Api/Dominio/Servicos/AdministradorServico.cs index 5365aac..fe0647d 100644 --- a/Api/Dominio/Servicos/AdministradorServico.cs +++ b/Api/Dominio/Servicos/AdministradorServico.cs @@ -1,7 +1,10 @@ -using MinimalApi.Dominio.Entidades; using MinimalApi.DTOs; -using MinimalApi.Infraestrutura.Db; +using MinimalApi.Dominio.Entidades; using MinimalApi.Dominio.Interfaces; +using MinimalApi.Infraestrutura.Db; +using System.Linq; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; namespace MinimalApi.Dominio.Servicos; @@ -13,34 +16,45 @@ public AdministradorServico(DbContexto contexto) _contexto = contexto; } - public Administrador? BuscaPorId(int id) - { - return _contexto.Administradores.Where(v => v.Id == id).FirstOrDefault(); - } - - public Administrador Incluir(Administrador administrador) + public Administrador? Incluir(Administrador administrador) { _contexto.Administradores.Add(administrador); _contexto.SaveChanges(); - return administrador; } public Administrador? Login(LoginDTO loginDTO) { - var adm = _contexto.Administradores.Where(a => a.Email == loginDTO.Email && a.Senha == loginDTO.Senha).FirstOrDefault(); + var adm = _contexto.Administradores + .Where(a => a.Email == loginDTO.Email && a.Senha == loginDTO.Senha) + .FirstOrDefault(); return adm; } - public List Todos(int? pagina) + public Administrador? BuscarPorId(int id) { - var query = _contexto.Administradores.AsQueryable(); + return _contexto.Administradores.Find(id); + } + public List Todos(int? pagina = 1) + { + var query = _contexto.Administradores.AsQueryable(); int itensPorPagina = 10; - - if(pagina != null) - query = query.Skip(((int)pagina - 1) * itensPorPagina).Take(itensPorPagina); - + if (pagina != null) + { + query = query.Skip(((int)pagina.Value - 1) * itensPorPagina).Take(itensPorPagina); + } return query.ToList(); } -} \ No newline at end of file + + public void Atualizar(Administrador administrador) + { + _contexto.Administradores.Update(administrador); + _contexto.SaveChanges(); + } + public void Apagar(Administrador administrador) + { + _contexto.Administradores.Remove(administrador); + _contexto.SaveChanges(); + } +} diff --git a/Api/Dominio/Servicos/VeiculoServico.cs b/Api/Dominio/Servicos/VeiculoServico.cs index 2206994..1954770 100644 --- a/Api/Dominio/Servicos/VeiculoServico.cs +++ b/Api/Dominio/Servicos/VeiculoServico.cs @@ -1,8 +1,10 @@ -using MinimalApi.Dominio.Entidades; using MinimalApi.DTOs; -using MinimalApi.Infraestrutura.Db; +using MinimalApi.Dominio.Entidades; using MinimalApi.Dominio.Interfaces; +using MinimalApi.Infraestrutura.Db; using Microsoft.EntityFrameworkCore; +using System.Linq; +using System.Collections.Generic; namespace MinimalApi.Dominio.Servicos; @@ -26,7 +28,7 @@ public void Atualizar(Veiculo veiculo) _contexto.SaveChanges(); } - public Veiculo? BuscaPorId(int id) + public Veiculo? BuscarPorId(int id) { return _contexto.Veiculos.Where(v => v.Id == id).FirstOrDefault(); } @@ -40,16 +42,18 @@ public void Incluir(Veiculo veiculo) public List Todos(int? pagina = 1, string? nome = null, string? marca = null) { var query = _contexto.Veiculos.AsQueryable(); - if(!string.IsNullOrEmpty(nome)) + if (!string.IsNullOrEmpty(nome)) { - query = query.Where(v => EF.Functions.Like(v.Nome.ToLower(), $"%{nome}%")); + query = query.Where(v => EF.Functions.Like(v.Nome.ToLower(), $"%{nome.ToLower()}%")); } int itensPorPagina = 10; if(pagina != null) + { query = query.Skip(((int)pagina - 1) * itensPorPagina).Take(itensPorPagina); - + } + return query.ToList(); } -} \ No newline at end of file +} diff --git a/Api/Program.cs b/Api/Program.cs index 7a73725..2524ae6 100644 --- a/Api/Program.cs +++ b/Api/Program.cs @@ -1,11 +1,20 @@ -using MinimalApi; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; -IHostBuilder CreateHostBuilder(string[] args){ - return Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => +namespace MinimalApi +{ + public class Program { - webBuilder.UseStartup(); - }); -} + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } -CreateHostBuilder(args).Build().Run(); \ No newline at end of file + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + } +} \ No newline at end of file diff --git a/Api/Startup.cs b/Api/Startup.cs index 9fa4f87..d34de9b 100644 --- a/Api/Startup.cs +++ b/Api/Startup.cs @@ -3,11 +3,19 @@ using System.Text; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; -using MinimalApi; +using Pomelo.EntityFrameworkCore.MySql.Infrastructure; +using Swashbuckle.AspNetCore.Swagger; +using Swashbuckle.AspNetCore.SwaggerGen; +using Swashbuckle.AspNetCore.SwaggerUI; + using MinimalApi.Dominio.Entidades; using MinimalApi.Dominio.Enuns; using MinimalApi.Dominio.Interfaces; @@ -16,287 +24,335 @@ using MinimalApi.DTOs; using MinimalApi.Infraestrutura.Db; -public class Startup +namespace MinimalApi { - public Startup(IConfiguration configuration) + public class Startup { - Configuration = configuration; - key = Configuration?.GetSection("Jwt")?.ToString() ?? ""; - } + private readonly string key; - private string key = ""; - public IConfiguration Configuration { get;set; } = default!; + public Startup(IConfiguration configuration) + { + Configuration = configuration; + key = Configuration.GetSection("Jwt")?.Value ?? "123456"; + } - public void ConfigureServices(IServiceCollection services) - { - services.AddAuthentication(option => { - option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - }).AddJwtBearer(option => { - option.TokenValidationParameters = new TokenValidationParameters{ - ValidateLifetime = true, - IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)), - ValidateIssuer = false, - ValidateAudience = false, - }; - }); - - services.AddAuthorization(); - - services.AddScoped(); - services.AddScoped(); - - services.AddEndpointsApiExplorer(); - services.AddSwaggerGen(options => { - options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme{ - Name = "Authorization", - Type = SecuritySchemeType.Http, - Scheme = "bearer", - BearerFormat = "JWT", - In = ParameterLocation.Header, - Description = "Insira o token JWT aqui" - }); + public IConfiguration Configuration { get; } - options.AddSecurityRequirement(new OpenApiSecurityRequirement + public void ConfigureServices(IServiceCollection services) + { + services.AddAuthentication(option => + { + option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + }).AddJwtBearer(option => { + option.TokenValidationParameters = new TokenValidationParameters { - new OpenApiSecurityScheme{ - Reference = new OpenApiReference - { - Type = ReferenceType.SecurityScheme, - Id = "Bearer" - } - }, - new string[] {} - } + ValidateLifetime = true, + IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)), + ValidateIssuer = false, + ValidateAudience = false, + }; }); - }); - services.AddDbContext(options => { - options.UseMySql( - Configuration.GetConnectionString("MySql"), - ServerVersion.AutoDetect(Configuration.GetConnectionString("MySql")) - ); - }); + services.AddAuthorization(); - services.AddCors(options => - { - options.AddDefaultPolicy( - builder => + services.AddScoped(); + services.AddScoped(); + + services.AddEndpointsApiExplorer(); + services.AddSwaggerGen(options => + { + options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { - builder.AllowAnyOrigin() - .AllowAnyMethod() - .AllowAnyHeader(); + Name = "Authorization", + Type = SecuritySchemeType.Http, + Scheme = "bearer", + BearerFormat = "JWT", + In = ParameterLocation.Header, + Description = "Insira o token JWT aqui" }); - }); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - app.UseSwagger(); - app.UseSwaggerUI(); - app.UseRouting(); + options.AddSecurityRequirement(new OpenApiSecurityRequirement + { + { + new OpenApiSecurityScheme + { + Reference = new OpenApiReference + { + Type = ReferenceType.SecurityScheme, + Id = "Bearer" + } + }, + new string[] {} + } + }); + }); - app.UseAuthentication(); - app.UseAuthorization(); + services.AddDbContext(options => + { + options.UseMySql( + Configuration.GetConnectionString("MySql"), + ServerVersion.AutoDetect(Configuration.GetConnectionString("MySql")) + ); + }); - app.UseCors(); + services.AddCors(options => + { + options.AddDefaultPolicy( + builder => + { + builder.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader(); + }); + }); + } - app.UseEndpoints(endpoints => { + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + app.UseSwagger(); + app.UseSwaggerUI(); - #region Home - endpoints.MapGet("/", () => Results.Json(new Home())).AllowAnonymous().WithTags("Home"); - #endregion + app.UseRouting(); - #region Administradores - string GerarTokenJwt(Administrador administrador){ - if(string.IsNullOrEmpty(key)) return string.Empty; + app.UseAuthentication(); + app.UseAuthorization(); - var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)); - var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); + app.UseCors(); - var claims = new List() + app.UseEndpoints(endpoints => + { + #region Home + endpoints.MapGet("/", () => Results.Ok(new Home())) + .AllowAnonymous() + .WithTags("Home"); + #endregion + + #region Administradores + string GerarTokenJwt(Administrador administrador) { - new Claim("Email", administrador.Email), - new Claim("Perfil", administrador.Perfil), - new Claim(ClaimTypes.Role, administrador.Perfil), - }; - - var token = new JwtSecurityToken( - claims: claims, - expires: DateTime.Now.AddDays(1), - signingCredentials: credentials - ); + if (string.IsNullOrEmpty(key)) return string.Empty; - return new JwtSecurityTokenHandler().WriteToken(token); - } + var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)); + var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); - endpoints.MapPost("/administradores/login", ([FromBody] LoginDTO loginDTO, IAdministradorServico administradorServico) => { - var adm = administradorServico.Login(loginDTO); - if(adm != null) - { - string token = GerarTokenJwt(adm); - return Results.Ok(new AdministradorLogado + var claims = new List() { - Email = adm.Email, - Perfil = adm.Perfil, - Token = token - }); + new Claim("Email", administrador.Email), + new Claim("Perfil", administrador.Perfil), + new Claim(ClaimTypes.Role, administrador.Perfil), + }; + + var token = new JwtSecurityToken( + claims: claims, + expires: DateTime.Now.AddDays(1), + signingCredentials: credentials + ); + + return new JwtSecurityTokenHandler().WriteToken(token); } - else - return Results.Unauthorized(); - }).AllowAnonymous().WithTags("Administradores"); - - endpoints.MapGet("/administradores", ([FromQuery] int? pagina, IAdministradorServico administradorServico) => { - var adms = new List(); - var administradores = administradorServico.Todos(pagina); - foreach(var adm in administradores) + + endpoints.MapPost("/administradores/login", ([FromBody] LoginDTO loginDTO, IAdministradorServico administradorServico) => { - adms.Add(new AdministradorModelView{ - Id = adm.Id, - Email = adm.Email, - Perfil = adm.Perfil - }); - } - return Results.Ok(adms); - }) - .RequireAuthorization() - .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm" }) - .WithTags("Administradores"); - - endpoints.MapGet("/Administradores/{id}", ([FromRoute] int id, IAdministradorServico administradorServico) => { - var administrador = administradorServico.BuscaPorId(id); - if(administrador == null) return Results.NotFound(); - return Results.Ok(new AdministradorModelView{ + var adm = administradorServico.Login(loginDTO); + if (adm != null) + { + string token = GerarTokenJwt(adm); + return Results.Ok(new AdministradorLogado + { + Email = adm.Email, + Perfil = adm.Perfil, + Token = token + }); + } + else + { + return Results.Unauthorized(); + } + }).AllowAnonymous().WithTags("Administradores"); + + endpoints.MapPost("/administradores", ([FromBody] AdministradorDTO administradorDTO, IAdministradorServico administradorServico) => + { + var validacao = new ErrosDeValidacao { Mensagens = new List() }; + if (string.IsNullOrEmpty(administradorDTO.Email)) + validacao.Mensagens.Add("Email não pode ser vazio"); + if (string.IsNullOrEmpty(administradorDTO.Senha)) + validacao.Mensagens.Add("Senha não pode ser vazia"); + if (!administradorDTO.Perfil.HasValue) + validacao.Mensagens.Add("Perfil não pode ser vazio"); + if (validacao.Mensagens.Count > 0) + return Results.BadRequest(validacao); + + var administrador = new Administrador + { + Email = administradorDTO.Email, + Senha = administradorDTO.Senha, + Perfil = administradorDTO.Perfil?.ToString() ?? Perfil.Editor.ToString() + }; + administradorServico.Incluir(administrador); + return Results.Created($"/administrador/{administrador.Id}", administrador); + }) + .RequireAuthorization() + .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm" }) + .WithTags("Administradores"); + + endpoints.MapGet("/administradores", ([FromQuery] int? pagina, IAdministradorServico administradorServico) => + { + var adms = new List(); + var administradores = administradorServico.Todos(pagina); + foreach (var adm in administradores) + { + adms.Add(new AdministradorModelView + { + Id = adm.Id, + Email = adm.Email, + Perfil = adm.Perfil + }); + } + return Results.Ok(adms); + }) + .RequireAuthorization() + .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm" }) + .WithTags("Administradores"); + + endpoints.MapGet("/Administradores/{id}", ([FromRoute] int id, IAdministradorServico administradorServico) => + { + var administrador = administradorServico.BuscarPorId(id); + if (administrador == null) return Results.NotFound(); + return Results.Ok(new AdministradorModelView + { Id = administrador.Id, Email = administrador.Email, Perfil = administrador.Perfil - }); - }) - .RequireAuthorization() - .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm" }) - .WithTags("Administradores"); - - endpoints.MapPost("/administradores", ([FromBody] AdministradorDTO administradorDTO, IAdministradorServico administradorServico) => { - var validacao = new ErrosDeValidacao{ - Mensagens = new List() - }; + }); + }) + .RequireAuthorization() + .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm,Editor" }) + .WithTags("Administradores"); - if(string.IsNullOrEmpty(administradorDTO.Email)) - validacao.Mensagens.Add("Email não pode ser vazio"); - if(string.IsNullOrEmpty(administradorDTO.Senha)) - validacao.Mensagens.Add("Senha não pode ser vazia"); - if(administradorDTO.Perfil == null) - validacao.Mensagens.Add("Perfil não pode ser vazio"); - - if(validacao.Mensagens.Count > 0) - return Results.BadRequest(validacao); - - var administrador = new Administrador{ - Email = administradorDTO.Email, - Senha = administradorDTO.Senha, - Perfil = administradorDTO.Perfil.ToString() ?? Perfil.Editor.ToString() - }; + endpoints.MapPut("/administradores/{id}", ([FromRoute] int id, AdministradorDTO administradorDTO, IAdministradorServico administradorServico) => + { + var administrador = administradorServico.BuscarPorId(id); + if (administrador == null) return Results.NotFound(); - administradorServico.Incluir(administrador); + var validacao = new ErrosDeValidacao { Mensagens = new List() }; + if (string.IsNullOrEmpty(administradorDTO.Email)) + validacao.Mensagens.Add("Email não pode ser vazio"); + if (string.IsNullOrEmpty(administradorDTO.Senha)) + validacao.Mensagens.Add("Senha não pode ser vazia"); + if (administradorDTO.Perfil == null) + validacao.Mensagens.Add("Perfil não pode ser vazio"); - return Results.Created($"/administrador/{administrador.Id}", new AdministradorModelView{ - Id = administrador.Id, - Email = administrador.Email, - Perfil = administrador.Perfil - }); - - }) - .RequireAuthorization() - .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm" }) - .WithTags("Administradores"); - #endregion - - #region Veiculos - ErrosDeValidacao validaDTO(VeiculoDTO veiculoDTO) - { - var validacao = new ErrosDeValidacao{ - Mensagens = new List() - }; + if (validacao.Mensagens.Count > 0) + return Results.BadRequest(validacao); + + administrador.Email = administradorDTO.Email; + administrador.Senha = administradorDTO.Senha; + administrador.Perfil = administradorDTO.Perfil.ToString() ?? Perfil.Editor.ToString(); - if(string.IsNullOrEmpty(veiculoDTO.Nome)) - validacao.Mensagens.Add("O nome não pode ser vazio"); + administradorServico.Atualizar(administrador); - if(string.IsNullOrEmpty(veiculoDTO.Marca)) - validacao.Mensagens.Add("A Marca não pode ficar em branco"); + return Results.Ok(administrador); + }) + .RequireAuthorization() + .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm" }) + .WithTags("Administradores"); - if(veiculoDTO.Ano < 1950) - validacao.Mensagens.Add("Veículo muito antigo, aceito somete anos superiores a 1950"); + endpoints.MapDelete("/administradores/{id}", ([FromRoute] int id, IAdministradorServico administradorServico) => + { + var administrador = administradorServico.BuscarPorId(id); + if (administrador == null) return Results.NotFound(); - return validacao; - } + administradorServico.Apagar(administrador); - endpoints.MapPost("/veiculos", ([FromBody] VeiculoDTO veiculoDTO, IVeiculoServico veiculoServico) => { - var validacao = validaDTO(veiculoDTO); - if(validacao.Mensagens.Count > 0) - return Results.BadRequest(validacao); - - var veiculo = new Veiculo{ - Nome = veiculoDTO.Nome, - Marca = veiculoDTO.Marca, - Ano = veiculoDTO.Ano - }; - veiculoServico.Incluir(veiculo); - - return Results.Created($"/veiculo/{veiculo.Id}", veiculo); - }) - .RequireAuthorization() - .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm,Editor" }) - .WithTags("Veiculos"); - - endpoints.MapGet("/veiculos", ([FromQuery] int? pagina, IVeiculoServico veiculoServico) => { - var veiculos = veiculoServico.Todos(pagina); - - return Results.Ok(veiculos); - }).RequireAuthorization().WithTags("Veiculos"); - - endpoints.MapGet("/veiculos/{id}", ([FromRoute] int id, IVeiculoServico veiculoServico) => { - var veiculo = veiculoServico.BuscaPorId(id); - if(veiculo == null) return Results.NotFound(); - return Results.Ok(veiculo); - }) - .RequireAuthorization() - .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm,Editor" }) - .WithTags("Veiculos"); - - endpoints.MapPut("/veiculos/{id}", ([FromRoute] int id, VeiculoDTO veiculoDTO, IVeiculoServico veiculoServico) => { - var veiculo = veiculoServico.BuscaPorId(id); - if(veiculo == null) return Results.NotFound(); - - var validacao = validaDTO(veiculoDTO); - if(validacao.Mensagens.Count > 0) - return Results.BadRequest(validacao); - - veiculo.Nome = veiculoDTO.Nome; - veiculo.Marca = veiculoDTO.Marca; - veiculo.Ano = veiculoDTO.Ano; - - veiculoServico.Atualizar(veiculo); - - return Results.Ok(veiculo); - }) - .RequireAuthorization() - .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm" }) - .WithTags("Veiculos"); - - endpoints.MapDelete("/veiculos/{id}", ([FromRoute] int id, IVeiculoServico veiculoServico) => { - var veiculo = veiculoServico.BuscaPorId(id); - if(veiculo == null) return Results.NotFound(); - - veiculoServico.Apagar(veiculo); - - return Results.NoContent(); - }) - .RequireAuthorization() - .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm" }) - .WithTags("Veiculos"); - #endregion - }); + return Results.NoContent(); + }) + .RequireAuthorization() + .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm" }) + .WithTags("Administradores"); + #endregion + + #region Veiculos + ErrosDeValidacao validaDTO(VeiculoDTO veiculoDTO) + { + var validacao = new ErrosDeValidacao(){ Mensagens = new List() }; + if (string.IsNullOrEmpty(veiculoDTO.Nome)) + validacao.Mensagens.Add("O nome não pode ser vazio"); + if (string.IsNullOrEmpty(veiculoDTO.Marca)) + validacao.Mensagens.Add("A Marca não pode ficar em branco"); + if (veiculoDTO.Ano < 1950) + validacao.Mensagens.Add("Veículo muito antigo, aceito somete anos superiores a 1950"); + return validacao; + } + + endpoints.MapPost("/veiculos", ([FromBody] VeiculoDTO veiculoDTO, IVeiculoServico veiculoServico) => + { + var validacao = validaDTO(veiculoDTO); + if (validacao.Mensagens.Count > 0) + return Results.BadRequest(validacao); + + var veiculo = new Veiculo{ + Nome = veiculoDTO.Nome, + Marca = veiculoDTO.Marca, + Ano = veiculoDTO.Ano + }; + veiculoServico.Incluir(veiculo); + + return Results.Created($"/veiculo/{veiculo.Id}", veiculo); + }) + .RequireAuthorization() + .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm,Editor" }) + .WithTags("Veiculos"); + + endpoints.MapGet("/veiculos", ([FromQuery] int? pagina, IVeiculoServico veiculoServico) => { + var veiculos = veiculoServico.Todos(pagina); + + return Results.Ok(veiculos); + }).RequireAuthorization().WithTags("Veiculos"); + + endpoints.MapGet("/veiculos/{id}", ([FromRoute] int id, IVeiculoServico veiculoServico) => { + var veiculo = veiculoServico.BuscarPorId(id); + if(veiculo == null) return Results.NotFound(); + return Results.Ok(veiculo); + }) + .RequireAuthorization() + .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm,Editor" }) + .WithTags("Veiculos"); + + endpoints.MapPut("/veiculos/{id}", ([FromRoute] int id, VeiculoDTO veiculoDTO, IVeiculoServico veiculoServico) => { + var veiculo = veiculoServico.BuscarPorId(id); + if(veiculo == null) return Results.NotFound(); + + var validacao = validaDTO(veiculoDTO); + if(validacao.Mensagens.Count > 0) + return Results.BadRequest(validacao); + + veiculo.Nome = veiculoDTO.Nome; + veiculo.Marca = veiculoDTO.Marca; + veiculo.Ano = veiculoDTO.Ano; + + veiculoServico.Atualizar(veiculo); + + return Results.Ok(veiculo); + }) + .RequireAuthorization() + .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm" }) + .WithTags("Veiculos"); + + endpoints.MapDelete("/veiculos/{id}", ([FromRoute] int id, IVeiculoServico veiculoServico) => { + var veiculo = veiculoServico.BuscarPorId(id); + if(veiculo == null) return Results.NotFound(); + + veiculoServico.Apagar(veiculo); + + return Results.NoContent(); + }) + .RequireAuthorization() + .RequireAuthorization(new AuthorizeAttribute { Roles = "Adm" }) + .WithTags("Veiculos"); + #endregion + }); + } } } \ No newline at end of file diff --git a/Api/appsettings.json b/Api/appsettings.json index e47fe81..d90b5b4 100644 --- a/Api/appsettings.json +++ b/Api/appsettings.json @@ -7,7 +7,7 @@ }, "AllowedHosts": "*", "ConnectionStrings": { - "MySql": "Server=localhost;Database=minimal_api;Uid=root;Pwd=root;" + "MySql" : "Server=localhost;Database=minimal_api;User Id=root;Password=admin" }, - "Jwt": "minimal-api-alunos-vamos_lá" + "Jwt":"esta-e-uma-chave-secreta-muito-longa-e-segura-para-o-jwt" } diff --git a/Api/mininal-api.csproj b/Api/mininal-api.csproj index 0922f14..bf6925f 100644 --- a/Api/mininal-api.csproj +++ b/Api/mininal-api.csproj @@ -1,25 +1,26 @@ - net7.0 + net8.0 enable enable mininal_api - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + - + \ No newline at end of file