Skip to content

Commit 9ef92ff

Browse files
committed
Added feature to save local user settings + first setting FullyQualifiedNamespaces
1 parent 1285a52 commit 9ef92ff

9 files changed

Lines changed: 325 additions & 14 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace servicebus_cli.Models;
2+
3+
public class UserSettings
4+
{
5+
public List<string> FullyQualifiedNamespaces { get; set; } = new List<string>();
6+
}

servicebus-cli/Program.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@ public static async Task Main(string[] args)
1212
var serviceProvider = new ServiceCollection()
1313
.AddSingleton<IServiceBusCli, ServiceBusCli>()
1414
.AddSingleton<IDeadletter, Deadletter>()
15+
.AddSingleton<ISettings, Settings>()
1516
.AddSingleton<IQueue, Queue>()
1617
.AddSingleton<IServiceBusService, ServiceBusService>()
18+
.AddSingleton<IFileService, FileService>()
19+
.AddSingleton<IUserSettingsService, UserSettingsService>()
1720
.AddSingleton<IServiceBusRepository, ServiceBusRepository>()
1821
.AddSingleton<IHelp, Help>()
1922
.BuildServiceProvider();

servicebus-cli/ServiceBusCli.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ public class ServiceBusCli : IServiceBusCli
1313
private IDeadletter _deadletter;
1414
private IQueue queue;
1515
private IHelp _help;
16+
private ISettings _settings;
1617

17-
public ServiceBusCli(IDeadletter deadletter, IHelp help, IQueue queue)
18+
public ServiceBusCli(IDeadletter deadletter, IHelp help, IQueue queue, ISettings settings)
1819
{
1920
_help = help;
2021
_deadletter = deadletter;
22+
_settings = settings;
2123
this.queue = queue;
2224
}
2325

