Add project files.

This commit is contained in:
2025-08-26 09:20:13 -04:00
parent 6c6a149821
commit d2201d6f9b
118 changed files with 1924 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
using JSMR.Application.Circles.Ports;
namespace JSMR.Application.Circles.Commands.UpdateCircleStatus;
public class UpdateCircleStatusHandler(ICircleWriter writer)
{
public Task<UpdateCircleStatusResponse> HandleAsync(UpdateCircleStatusRequest request, CancellationToken cancellationToken = default)
{
return writer.UpdateStatusAsync(request, cancellationToken);
}
}

View File

@@ -0,0 +1,5 @@
using JSMR.Application.Circles.Contracts;
namespace JSMR.Application.Circles.Commands.UpdateCircleStatus;
public sealed record UpdateCircleStatusRequest(int CircleId, CircleStatus CircleStatus);

View File

@@ -0,0 +1,5 @@
using JSMR.Application.Circles.Contracts;
namespace JSMR.Application.Circles.Commands.UpdateCircleStatus;
public sealed record UpdateCircleStatusResponse(int CircleId, CircleStatus CircleStatus);

View File

@@ -0,0 +1,9 @@
namespace JSMR.Application.Circles.Contracts;
public enum CircleStatus
{
Neutral,
Favorite,
Blacklisted,
Spam
}

View File

@@ -0,0 +1,6 @@
namespace JSMR.Application.Circles.Ports;
public interface ICircleReader
{
}

View File

@@ -0,0 +1,8 @@
using JSMR.Application.Circles.Commands.UpdateCircleStatus;
namespace JSMR.Application.Circles.Ports;
public interface ICircleWriter
{
Task<UpdateCircleStatusResponse> UpdateStatusAsync(UpdateCircleStatusRequest request, CancellationToken cancellationToken = default);
}

View File

@@ -0,0 +1,11 @@
namespace JSMR.Application.Circles.Queries.GetCreators;
public sealed record CircleCreatorItem(
string CreatorName,
DateTime? FirstCollaborationDate,
DateTime? LastCollaborationDate,
int Downloads,
int Count)
{
public readonly int AverageDownloads = Downloads / Count;
}

View File

@@ -0,0 +1,9 @@
namespace JSMR.Application.Circles.Queries.GetCreators;
public sealed class GetCircleCreatorsHandler(ICircleCreatorsProvider provider)
{
public Task<GetCircleCreatorsResponse> HandleAsync(GetCircleCreatorsRequest request, CancellationToken cancellationToken = default)
{
return provider.HandleAsync(request, cancellationToken);
}
}

View File

@@ -0,0 +1,3 @@
namespace JSMR.Application.Circles.Queries.GetCreators;
public sealed record GetCircleCreatorsRequest(int? CircleId, string? NameOrMakerId);

View File

@@ -0,0 +1,3 @@
namespace JSMR.Application.Circles.Queries.GetCreators;
public sealed record GetCircleCreatorsResponse(IReadOnlyList<CircleCreatorItem> Items);

View File

@@ -0,0 +1,6 @@
namespace JSMR.Application.Circles.Queries.GetCreators;
public interface ICircleCreatorsProvider
{
Task<GetCircleCreatorsResponse> HandleAsync(GetCircleCreatorsRequest request, CancellationToken cancellationToken = default);
}

View File

@@ -0,0 +1,3 @@
namespace JSMR.Application.Circles.Queries.GetTags;
public sealed record CircleTagItem(string TagName, string? EnglishTagName, int Count);

View File

@@ -0,0 +1,9 @@
namespace JSMR.Application.Circles.Queries.GetTags;
public sealed class GetCircleTagsHandler(ICircleTagsProvider provider)
{
public Task<GetCircleTagsResponse> HandleAsync(GetCircleTagsRequest request, CancellationToken cancellationToken = default)
{
return provider.HandleAsync(request, cancellationToken);
}
}

View File

@@ -0,0 +1,3 @@
namespace JSMR.Application.Circles.Queries.GetTags;
public sealed record GetCircleTagsRequest(int? CircleId, string? NameOrMakerId);

View File

@@ -0,0 +1,3 @@
namespace JSMR.Application.Circles.Queries.GetTags;
public sealed record GetCircleTagsResponse(IReadOnlyList<CircleTagItem> Items);

View File

@@ -0,0 +1,6 @@
namespace JSMR.Application.Circles.Queries.GetTags;
public interface ICircleTagsProvider
{
Task<GetCircleTagsResponse> HandleAsync(GetCircleTagsRequest request, CancellationToken cancellationToken = default);
}

View File

@@ -0,0 +1,6 @@
namespace JSMR.Application.Circles.Queries.Search;
public class CircleSearchCriteria
{
public string? Name { get; init; }
}

View File

@@ -0,0 +1,19 @@
namespace JSMR.Application.Circles.Queries.Search;
public record CircleSearchItem
{
public int CircleId { get; init; }
public string Name { get; init; } = string.Empty;
public string MakerId { get; init; } = string.Empty;
public bool Blacklisted { get; init; }
public bool Favorite { get; init; }
public bool Spam { get; init; }
public int Downloads { get; init; }
public int Releases { get; init; }
public int Pending { get; init; }
public DateTime? FirstReleaseDate { get; init; }
public DateTime? LatestReleaseDate { get; init; }
public string? LatestProductId { get; init; }
public bool? LatestVoiceWorkHasImage { get; init; }
public DateTime? LatestVoiceWorkSalesDate { get; init; }
}

View File

@@ -0,0 +1,8 @@
using JSMR.Application.Common.Search;
namespace JSMR.Application.Circles.Queries.Search;
//public record TagSearchOptions : SearchOptions<TagSearchCriteria, TagSortField>
//{
//}

View File

@@ -0,0 +1,8 @@
using JSMR.Application.Common.Search;
namespace JSMR.Application.Circles.Queries.Search;
public record CircleSearchResults : SearchResult<CircleSearchItem>
{
}

View File

@@ -0,0 +1,10 @@
namespace JSMR.Application.Circles.Queries.Search;
public enum CircleSortField
{
Name,
Blacklisted,
Favorite,
Spam,
VoiceWorkCount
}

View File

@@ -0,0 +1,8 @@
using JSMR.Application.Common.Search;
namespace JSMR.Application.Circles.Queries.Search;
public interface ICircleSearchProvider : ISearchProvider<CircleSearchItem, CircleSearchCriteria, CircleSortField>
{
}

View File

@@ -0,0 +1,15 @@
using JSMR.Application.Common.Search;
namespace JSMR.Application.Circles.Queries.Search;
public sealed class SearchCirclesHandler(ICircleSearchProvider searchProvider)
{
public async Task<SearchCirclesResponse> HandleAsync(SearchCirclesRequest request, CancellationToken cancellationToken)
{
SearchOptions<CircleSearchCriteria, CircleSortField> searchOptions = request.Options;
SearchResult<CircleSearchItem> results = await searchProvider.SearchAsync(searchOptions, cancellationToken);
return new SearchCirclesResponse(results);
}
}

View File

@@ -0,0 +1,5 @@
using JSMR.Application.Common.Search;
namespace JSMR.Application.Circles.Queries.Search;
public sealed record SearchCirclesRequest(SearchOptions<CircleSearchCriteria, CircleSortField> Options);

View File

@@ -0,0 +1,5 @@
using JSMR.Application.Common.Search;
namespace JSMR.Application.Circles.Queries.Search;
public sealed record SearchCirclesResponse(SearchResult<CircleSearchItem> Results);