Last active
February 2, 2022 22:05
-
-
Save ZlobnyiSerg/45145d9140f1d58def4a696cc7483a08 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.ComponentModel.DataAnnotations; | |
using System.Net; | |
using AutoMapper; | |
using AutoMapper.QueryableExtensions; | |
using Microsoft.AspNetCore.Mvc; | |
using Microsoft.EntityFrameworkCore; | |
var builder = WebApplication.CreateBuilder(args); | |
builder.Services.AddSwaggerGen(); | |
builder.Services.AddControllers(); | |
builder.Services.AddDbContext<TodoDbContext>(cfg => cfg.UseInMemoryDatabase("DbName")); | |
builder.Services.AddAutoMapper(typeof(TodoModel).Assembly); | |
var app = builder.Build(); | |
app.UseSwagger(); | |
app.UseSwaggerUI(); | |
app.MapControllers(); | |
app.Run(); | |
public class TodoModel // Slim DTO for http transfer | |
{ | |
public int Id { get; set; } | |
public string TaskName { get; set; } | |
} | |
public class TodoModelMappingProfile : Profile // This class define how to map object of type Todo to object of type TodoModel | |
{ | |
public TodoModelMappingProfile() | |
{ | |
CreateMap<Todo, TodoModel>() | |
.ForMember(t => t.TaskName, opt => opt.MapFrom(t => t.Name)); // We tell that TaskName should be taken from Name column | |
} | |
} | |
public class Todo // Entity & model at the same time | |
{ | |
[Key] public int Id { get; set; } | |
[Required] [MaxLength(128)] public string Name { get; set; } | |
public bool Completed { get; set; } | |
} | |
public class TodoDbContext : DbContext // Database information - what models should be tables and so on | |
{ | |
public DbSet<Todo> Todos { get; set; } | |
public TodoDbContext(DbContextOptions options) : base(options) | |
{ | |
} | |
} | |
[ApiController] | |
public class TodoController : Controller // Endpoint to process http requests | |
{ | |
private readonly TodoDbContext _dbContext; | |
private readonly IMapper _mapper; | |
public TodoController(TodoDbContext dbContext, IMapper mapper) | |
{ | |
_dbContext = dbContext; | |
_mapper = mapper; | |
} | |
[HttpGet] | |
[Route("todos/{id}")] | |
[ProducesResponseType(typeof(TodoModel), (int)HttpStatusCode.OK)] | |
public async Task<IActionResult> Get(int id, CancellationToken token) | |
{ | |
var todo = await _dbContext.Todos.ProjectTo<TodoModel>(_mapper.ConfigurationProvider).FirstOrDefaultAsync(t => t.Id == id, token); | |
return todo == null ? NotFound() : Ok(todo); | |
} | |
[HttpPost] | |
[Route("todos")] | |
[ProducesResponseType(typeof(Todo), (int)HttpStatusCode.OK)] | |
public async Task<IActionResult> Create(Todo request, CancellationToken token) | |
{ | |
await _dbContext.Todos.AddAsync(request, token); | |
await _dbContext.SaveChangesAsync(token); | |
return Ok(request); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment