Files
MilkyShots/Lactose/Controllers/FolderController.cs
T

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();
}
}