diff --git a/Controllers/TarefaController.cs b/Controllers/TarefaController.cs index ba96b30f..22cdf4e8 100644 --- a/Controllers/TarefaController.cs +++ b/Controllers/TarefaController.cs @@ -8,63 +8,76 @@ namespace TrilhaApiDesafio.Controllers [Route("[controller]")] public class TarefaController : ControllerBase { + private const string connectionString = "Server=localhost\\sqlexpress; Initial Catalog=Tarefa; Integrated Security=true"; + private readonly OrganizadorContext _context; public TarefaController(OrganizadorContext context) { _context = context; } + // Salvar - Criar novo + [HttpPost] + public IActionResult Criar(Tarefa tarefa) + { + if (tarefa.Data == DateTime.MinValue) + return BadRequest(new { Erro = "A data da tarefa não pode ser vazia" }); + _context.Add(tarefa); + _context.SaveChanges(); + + // TODO: Adicionar a tarefa recebida no EF e salvar as mudanças (save changes) + return CreatedAtAction(nameof(ObterPorId), new {id=tarefa.Id}, tarefa); + } + //elecionar por id [HttpGet("{id}")] public IActionResult ObterPorId(int id) { // TODO: Buscar o Id no banco utilizando o EF + var tarefa = _context.Tarefas.Find(id); // TODO: Validar o tipo de retorno. Se não encontrar a tarefa, retornar NotFound, + if(tarefa == null) + return NotFound(); + // caso contrário retornar OK com a tarefa encontrada - return Ok(); + return Ok(tarefa); } - + // seçecionar todos [HttpGet("ObterTodos")] public IActionResult ObterTodos() { // TODO: Buscar todas as tarefas no banco utilizando o EF - return Ok(); + //var tarefa = _context.Tarefas.Find(*); + + var tarefas = _context.Tarefas.Where(x => x.Id > 0); + return Ok(tarefas); } - + // Selecionar pelo título [HttpGet("ObterPorTitulo")] public IActionResult ObterPorTitulo(string titulo) { // TODO: Buscar as tarefas no banco utilizando o EF, que contenha o titulo recebido por parâmetro + var tarefas = _context.Tarefas.Where(x => x.Titulo.Contains(titulo)); // Dica: Usar como exemplo o endpoint ObterPorData - return Ok(); + return Ok(tarefas); } - + // selecionar por data aaaa-mm-dd [HttpGet("ObterPorData")] public IActionResult ObterPorData(DateTime data) { var tarefa = _context.Tarefas.Where(x => x.Data.Date == data.Date); return Ok(tarefa); } - + //Selecionar por status [HttpGet("ObterPorStatus")] public IActionResult ObterPorStatus(EnumStatusTarefa status) { // TODO: Buscar as tarefas no banco utilizando o EF, que contenha o status recebido por parâmetro - // Dica: Usar como exemplo o endpoint ObterPorData var tarefa = _context.Tarefas.Where(x => x.Status == status); + // Dica: Usar como exemplo o endpoint ObterPorData return Ok(tarefa); } - - [HttpPost] - public IActionResult Criar(Tarefa tarefa) - { - if (tarefa.Data == DateTime.MinValue) - return BadRequest(new { Erro = "A data da tarefa não pode ser vazia" }); - - // TODO: Adicionar a tarefa recebida no EF e salvar as mudanças (save changes) - return CreatedAtAction(nameof(ObterPorId), new { id = tarefa.Id }, tarefa); - } - + // Update - Aterar poi id [HttpPut("{id}")] public IActionResult Atualizar(int id, Tarefa tarefa) { @@ -77,8 +90,16 @@ public IActionResult Atualizar(int id, Tarefa tarefa) return BadRequest(new { Erro = "A data da tarefa não pode ser vazia" }); // TODO: Atualizar as informações da variável tarefaBanco com a tarefa recebida via parâmetro + tarefaBanco.Titulo = tarefa.Titulo; + tarefaBanco.Descricao = tarefa.Descricao; + tarefaBanco.Status = tarefa.Status; + tarefaBanco.Data = tarefa.Data; + + _context.Tarefas.Update(tarefaBanco); + _context.SaveChanges(); + // TODO: Atualizar a variável tarefaBanco no EF e salvar as mudanças (save changes) - return Ok(); + return Ok(tarefaBanco); } [HttpDelete("{id}")] @@ -90,6 +111,9 @@ public IActionResult Deletar(int id) return NotFound(); // TODO: Remover a tarefa encontrada através do EF e salvar as mudanças (save changes) + _context.Tarefas.Remove(tarefaBanco); + _context.SaveChanges(); + return NoContent(); } } diff --git a/Controllers/WeatherForecastController.cs b/Controllers/WeatherForecastController.cs new file mode 100644 index 00000000..bf6131c8 --- /dev/null +++ b/Controllers/WeatherForecastController.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Mvc; + +namespace TrilhaApiDesafio.Controllers; + +[ApiController] +[Route("[controller]")] +public class WeatherForecastController : ControllerBase +{ + private static readonly string[] Summaries = new[] + { + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; + + private readonly ILogger _logger; + + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } + + [HttpGet(Name = "GetWeatherForecast")] + public IEnumerable Get() + { + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateTime.Now.AddDays(index), + TemperatureC = Random.Shared.Next(-20, 55), + Summary = Summaries[Random.Shared.Next(Summaries.Length)] + }) + .ToArray(); + } +} diff --git a/Migrations/20250125183531_CriacaoTabelaTarefa.Designer.cs b/Migrations/20250125183531_CriacaoTabelaTarefa.Designer.cs new file mode 100644 index 00000000..29b2ae36 --- /dev/null +++ b/Migrations/20250125183531_CriacaoTabelaTarefa.Designer.cs @@ -0,0 +1,54 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TrilhaApiDesafio.Context; + +#nullable disable + +namespace TrilhaApiDesafio.Migrations +{ + [DbContext(typeof(OrganizadorContext))] + [Migration("20250125183531_CriacaoTabelaTarefa")] + partial class CriacaoTabelaTarefa + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); + + modelBuilder.Entity("TrilhaApiDesafio.Models.Tarefa", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("Data") + .HasColumnType("datetime2"); + + b.Property("Descricao") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Titulo") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Tarefas"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Migrations/20250125183531_CriacaoTabelaTarefa.cs b/Migrations/20250125183531_CriacaoTabelaTarefa.cs new file mode 100644 index 00000000..fc4df292 --- /dev/null +++ b/Migrations/20250125183531_CriacaoTabelaTarefa.cs @@ -0,0 +1,35 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TrilhaApiDesafio.Migrations +{ + public partial class CriacaoTabelaTarefa : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Tarefas", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Titulo = table.Column(type: "nvarchar(max)", nullable: true), + Descricao = table.Column(type: "nvarchar(max)", nullable: true), + Data = table.Column(type: "datetime2", nullable: false), + Status = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Tarefas", x => x.Id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Tarefas"); + } + } +} diff --git a/Migrations/OrganizadorContextModelSnapshot.cs b/Migrations/OrganizadorContextModelSnapshot.cs new file mode 100644 index 00000000..a03c0a7e --- /dev/null +++ b/Migrations/OrganizadorContextModelSnapshot.cs @@ -0,0 +1,52 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TrilhaApiDesafio.Context; + +#nullable disable + +namespace TrilhaApiDesafio.Migrations +{ + [DbContext(typeof(OrganizadorContext))] + partial class OrganizadorContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); + + modelBuilder.Entity("TrilhaApiDesafio.Models.Tarefa", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"), 1L, 1); + + b.Property("Data") + .HasColumnType("datetime2"); + + b.Property("Descricao") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Titulo") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Tarefas"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Program.cs b/Program.cs index eae6505e..f17eb5c0 100644 --- a/Program.cs +++ b/Program.cs @@ -30,4 +30,4 @@ app.MapControllers(); -app.Run(); +app.Run(); \ No newline at end of file diff --git a/Properties/launchSettings.json b/Properties/launchSettings.json index 09bbd92a..4204f9c9 100644 --- a/Properties/launchSettings.json +++ b/Properties/launchSettings.json @@ -1,20 +1,30 @@ { - "$schema": "https://json.schemastore.org/launchsettings.json", + "$schema": "http://json.schemastore.org/launchsettings.json", "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:3076", - "sslPort": 44343 + "applicationUrl": "http://localhost:26014", + "sslPort": 44381 } }, "profiles": { - "TrilhaApiDesafio": { + "http": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "swagger", - "applicationUrl": "https://localhost:7295;http://localhost:5181", + "applicationUrl": "http://localhost:5204", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:7004;http://localhost:5204", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/TrilhaApiDesafio.csproj b/TrilhaApiDesafio.csproj index ab338f7c..7302ea7e 100644 --- a/TrilhaApiDesafio.csproj +++ b/TrilhaApiDesafio.csproj @@ -1,18 +1,19 @@ - net6.0 + net8.0 disable enable - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - - + + diff --git a/TrilhaApiDesafio.http b/TrilhaApiDesafio.http new file mode 100644 index 00000000..f5c9d1d5 --- /dev/null +++ b/TrilhaApiDesafio.http @@ -0,0 +1,6 @@ +@TrilhaApiDesafio_HostAddress = http://localhost:5204 + +GET {{TrilhaApiDesafio_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/TrilhaApiDesafio.sln b/TrilhaApiDesafio.sln new file mode 100644 index 00000000..dbbf8116 --- /dev/null +++ b/TrilhaApiDesafio.sln @@ -0,0 +1,24 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrilhaApiDesafio", "TrilhaApiDesafio.csproj", "{0FA4A2BD-0B92-5E85-E87C-176D79B2DDC0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0FA4A2BD-0B92-5E85-E87C-176D79B2DDC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0FA4A2BD-0B92-5E85-E87C-176D79B2DDC0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0FA4A2BD-0B92-5E85-E87C-176D79B2DDC0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0FA4A2BD-0B92-5E85-E87C-176D79B2DDC0}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {AEC24498-A0CE-46E2-AC5C-859451D7A2BB} + EndGlobalSection +EndGlobal diff --git a/WeatherForecast.cs b/WeatherForecast.cs new file mode 100644 index 00000000..a78674d5 --- /dev/null +++ b/WeatherForecast.cs @@ -0,0 +1,12 @@ +namespace TrilhaApiDesafio; + +public class WeatherForecast +{ + public DateTime Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string? Summary { get; set; } +} diff --git a/appsettings.Development.json b/appsettings.Development.json index 9978cbfd..d4efda0d 100644 --- a/appsettings.Development.json +++ b/appsettings.Development.json @@ -6,6 +6,6 @@ } }, "ConnectionStrings": { - "ConexaoPadrao": "COLOCAR SUA CONNECTION STRING AQUI" + "ConexaoPadrao": "Server=localhost\\sqlexpress; Initial Catalog=Tarefas; Integrated Security=true" } }