Структура, доп модули, федерация, документация

This commit is contained in:
Халимов Рустам
2026-03-27 00:55:01 +03:00
parent 7cb6ac61dd
commit 7ef73b414c
64 changed files with 3080 additions and 133 deletions

View File

@@ -6,10 +6,14 @@ namespace Knot.Modules.Messaging.Infrastructure.Persistence;
public sealed class MessageReactionRepository : IMessageReactionRepository
{
private readonly IMongoCollection<MessageReaction> _reactions;
private readonly MediatR.IMediator _mediator;
private readonly IMessageRepository _messageRepository;
public MessageReactionRepository(IMongoDatabase mongoDatabase)
public MessageReactionRepository(IMongoDatabase mongoDatabase, MediatR.IMediator mediator, IMessageRepository messageRepository)
{
_reactions = mongoDatabase.GetCollection<MessageReaction>("message_reactions");
_mediator = mediator;
_messageRepository = messageRepository;
// Ensure index for fast querying by message
var indexKeysDefinition = Builders<MessageReaction>.IndexKeys.Ascending(r => r.MessageId);
@@ -27,6 +31,13 @@ public sealed class MessageReactionRepository : IMessageReactionRepository
// Используем ReplaceOptions.IsUpsert = true для идемпотентности (нет гонок)
await _reactions.ReplaceOneAsync(filter, reaction, new ReplaceOptions { IsUpsert = true }, cancellationToken);
// Уведомляем систему (для Федерации)
var message = await _messageRepository.GetByIdAsync(reaction.MessageId, cancellationToken);
if (message != null)
{
await _mediator.Publish(new MessageReactionAddedDomainEvent(reaction.MessageId, message.ChatId, reaction.UserId, reaction.Emoji), cancellationToken);
}
}
public async Task RemoveAsync(Guid messageId, Guid userId, string emoji, CancellationToken cancellationToken)
@@ -38,6 +49,13 @@ public sealed class MessageReactionRepository : IMessageReactionRepository
);
await _reactions.DeleteOneAsync(filter, cancellationToken);
// Уведомляем систему (для Федерации)
var message = await _messageRepository.GetByIdAsync(messageId, cancellationToken);
if (message != null)
{
await _mediator.Publish(new MessageReactionRemovedDomainEvent(messageId, message.ChatId, userId, emoji), cancellationToken);
}
}
public async Task<List<MessageReaction>> GetReactionsForMessageAsync(Guid messageId, CancellationToken cancellationToken)

View File

@@ -129,6 +129,29 @@ public sealed class MessageRepository : IMessageRepository
await _mediator.Publish(domainEvent, cancellationToken);
}
}
public async Task<List<Message>> GetAllMessagesAsync(CancellationToken cancellationToken)
{
return await _messages.Find(_ => true).ToListAsync(cancellationToken);
}
public async Task DeleteChatMessagesAsync(Guid chatId, CancellationToken cancellationToken)
{
var filter = Builders<Message>.Filter.Eq(m => m.ChatId, chatId);
await _messages.DeleteManyAsync(filter, cancellationToken);
}
public async Task DeleteUserMessagesAsync(Guid userId, CancellationToken cancellationToken)
{
var filter = Builders<Message>.Filter.Eq(m => m.SenderId, userId);
await _messages.DeleteManyAsync(filter, cancellationToken);
}
public async Task RemoveAsync(Guid id, CancellationToken cancellationToken)
{
var filter = Builders<Message>.Filter.Eq(m => m.Id, id);
await _messages.DeleteOneAsync(filter, cancellationToken);
}
}

View File

@@ -2,7 +2,6 @@ using Knot.Modules.Messaging.Domain;
using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Serializers;
using Knot.Modules.Messaging.Domain;
using Knot.Shared.Kernel;
namespace Knot.Modules.Messaging.Infrastructure.Persistence.Mongo;
@@ -59,6 +58,17 @@ public static class MongoDbMapConfigurator
BsonClassMap.RegisterClassMap<DeletedMessage>(cm => cm.AutoMap());
BsonClassMap.RegisterClassMap<MessageReaction>(cm => cm.AutoMap());
BsonClassMap.RegisterClassMap<PollMessage>(cm =>
{
cm.AutoMap();
cm.MapField("_options").SetElementName("Options");
cm.MapField("_votes").SetElementName("Votes");
cm.SetDiscriminator("PollMessage");
});
BsonClassMap.RegisterClassMap<PollOption>(cm => cm.AutoMap());
BsonClassMap.RegisterClassMap<PollVote>(cm => cm.AutoMap());
BsonClassMap.RegisterClassMap<Media>(cm =>
{