Procházet zdrojové kódy

Fixes to the commands to use indexing

James před 2 měsíci
rodič
revize
81d734fa96

+ 1 - 4
RackPeek.Domain/Resources/SystemResources/UseCases/AddSystemDriveUseCase.cs

@@ -13,16 +13,13 @@ public class AddSystemDriveUseCase(ISystemRepository repository) : IUseCase
         ThrowIfInvalid.ResourceName(type);
 
         if (size < 0)
-            throw new ValidationException("Drive size must be a non‑negative number of gigabytes.");
+            throw new ValidationException("Drive size must be non‑negative.");
 
         var system = await repository.GetByNameAsync(systemName)
                      ?? throw new NotFoundException($"System '{systemName}' not found.");
 
         system.Drives ??= new List<Drive>();
 
-        if (system.Drives.Any(d => d.Type == type))
-            throw new ConflictException($"Drive '{type}' already exists on system '{systemName}'.");
-
         system.Drives.Add(new Drive
         {
             Type = type,

+ 5 - 6
RackPeek.Domain/Resources/SystemResources/UseCases/RemoveSystemDriveUseCase.cs

@@ -1,23 +1,22 @@
+using System.ComponentModel.DataAnnotations;
 using RackPeek.Domain.Helpers;
-using RackPeek.Domain.Resources.Hardware.Models;
 using RackPeek.Domain.Resources.SystemResources;
 
 namespace RackPeek.Domain.Resources.SystemResources.UseCases;
 
 public class RemoveSystemDriveUseCase(ISystemRepository repository) : IUseCase
 {
-    public async Task ExecuteAsync(string systemName, string type)
+    public async Task ExecuteAsync(string systemName, int index)
     {
         ThrowIfInvalid.ResourceName(systemName);
-        ThrowIfInvalid.ResourceName(type);
 
         var system = await repository.GetByNameAsync(systemName)
                      ?? throw new NotFoundException($"System '{systemName}' not found.");
 
-        var drive = system.Drives?.FirstOrDefault(d => d.Type == type)
-                    ?? throw new NotFoundException($"Drive '{type}' not found on system '{systemName}'.");
+        if (system.Drives == null || index < 0 || index >= system.Drives.Count)
+            throw new NotFoundException($"Drive index {index} not found on system '{systemName}'.");
 
-        system.Drives!.Remove(drive);
+        system.Drives.RemoveAt(index);
 
         await repository.UpdateAsync(system);
     }

+ 7 - 4
RackPeek.Domain/Resources/SystemResources/UseCases/UpdateSystemDriveUseCase.cs

@@ -7,20 +7,23 @@ namespace RackPeek.Domain.Resources.SystemResources.UseCases;
 
 public class UpdateSystemDriveUseCase(ISystemRepository repository) : IUseCase
 {
-    public async Task ExecuteAsync(string systemName, string type, int size)
+    public async Task ExecuteAsync(string systemName, int index, string type, int size)
     {
         ThrowIfInvalid.ResourceName(systemName);
         ThrowIfInvalid.ResourceName(type);
 
         if (size < 0)
-            throw new ValidationException("Drive size must be a non‑negative number of gigabytes.");
+            throw new ValidationException("Drive size must be non‑negative.");
 
         var system = await repository.GetByNameAsync(systemName)
                      ?? throw new NotFoundException($"System '{systemName}' not found.");
 
-        var drive = system.Drives?.FirstOrDefault(d => d.Type == type)
-                    ?? throw new NotFoundException($"Drive '{type}' not found on system '{systemName}'.");
+        if (system.Drives == null || index < 0 || index >= system.Drives.Count)
+            throw new NotFoundException($"Drive index {index} not found on system '{systemName}'.");
 
+        var drive = system.Drives[index];
+
+        drive.Type = type;
         drive.Size = size;
 
         await repository.UpdateAsync(system);

+ 12 - 17
RackPeek/Commands/Systems/Drives/SystemDriveAddCommand.cs

@@ -5,34 +5,29 @@ using Spectre.Console.Cli;
 
 namespace RackPeek.Commands.Systems.Drives;
 
-public class SystemDriveAddCommand(IServiceProvider serviceProvider)
-    : AsyncCommand<SystemDriveAddCommand.Settings>
+public class SystemDriveAddSettings : SystemNameSettings
 {
-    public class Settings : CommandSettings
-    {
-        [CommandArgument(0, "<systemName>")]
-        public string SystemName { get; set; } = default!;
+    [CommandOption("--type <TYPE>")] 
+    public string Type { get; set; } = default!;
 
-        [CommandArgument(1, "<driveName>")]
-        public string DriveName { get; set; } = default!;
-
-        [CommandArgument(2, "<sizeGb>")]
-        public int SizeGb { get; set; }
-    }
+    [CommandOption("--size <SIZE>")] 
+    public int Size { get; set; }
+}
 
+public class SystemDriveAddCommand(IServiceProvider serviceProvider)
+    : AsyncCommand<SystemDriveAddSettings>
+{
     public override async Task<int> ExecuteAsync(
         CommandContext context,
-        Settings settings,
+        SystemDriveAddSettings settings,
         CancellationToken cancellationToken)
     {
         using var scope = serviceProvider.CreateScope();
         var useCase = scope.ServiceProvider.GetRequiredService<AddSystemDriveUseCase>();
 
-        await useCase.ExecuteAsync(settings.SystemName, settings.DriveName, settings.SizeGb);
-
-        AnsiConsole.MarkupLine(
-            $"[green]Drive '{settings.DriveName}' added to system '{settings.SystemName}'.[/]");
+        await useCase.ExecuteAsync(settings.Name, settings.Type, settings.Size);
 
+        AnsiConsole.MarkupLine($"[green]Drive added to '{settings.Name}'.[/]");
         return 0;
     }
 }

+ 10 - 15
RackPeek/Commands/Systems/Drives/SystemDriveRemoveCommand.cs

@@ -5,31 +5,26 @@ using Spectre.Console.Cli;
 
 namespace RackPeek.Commands.Systems.Drives;
 
-public class SystemDriveRemoveCommand(IServiceProvider serviceProvider)
-    : AsyncCommand<SystemDriveRemoveCommand.Settings>
+public class SystemDriveRemoveSettings : SystemNameSettings
 {
-    public class Settings : CommandSettings
-    {
-        [CommandArgument(0, "<systemName>")]
-        public string SystemName { get; set; } = default!;
-
-        [CommandArgument(1, "<driveName>")]
-        public string DriveName { get; set; } = default!;
-    }
+    [CommandOption("--index <INDEX>")] 
+    public int Index { get; set; }
+}
 
+public class SystemDriveRemoveCommand(IServiceProvider serviceProvider)
+    : AsyncCommand<SystemDriveRemoveSettings>
+{
     public override async Task<int> ExecuteAsync(
         CommandContext context,
-        Settings settings,
+        SystemDriveRemoveSettings settings,
         CancellationToken cancellationToken)
     {
         using var scope = serviceProvider.CreateScope();
         var useCase = scope.ServiceProvider.GetRequiredService<RemoveSystemDriveUseCase>();
 
-        await useCase.ExecuteAsync(settings.SystemName, settings.DriveName);
-
-        AnsiConsole.MarkupLine(
-            $"[green]Drive '{settings.DriveName}' removed from system '{settings.SystemName}'.[/]");
+        await useCase.ExecuteAsync(settings.Name, settings.Index);
 
+        AnsiConsole.MarkupLine($"[green]Drive {settings.Index} removed from '{settings.Name}'.[/]");
         return 0;
     }
 }

+ 14 - 16
RackPeek/Commands/Systems/Drives/SystemDriveUpdateCommand.cs

@@ -5,34 +5,32 @@ using Spectre.Console.Cli;
 
 namespace RackPeek.Commands.Systems.Drives;
 
-public class SystemDriveUpdateCommand(IServiceProvider serviceProvider)
-    : AsyncCommand<SystemDriveUpdateCommand.Settings>
+public class SystemDriveUpdateSettings : SystemNameSettings
 {
-    public class Settings : CommandSettings
-    {
-        [CommandArgument(0, "<systemName>")]
-        public string SystemName { get; set; } = default!;
+    [CommandOption("--index <INDEX>")] 
+    public int Index { get; set; }
 
-        [CommandArgument(1, "<driveName>")]
-        public string DriveName { get; set; } = default!;
+    [CommandOption("--type <TYPE>")] 
+    public string Type { get; set; } = default!;
 
-        [CommandArgument(2, "<sizeGb>")]
-        public int SizeGb { get; set; }
-    }
+    [CommandOption("--size <SIZE>")] 
+    public int Size { get; set; }
+}
 
+public class SystemDriveUpdateCommand(IServiceProvider serviceProvider)
+    : AsyncCommand<SystemDriveUpdateSettings>
+{
     public override async Task<int> ExecuteAsync(
         CommandContext context,
-        Settings settings,
+        SystemDriveUpdateSettings settings,
         CancellationToken cancellationToken)
     {
         using var scope = serviceProvider.CreateScope();
         var useCase = scope.ServiceProvider.GetRequiredService<UpdateSystemDriveUseCase>();
 
-        await useCase.ExecuteAsync(settings.SystemName, settings.DriveName, settings.SizeGb);
-
-        AnsiConsole.MarkupLine(
-            $"[green]Drive '{settings.DriveName}' updated on system '{settings.SystemName}'.[/]");
+        await useCase.ExecuteAsync(settings.Name, settings.Index, settings.Type, settings.Size);
 
+        AnsiConsole.MarkupLine($"[green]Drive {settings.Index} updated on '{settings.Name}'.[/]");
         return 0;
     }
 }