using Foxel.Controllers; using Foxel.Models; using Foxel.Models.Request.Storage; using Foxel.Models.Response.Storage; using Foxel.Services.Attributes; using Foxel.Services.Management; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Foxel.Api.Management; [Authorize(Roles = "Administrator")] [Route("api/management/storage")] public class StorageManagementController(IStorageManagementService storageManagementService) : BaseApiController { [AllowAnonymous] [HttpGet("get_available_modes")] public async Task>>> GetAvailableStorageModes() { try { var result = await storageManagementService.GetStorageModesAsync(); var filteredModes = result.Data! .Where(mode => mode.IsEnabled) .Select(mode => new StorageModeResponse { Id = mode.Id, Name = mode.Name, StorageType = mode.StorageType, IsEnabled = mode.IsEnabled }) .ToList(); return Success(filteredModes, "Available storage modes retrieved successfully."); } catch (Exception ex) { return Error>($"Failed to get available storage modes: {ex.Message}", 500); } } [HttpGet("get_modes")] public async Task>> GetStorageModes( [FromQuery] int page = 1, [FromQuery] int pageSize = 10, [FromQuery] string? searchQuery = null, [FromQuery] StorageType? storageType = null, [FromQuery] bool? isEnabled = null) { try { var result = await storageManagementService.GetStorageModesAsync(page, pageSize, searchQuery, storageType, isEnabled); return PaginatedSuccess(result.Data, result.TotalCount, result.Page, result.PageSize); } catch (Exception ex) { return PaginatedError($"Failed to get storage modes: {ex.Message}", 500); } } [HttpGet("get_mode/{id}")] public async Task>> GetStorageModeById(int id) { try { var result = await storageManagementService.GetStorageModeByIdAsync(id); return Success(result, "Storage mode retrieved successfully."); } catch (KeyNotFoundException ex) { return Error(ex.Message, 404); } catch (Exception ex) { return Error($"Failed to get storage mode: {ex.Message}", 500); } } [HttpPost("create_mode")] public async Task>> CreateStorageMode( [FromBody] CreateStorageModeRequest request) { try { var result = await storageManagementService.CreateStorageModeAsync(request); return Success(result, "Storage mode created successfully."); } catch (ArgumentException ex) { return Error(ex.Message, 400); } catch (Exception ex) { return Error($"Failed to create storage mode: {ex.Message}", 500); } } [HttpPost("update_mode")] public async Task>> UpdateStorageMode( [FromBody] UpdateStorageModeRequest request) { try { var result = await storageManagementService.UpdateStorageModeAsync(request); return Success(result, "Storage mode updated successfully."); } catch (KeyNotFoundException ex) { return Error(ex.Message, 404); } catch (ArgumentException ex) { return Error(ex.Message, 400); } catch (Exception ex) { return Error($"Failed to update storage mode: {ex.Message}", 500); } } [HttpPost("delete_mode")] public async Task>> DeleteStorageMode([FromBody] int id) { try { var result = await storageManagementService.DeleteStorageModeAsync(id); return Success(result, "Storage mode deleted successfully."); } catch (KeyNotFoundException ex) { return Error(ex.Message, 404); } catch (InvalidOperationException ex) // Catch specific exception for "in use" { return Error(ex.Message, 400); } catch (Exception ex) { return Error($"Failed to delete storage mode: {ex.Message}", 500); } } [HttpPost("batch_delete_modes")] public async Task>> BatchDeleteStorageModes([FromBody] List ids) { try { if (ids == null || !ids.Any()) { return Error("No IDs provided for batch deletion.", 400); } var result = await storageManagementService.BatchDeleteStorageModesAsync(ids); return Success(result, $"Batch delete completed. Succeeded: {result.SuccessCount}, Failed: {result.FailedCount}."); } catch (Exception ex) { return Error($"Batch delete failed: {ex.Message}", 500); } } [HttpGet("get_storage_types")] public async Task>>> GetStorageTypes() { try { var result = await storageManagementService.GetStorageTypesAsync(); return Success(result, "Storage types retrieved successfully."); } catch (Exception ex) { return Error>($"Failed to get storage types: {ex.Message}", 500); } } [HttpGet("get_default_mode_id")] public async Task>> GetDefaultStorageModeId() { try { var result = await storageManagementService.GetDefaultStorageModeIdAsync(); if (result.HasValue) { return Success(result.Value, "Default storage mode ID retrieved successfully."); } return Success(null, "No default storage mode is currently set or the configured one is invalid."); } catch (Exception ex) { return Error($"Failed to get default storage mode ID: {ex.Message}", 500); } } [HttpPost("set_default_mode/{id}")] public async Task>> SetDefaultStorageMode(int id) { try { var result = await storageManagementService.SetDefaultStorageModeAsync(id); return Success(result, $"Default storage mode set to ID {id} successfully."); } catch (KeyNotFoundException ex) { return Error(ex.Message, 404); } catch (InvalidOperationException ex) { return Error(ex.Message, 400); } catch (Exception ex) { return Error($"Failed to set default storage mode: {ex.Message}", 500); } } }