diff --git a/src/Web/Features/Contents/Data/Content.cs b/src/Web/Features/Contents/Data/Content.cs index 08660bb..dff459a 100644 --- a/src/Web/Features/Contents/Data/Content.cs +++ b/src/Web/Features/Contents/Data/Content.cs @@ -1,12 +1,15 @@ -namespace Hutopy.Web.Features.Contents.Data; +using System.ComponentModel.DataAnnotations; + +namespace Hutopy.Web.Features.Contents.Data; public class Content { public Guid Id { get; init; } public Guid CreatedBy { get; init; } + public Creator? Creator { get; set; } public DateTimeOffset CreatedAt { get; init; } - public string Title { get; set; } - public string Description { get; set; } + [MaxLength(128)] public required string Title { get; set; } + [MaxLength(2048)] public required string Description { get; set; } public string[]? Urls { get; init; } } diff --git a/src/Web/Features/Contents/Data/ContentDbContext.cs b/src/Web/Features/Contents/Data/ContentDbContext.cs index 4dd5476..e01321b 100644 --- a/src/Web/Features/Contents/Data/ContentDbContext.cs +++ b/src/Web/Features/Contents/Data/ContentDbContext.cs @@ -21,6 +21,12 @@ public class ContentDbContext( .Property(c => c.CreatedAt) .ValueGeneratedOnAdd() .HasDefaultValueSql("CURRENT_TIMESTAMP"); + + modelBuilder + .Entity() + .HasOne(c => c.Creator) + .WithMany() + .HasForeignKey(c => c.CreatedBy); modelBuilder .Entity() @@ -41,19 +47,4 @@ public class ContentDbContext( .OwnsOne(x => x.StoredDataUrls) .ToTable(nameof(StoredDataUrls)); } - - public async Task FindByCreatorAliasAsync( - string creatorAlias, - CancellationToken cancellationToken = default) - { - ArgumentException.ThrowIfNullOrEmpty(creatorAlias); - - var user = await Creators.SingleOrDefaultAsync(creator => - EF.Functions.Like( - creatorAlias, - creator.Name), - cancellationToken: cancellationToken); - - return user; - } } diff --git a/src/Web/Features/Contents/Handlers/GetContent.cs b/src/Web/Features/Contents/Handlers/GetContent.cs index 95dd16a..7e79021 100644 --- a/src/Web/Features/Contents/Handlers/GetContent.cs +++ b/src/Web/Features/Contents/Handlers/GetContent.cs @@ -26,7 +26,7 @@ public class GetContent( { var content = await context .Contents - .FirstOrDefaultAsync( + .SingleOrDefaultAsync( c => c.Id == req.ContentId, cancellationToken: ct); diff --git a/src/Web/Features/Contents/Handlers/GetContentsByUser.cs b/src/Web/Features/Contents/Handlers/GetContentsByCreator.cs similarity index 80% rename from src/Web/Features/Contents/Handlers/GetContentsByUser.cs rename to src/Web/Features/Contents/Handlers/GetContentsByCreator.cs index f17214e..3ec2e83 100644 --- a/src/Web/Features/Contents/Handlers/GetContentsByUser.cs +++ b/src/Web/Features/Contents/Handlers/GetContentsByCreator.cs @@ -4,26 +4,26 @@ using Microsoft.EntityFrameworkCore; namespace Hutopy.Web.Features.Contents.Handlers; -public sealed class GetContentsByUserRequest +public sealed class GetContentsByCreatorRequest { public Guid UserId { get; set; } [BindFrom("page_size")] public int PageSize { get; set; } = 10; [BindFrom("last_id")] public Guid? LastId { get; set; } } -public class GetContentsByUser( +public class GetContentsByCreatorHandler( ContentDbContext context) - : Endpoint> + : Endpoint> { public override void Configure() { - Get("/api/contents/user/{UserId:guid}"); + Get("/api/contents/creator/{UserId:guid}"); Options(o => o.WithTags("Contents")); AllowAnonymous(); } public override async Task HandleAsync( - GetContentsByUserRequest req, + GetContentsByCreatorRequest req, CancellationToken ct) { var query = context