Skip to content

Commit

Permalink
Merge pull request #18 from marcos-venicius/feat/delete-task
Browse files Browse the repository at this point in the history
Feat: delete task
  • Loading branch information
marcos-venicius committed Jun 6, 2023
2 parents a6765fe + 6f0f6cc commit 6a34a2d
Show file tree
Hide file tree
Showing 23 changed files with 265 additions and 60 deletions.
Binary file added .docker-compose.yml.swp
Binary file not shown.
8 changes: 5 additions & 3 deletions GrpcTodo.CLI/ActionRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using GrpcTodo.CLI.UseCases.AliasList;
using GrpcTodo.CLI.UseCases.AliasRemove;
using GrpcTodo.CLI.UseCases.TaskCreate;
using GrpcTodo.CLI.UseCases.TaskDelete;
using GrpcTodo.CLI.UseCases.TaskList;

namespace GrpcTodo.CLI;
Expand All @@ -23,6 +24,7 @@ internal class ActionRunner
private readonly AliasRemoveUseCase _aliasRemoveUseCase;
private readonly TaskCreateUseCase _taskCreateUseCase;
private readonly TaskListUseCase _taskListUseCase;
private readonly TaskDeleteUseCase _taskDeleteUseCase;

private readonly CommandReader _commandReader;

Expand All @@ -39,6 +41,7 @@ public ActionRunner(ConfigsManager configsManager, CommandReader commandReader,
_aliasRemoveUseCase = new AliasRemoveUseCase(configsManager, commandReader);
_taskCreateUseCase = new TaskCreateUseCase(configsManager);
_taskListUseCase = new TaskListUseCase(configsManager, parameters);
_taskDeleteUseCase = new TaskDeleteUseCase(configsManager);
}

public Task Run(Command? action)
Expand All @@ -65,15 +68,14 @@ public Task Run(Command? action)
return _taskCreateUseCase.ExecuteAsync();
case Command.ListAllTasks:
return _taskListUseCase.ExecuteAsync();
case Command.DeleteTask:
return _taskDeleteUseCase.ExecuteAsync();
case Command.CompleteTask:
Console.WriteLine("no implemented yet: complete task");
break;
case Command.UncompleteTask:
Console.WriteLine("no implemented yet: uncomplete task");
break;
case Command.DeleteTask:
Console.WriteLine("no implemented yet: delete task");
break;
}

return Task.CompletedTask;
Expand Down
10 changes: 10 additions & 0 deletions GrpcTodo.CLI/CLI.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using Grpc.Core;

using GrpcTodo.CLI.Lib;
using GrpcTodo.CLI.Models;
using GrpcTodo.CLI.Services;
Expand Down Expand Up @@ -48,6 +50,14 @@ public async Task Run()
Menu.ShowAvailableOptions(parameters);
}
}
catch (RpcException e)
{
ConsoleWritter.WriteError(e.Status.Detail ?? e.Message);
}
catch (ArgumentNullException e)
{
ConsoleWritter.WriteError(e.Message);
}
catch (ShowErrorMessageException e)
{
ConsoleWritter.WriteError(e.Message);
Expand Down
3 changes: 2 additions & 1 deletion GrpcTodo.CLI/Menu.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,9 @@ public sealed class Menu
},
new MenuOption {
Path = "delete",
IsImplemented = true,
Command = Command.DeleteTask,
Description = "delete a task"
Description = "delete a task. example: gl delete task <task_id>"
},
}
}
Expand Down
3 changes: 1 addition & 2 deletions GrpcTodo.CLI/UseCases/AccountCreate/AccountCreateUseCase.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using GrpcTodo.CLI.Utils;
using Grpc.Core;
using Grpc.Net.Client;
using GrpcTodo.SharedKernel.Protos.User;
using GrpcTodo.SharedKernel.Protos.User.Requests;
using GrpcTodo.CLI.Lib;
Expand Down Expand Up @@ -34,7 +33,7 @@ public override async Task ExecuteAsync()

