From 2485612c876dc92fd3235aad7647dac9c0485750 Mon Sep 17 00:00:00 2001 From: ChronosX88 Date: Tue, 23 Feb 2021 22:12:24 +0300 Subject: [PATCH] Implement saving events in EventStorageManager --- .../Storage/ChatStorageManager.cs | 55 +++++++++++++++++ .../Storage/EventStorageManager.cs | 61 +++++++++++++++++++ .../Interfaces/IEventStorageManager.cs | 2 +- .../ChatSubsystem/Storage/Models/Event.cs | 13 +++- 4 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 src/ZirconiumPlugins/ChatSubsystem/Storage/ChatStorageManager.cs create mode 100644 src/ZirconiumPlugins/ChatSubsystem/Storage/EventStorageManager.cs diff --git a/src/ZirconiumPlugins/ChatSubsystem/Storage/ChatStorageManager.cs b/src/ZirconiumPlugins/ChatSubsystem/Storage/ChatStorageManager.cs new file mode 100644 index 0000000..6ed9cb3 --- /dev/null +++ b/src/ZirconiumPlugins/ChatSubsystem/Storage/ChatStorageManager.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using ChatSubsystem.Storage.Models; +using MongoDB.Driver; +using Zirconium.Core.Models; + +namespace ChatSubsystem.Storage +{ + public class ChatStorageManager + { + // get private chat by user 1 and user 2 + // get chat by id + // update chat + + private const string ChatsCollectionName = "chats"; + + private IMongoCollection chatsCollection; + + public ChatStorageManager(IMongoDatabase database) + { + chatsCollection = database.GetCollection(ChatsCollectionName); + } + + public async Task GetPrivateChat(EntityID u1, EntityID u2) + { + var filter = + Builders.Filter.Where( + x => x.Members.Contains(u1.ToString()) && x.Members.Contains(u2.ToString()) && x.Members.Length == 2 && x.IsPrivateChat); + var res = await chatsCollection.FindAsync(filter); + var chat = res.FirstOrDefault(); + return chat; + } + + public async Task GetById(EntityID chatId) + { + var filter = + Builders.Filter.Where( + x => x.ChatID == chatId.ToString()); + var res = await chatsCollection.FindAsync(filter); + var chat = res.FirstOrDefault(); + return chat; + } + + public async Task> GetChatsForUser(EntityID user) + { + var filter = + Builders.Filter.Where( + x => x.Members.Contains(user.ToString())); + var res = await chatsCollection.FindAsync(filter); + var chat = res.ToList(); + return chat; + } + } +} \ No newline at end of file diff --git a/src/ZirconiumPlugins/ChatSubsystem/Storage/EventStorageManager.cs b/src/ZirconiumPlugins/ChatSubsystem/Storage/EventStorageManager.cs new file mode 100644 index 0000000..e1642cf --- /dev/null +++ b/src/ZirconiumPlugins/ChatSubsystem/Storage/EventStorageManager.cs @@ -0,0 +1,61 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using ChatSubsystem.Storage.Interfaces; +using ChatSubsystem.Storage.Models; +using MongoDB.Driver; +using Zirconium.Core.Models; + +namespace ChatSubsystem.Storage +{ + public class EventStorageManager : IEventStorageManager + { + private const string EventsCollectionName = "events"; + + // get event by id + // get events for user after some point in timeline (via sorting by event id) + + private ChatStorageManager _chatStorageManager; + private IMongoCollection events; + + public EventStorageManager(ChatStorageManager chatStorageManager, IMongoDatabase database) + { + _chatStorageManager = chatStorageManager; + events = database.GetCollection(EventsCollectionName); + } + + public IList GetEventsForUser(EntityID user, EntityID token, int limit) + { + return new List(); + } + + public async Task SaveEvent(Event e) + { + var connectFromField = (FieldDefinition)"_id"; + var connectToField = (FieldDefinition)"PrevID"; + var startWith = (AggregateExpressionDefinition)"$_id"; + var @as = (FieldDefinition>)"Children"; + + var res = await events.Aggregate() + .GraphLookup(events, connectFromField, connectToField, startWith, @as) + .Match("{ Children: { $size: 0 } }").FirstOrDefaultAsync(); + if (res == null) + { + await events.InsertOneAsync(e); + return; + } + // TODO link to previous events in the room + res.PrevID = res.Id; + await events.InsertOneAsync(e); + } + + public async Task GetEventById(EntityID id) + { + var filter = + Builders.Filter.Where( + x => x.Id.ToString() == id.LocalPart && x.OriginServer.ServerPart == id.ServerPart); + var res = await events.FindAsync(filter); + var ev = res.FirstOrDefault(); + return ev; + } + } +} \ No newline at end of file diff --git a/src/ZirconiumPlugins/ChatSubsystem/Storage/Interfaces/IEventStorageManager.cs b/src/ZirconiumPlugins/ChatSubsystem/Storage/Interfaces/IEventStorageManager.cs index d586af4..f54ff03 100644 --- a/src/ZirconiumPlugins/ChatSubsystem/Storage/Interfaces/IEventStorageManager.cs +++ b/src/ZirconiumPlugins/ChatSubsystem/Storage/Interfaces/IEventStorageManager.cs @@ -8,7 +8,7 @@ namespace ChatSubsystem.Storage.Interfaces public interface IEventStorageManager { IList GetEventsForUser(EntityID user, EntityID token, int limit); - Task GetEventById(EntityID id); + Task SaveEvent(Event e); } } \ No newline at end of file diff --git a/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Event.cs b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Event.cs index fc92fe6..ef25d7c 100644 --- a/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Event.cs +++ b/src/ZirconiumPlugins/ChatSubsystem/Storage/Models/Event.cs @@ -6,14 +6,21 @@ namespace ChatSubsystem.Storage.Models { public class Event { - [BsonId] - public ObjectId Id { get; set; } - + [BsonId] public ObjectId Id { get; set; } + + public EntityID EventID { get; set; } public EntityID From { get; set; } public EntityID ChatId { get; set; } public string Type { get; set; } public long Timestamp { get; set; } + public EntityID[] PrevEvents { get; set; } + public ObjectId PrevID { get; set; } public EntityID OriginServer { get; set; } public EventContent Content { get; set; } } + + public class EventWithChildren : Event + { + public Event[] Children { get; set; } + } } \ No newline at end of file