feat(template-folder): add TemplateFolderService.CreateFolderAsync with validation
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
using ScadaLink.Commons.Entities.Templates;
|
||||
using ScadaLink.Commons.Interfaces.Repositories;
|
||||
using ScadaLink.Commons.Interfaces.Services;
|
||||
using ScadaLink.Commons.Types;
|
||||
|
||||
namespace ScadaLink.TemplateEngine.Services;
|
||||
|
||||
public class TemplateFolderService
|
||||
{
|
||||
private readonly ITemplateEngineRepository _repository;
|
||||
private readonly IAuditService _auditService;
|
||||
|
||||
public TemplateFolderService(ITemplateEngineRepository repository, IAuditService auditService)
|
||||
{
|
||||
_repository = repository ?? throw new ArgumentNullException(nameof(repository));
|
||||
_auditService = auditService ?? throw new ArgumentNullException(nameof(auditService));
|
||||
}
|
||||
|
||||
public async Task<Result<TemplateFolder>> CreateFolderAsync(
|
||||
string name, int? parentFolderId, string user,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(name))
|
||||
return Result<TemplateFolder>.Failure("Folder name is required.");
|
||||
|
||||
if (parentFolderId.HasValue)
|
||||
{
|
||||
var parent = await _repository.GetFolderByIdAsync(parentFolderId.Value, cancellationToken);
|
||||
if (parent == null)
|
||||
return Result<TemplateFolder>.Failure($"Parent folder with ID {parentFolderId.Value} not found.");
|
||||
}
|
||||
|
||||
var all = await _repository.GetAllFoldersAsync(cancellationToken);
|
||||
if (all.Any(f => f.ParentFolderId == parentFolderId
|
||||
&& string.Equals(f.Name, name, StringComparison.OrdinalIgnoreCase)))
|
||||
return Result<TemplateFolder>.Failure($"A folder named '{name}' already exists at this level.");
|
||||
|
||||
var folder = new TemplateFolder(name) { ParentFolderId = parentFolderId };
|
||||
await _repository.AddFolderAsync(folder, cancellationToken);
|
||||
await _repository.SaveChangesAsync(cancellationToken);
|
||||
await _auditService.LogAsync(user, "Create", "TemplateFolder", folder.Id.ToString(), name, folder, cancellationToken);
|
||||
|
||||
return Result<TemplateFolder>.Success(folder);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user