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,61 @@
using JSMR.Application.Creators.Queries.Search.Contracts;
using JSMR.Application.Creators.Queries.Search.Ports;
using JSMR.Infrastructure.Common.Queries;
using System.Linq.Expressions;
namespace JSMR.Infrastructure.Data.Repositories.Creators;
public class CreatorSearchProvider(AppDbContext context) : SearchProvider<CreatorSearchItem, CreatorSearchCriteria, CreatorSortField, CreatorSearchItem>, ICreatorSearchProvider
{
protected override IQueryable<CreatorSearchItem> GetBaseQuery()
{
return
from creator in context.Creators
join voiceWorkCreators in context.VoiceWorkCreators on creator.CreatorId equals voiceWorkCreators.CreatorId into vwcs
select new CreatorSearchItem
{
CreatorId = creator.CreatorId,
Name = creator.Name,
Favorite = creator.Favorite,
Blacklisted = creator.Blacklisted,
VoiceWorkCount = vwcs.Count()
};
}
protected override IQueryable<CreatorSearchItem> ApplyFilters(IQueryable<CreatorSearchItem> query, CreatorSearchCriteria criteria)
{
IQueryable<CreatorSearchItem> filteredQuery = query;
if (string.IsNullOrEmpty(criteria.Name) == false)
{
string name = criteria.Name.Trim();
filteredQuery = filteredQuery.Where(x => x.Name.Contains(name));
}
return filteredQuery;
}
protected override Expression<Func<CreatorSearchItem, object>> GetSortExpression(CreatorSortField field)
{
Expression<Func<CreatorSearchItem, object>> selector = field switch
{
CreatorSortField.VoiceWorkCount => x => x.VoiceWorkCount,
CreatorSortField.Favorite => x => x.Favorite,
CreatorSortField.Blacklisted => x => x.Blacklisted,
_ => x => x.Name
};
return selector;
}
protected override IOrderedQueryable<CreatorSearchItem> GetDefaultSortExpression(IQueryable<CreatorSearchItem> query)
{
return query.OrderBy(x => x.Name);
}
protected override IOrderedQueryable<CreatorSearchItem> GetSelectQuery(IOrderedQueryable<CreatorSearchItem> query)
{
return query;
}
}

View File

@@ -0,0 +1,41 @@
using JSMR.Application.Creators.Commands.UpdateCreatorStatus;
using JSMR.Application.Creators.Contracts;
using JSMR.Application.Creators.Ports;
using JSMR.Domain.Entities;
using Microsoft.EntityFrameworkCore;
namespace JSMR.Infrastructure.Data.Repositories.Creators;
public class CreatorWriter(AppDbContext context) : ICreatorWriter
{
public async Task<UpdateCreatorStatusResponse> UpdateStatusAsync(UpdateCreatorStatusRequest request, CancellationToken cancellationToken = default)
{
Creator creator = await GetCreatorAsync(request.CreatorId, cancellationToken);
switch (request.CreatorStatus)
{
case CreatorStatus.Neutral:
creator.Favorite = false;
creator.Blacklisted = false;
break;
case CreatorStatus.Favorite:
creator.Favorite = true;
creator.Blacklisted = false;
break;
case CreatorStatus.Blacklisted:
creator.Favorite = false;
creator.Blacklisted = true;
break;
}
await context.SaveChangesAsync(cancellationToken);
return new UpdateCreatorStatusResponse(request.CreatorId, request.CreatorStatus);
}
private async Task<Creator> GetCreatorAsync(int creatorId, CancellationToken cancellationToken)
{
return await context.Creators.FirstOrDefaultAsync(creator => creator.CreatorId == creatorId, cancellationToken)
?? throw new KeyNotFoundException($"Creator {creatorId} not found.");
}
}