Files
social-media/src/Web/Features/Contents/Handlers/GetCreatorByAlias.cs

72 lines
1.9 KiB
C#

using Hutopy.Web.Features.Contents.Data;
using Hutopy.Web.Features.Contents.Handlers.Models;
namespace Hutopy.Web.Features.Contents.Handlers;
[PublicAPI]
public sealed class GetCreatorByAliasRequest
{
public required string Name { get; set; }
}
[UsedImplicitly]
public sealed class GetCreatorByAliasRequestValidator
: Validator<GetCreatorByAliasRequest>
{
public GetCreatorByAliasRequestValidator()
{
RuleFor(r => r.Name)
.NotNull().WithMessage("You should specify the Name")
.NotEmpty().WithMessage("You should specify a valid/not empty Name");
}
}
[PublicAPI]
public class GetCreatorByAliasHandler(
ContentDbContext context)
: Endpoint<GetCreatorByAliasRequest, CreatorModel>
{
public override void Configure()
{
Get("/api/creators/@{Name}");
Options((o => o.WithTags("Contents")));
AllowAnonymous();
}
public override async Task HandleAsync(
GetCreatorByAliasRequest req,
CancellationToken ct)
{
var creatorName = req.Name.ToLower();
var creator = await context
.Creators
.Where(c => EF.Functions.Like(c.Name, creatorName))
.FirstOrDefaultAsync(ct);
if (creator is null)
{
await SendNotFoundAsync(ct);
}
else
{
var subscriberCount = await context.Subscriptions.CountAsync(
s => s.CreatorId == creator.Id,
cancellationToken: ct);
var model = new CreatorModel(
creator.Id,
creator.CreatedBy,
creator.CreatedAt,
creator.Name,
creator.About,
creator.Socials,
creator.Colors,
creator.Images,
subscriberCount);
await SendAsync(model, cancellation: ct);
}
}
}