Add basic todo behavior

This commit is contained in:
2021-11-13 17:35:33 +01:00
parent 43a9187579
commit 62630d63f2
14 changed files with 110 additions and 49 deletions

View File

@@ -0,0 +1,15 @@
using System.Text.Json.Serialization;
namespace Todo.Api.Hubs.Models;
public record TodoResponse
{
[JsonPropertyName("id")]
public string Id { get; init; }
[JsonPropertyName("title")]
public string Title { get; init; }
[JsonPropertyName("status")]
public bool Status { get; init; }
}

View File

@@ -1,5 +1,6 @@
using System.Text.Json;
using Microsoft.AspNetCore.SignalR;
using Todo.Api.Hubs.Models;
using Todo.Core.Interfaces.Persistence;
namespace Todo.Api.Hubs
@@ -13,18 +14,40 @@ namespace Todo.Api.Hubs
_todoRepository = todoRepository;
}
public async Task GetInboxTodos()
public async Task CreateTodo(string todoTitle)
{
await Clients.Caller.SendAsync("InboxTodos", "some data");
var _ = await _todoRepository.CreateTodoAsync(todoTitle);
var todos = await _todoRepository.GetTodosAsync();
var serializedTodos =
JsonSerializer.Serialize(todos
.Select(t => new TodoResponse { Id = t.Id, Title = t.Title })
.ToList());
await Clients.Caller.SendAsync("todos", serializedTodos);
}
public async Task UpdateTodo(string todoId, bool todoStatus)
{
await _todoRepository.UpdateTodoStatus(todoId, todoStatus);
var todos = await _todoRepository.GetTodosAsync();
var serializedTodos =
JsonSerializer.Serialize(todos
.Select(t => new TodoResponse { Id = t.Id, Title = t.Title, Status = t.Status })
.ToList());
await Clients.Caller.SendAsync("todos", serializedTodos);
}
public async Task CreateTodo(string createTodoRequest)
public async Task GetTodos()
{
var todo = JsonSerializer.Deserialize<Core.Entities.Todo>(createTodoRequest);
if (todo is null)
throw new InvalidOperationException("Failed to create todo because of invalid request");
var todos = await _todoRepository.GetTodosAsync();
var serializedTodos = JsonSerializer.Serialize(todos
.Select(t => new TodoResponse { Id = t.Id, Title = t.Title, Status = t.Status})
.ToList());
await _todoRepository.CreateTodoAsync(todo.Title);
await Clients.Caller.SendAsync("todos", serializedTodos);
}
}
}

View File

@@ -14,7 +14,7 @@
"dotnetRunMessages": "true",
"launchBrowser": false,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}

View File

@@ -53,8 +53,6 @@ namespace Todo.Api
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Todo.Api v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseCors();

View File

@@ -4,4 +4,5 @@ public record Todo
{
public string Id { get; init; }
public string Title { get; init; }
public bool Status { get; init; }
}

View File

@@ -4,4 +4,5 @@ public interface ITodoRepository
{
Task<Entities.Todo> CreateTodoAsync(string title);
Task<IEnumerable<Entities.Todo>> GetTodosAsync();
Task UpdateTodoStatus(string todoId, bool todoStatus);
}

View File

@@ -10,4 +10,5 @@ public record MongoTodo
public string Id { get; init; }
[BsonRequired] public string Title { get; init; }
[BsonRequired] public bool Status { get; set; }
}

View File

@@ -29,6 +29,13 @@ public class TodoRepository : ITodoRepository
return todos
.ToEnumerable()
.Select(t =>
new Core.Entities.Todo() { Id = t.Id, Title = t.Title });
new Core.Entities.Todo() { Id = t.Id, Title = t.Title, Status = t.Status});
}
public async Task UpdateTodoStatus(string todoId, bool todoStatus)
{
await _todosCollection
.UpdateOneAsync(t => t.Id == todoId,
Builders<MongoTodo>.Update.Set(t => t.Status, todoStatus));
}
}