diff --git a/CaddyManager/Components/Pages/ReverseProxies/ReverseProxiesPage.razor b/CaddyManager/Components/Pages/ReverseProxies/ReverseProxiesPage.razor
index 876aa9a..398c0d6 100644
--- a/CaddyManager/Components/Pages/ReverseProxies/ReverseProxiesPage.razor
+++ b/CaddyManager/Components/Pages/ReverseProxies/ReverseProxiesPage.razor
@@ -8,7 +8,8 @@
OnClick="NewReverseProxy">New...
Delete
+ Disabled="@(_selectedCaddyConfigurations.Count <= 0)"
+ OnClick="Delete">Delete
///
CaddyOperationResponse SaveCaddyGlobalConfiguration(string content);
+
+ ///
+ /// Method to delete the given Caddy configurations by name
+ ///
+ ///
+ ///
+ CaddyDeleteOperationResponse DeleteCaddyConfigurations(List configurationNames);
}
\ No newline at end of file
diff --git a/CaddyManager/Models/Caddy/CaddyDeleteOperationResponse.cs b/CaddyManager/Models/Caddy/CaddyDeleteOperationResponse.cs
new file mode 100644
index 0000000..8a0239f
--- /dev/null
+++ b/CaddyManager/Models/Caddy/CaddyDeleteOperationResponse.cs
@@ -0,0 +1,12 @@
+namespace CaddyManager.Models.Caddy;
+
+///
+/// Class to wrap the response of a Caddy delete operation
+///
+public class CaddyDeleteOperationResponse : CaddyOperationResponse
+{
+ ///
+ /// List of configurations that were successfully deleted
+ ///
+ public List DeletedConfigurations { get; set; } = [];
+}
\ No newline at end of file
diff --git a/CaddyManager/Services/CaddyService.cs b/CaddyManager/Services/CaddyService.cs
index 4ac9b99..7d85d30 100644
--- a/CaddyManager/Services/CaddyService.cs
+++ b/CaddyManager/Services/CaddyService.cs
@@ -21,6 +21,7 @@ public class CaddyService(IConfigurationsService configurationsService) : ICaddy
return Directory.GetFiles(Configurations.ConfigDir)
.Where(filePath => Path.GetFileName(filePath) != CaddyGlobalConfigName)
.Select(Path.GetFileNameWithoutExtension)
+ .Order()
.ToList()!;
}
@@ -92,4 +93,41 @@ public class CaddyService(IConfigurationsService configurationsService) : ICaddy
FileName = CaddyGlobalConfigName,
Content = content
});
+
+ ///
+ public CaddyDeleteOperationResponse DeleteCaddyConfigurations(List configurationNames)
+ {
+ var failed = new List();
+
+ foreach (var configurationName in configurationNames)
+ {
+ var filePath = Path.Combine(Configurations.ConfigDir,
+ configurationName == CaddyGlobalConfigName ? CaddyGlobalConfigName : $"{configurationName}.caddy");
+
+ if (File.Exists(filePath))
+ {
+ try
+ {
+ File.Delete(filePath);
+ }
+ catch
+ {
+ failed.Add(configurationName);
+ }
+ }
+ else
+ {
+ failed.Add(configurationName);
+ }
+ }
+
+ return new CaddyDeleteOperationResponse
+ {
+ Success = failed.Count == 0,
+ Message = failed.Count == 0
+ ? "Configuration(s) deleted successfully"
+ : $"Failed to delete the following configuration(s): {string.Join(", ", failed)}",
+ DeletedConfigurations = configurationNames.Except(failed).ToList()
+ };
+ }
}
\ No newline at end of file