try
{
using var channel = GrpcChannel.ForAddress(Settings.ServerAddress);
using var channel = GrpcConnection.CreateChannel();

var client = new User.UserClient(channel);

Expand Down
3 changes: 1 addition & 2 deletions GrpcTodo.CLI/UseCases/AccountLogin/AccountLoginUseCase.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using GrpcTodo.CLI.Utils;
using Grpc.Core;
using Grpc.Net.Client;
using GrpcTodo.SharedKernel.Protos.User;
using GrpcTodo.SharedKernel.Protos.User.Requests;
using GrpcTodo.CLI.Lib;
Expand Down Expand Up @@ -34,7 +33,7 @@ public override async Task ExecuteAsync()

try
{
using var channel = GrpcChannel.ForAddress(Settings.ServerAddress);
using var channel = GrpcConnection.CreateChannel();

var client = new User.UserClient(channel);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using Grpc.Core;
using Grpc.Net.Client;
using GrpcTodo.SharedKernel.Protos.User;
using GrpcTodo.SharedKernel.Protos.User.Requests;
using GrpcTodo.CLI.UseCases.Common;
Expand Down Expand Up @@ -34,7 +33,7 @@ public override async Task ExecuteAsync()

try
{
using var channel = GrpcChannel.ForAddress(Settings.ServerAddress);
using var channel = GrpcConnection.CreateChannel();

var client = new User.UserClient(channel);

Expand Down
3 changes: 3 additions & 0 deletions GrpcTodo.CLI/UseCases/Common/Prompt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ private protected record PromptOptions
public bool RemoveWhitespaces { get; init; } = false;
public bool ShouldBeNumber { get; init; } = false;
public bool ShouldBeSingleWord { get; init; } = false;
/// <summary>
/// returns true when should show the error, false when not
/// </summary>
public Func<string, bool>? Custom { get; init; }
public string? CustomMessage { get; init; }
public bool ShouldBeHidden { get; init; } = false;
Expand Down
3 changes: 1 addition & 2 deletions GrpcTodo.CLI/UseCases/TaskCreate/TaskCreateUseCase.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using Grpc.Core;
using Grpc.Net.Client;
using GrpcTodo.CLI.Lib;
using GrpcTodo.CLI.UseCases.Common;
using GrpcTodo.CLI.Utils;
Expand Down Expand Up @@ -27,7 +26,7 @@ public override async Task ExecuteAsync()
var prompt = createTaskPrompt.PromptName();
var name = prompt.Name;

using var channel = GrpcChannel.ForAddress(Settings.ServerAddress);
using var channel = GrpcConnection.CreateChannel();

var client = new TaskItem.TaskItemClient(channel);

Expand Down
56 changes: 56 additions & 0 deletions GrpcTodo.CLI/UseCases/TaskDelete/TaskDeletePrompt.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
using System.Text;

using GrpcTodo.CLI.UseCases.Common;
using GrpcTodo.CLI.Utils;
using GrpcTodo.SharedKernel.Protos.Tasks.Responses;

namespace GrpcTodo.CLI.UseCases.TaskDelete;

public sealed class TaskDeletePrompt : Prompt
{
public string PromptTask(IOrderedEnumerable<TaskListResponseItem> tasks)
{
Dictionary<string, bool> tasksId = new();

foreach (var task in tasks)
tasksId.Add(task.Id[0..4], true);

ConsoleWritter.WriteInfo("Choose a task id to delete\n");

ConsoleWritter.WriteWithColor("+ completed", ConsoleColor.Green);
ConsoleWritter.WriteWithColor("- uncompleted", ConsoleColor.White);
Console.WriteLine();

StringBuilder sb = new();

foreach (var task in tasks)
{
var id = task.Id[0..4];

sb.Append(task.Completed ? "+" : "- ");

var createdAt = new DateTime(task.CreatedAt);

sb.Append($"[{id}] [{createdAt:MM/dd HH:mm}] {task.Name}");

if (task.Completed)
ConsoleWritter.WriteWithColor(sb.ToString(), ConsoleColor.Green);
else
ConsoleWritter.WriteWithColor(sb.ToString(), ConsoleColor.White);

sb.Clear();
}

Console.WriteLine();

var taskId = Read("task id: ", new PromptOptions
{
RemoveWhitespaces = true,
ShouldBeSingleWord = true,
CustomMessage = "This task id does not exists",
Custom = id => !tasksId.ContainsKey(id)
});

return taskId;
}
}
45 changes: 45 additions & 0 deletions GrpcTodo.CLI/UseCases/TaskDelete/TaskDeleteUseCase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using GrpcTodo.CLI.Lib;
using GrpcTodo.CLI.UseCases.Common;
using GrpcTodo.CLI.Utils;
using GrpcTodo.SharedKernel.Protos.Tasks;
using GrpcTodo.SharedKernel.Protos.Tasks.Requests;

namespace GrpcTodo.CLI.UseCases.TaskDelete;
public class TaskDeleteUseCase : UseCase
{
public TaskDeleteUseCase(ConfigsManager configsManager) : base(configsManager)
{
}

public override async Task ExecuteAsync()
{
var accessToken = _configsManager.GetItem(ConfigKey.Item, Settings.AuthTokenKey);

if (accessToken is null)
throw new ArgumentNullException(nameof(accessToken), "you are not authenticated");

using var channel = GrpcConnection.CreateChannel();

var client = new TaskItem.TaskItemClient(channel);

var request = new TaskListRequest
{
AccessToken = accessToken
};

var response = await client.ListAllAsync(request);

var tasks = response.Items.OrderByDescending(x => x.CreatedAt);

var taskDeletePrompt = new TaskDeletePrompt();

var taskIdToDelete = taskDeletePrompt.PromptTask(tasks);

await client.DeleteAsync(new TaskDeleteRequest {
TaskId = taskIdToDelete,
AccessToken = accessToken
});

ConsoleWritter.WriteSuccess($"task [{taskIdToDelete}] deleted successfully");
}
}
82 changes: 34 additions & 48 deletions GrpcTodo.CLI/UseCases/TaskList/TaskListUseCase.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
using System.Text;

using Grpc.Core;
using Grpc.Net.Client;

using GrpcTodo.CLI.Lib;
using GrpcTodo.CLI.UseCases.Common;
using GrpcTodo.CLI.Utils;
Expand All @@ -22,66 +19,55 @@ public TaskListUseCase(ConfigsManager configsManager, Parameters parameters) : b

public override async Task ExecuteAsync()
{
try
{
var accessToken = _configsManager.GetItem(ConfigKey.Item, Settings.AuthTokenKey);
var accessToken = _configsManager.GetItem(ConfigKey.Item, Settings.AuthTokenKey);

if (accessToken is null)
throw new ArgumentNullException(nameof(accessToken), "you are not authenticated");
if (accessToken is null)
throw new ArgumentNullException(nameof(accessToken), "you are not authenticated");

using var channel = GrpcChannel.ForAddress(Settings.ServerAddress);
using var channel = GrpcConnection.CreateChannel();

var client = new TaskItem.TaskItemClient(channel);

var request = new TaskListRequest
{
AccessToken = accessToken
};
var client = new TaskItem.TaskItemClient(channel);

var response = await client.ListAllAsync(request);
var request = new TaskListRequest
{
AccessToken = accessToken
};

var tasks = response.Items.OrderByDescending(x => x.CreatedAt);
var response = await client.ListAllAsync(request);

ConsoleWritter.WriteInfo("==== ALL TASKS ===\n");
ConsoleWritter.WriteWithColor("+ completed", ConsoleColor.Green);
ConsoleWritter.WriteWithColor("- uncompleted", ConsoleColor.White);
Console.WriteLine();
var tasks = response.Items.OrderByDescending(x => x.CreatedAt);

StringBuilder sb = new();
ConsoleWritter.WriteInfo("==== ALL TASKS ===\n");
ConsoleWritter.WriteWithColor("+ completed", ConsoleColor.Green);
ConsoleWritter.WriteWithColor("- uncompleted", ConsoleColor.White);
Console.WriteLine();

foreach (var task in tasks)
{
var id = task.Id[0..4];
StringBuilder sb = new();

sb.Append(task.Completed ? "+" : "- ");
foreach (var task in tasks)
{
var id = task.Id[0..4];

if (_parameters.Has("--full"))
{
var createdAt = new DateTime(task.CreatedAt);
sb.Append(task.Completed ? "+" : "- ");

sb.Append($"[{id}] ");
sb.Append($"[{createdAt:MM/dd HH:mm}] ");
}
if (_parameters.Has("--full"))
{
var createdAt = new DateTime(task.CreatedAt);

sb.Append(task.Name);
sb.Append($"[{id}] ");
sb.Append($"[{createdAt:MM/dd HH:mm}] ");
}

if (task.Completed)
ConsoleWritter.WriteWithColor(sb.ToString(), ConsoleColor.Green);
else
ConsoleWritter.WriteWithColor(sb.ToString(), ConsoleColor.White);
sb.Append(task.Name);

sb.Clear();
}
if (task.Completed)
ConsoleWritter.WriteWithColor(sb.ToString(), ConsoleColor.Green);
else
ConsoleWritter.WriteWithColor(sb.ToString(), ConsoleColor.White);

Console.WriteLine();
}
catch (RpcException e)
{
ConsoleWritter.WriteError(e.Status.Detail ?? e.Message);
}
catch (ArgumentNullException e)
{
ConsoleWritter.WriteError(e.Message);
sb.Clear();
}

Console.WriteLine();
}
}
21 changes: 21 additions & 0 deletions GrpcTodo.CLI/Utils/GrpcConnection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using Grpc.Net.Client;

namespace GrpcTodo.CLI.Utils;

public static class GrpcConnection
{
public static GrpcChannel CreateChannel()
{
var httpHandler = new HttpClientHandler
{
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};

var configurations = new GrpcChannelOptions
{
HttpHandler = httpHandler
};

return GrpcChannel.ForAddress(Settings.ServerAddress, configurations);
}
}

0 comments on commit 6a34a2d

Please sign in to comment.