]> git.r.bdr.sh - rbdr/blog/blobdiff - lib/remote.js
Add rudimentary sync support
[rbdr/blog] / lib / remote.js
diff --git a/lib/remote.js b/lib/remote.js
new file mode 100644 (file)
index 0000000..d8f73f9
--- /dev/null
@@ -0,0 +1,48 @@
+const { readFile, rm, writeFile } = require('fs/promises');
+
+const internals = {
+  strings: {
+    configurationNotFound: 'Remote configuration not set, consult help for more info.'
+  },
+  strategies: [
+    require('./remotes/git')
+  ]
+};
+
+module.exports = {
+  async add(remoteConfig, remote) {
+    await writeFile(remoteConfig, remote);
+  },
+
+  async remove(remoteConfig) {
+    await rm(remoteConfig, { force: true })
+  },
+
+  async syncUp(remoteConfig, blogDirectory) {
+    this._executeMethodOnStrategy(remoteConfig, 'syncUp', blogDirectory);
+  },
+
+  async syncDown(remoteConfig, blogDirectory) {
+    this._executeMethodOnStrategy(remoteConfig, 'syncDown', blogDirectory);
+  },
+
+  async _executeMethodOnStrategy(remoteConfig, method, blogDirectory) {
+    const remote = await this._ensureConfiguration(remoteConfig);
+
+    for (const strategy of internals.strategies) {
+      if (strategy.canHandle(remote)) {
+        await strategy[method](remote, blogDirectory);
+      }
+    }
+  },
+
+  async _ensureConfiguration(remoteConfig) {
+    try {
+      const configuration = await readFile(remoteConfig, { encoding: 'utf8' });
+      return configuration;
+    }
+    catch {
+      throw new Error(internals.strings.configurationNotFound);
+    }
+  }
+}