@@ -34,6 +36,7 @@ public async Task Run(string[] args)
3436
.AddChoices(
3537
"deadletter",
3638
"queue",
39+
"settings",
3740
"help"
3841
)
3942
);
@@ -53,6 +56,9 @@ public async Task Run(string[] args)
5356
case "queue":
5457
await queue.Run(args.Skip(1).ToArray());
5558
break;
59+
case "settings":
60+
await _settings.Run(args.Skip(1).ToArray());
61+
break;
5662
default:
5763
_help.Run();
5864
break;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using Azure.Messaging.ServiceBus;
2+
using Azure.Messaging.ServiceBus.Administration;
3+
using servicebus_cli.Models;
4+
using servicebus_cli.Repositories;
5+
using System.Text.RegularExpressions;
6+
7+
namespace servicebus_cli.Services;
8+
9+
public interface IFileService
10+
{
11+
string GetConfigFileContent();
12+
void SetConfigFileContent(string content);
13+
}
14+
15+
public class FileService() : IFileService
16+
{
17+
public string GetConfigFileContent()
18+
{
19+
var homePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
20+
var configFilePath = Path.Combine(homePath, ".servicebus-cli", "config.json"); //TODO: Is this working on Windows?
21+
22+
if (!File.Exists(configFilePath))
23+
{
24+
return string.Empty;
25+
}
26+
27+
return File.ReadAllText(configFilePath);
28+
}
29+
30+
public void SetConfigFileContent(string content)
31+
{
32+
var homePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
33+
var configDirectoryPath = Path.Combine(homePath, ".servicebus-cli");
34+
var configFilePath = Path.Combine(configDirectoryPath, "config.json"); //TODO: Is this working on Windows?
35+
36+
if (!Directory.Exists(configDirectoryPath))
37+
{
38+
Directory.CreateDirectory(configDirectoryPath);
39+
}
40+
41+
File.WriteAllText(configFilePath, content);
42+
}
43+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using servicebus_cli.Models;
2+
3+
namespace servicebus_cli.Services;
4+
5+
public interface IUserSettingsService
6+
{
7+
string Serialize(UserSettings settings);
8+
UserSettings Deserialize(string content);
9+
}
10+
11+
public class UserSettingsService() : IUserSettingsService
12+
{
13+
public string Serialize(UserSettings settings)
14+
{
15+
return System.Text.Json.JsonSerializer.Serialize(
16+
settings,
17+
new System.Text.Json.JsonSerializerOptions { WriteIndented = true });
18+
}
19+
20+
public UserSettings Deserialize(string content)
21+
{
22+
if (string.IsNullOrWhiteSpace(content))
23+
{
24+
return new UserSettings();
25+
}
26+
27+
return System.Text.Json.JsonSerializer.Deserialize<UserSettings>(content) ?? new UserSettings();
28+
}
29+
}

servicebus-cli/Subjects/Deadletter.cs

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,16 @@ public class Deadletter : IDeadletter
1313
{
1414
private readonly IHelp _helpService;
1515
private readonly IServiceBusService _serviceBusService;
16+
private readonly IFileService _fileService;
17+
private readonly IUserSettingsService _userSettingsService;
1618

17-
public Deadletter(IHelp helpService, IServiceBusService serviceBusRepostitory)
19+
20+
public Deadletter(IHelp helpService, IServiceBusService serviceBusRepostitory, IFileService fileService, IUserSettingsService userSettingsService)
1821
{
1922
_helpService = helpService;
2023
_serviceBusService = serviceBusRepostitory;
24+
_fileService = fileService;
25+
_userSettingsService = userSettingsService;
2126
}
2227

2328
public async Task Run(string[] args)
@@ -60,6 +65,8 @@ private async Task Resend(List<string> args)
6065
{
6166
var fullyQualifiedNamespace = "";
6267
var entityPath = "";
68+
var settingsFileContent = _fileService.GetConfigFileContent();
69+
var savedNamespaces = _userSettingsService.Deserialize(settingsFileContent);
6370

6471
switch (args.Count)
6572
{
@@ -68,9 +75,22 @@ private async Task Resend(List<string> args)
6875
entityPath = args[1];
6976
break;
7077
default:
71-
fullyQualifiedNamespace = await AnsiConsole.PromptAsync(
72-
new TextPrompt<string>("Enter the [green]fully qualified namespace[/]:")
73-
);
78+
if (!savedNamespaces.FullyQualifiedNamespaces.Any())
79+
{
80+
fullyQualifiedNamespace = await AnsiConsole.PromptAsync(
81+
new TextPrompt<string>("Enter the [green]fully qualified namespace[/]:")
82+
);
83+
}
84+
else
85+
{
86+
fullyQualifiedNamespace = await AnsiConsole.PromptAsync(
87+
new SelectionPrompt<string>()
88+
.Title("Select a fully qualified namespace:")
89+
.PageSize(10)
90+
.AddChoices(savedNamespaces.FullyQualifiedNamespaces)
91+
);
92+
AnsiConsole.MarkupLine($"[grey]Selected fully qualified namespace: {fullyQualifiedNamespace}[/]");
93+
}
7494

7595
var queues = await AnsiConsole.Status()
7696
.StartAsync($"Fetching queues on {fullyQualifiedNamespace}...", async ctx =>
@@ -90,7 +110,9 @@ private async Task Resend(List<string> args)
90110
.AddChoices(queues.Select(q => $"{q.QueueProperties.Name} ([green]{q.QueueRuntimeProperties.ActiveMessageCount}[/], [red]{q.QueueRuntimeProperties.DeadLetterMessageCount}[/], [blue]{q.QueueRuntimeProperties.ScheduledMessageCount}[/])").ToList())
91111
);
92112
entityPath = selectedQueue.Split(' ')[0];
93-
113+
114+
AnsiConsole.MarkupLine($"[grey]Selected queue: {entityPath}[/]");
115+
94116
break;
95117
}
96118

@@ -144,6 +166,8 @@ private async Task Purge(List<string> args)
144166
{
145167
var fullyQualifiedNamespace = "";
146168
var entityPath = "";
169+
var settingsFileContent = _fileService.GetConfigFileContent();
170+
var savedNamespaces = _userSettingsService.Deserialize(settingsFileContent);
147171

148172
switch (args.Count)
149173
{
@@ -152,9 +176,22 @@ private async Task Purge(List<string> args)
152176
entityPath = args[1];
153177
break;
154178
default:
155-
fullyQualifiedNamespace = await AnsiConsole.PromptAsync(
156-
new TextPrompt<string>("Enter the [green]fully qualified namespace[/]:")
157-
);
179+
if (!savedNamespaces.FullyQualifiedNamespaces.Any())
180+
{
181+
fullyQualifiedNamespace = await AnsiConsole.PromptAsync(
182+
new TextPrompt<string>("Enter the [green]fully qualified namespace[/]:") //Here
183+
);
184+
}
185+
else
186+
{
187+
fullyQualifiedNamespace = await AnsiConsole.PromptAsync(
188+
new SelectionPrompt<string>()
189+
.Title("Select a fully qualified namespace:")
190+
.PageSize(10)
191+
.AddChoices(savedNamespaces.FullyQualifiedNamespaces)
192+
);
193+
AnsiConsole.MarkupLine($"[grey]Selected fully qualified namespace: {fullyQualifiedNamespace}[/]");
194+
}
158195

159196
var queues = await AnsiConsole.Status()
160197
.StartAsync($"Fetching queues on {fullyQualifiedNamespace}...", async ctx =>
@@ -164,7 +201,7 @@ private async Task Purge(List<string> args)
164201

165202
return await _serviceBusService.GetInformationAboutAllQueues(fullyQualifiedNamespace).ConfigureAwait(false);
166203
});
167-
204+
168205
var selectedQueue = await AnsiConsole.PromptAsync(
169206
new SelectionPrompt<string>()
170207
.Title("Select a [green]queue[/]:")
@@ -173,6 +210,9 @@ private async Task Purge(List<string> args)
173210
.AddChoices(queues.Select(q => $"{q.QueueProperties.Name} ([green]{q.QueueRuntimeProperties.ActiveMessageCount}[/], [red]{q.QueueRuntimeProperties.DeadLetterMessageCount}[/], [blue]{q.QueueRuntimeProperties.ScheduledMessageCount}[/])").ToList())
174211
);
175212
entityPath = selectedQueue.Split(' ')[0];
213+
214+
AnsiConsole.MarkupLine($"[grey]Selected queue: {entityPath}[/]");
215+
176216
break;
177217
}
178218

servicebus-cli/Subjects/Help.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,19 @@ public void Run()
5050
listNode.AddNode("[dim]<FullyQualifiedNamespace>[/] - Service Bus namespace");
5151
listNode.AddNode("[dim]<Filter>[/] - Optional filter pattern");
5252

53+
// Settings branch
54+
var settingsNode = tree.AddNode("[bold yellow]settings[/] - Local settings management operations");
55+
56+
var getNode = settingsNode.AddNode("[green]get[/] - Get local user setting");
57+
getNode.AddNode("[dim]<SettingName>[/] - Name of the setting to get. Available settings are: FullyQualifiedNamespaces");
58+
59+
var setNode = settingsNode.AddNode("[green]set[/] - Set local user setting");
60+
setNode.AddNode("[dim]<SettingName>[/] - Name of the setting to set. Available settings are: FullyQualifiedNamespaces");
61+
setNode.AddNode("[dim]<SettingValue>[/] - Value to set for the setting");
62+
63+
// Help branch
64+
var _ = tree.AddNode("[bold yellow]help[/] - Displays the help section");
65+
5366
// Render the tree
5467
AnsiConsole.Write(tree);
5568
AnsiConsole.WriteLine();

servicebus-cli/Subjects/Queue.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,15 @@ public class Queue : IQueue
1212
{
1313
private readonly IHelp _helpService;
1414
private readonly IServiceBusService _serviceBusService;
15+
private readonly IFileService _fileService;
16+
private readonly IUserSettingsService _userSettingsService;
1517

16-
public Queue(IHelp helpService, IServiceBusService serviceBusRepostitory)
18+
public Queue(IHelp helpService, IServiceBusService serviceBusRepostitory, IFileService fileService, IUserSettingsService settingsService)
1719
{
1820
_helpService = helpService;
21+
_fileService = fileService;
1922
_serviceBusService = serviceBusRepostitory;
23+
_userSettingsService = settingsService;
2024
}
2125

2226
public async Task Run(string[] args)
@@ -55,6 +59,8 @@ private async Task List(List<string> args)
5559
{
5660
var fullyQualifiedNamespace = "";
5761
var filter = "";
62+
var settingsFileContent = _fileService.GetConfigFileContent();
63+
var savedNamespaces = _userSettingsService.Deserialize(settingsFileContent);
5864

5965
switch (args.Count)
6066
{
@@ -66,9 +72,23 @@ private async Task List(List<string> args)
6672
filter = args[1];
6773
break;
6874
default:
69-
fullyQualifiedNamespace = await AnsiConsole.PromptAsync(
70-
new TextPrompt<string>("Enter the [green]fully qualified namespace[/]:")
71-
);
75+
if (!savedNamespaces.FullyQualifiedNamespaces.Any())
76+
{
77+
fullyQualifiedNamespace = await AnsiConsole.PromptAsync(
78+
new TextPrompt<string>("Enter the [green]fully qualified namespace[/]:")
79+
);
80+
}
81+
else
82+
{
83+
fullyQualifiedNamespace = await AnsiConsole.PromptAsync(
84+
new SelectionPrompt<string>()
85+
.Title("Select a fully qualified namespace:")
86+
.PageSize(10)
87+
.AddChoices(savedNamespaces.FullyQualifiedNamespaces)
88+
);
89+
AnsiConsole.MarkupLine($"[grey]Selected fully qualified namespace: {fullyQualifiedNamespace}[/]");
90+
}
91+
7292
filter = await AnsiConsole.PromptAsync(
7393
new TextPrompt<string>("Enter a [green]filter[/] (optional):")
7494
.AllowEmpty()

0 commit comments

Comments
 (0)