From 5e6f1640dcb8e30a44f8ff07572874850b12cc2e Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com>
Date: Sat, 16 May 2020 14:30:07 -0400
Subject: simplify single-instance deployment and make MongoDB server optional

---
 .../Framework/Caching/Wiki/IWikiCacheRepository.cs |  2 +-
 .../Caching/Wiki/WikiCacheMemoryRepository.cs      | 54 ++++++++++++++++
 .../Caching/Wiki/WikiCacheMongoRepository.cs       | 73 ++++++++++++++++++++++
 .../Framework/Caching/Wiki/WikiCacheRepository.cs  | 73 ----------------------
 4 files changed, 128 insertions(+), 74 deletions(-)
 create mode 100644 src/SMAPI.Web/Framework/Caching/Wiki/WikiCacheMemoryRepository.cs
 create mode 100644 src/SMAPI.Web/Framework/Caching/Wiki/WikiCacheMongoRepository.cs
 delete mode 100644 src/SMAPI.Web/Framework/Caching/Wiki/WikiCacheRepository.cs

(limited to 'src/SMAPI.Web/Framework/Caching/Wiki')

diff --git a/src/SMAPI.Web/Framework/Caching/Wiki/IWikiCacheRepository.cs b/src/SMAPI.Web/Framework/Caching/Wiki/IWikiCacheRepository.cs
index b54c8a2f..02097f52 100644
--- a/src/SMAPI.Web/Framework/Caching/Wiki/IWikiCacheRepository.cs
+++ b/src/SMAPI.Web/Framework/Caching/Wiki/IWikiCacheRepository.cs
@@ -5,7 +5,7 @@ using StardewModdingAPI.Toolkit.Framework.Clients.Wiki;
 
 namespace StardewModdingAPI.Web.Framework.Caching.Wiki
 {
-    /// <summary>Encapsulates logic for accessing the wiki data cache.</summary>
+    /// <summary>Manages cached wiki data.</summary>
     internal interface IWikiCacheRepository : ICacheRepository
     {
         /*********
diff --git a/src/SMAPI.Web/Framework/Caching/Wiki/WikiCacheMemoryRepository.cs b/src/SMAPI.Web/Framework/Caching/Wiki/WikiCacheMemoryRepository.cs
new file mode 100644
index 00000000..4621f5e3
--- /dev/null
+++ b/src/SMAPI.Web/Framework/Caching/Wiki/WikiCacheMemoryRepository.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using StardewModdingAPI.Toolkit.Framework.Clients.Wiki;
+
+namespace StardewModdingAPI.Web.Framework.Caching.Wiki
+{
+    /// <summary>Manages cached wiki data in-memory.</summary>
+    internal class WikiCacheMemoryRepository : BaseCacheRepository, IWikiCacheRepository
+    {
+        /*********
+        ** Fields
+        *********/
+        /// <summary>The saved wiki metadata.</summary>
+        private CachedWikiMetadata Metadata;
+
+        /// <summary>The cached wiki data.</summary>
+        private CachedWikiMod[] Mods = new CachedWikiMod[0];
+
+
+        /*********
+        ** Public methods
+        *********/
+        /// <summary>Get the cached wiki metadata.</summary>
+        /// <param name="metadata">The fetched metadata.</param>
+        public bool TryGetWikiMetadata(out CachedWikiMetadata metadata)
+        {
+            metadata = this.Metadata;
+            return metadata != null;
+        }
+
+        /// <summary>Get the cached wiki mods.</summary>
+        /// <param name="filter">A filter to apply, if any.</param>
+        public IEnumerable<CachedWikiMod> GetWikiMods(Expression<Func<CachedWikiMod, bool>> filter = null)
+        {
+            return filter != null
+                ? this.Mods.Where(filter.Compile())
+                : this.Mods.ToArray();
+        }
+
+        /// <summary>Save data fetched from the wiki compatibility list.</summary>
+        /// <param name="stableVersion">The current stable Stardew Valley version.</param>
+        /// <param name="betaVersion">The current beta Stardew Valley version.</param>
+        /// <param name="mods">The mod data.</param>
+        /// <param name="cachedMetadata">The stored metadata record.</param>
+        /// <param name="cachedMods">The stored mod records.</param>
+        public void SaveWikiData(string stableVersion, string betaVersion, IEnumerable<WikiModEntry> mods, out CachedWikiMetadata cachedMetadata, out CachedWikiMod[] cachedMods)
+        {
+            this.Metadata = cachedMetadata = new CachedWikiMetadata(stableVersion, betaVersion);
+            this.Mods = cachedMods = mods.Select(mod => new CachedWikiMod(mod)).ToArray();
+        }
+    }
+}
diff --git a/src/SMAPI.Web/Framework/Caching/Wiki/WikiCacheMongoRepository.cs b/src/SMAPI.Web/Framework/Caching/Wiki/WikiCacheMongoRepository.cs
new file mode 100644
index 00000000..07e7c721
--- /dev/null
+++ b/src/SMAPI.Web/Framework/Caching/Wiki/WikiCacheMongoRepository.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using MongoDB.Driver;
+using StardewModdingAPI.Toolkit.Framework.Clients.Wiki;
+
+namespace StardewModdingAPI.Web.Framework.Caching.Wiki
+{
+    /// <summary>Manages cached wiki data in MongoDB.</summary>
+    internal class WikiCacheMongoRepository : BaseCacheRepository, IWikiCacheRepository
+    {
+        /*********
+        ** Fields
+        *********/
+        /// <summary>The collection for wiki metadata.</summary>
+        private readonly IMongoCollection<CachedWikiMetadata> Metadata;
+
+        /// <summary>The collection for wiki mod data.</summary>
+        private readonly IMongoCollection<CachedWikiMod> Mods;
+
+
+        /*********
+        ** Public methods
+        *********/
+        /// <summary>Construct an instance.</summary>
+        /// <param name="database">The authenticated MongoDB database.</param>
+        public WikiCacheMongoRepository(IMongoDatabase database)
+        {
+            // get collections
+            this.Metadata = database.GetCollection<CachedWikiMetadata>("wiki-metadata");
+            this.Mods = database.GetCollection<CachedWikiMod>("wiki-mods");
+
+            // add indexes if needed
+            this.Mods.Indexes.CreateOne(new CreateIndexModel<CachedWikiMod>(Builders<CachedWikiMod>.IndexKeys.Ascending(p => p.ID)));
+        }
+
+        /// <summary>Get the cached wiki metadata.</summary>
+        /// <param name="metadata">The fetched metadata.</param>
+        public bool TryGetWikiMetadata(out CachedWikiMetadata metadata)
+        {
+            metadata = this.Metadata.Find("{}").FirstOrDefault();
+            return metadata != null;
+        }
+
+        /// <summary>Get the cached wiki mods.</summary>
+        /// <param name="filter">A filter to apply, if any.</param>
+        public IEnumerable<CachedWikiMod> GetWikiMods(Expression<Func<CachedWikiMod, bool>> filter = null)
+        {
+            return filter != null
+                ? this.Mods.Find(filter).ToList()
+                : this.Mods.Find("{}").ToList();
+        }
+
+        /// <summary>Save data fetched from the wiki compatibility list.</summary>
+        /// <param name="stableVersion">The current stable Stardew Valley version.</param>
+        /// <param name="betaVersion">The current beta Stardew Valley version.</param>
+        /// <param name="mods">The mod data.</param>
+        /// <param name="cachedMetadata">The stored metadata record.</param>
+        /// <param name="cachedMods">The stored mod records.</param>
+        public void SaveWikiData(string stableVersion, string betaVersion, IEnumerable<WikiModEntry> mods, out CachedWikiMetadata cachedMetadata, out CachedWikiMod[] cachedMods)
+        {
+            cachedMetadata = new CachedWikiMetadata(stableVersion, betaVersion);
+            cachedMods = mods.Select(mod => new CachedWikiMod(mod)).ToArray();
+
+            this.Mods.DeleteMany("{}");
+            this.Mods.InsertMany(cachedMods);
+
+            this.Metadata.DeleteMany("{}");
+            this.Metadata.InsertOne(cachedMetadata);
+        }
+    }
+}
diff --git a/src/SMAPI.Web/Framework/Caching/Wiki/WikiCacheRepository.cs b/src/SMAPI.Web/Framework/Caching/Wiki/WikiCacheRepository.cs
deleted file mode 100644
index 1ae9d38f..00000000
--- a/src/SMAPI.Web/Framework/Caching/Wiki/WikiCacheRepository.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Linq.Expressions;
-using MongoDB.Driver;
-using StardewModdingAPI.Toolkit.Framework.Clients.Wiki;
-
-namespace StardewModdingAPI.Web.Framework.Caching.Wiki
-{
-    /// <summary>Encapsulates logic for accessing the wiki data cache.</summary>
-    internal class WikiCacheRepository : BaseCacheRepository, IWikiCacheRepository
-    {
-        /*********
-        ** Fields
-        *********/
-        /// <summary>The collection for wiki metadata.</summary>
-        private readonly IMongoCollection<CachedWikiMetadata> WikiMetadata;
-
-        /// <summary>The collection for wiki mod data.</summary>
-        private readonly IMongoCollection<CachedWikiMod> WikiMods;
-
-
-        /*********
-        ** Public methods
-        *********/
-        /// <summary>Construct an instance.</summary>
-        /// <param name="database">The authenticated MongoDB database.</param>
-        public WikiCacheRepository(IMongoDatabase database)
-        {
-            // get collections
-            this.WikiMetadata = database.GetCollection<CachedWikiMetadata>("wiki-metadata");
-            this.WikiMods = database.GetCollection<CachedWikiMod>("wiki-mods");
-
-            // add indexes if needed
-            this.WikiMods.Indexes.CreateOne(new CreateIndexModel<CachedWikiMod>(Builders<CachedWikiMod>.IndexKeys.Ascending(p => p.ID)));
-        }
-
-        /// <summary>Get the cached wiki metadata.</summary>
-        /// <param name="metadata">The fetched metadata.</param>
-        public bool TryGetWikiMetadata(out CachedWikiMetadata metadata)
-        {
-            metadata = this.WikiMetadata.Find("{}").FirstOrDefault();
-            return metadata != null;
-        }
-
-        /// <summary>Get the cached wiki mods.</summary>
-        /// <param name="filter">A filter to apply, if any.</param>
-        public IEnumerable<CachedWikiMod> GetWikiMods(Expression<Func<CachedWikiMod, bool>> filter = null)
-        {
-            return filter != null
-                ? this.WikiMods.Find(filter).ToList()
-                : this.WikiMods.Find("{}").ToList();
-        }
-
-        /// <summary>Save data fetched from the wiki compatibility list.</summary>
-        /// <param name="stableVersion">The current stable Stardew Valley version.</param>
-        /// <param name="betaVersion">The current beta Stardew Valley version.</param>
-        /// <param name="mods">The mod data.</param>
-        /// <param name="cachedMetadata">The stored metadata record.</param>
-        /// <param name="cachedMods">The stored mod records.</param>
-        public void SaveWikiData(string stableVersion, string betaVersion, IEnumerable<WikiModEntry> mods, out CachedWikiMetadata cachedMetadata, out CachedWikiMod[] cachedMods)
-        {
-            cachedMetadata = new CachedWikiMetadata(stableVersion, betaVersion);
-            cachedMods = mods.Select(mod => new CachedWikiMod(mod)).ToArray();
-
-            this.WikiMods.DeleteMany("{}");
-            this.WikiMods.InsertMany(cachedMods);
-
-            this.WikiMetadata.DeleteMany("{}");
-            this.WikiMetadata.InsertOne(cachedMetadata);
-        }
-    }
-}
-- 
cgit