152 lines
5.3 KiB
C#
152 lines
5.3 KiB
C#
using Butter.Dtos.Folder;
|
|
using Butter.Types;
|
|
using Lactose.Mapper;
|
|
using Lactose.Models;
|
|
using Lactose.Repositories;
|
|
using Lactose.Services;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace Lactose.Controllers;
|
|
|
|
/// <summary>
|
|
/// Manages file system folders for asset scanning (admin only).
|
|
/// </summary>
|
|
/// <param name="authService">Authentication service.</param>
|
|
/// <param name="folderRepository">Folder repository.</param>
|
|
/// <param name="assetRepository">Asset repository for sample path queries.</param>
|
|
[ApiController]
|
|
[Authorize(Roles = "Admin")]
|
|
[Route("api/[controller]")]
|
|
public class FolderController(
|
|
//TODO: add logging
|
|
//ILogger<FolderController> logger,
|
|
LactoseAuthService authService,
|
|
IFolderRepository folderRepository,
|
|
IAssetRepository assetRepository
|
|
) : ControllerBase {
|
|
/// <summary>
|
|
/// Creates a new folder for asset scanning.
|
|
/// </summary>
|
|
/// <param name="folderCreateDto">The folder creation data.</param>
|
|
/// <returns>200 on success.</returns>
|
|
[HttpPut]
|
|
[Authorize(Roles = "Admin")]
|
|
public ActionResult Create([FromBody] FolderCreateDto folderCreateDto) {
|
|
var accessLevel = authService.GetUserData(User)?.AccessLevel ?? EAccessLevel.User;
|
|
|
|
if (accessLevel != EAccessLevel.Admin) { return Unauthorized(); }
|
|
|
|
Folder newFolder = new Folder {
|
|
BasePath = folderCreateDto.BasePath,
|
|
RegexPattern = folderCreateDto.RegexPattern,
|
|
Active = false
|
|
};
|
|
|
|
folderRepository.Create(newFolder);
|
|
return Ok();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets all tracked folders.
|
|
/// </summary>
|
|
/// <returns>A list of all folders.</returns>
|
|
[HttpGet]
|
|
[Authorize(Roles = "Admin")]
|
|
public ActionResult<List<FolderFullDto>> GetAll() {
|
|
var accessLevel = authService.GetUserData(User)?.AccessLevel ?? EAccessLevel.User;
|
|
|
|
if (accessLevel != EAccessLevel.Admin) { return Unauthorized(); }
|
|
return Ok(
|
|
folderRepository.GetAll()
|
|
.Select(folder => folder.ToFolderDto())
|
|
.ToList()
|
|
);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets a specific folder by ID.
|
|
/// </summary>
|
|
/// <param name="id">The folder ID.</param>
|
|
/// <returns>The folder details, or 404 if not found.</returns>
|
|
[HttpGet("{id}")]
|
|
[Authorize(Roles = "Admin")]
|
|
public ActionResult<FolderFullDto> Get([FromRoute] Guid id) {
|
|
var accessLevel = authService.GetUserData(User)?.AccessLevel ?? EAccessLevel.User;
|
|
|
|
if (accessLevel != EAccessLevel.Admin) { return Unauthorized(); }
|
|
|
|
var folder = folderRepository.Get(id);
|
|
|
|
if (folder == null) return NotFound();
|
|
|
|
return Ok(folder.ToFolderDto());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates an existing folder.
|
|
/// </summary>
|
|
/// <param name="id">The folder ID.</param>
|
|
/// <param name="folderUpdateDto">The folder update data.</param>
|
|
/// <returns>200 on success, 404 if not found.</returns>
|
|
[HttpPost("{id}")]
|
|
[Authorize(Roles = "Admin")]
|
|
public ActionResult Update([FromRoute] Guid id, [FromBody] FolderUpdateDto folderUpdateDto) {
|
|
var accessLevel = authService.GetUserData(User)?.AccessLevel ?? EAccessLevel.User;
|
|
|
|
if (accessLevel != EAccessLevel.Admin) { return Unauthorized(); }
|
|
|
|
Folder? folder = folderRepository.Get(id);
|
|
if (folder == null) return NotFound();
|
|
|
|
folder.BasePath = folderUpdateDto.BasePath ?? folder.BasePath;
|
|
folder.Active = folderUpdateDto.Active ?? folder.Active;
|
|
folder.RegexPattern = folderUpdateDto.RegexPattern ?? folder.RegexPattern;
|
|
|
|
folderRepository.Update(id, folder);
|
|
return Ok();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets a random sample of asset paths from the folder for testing regex patterns.
|
|
/// </summary>
|
|
/// <param name="id">The folder ID.</param>
|
|
/// <param name="count">Number of sample paths to return (default 10, max 50).</param>
|
|
/// <returns>A list of up to <paramref name="count"/> random asset paths, or 404 if the folder is not found.</returns>
|
|
[HttpGet("{id}/sample-paths")]
|
|
[Authorize(Roles = "Admin")]
|
|
public ActionResult<FolderSamplePathsDto> GetSamplePaths([FromRoute] Guid id, [FromQuery] int count = 10) {
|
|
var accessLevel = authService.GetUserData(User)?.AccessLevel ?? EAccessLevel.User;
|
|
|
|
if (accessLevel != EAccessLevel.Admin) { return Unauthorized(); }
|
|
|
|
var folder = folderRepository.Get(id);
|
|
if (folder == null) return NotFound();
|
|
|
|
count = Math.Clamp(count, 1, 50);
|
|
|
|
var paths = assetRepository.GetRandomPathsByFolder(id, count);
|
|
|
|
return Ok(new FolderSamplePathsDto {
|
|
FolderId = id,
|
|
Paths = paths
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// Deletes a folder (stops tracking it).
|
|
/// </summary>
|
|
/// <param name="id">The folder ID.</param>
|
|
/// <returns>200 on success.</returns>
|
|
[HttpDelete("{id}")]
|
|
[Authorize(Roles = "Admin")]
|
|
public ActionResult Delete([FromRoute] Guid id) {
|
|
var accessLevel = authService.GetUserData(User)?.AccessLevel ?? EAccessLevel.User;
|
|
|
|
if (accessLevel != EAccessLevel.Admin) { return Unauthorized(); }
|
|
|
|
folderRepository.Delete(id);
|
|
return Ok();
|
|
}
|
|
}
|