TOOGLE
Repository Service Pattern - Back-End
### **📌 1. Separação de Responsabilidades (SoC - Separation of Concerns)**

Cada camada tem sua responsabilidade clara:

✅ **Controller (`HomeController`)** → Apenas lida com requisições HTTP e respostas.
Receber requisições HTTP, chamar o Service, e devolver a resposta apropriada.
✅ **Service (`BlobService`)** → Contém a lógica de negócio (validações, chamadas ao repositório).
Lógica de negócios, validações e regras da aplicação. Ele chama o Repository para interagir com os dados.
✅ **Repository (`BlobRepository`)** → Interage diretamente com o **Azure Blob Storage**.
Acesso direto ao banco de dados ou ao armazenamento (ex: Azure Blob Storage). Não contém lógica de negócios.
_______________________________________________________________________________________
Controller - Antes

[HttpPost("delete/{fileName}")]
public async Task<IActionResult> DeleteFile(string fileName)
{
    try
    {
        var blobContainerClient = _blobStorageClientFactory.CreateBlobContainerClient();
        var blobClient = blobContainerClient.GetBlobClient(fileName);

        var response = await blobClient.DeleteIfExistsAsync();

        if (response)
        {
            TempData["ToastMessage"] = $"Arquivo '{fileName}' excluído com sucesso!";
            TempData["ToastColor"] = "success";
        }
        else
        {
            TempData["ToastMessage"] = $"Arquivo '{fileName}' não encontrado.";
            TempData["ToastColor"] = "danger";
        }

        return RedirectToAction("Index");
    }
    catch (Exception ex)
    {
        TempData["ToastMessage"] = $"Erro ao excluir o arquivo: {ex.Message}";
        TempData["ToastColor"] = "danger";
        return RedirectToAction("Index");
    }
}
_______________________________________________________________________________________
Depois
_______________________________________________________________________________________
Controller
   [HttpPost("delete/{fileName}")]
   public async Task<IActionResult> DeleteFile(string fileName)
   {
       var result = await _blobService.DeleteFileAsync(fileName);

       TempData["ToastMessage"] = result ? $"Arquivo '{fileName}' excluído com sucesso!" : $"Arquivo '{fileName}' não encontrado.";
       TempData["ToastColor"] = result ? "success" : "danger";

       return RedirectToAction("Index");
   }
_______________________________________________________________________________________
IService e Service

Task<bool> DeleteFileAsync(string fileName);

public async Task<bool> DeleteFileAsync(string fileName)
{
    try
    {
        return await _blobRepository.DeleteBlobAsync(fileName);
    }
    catch(Exception ex)
    {
        Console.WriteLine($"Erro ao excluir arquivo: {ex.Message}");
        return false;
    }
}

_______________________________________________________________________________________
IRepository Repository

Task<bool> DeleteBlobAsync(string fileName);

public async Task<bool> DeleteBlobAsync(string fileName)
{
    var blobContainerClient = _blobStorageClientFactory.CreateBlobContainerClient();
    var blobClient = blobContainerClient.GetBlobClient(fileName);

    return await blobClient.DeleteIfExistsAsync();
}