TasksTracker.TasksManager.Backend.Api/Services/TasksStoreManager.cs (132 lines of code) (raw):

using Dapr.Client; using TasksTracker.TasksManager.Backend.Api.Models; using System.Text.Json; using System.Text.Encodings.Web; using System.Text.Json.Serialization; namespace TasksTracker.TasksManager.Backend.Api.Services { public class TasksStoreManager : ITasksManager { private static string STORE_NAME = "statestore"; private readonly DaprClient _daprClient; private readonly IConfiguration _config; private readonly ILogger<TasksStoreManager> _logger; public TasksStoreManager(DaprClient daprClient, IConfiguration config, ILogger<TasksStoreManager> logger) { _daprClient = daprClient; _config = config; _logger = logger; } public async Task<Guid> CreateNewTask(string taskName, string createdBy, string assignedTo, DateTime dueDate) { var taskModel = new TaskModel() { TaskId = Guid.NewGuid(), TaskName = taskName, TaskCreatedBy = createdBy, TaskCreatedOn = DateTime.UtcNow, TaskDueDate = dueDate, TaskAssignedTo = assignedTo, }; _logger.LogInformation("Save a new task with name: '{0}' to state store", taskModel.TaskName); await _daprClient.SaveStateAsync<TaskModel>(STORE_NAME, taskModel.TaskId.ToString(), taskModel); await PublishTaskSavedEvent(taskModel); return taskModel.TaskId; } public async Task<bool> DeleteTask(Guid taskId) { _logger.LogInformation("Delete task with Id: '{0}'", taskId); await _daprClient.DeleteStateAsync(STORE_NAME, taskId.ToString()); return true; } public async Task<TaskModel?> GetTaskById(Guid taskId) { _logger.LogInformation("Getting task with Id: '{0}'", taskId); var taskModel = await _daprClient.GetStateAsync<TaskModel>(STORE_NAME, taskId.ToString()); return taskModel; } public async Task<List<TaskModel>> GetTasksByCreator(string createdBy) { _logger.LogInformation("Query tasks created by: '{0}'", createdBy); var query = "{" + "\"filter\": {" + "\"EQ\": { \"taskCreatedBy\": \"" + createdBy + "\" }" + "}}"; var queryResponse = await _daprClient.QueryStateAsync<TaskModel>(STORE_NAME, query); var tasksList = queryResponse.Results.Select(q => q.Data).OrderByDescending(o=>o.TaskCreatedOn); return tasksList.ToList(); } public async Task<bool> MarkTaskCompleted(Guid taskId) { _logger.LogInformation("Mark task with Id: '{0}' as completed", taskId); var taskModel = await _daprClient.GetStateAsync<TaskModel>(STORE_NAME, taskId.ToString()); if (taskModel != null) { taskModel.IsCompleted = true; await _daprClient.SaveStateAsync<TaskModel>(STORE_NAME, taskModel.TaskId.ToString(), taskModel); return true; } return false; } public async Task<bool> UpdateTask(Guid taskId, string taskName, string assignedTo, DateTime dueDate) { _logger.LogInformation("Update task with Id: '{0}'", taskId); var taskModel = await _daprClient.GetStateAsync<TaskModel>(STORE_NAME, taskId.ToString()); var currentAssignee = taskModel.TaskAssignedTo; if (taskModel != null) { taskModel.TaskName = taskName; taskModel.TaskAssignedTo = assignedTo; taskModel.TaskDueDate = dueDate; await _daprClient.SaveStateAsync<TaskModel>(STORE_NAME, taskModel.TaskId.ToString(), taskModel); if (!taskModel.TaskAssignedTo.Equals(currentAssignee, StringComparison.OrdinalIgnoreCase)) { await PublishTaskSavedEvent(taskModel); } return true; } return false; } private async Task PublishTaskSavedEvent(TaskModel taskModel) { _logger.LogInformation("Publish Task Saved event for task with Id: '{0}' and Name: '{1}' for Assignee: '{2}'", taskModel.TaskId, taskModel.TaskName, taskModel.TaskAssignedTo); await _daprClient.PublishEventAsync("dapr-pubsub-servicebus", "tasksavedtopic", taskModel); } public async Task<List<TaskModel>> GetYesterdaysDueTasks() { var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = true, Converters = { new JsonStringEnumConverter(), new DateTimeConverter("yyyy-MM-ddTHH:mm:ss") }, PropertyNameCaseInsensitive = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; var yesterday = DateTime.Today.AddDays(-1); var jsonDate = JsonSerializer.Serialize(yesterday, options); _logger.LogInformation("Getting overdue tasks for yesterday date: '{0}'", jsonDate); var query = "{" + "\"filter\": {" + "\"EQ\": { \"taskDueDate\": " + jsonDate + " }" + "}}"; var queryResponse = await _daprClient.QueryStateAsync<TaskModel>(STORE_NAME, query); var tasksList = queryResponse.Results.Select(q => q.Data).Where(q=>q.IsCompleted==false && q.IsOverDue==false).OrderBy(o=>o.TaskCreatedOn); return tasksList.ToList(); } public async Task MarkOverdueTasks(List<TaskModel> overDueTasksList) { foreach (var taskModel in overDueTasksList) { _logger.LogInformation("Mark task with Id: '{0}' as OverDue task", taskModel.TaskId); taskModel.IsOverDue = true; await _daprClient.SaveStateAsync<TaskModel>(STORE_NAME, taskModel.TaskId.ToString(), taskModel); } } } }