Files
adas-core/adas-core.Application/Services/FileService.cs
T

152 lines
7.2 KiB
C#

//using Microsoft.AspNetCore.Http;
using adas_core.Application.Services.Interfaces;
using adas_core.Domain.Enums;
using adas_core.Domain.Models.AppSettings;
using adas_core.Domain.Models.DTO;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Serilog;
namespace adas_core.Application.Services;
/// <summary>
/// Provides a concrete implementation of the <see cref="IFileService"/> contract for performing file-related operations.
/// </summary>
/// <!-- aidoc:v1 sig=52eb70b -->
public class FileService : IFileService
{
private readonly string? _assetsDirectory;
private readonly ILogger<FileService> _logger;
private readonly string? _updateDirectory;
/// <summary>
/// Initializes a new instance of the <see cref="FileService"/> class, configuring the file system paths used to read update files and display assets and storing the logger used for diagnostic output. <see cref="FileService"/> provides file-related operations backed by the supplied configuration.
/// </summary>
/// <param name="apiSettings">The bound application settings exposed via <see cref="IOptions{ApiSettings}"/>; supplies the <see cref="ApiSettings.PathUpdateFiles"/> and <see cref="ApiSettings.PathToDisplayAssets"/> paths used to build the working directories.</param>
/// <param name="logger">The <see cref="ILogger{FileService}"/> retained for recording diagnostic and operational events.</param>
/// <!-- aidoc:v1 sig=715c341 body=f27c630 -->
public FileService(
IOptions<ApiSettings> apiSettings,
ILogger<FileService> logger
)
{
_logger = logger;
if (apiSettings.Value.PathUpdateFiles != null)
_updateDirectory = Path.Combine(apiSettings.Value.PathUpdateFiles);
if (apiSettings.Value.PathToDisplayAssets != null)
_assetsDirectory = Path.Combine(apiSettings.Value.PathToDisplayAssets);
}
/// <summary>
/// Copies the provided uploaded files into the configured update directory, creating each file on disk.
/// Returns false if the update directory is not configured (null, empty, or whitespace); otherwise returns true after all files have been copied.
/// </summary>
/// <param name="files">The collection of uploaded form files to be written to the update directory.</param>
/// <returns>A task that resolves to true when every file is successfully copied, or false when the update directory is not configured.</returns>
/// <!-- aidoc:v1 sig=8b3261f body=f4c95cd -->
public async Task<bool> CopyUpdateFiles(ICollection<IFormFile> files)
{
if (string.IsNullOrWhiteSpace(_updateDirectory)) return false;
foreach (var file in files)
{
await using var stream = new FileStream(Path.Combine(_updateDirectory, file.FileName), FileMode.Create);
await file.CopyToAsync(stream);
}
return true;
}
/// <summary>
/// Asynchronously uploads a collection of asset files into a directory organized by the specified theme. If the assets directory is not configured, the method returns false; otherwise, it ensures the target directory exists, writes each file to disk, and returns true.
/// </summary>
/// <param name="files">The collection of uploaded form files to persist to the assets directory.</param>
/// <param name="themeParse">The asset theme used to determine the subdirectory in which the files will be stored.</param>
/// <returns>A task that resolves to <c>true</c> when the files are successfully written, or <c>false</c> when the assets directory path is not configured.</returns>
/// <!-- aidoc:v1 sig=6ee9410 body=8680e5a -->
public async Task<bool> UploadAssetFiles(ICollection<IFormFile> files, FileEnum.AssetTheme themeParse)
{
if (string.IsNullOrWhiteSpace(_assetsDirectory)) return false;
var directoryInfo = new DirectoryInfo(Path.Combine(_assetsDirectory, themeParse.ToString()));
if (!directoryInfo.Exists) directoryInfo.Create();
foreach (var file in files)
{
await using var stream =
new FileStream(Path.Combine(_assetsDirectory, themeParse.ToString(), file.FileName), FileMode.Create);
await file.CopyToAsync(stream);
}
return true;
}
/// <summary>
/// Retrieves all asset files from the subdirectory that matches the specified theme, creating the subdirectory if it does not exist.
/// Returns an empty list when the assets directory is not configured or when an error occurs while reading the files.
/// </summary>
/// <param name="themeParse">The theme used to locate the corresponding subdirectory within the assets directory.</param>
/// <returns>A list of <see cref="AssetDto"/> objects containing the name, extension, and full path of each file found; an empty list if the assets directory is not configured or an error occurs.</returns>
/// <!-- aidoc:v1 sig=0de5997 body=8f16929 -->
public List<AssetDto> GetAllAssetFile(FileEnum.AssetTheme themeParse)
{
try
{
if (string.IsNullOrWhiteSpace(_assetsDirectory)) return [];
var listToReturn = new List<AssetDto>();
var directoryInfo = new DirectoryInfo(Path.Combine(_assetsDirectory, themeParse.ToString()));
if (!directoryInfo.Exists) directoryInfo.Create();
var files = directoryInfo.GetFiles(); // Obtener todos los archivos en el directorio
foreach (var file in files)
{
var assetDto = new AssetDto
{
Name = file.Name,
Extension = file.Extension,
Path = file.FullName // Obtener la ruta completa del archivo
};
listToReturn.Add(assetDto);
}
return listToReturn;
}
catch (Exception e)
{
_logger.LogError("Error while retrieving assets: {eMessage} {eStackTrace}", e.Message, e.StackTrace);
return [];
}
}
/// <summary>
/// Retrieves the list of file paths contained in the specified directory.
/// If the directory does not exist, a warning is logged and an empty list is returned;
/// if an error occurs during retrieval, it is logged and an empty list is returned.
/// </summary>
/// <param name="directoryPath">The path of the directory to search for files.</param>
/// <returns>A list of file paths found in the directory, or an empty list if the directory does not exist or an error occurs.</returns>
/// <!-- aidoc:v1 sig=c3be2b5 body=d2272c4 -->
public List<string> GetFilesInDirectory(string directoryPath)
{
List<string> fileList = [];
try
{
if (Directory.Exists(directoryPath))
// Obtiene todos los archivos en el directorio
fileList.AddRange(Directory.GetFiles(directoryPath));
else
Log.Warning("La ruta proporcionada no existe: {directoryPath}", directoryPath);
}
catch (Exception ex)
{
Log.Error("Ocurrió un error al buscar archivos: {exMessage}", ex.Message);
}
return fileList;
}
}