Files
MilkyShots/MilkStream.Client/Services/FoldersService.cs
REDCODE 220581579b refactor(auth): remove SendWithRefreshAsync, rely solely on JwtTokenRefresher
- Remove SendWithRefreshAsync method from AuthServiceBase (now dead code)
- Replace all 15 SendWithRefreshAsync call sites in 7 services with
  direct Client.XxxAsync calls
- Remove unused using System.Net from AuthServiceBase
- Update AGENTS.md to document JwtTokenRefresher as the sole token
  refresh mechanism
2026-07-10 01:12:31 +02:00

91 lines
3.2 KiB
C#

using Butter.Dtos.Folder;
using Microsoft.Extensions.Options;
namespace MilkStream.Client.Services;
/// <summary>
/// Manages file system folders for asset scanning via the API.
/// </summary>
public sealed class FoldersService(
IOptions<ServiceOptions> options,
IHttpClientFactory httpClientFactory,
LoginService loginService,
ILogger<FoldersService> logger
) : AuthServiceBase(options, httpClientFactory, loginService, logger) {
/// <summary>
/// Fired when folders are saved.
/// </summary>
public event EventHandler? SaveFolders;
/// <summary>
/// Invokes the <see cref="SaveFolders"/> event.
/// </summary>
public void OnSaveFolders() => SaveFolders?.Invoke(this, EventArgs.Empty);
/// <summary>
/// Gets all tracked folders.
/// </summary>
/// <returns>A list of folders, or null if the request failed.</returns>
public async Task<List<FolderFullDto>?> GetAllFolders() {
var response = await Client.GetAsync("/api/folder");
if (response.IsSuccessStatusCode) return await response.Content.ReadFromJsonAsync<List<FolderFullDto>>();
return null;
}
/// <summary>
/// Gets a folder by its ID.
/// </summary>
/// <param name="id">The folder ID.</param>
/// <returns>The folder details, or null if not found.</returns>
public async Task<FolderFullDto?> GetFolderById(Guid id) {
var response = await Client.GetAsync($"/api/folder/{id}");
if (response.IsSuccessStatusCode) return await response.Content.ReadFromJsonAsync<FolderFullDto>();
return null;
}
/// <summary>
/// Creates a new folder.
/// </summary>
/// <param name="folder">The folder creation data.</param>
public async Task CreateFolderAsync(FolderCreateDto folder) {
var response = await Client.PutAsJsonAsync("/api/folder", folder);
response.EnsureSuccessStatusCode();
}
/// <summary>
/// Updates an existing folder.
/// </summary>
/// <param name="id">The folder ID.</param>
/// <param name="folder">The folder update data.</param>
public async Task UpdateFolderAsync(Guid id, FolderUpdateDto folder) {
var response = await Client.PostAsJsonAsync($"/api/folder/{id}", folder);
response.EnsureSuccessStatusCode();
}
/// <summary>
/// Deletes a folder.
/// </summary>
/// <param name="folderId">The folder ID.</param>
public async Task RemoveFolderAsync(Guid folderId) {
var response = await Client.DeleteAsync($"/api/folder/{folderId}");
response.EnsureSuccessStatusCode();
}
/// <summary>
/// Gets a random sample of asset paths from the folder for testing regex patterns.
/// </summary>
/// <param name="folderId">The folder ID.</param>
/// <param name="count">Number of sample paths to return (default 10).</param>
/// <returns>A sample paths DTO, or null if the request failed.</returns>
public async Task<FolderSamplePathsDto?> GetSamplePathsAsync(Guid folderId, int count = 10) {
var response = await Client.GetAsync($"/api/folder/{folderId}/sample-paths?count={count}");
if (response.IsSuccessStatusCode) return await response.Content.ReadFromJsonAsync<FolderSamplePathsDto>();
return null;
}
}