Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 0 additions & 116 deletions Controllers/TodoItemsController.cs

This file was deleted.

16 changes: 16 additions & 0 deletions Todo.Api/Configuration/DatabaseConfiguration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Todo.DAL;

namespace Todo.Api.Configuration
{
public static class DatabaseConfiguration
{
public static void ConfigureDatabase(this IServiceCollection services, IConfiguration configuration)
{
services.AddDbContext<TodoContext>(
options => options.UseSqlServer(configuration.GetConnectionString("TodoDB")));
}
}
}
27 changes: 27 additions & 0 deletions Todo.Api/Configuration/LoggingConfiguration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Exceptions;

namespace Todo.Api.Configuration
{
public static class LoggingConfiguration
{
public static void ConfigureLogging(this IServiceCollection services, IConfiguration configuration)
{
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.WithExceptionDetails()
.MinimumLevel.Error()
.ReadFrom.Configuration(configuration)
.CreateLogger();

services.AddLogging(loggingBuilder =>
{
loggingBuilder.ClearProviders();
loggingBuilder.AddSerilog();
});
}
}
}
14 changes: 14 additions & 0 deletions Todo.Api/Configuration/MappingConfiguration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using FastExpressionCompiler;
using Mapster;
using Microsoft.Extensions.DependencyInjection;

namespace Todo.Api.Configuration
{
public static class MappingConfiguration
{
public static void ConfigureMapping(this IServiceCollection _)
{
TypeAdapterConfig.GlobalSettings.Compiler = exp => exp.CompileFast();
}
}
}
18 changes: 18 additions & 0 deletions Todo.Api/Configuration/ServicesConfiguration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using MediatR;
using Microsoft.Extensions.DependencyInjection;
using Todo.BLL.Pipelines;

namespace Todo.Api.Configuration
{
public static class ServicesConfiguration
{
public static void ConfigureServices(this IServiceCollection services)
{
services.AddMediatR(cfg => {
cfg.RegisterServicesFromAssembly(typeof(ErrorLoggingPipeline<,>).Assembly);
cfg.AddBehavior(typeof(IPipelineBehavior<,>), typeof(ErrorLoggingPipeline<,>));
});
services.AddControllers();
}
}
}
26 changes: 26 additions & 0 deletions Todo.Api/Configuration/SwaggerConfiguration.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;

namespace Todo.Api.Configuration
{
public static class SwaggerConfiguration
{
public static void ConfigureSwagger(this IServiceCollection services)
{
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "TODO API", Version = "v1" });
});
}

public static void AddSwagger(this IApplicationBuilder app)
{
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "TODO API");
});
}
}
}
64 changes: 64 additions & 0 deletions Todo.Api/Controllers/TodoItemsController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
using MediatR;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Todo.Common.Commands;
using Todo.Common.Dto;
using Todo.Common.Queries;

namespace Todo.Api.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class TodoItemsController : ControllerBase
{
private readonly IMediator _mediator;

public TodoItemsController(IMediator mediator)
{
_mediator = mediator;
}

[HttpGet]
public async Task<ActionResult<ICollection<TodoItemDto>>> GetTodoItems(CancellationToken ct)
{
return Ok(await _mediator.Send(new GetAllTodosQuery(), ct));
}

[HttpGet("{id}")]
public async Task<ActionResult<TodoItemDto>> GetTodoItem(long id, CancellationToken ct)
{
return Ok(await _mediator.Send(new GetTodoQuery(id), ct));
}

[HttpPut("{id}")]
public async Task<IActionResult> UpdateTodoItem(long id, TodoItemDto todoItemDto, CancellationToken ct)
{
if (id != todoItemDto.Id) return BadRequest();

await _mediator.Send(new UpdateTodoCommand(todoItemDto), ct);

return NoContent();
}

[HttpPost]
public async Task<ActionResult<TodoItemDto>> CreateTodoItem(TodoItemDto todoItemDto, CancellationToken ct)
{
var result = await _mediator.Send(new CreateTodoCommand(todoItemDto), ct);

return CreatedAtAction(
nameof(GetTodoItem),
new { id = result.Id },
result);
}

[HttpDelete("{id}")]
public async Task<IActionResult> DeleteTodoItem(long id, CancellationToken ct)
{
await _mediator.Send(new DeleteTodoCommand(id), ct);

return NoContent();
}
}
}
28 changes: 28 additions & 0 deletions Todo.Api/Middleware/ErrorHandlingMiddleware.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
using Todo.Common.Exceptions;

namespace Todo.Api.Middleware
{
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate _next;

public ErrorHandlingMiddleware(RequestDelegate next)
{
_next = next;
}

public async Task InvokeAsync(HttpContext context)
{
try
{
await _next(context);
}
catch (NotFoundException)
{
context.Response.StatusCode = StatusCodes.Status404NotFound;
}
}
}
}
8 changes: 1 addition & 7 deletions Program.cs → Todo.Api/Program.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace TodoApi
namespace Todo.Api
{
public class Program
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "https://localhost:44331/swagger/index.html",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"TodoApiDTO": {
"Todo.ApiDTO": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "https://localhost:44331/swagger/index.html",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
Expand Down
Loading