diff --git a/src/Zirconium/Core/App.cs b/src/Zirconium/Core/App.cs index 472f3c1..dea0c46 100644 --- a/src/Zirconium/Core/App.cs +++ b/src/Zirconium/Core/App.cs @@ -2,6 +2,7 @@ using Zirconium.Core.Plugins; using Zirconium.Core.Plugins.Interfaces; using Zirconium.Core.Logging; using WebSocketSharp.Server; +using Zirconium.Core.Database; namespace Zirconium.Core { @@ -14,6 +15,7 @@ namespace Zirconium.Core public IPluginHostAPI PluginHostAPI { get; } public AuthManager AuthManager { get; } private WebSocketServer _websocketServer; + public DatabaseConnector Database { get; private set; } public App(Config config) { @@ -24,6 +26,7 @@ namespace Zirconium.Core Router = new Router(this); PluginHostAPI = new PluginHostAPI(this, Router); AuthManager = new AuthManager(this); + Database = new DatabaseConnector(this); PluginManager = new PluginManager(PluginHostAPI); PluginManager.LoadPlugins(config.PluginsDirPath, config.EnabledPlugins); Log.Info("Zirconium is initialized successfully"); @@ -34,7 +37,8 @@ namespace Zirconium.Core _websocketServer.Start(); } - public void Destroy() { + public void Destroy() + { Log.Info("Shutting down Zirconium..."); _websocketServer.Stop(); } diff --git a/src/Zirconium/Core/Config.cs b/src/Zirconium/Core/Config.cs index 1db36d1..13d0fbc 100644 --- a/src/Zirconium/Core/Config.cs +++ b/src/Zirconium/Core/Config.cs @@ -19,9 +19,12 @@ namespace Zirconium.Core // Websocket server settings public Websocket Websocket { get; set; } + // Database connection credentials + public MongoDatabaseConfig MongoDatabase { get; set; } + // Configurations of plugins public Dictionary Plugins { get; set; } - + public string AuthenticationProvider { get; set; } } @@ -31,4 +34,13 @@ namespace Zirconium.Core public int Port { get; set; } public string Endpoint { get; set; } } + + public class MongoDatabaseConfig + { + public string Host { get; set; } + public int Port { get; set; } + public string User { get; set; } + public string Password { get; set; } + public string Database { get; set; } + } } \ No newline at end of file diff --git a/src/Zirconium/Core/Database/DatabaseConnector.cs b/src/Zirconium/Core/Database/DatabaseConnector.cs new file mode 100644 index 0000000..5bda318 --- /dev/null +++ b/src/Zirconium/Core/Database/DatabaseConnector.cs @@ -0,0 +1,35 @@ +using MongoDB.Driver; +using Zirconium.Core.Logging; + +namespace Zirconium.Core.Database +{ + public class DatabaseConnector + { + private App _app; + + public IMongoDatabase MongoDatabase { get; private set; } + + public DatabaseConnector(App app) + { + this._app = app; + MongoClient client; + + string host = _app.Config.MongoDatabase.Host; + int port = _app.Config.MongoDatabase.Port; + string user = _app.Config.MongoDatabase.User; + string password = _app.Config.MongoDatabase.Password; + string database = _app.Config.MongoDatabase.Database; + if ((user == null || user == "") && (password == null || password == "")) + { + client = new MongoClient($"mongodb://{host}:{port}"); + } + else + { + client = new MongoClient($"mongodb://{user}:{password}@{host}:{port}"); + } + var db = client.GetDatabase(database); + this.MongoDatabase = db; + Log.Debug("Database initialized"); + } + } +} \ No newline at end of file diff --git a/src/Zirconium/Core/Plugins/Interfaces/IPluginHostAPI.cs b/src/Zirconium/Core/Plugins/Interfaces/IPluginHostAPI.cs index f5fd1dc..4333feb 100644 --- a/src/Zirconium/Core/Plugins/Interfaces/IPluginHostAPI.cs +++ b/src/Zirconium/Core/Plugins/Interfaces/IPluginHostAPI.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using MongoDB.Driver; using Zirconium.Core.Models; namespace Zirconium.Core.Plugins.Interfaces @@ -21,5 +22,6 @@ namespace Zirconium.Core.Plugins.Interfaces void RegisterIPCService(IPluginAPI plugin, dynamic service); Task MakeIPCRequest(string pluginName, string methodName, dynamic paramsObject); Task MakeIPCNotification(string pluginName, string methodName, dynamic paramsObject); + IMongoDatabase GetRawDatabase(); } } \ No newline at end of file diff --git a/src/Zirconium/Core/Plugins/PluginHostAPI.cs b/src/Zirconium/Core/Plugins/PluginHostAPI.cs index 3f8b527..b27fb26 100644 --- a/src/Zirconium/Core/Plugins/PluginHostAPI.cs +++ b/src/Zirconium/Core/Plugins/PluginHostAPI.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using MongoDB.Driver; using Newtonsoft.Json; using Zirconium.Core.Models; using Zirconium.Core.Plugins.Interfaces; @@ -96,5 +97,10 @@ namespace Zirconium.Core.Plugins public Task MakeIPCNotification(string pluginName, string methodName, dynamic paramsObject) { return _ipcRouter.MakeNotif(pluginName, methodName, paramsObject); } + + public IMongoDatabase GetRawDatabase() + { + return _app.Database.MongoDatabase; + } } } \ No newline at end of file diff --git a/src/Zirconium/Core/Plugins/PluginManager.cs b/src/Zirconium/Core/Plugins/PluginManager.cs index f555aa9..2ec453d 100644 --- a/src/Zirconium/Core/Plugins/PluginManager.cs +++ b/src/Zirconium/Core/Plugins/PluginManager.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Runtime.Loader; using System.Threading; using McMaster.NETCore.Plugins; +using MongoDB.Driver; using Zirconium.Core.Logging; using Zirconium.Core.Models; using Zirconium.Core.Plugins.Interfaces; @@ -75,7 +76,8 @@ namespace Zirconium.Core.Plugins typeof(ICoreEventHandler), typeof(BaseMessage), typeof(CoreEvent), - typeof(ExportedIPCMethodAttribute) + typeof(ExportedIPCMethodAttribute), + typeof(IMongoDatabase) }, config => config.PreferSharedTypes = true ); diff --git a/src/Zirconium/Zirconium.csproj b/src/Zirconium/Zirconium.csproj index 6b309bb..d78e65a 100644 --- a/src/Zirconium/Zirconium.csproj +++ b/src/Zirconium/Zirconium.csproj @@ -11,5 +11,9 @@ + + + + \ No newline at end of file diff --git a/src/ZirconiumPlugins/MongoDB/Plugin.cs b/src/ZirconiumPlugins/MongoDB/Plugin.cs deleted file mode 100644 index 68ed0a5..0000000 --- a/src/ZirconiumPlugins/MongoDB/Plugin.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Immutable; -using System.Collections.Generic; -using Zirconium.Core.Plugins.Interfaces; -using MongoDB.Driver; -using Zirconium.Core.Logging; -using Zirconium.Core.Plugins.IPC; - -namespace MongoDBPlugin -{ - class Plugin : IPluginAPI - { - private IMongoDatabase _database; - - public string GetPluginUniqueName() - { - return "MongoDB"; - } - - public void Initialize(IPluginHostAPI pluginHostAPI) - { - var settingsDynamic = pluginHostAPI.GetSettings(this); - var settings = (IImmutableDictionary)((IDictionary)settingsDynamic).ToImmutableDictionary(); - - var host = (string)settings.GetValueOrDefault("Host"); - var port = (int)settings.GetValueOrDefault("Port"); - var user = (string)settings.GetValueOrDefault("User"); - var password = (string)settings.GetValueOrDefault("Password"); - var database = (string)settings.GetValueOrDefault("Database"); - - MongoClient client; - if (user == null && password == null) - { - client = new MongoClient($"mongodb://{host}:{port}"); - } - else - { - client = new MongoClient($"mongodb://{user}:{password}@{host}:{port}"); - } - - var db = client.GetDatabase(database); - Log.Info("MongoDB is connected"); - _database = db; - var ipcService = new IPCService(db); - pluginHostAPI.RegisterIPCService(this, ipcService); - } - - public void PreInitialize(IPluginManager pluginManager) { } - - class IPCService - { - private IMongoDatabase _db; - - public IPCService(IMongoDatabase db) { _db = db; } - - [ExportedIPCMethod("Insert")] - public void Insert(dynamic paramsObject) { - var colName = paramsObject.ColName; - var model = paramsObject.Model; - _db.GetCollection(colName).InsertOne(model); - Log.Debug("successfully inserted the document"); - } - } - } -} diff --git a/src/ZirconiumPlugins/TestMongoDB/Plugin.cs b/src/ZirconiumPlugins/TestMongoDB/Plugin.cs index 2beb538..4e252ae 100644 --- a/src/ZirconiumPlugins/TestMongoDB/Plugin.cs +++ b/src/ZirconiumPlugins/TestMongoDB/Plugin.cs @@ -1,4 +1,9 @@ -using System.Dynamic; +using System.ComponentModel.DataAnnotations.Schema; +using System.Dynamic; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using MongoDB.Driver; +using Zirconium.Core.Logging; using Zirconium.Core.Plugins.Interfaces; namespace TestMongoDB @@ -11,24 +16,34 @@ namespace TestMongoDB return "TestMongoDB"; } - public async void Initialize(IPluginHostAPI pluginHostAPI) + public void Initialize(IPluginHostAPI pluginHostAPI) { var tm = new TestModel(); tm.ABC = "qweqowie"; - dynamic paramsObject = new ExpandoObject(); - paramsObject.ColName = "test_model"; - paramsObject.Model = tm; - await pluginHostAPI.MakeIPCRequest("MongoDB", "Insert", paramsObject); + var db = pluginHostAPI.GetRawDatabase(); + + db.GetCollection("test_model").InsertOne(tm); + Log.Debug("successfully inserted the model"); + var filter = Builders.Filter.Eq("ABC", "qweqowie"); + var found = db.GetCollection("test_model").Find(filter).FirstOrDefault(); + if (found != null) { + Log.Debug($"Found document with ABC property: {found.ABC}"); + } else { + Log.Debug("Nothing found!"); + } } public void PreInitialize(IPluginManager pluginManager) { - pluginManager.Depends(this, "MongoDB"); + } } class TestModel { + [BsonId] + public ObjectId Id { get; set; } + public string ABC { get; set; } } } diff --git a/src/ZirconiumPlugins/TestMongoDB/TestMongoDB.csproj b/src/ZirconiumPlugins/TestMongoDB/TestMongoDB.csproj index 816d99c..932a2a2 100644 --- a/src/ZirconiumPlugins/TestMongoDB/TestMongoDB.csproj +++ b/src/ZirconiumPlugins/TestMongoDB/TestMongoDB.csproj @@ -8,6 +8,9 @@ runtime + + +