♻️ Better way to vectorize quill delta
This commit is contained in:
parent
17de9a0f23
commit
46054dfb7b
@ -134,7 +134,6 @@ public class AppDatabase(
|
|||||||
.OnDelete(DeleteBehavior.Cascade);
|
.OnDelete(DeleteBehavior.Cascade);
|
||||||
|
|
||||||
modelBuilder.Entity<Post.Post>()
|
modelBuilder.Entity<Post.Post>()
|
||||||
.HasGeneratedTsVectorColumn(p => p.SearchVector, "simple", p => new { p.Title, p.Description, p.Content })
|
|
||||||
.HasIndex(p => p.SearchVector)
|
.HasIndex(p => p.SearchVector)
|
||||||
.HasMethod("GIN");
|
.HasMethod("GIN");
|
||||||
modelBuilder.Entity<Post.Post>()
|
modelBuilder.Entity<Post.Post>()
|
||||||
@ -193,6 +192,16 @@ public class AppDatabase(
|
|||||||
.OnDelete(DeleteBehavior.Cascade);
|
.OnDelete(DeleteBehavior.Cascade);
|
||||||
modelBuilder.Entity<Chat.MessageStatus>()
|
modelBuilder.Entity<Chat.MessageStatus>()
|
||||||
.HasKey(e => new { e.MessageId, e.SenderId });
|
.HasKey(e => new { e.MessageId, e.SenderId });
|
||||||
|
modelBuilder.Entity<Chat.Message>()
|
||||||
|
.HasOne(m => m.ForwardedMessage)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey(m => m.ForwardedMessageId)
|
||||||
|
.OnDelete(DeleteBehavior.Restrict);
|
||||||
|
modelBuilder.Entity<Chat.Message>()
|
||||||
|
.HasOne(m => m.RepliedMessage)
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey(m => m.RepliedMessageId)
|
||||||
|
.OnDelete(DeleteBehavior.Restrict);
|
||||||
|
|
||||||
// Automatically apply soft-delete filter to all entities inheriting BaseModel
|
// Automatically apply soft-delete filter to all entities inheriting BaseModel
|
||||||
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
|
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
|
||||||
|
@ -74,6 +74,9 @@ public class PostService(AppDatabase db, FileService fs, ActivityService act)
|
|||||||
List<string>? categories = null
|
List<string>? categories = null
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
if (post.Empty)
|
||||||
|
throw new InvalidOperationException("Cannot create a post with barely no content.");
|
||||||
|
|
||||||
if (post.PublishedAt is not null)
|
if (post.PublishedAt is not null)
|
||||||
{
|
{
|
||||||
if (post.PublishedAt.Value.ToDateTimeUtc() < DateTime.UtcNow)
|
if (post.PublishedAt.Value.ToDateTimeUtc() < DateTime.UtcNow)
|
||||||
@ -118,8 +121,27 @@ public class PostService(AppDatabase db, FileService fs, ActivityService act)
|
|||||||
throw new InvalidOperationException("Categories contains one or more categories that wasn't exists.");
|
throw new InvalidOperationException("Categories contains one or more categories that wasn't exists.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (post.Empty)
|
// Vectorize the quill delta content
|
||||||
throw new InvalidOperationException("Cannot create a post with barely no content.");
|
if (post.Content?.RootElement is { ValueKind: JsonValueKind.Array })
|
||||||
|
{
|
||||||
|
var searchTextBuilder = new System.Text.StringBuilder();
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(post.Title))
|
||||||
|
searchTextBuilder.AppendLine(post.Title);
|
||||||
|
if (!string.IsNullOrWhiteSpace(post.Description))
|
||||||
|
searchTextBuilder.AppendLine(post.Description);
|
||||||
|
|
||||||
|
foreach (var element in post.Content.RootElement.EnumerateArray())
|
||||||
|
{
|
||||||
|
if (element is { ValueKind: JsonValueKind.Object } &&
|
||||||
|
element.TryGetProperty("insert", out var insertProperty) &&
|
||||||
|
insertProperty.ValueKind == JsonValueKind.String)
|
||||||
|
{
|
||||||
|
searchTextBuilder.Append(insertProperty.GetString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post.SearchVector = EF.Functions.ToTsVector(searchTextBuilder.ToString().Trim());
|
||||||
|
}
|
||||||
|
|
||||||
// TODO Notify the subscribers
|
// TODO Notify the subscribers
|
||||||
|
|
||||||
@ -140,6 +162,9 @@ public class PostService(AppDatabase db, FileService fs, ActivityService act)
|
|||||||
Instant? publishedAt = null
|
Instant? publishedAt = null
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
if (post.Empty)
|
||||||
|
throw new InvalidOperationException("Cannot edit a post to barely no content.");
|
||||||
|
|
||||||
post.EditedAt = Instant.FromDateTimeUtc(DateTime.UtcNow);
|
post.EditedAt = Instant.FromDateTimeUtc(DateTime.UtcNow);
|
||||||
|
|
||||||
if (publishedAt is not null)
|
if (publishedAt is not null)
|
||||||
@ -196,8 +221,27 @@ public class PostService(AppDatabase db, FileService fs, ActivityService act)
|
|||||||
throw new InvalidOperationException("Categories contains one or more categories that wasn't exists.");
|
throw new InvalidOperationException("Categories contains one or more categories that wasn't exists.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (post.Empty)
|
// Vectorize the quill delta content
|
||||||
throw new InvalidOperationException("Cannot edit a post to barely no content.");
|
if (post.Content?.RootElement is { ValueKind: JsonValueKind.Array })
|
||||||
|
{
|
||||||
|
var searchTextBuilder = new System.Text.StringBuilder();
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(post.Title))
|
||||||
|
searchTextBuilder.AppendLine(post.Title);
|
||||||
|
if (!string.IsNullOrWhiteSpace(post.Description))
|
||||||
|
searchTextBuilder.AppendLine(post.Description);
|
||||||
|
|
||||||
|
foreach (var element in post.Content.RootElement.EnumerateArray())
|
||||||
|
{
|
||||||
|
if (element is { ValueKind: JsonValueKind.Object } &&
|
||||||
|
element.TryGetProperty("insert", out var insertProperty) &&
|
||||||
|
insertProperty.ValueKind == JsonValueKind.String)
|
||||||
|
{
|
||||||
|
searchTextBuilder.Append(insertProperty.GetString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post.SearchVector = EF.Functions.ToTsVector(searchTextBuilder.ToString().Trim());
|
||||||
|
}
|
||||||
|
|
||||||
db.Update(post);
|
db.Update(post);
|
||||||
await db.SaveChangesAsync();
|
await db.SaveChangesAsync();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user