From 55ef7cd782a95d059bbda5bd10f3770c2a710d97 Mon Sep 17 00:00:00 2001
From: Samuel Galson <samgalson@gmail.com>
Date: Fri, 22 Sep 2017 11:37:57 +0100
Subject: [PATCH] break apart validations

---
 README.md                |  1 +
 src/index.js             |  9 +++------
 src/setup-db/index.js    | 10 ++++++----
 src/setup-db/setup-db.js | 14 ++++----------
 src/validations.js       | 18 ++++++++++--------
 5 files changed, 24 insertions(+), 28 deletions(-)

diff --git a/README.md b/README.md
index cc5a4ea3d..fa6ff0710 100644
--- a/README.md
+++ b/README.md
@@ -36,6 +36,7 @@ It can be called without arguments, in which case it will take its configuration
     username: 'xxxxxx',
     password: 'pppppp',
     email: 'email@example.com',
+    clobber: false // overwrite existing db (optional)
     collection: 'collection_title' // (optional)
   }
 }
diff --git a/src/index.js b/src/index.js
index 270f91c9b..b88863357 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,14 +1,11 @@
-const logger = require('@pubsweet/logger')
-const winston = require('winston')
-const { validateConfig } = require('./validations')
+const config = require('config')
+const { validateServerConfig } = require('./validations')
 
 process.env.PUBSWEET_BACKEND_SILENT = true
 
-logger.configure(winston)
-validateConfig()
+validateServerConfig(config.get('pubsweet-server'))
 
 module.exports = {
   setupDb: require('./setup-db/'),
   addUser: require('./add-user/')
 }
-
diff --git a/src/setup-db/index.js b/src/setup-db/index.js
index e799e0b92..362a1bd88 100644
--- a/src/setup-db/index.js
+++ b/src/setup-db/index.js
@@ -1,11 +1,12 @@
 const logger = require('@pubsweet/logger')
-const path = require('path')
+const _ = require('lodash/fp')
 const config = require('config')
 const dbExists = require('../helpers/db-exists')
 const generateEnv = require('./generate-env')
 const setupDb = require('./setup-db')
 const dbPath = require('../helpers/db-path')
 const PouchDB = require('pouchdb')
+const { validateSetupDbConfig } = require('../validations')
 
 const checkNoDb = async () => {
   const exists = await dbExists()
@@ -21,12 +22,13 @@ const checkNoDb = async () => {
   logger.info('Removed DB at', dbPath)
 }
 
-module.exports = async () => {
-  const setupDbConfig = config.get('dbManager')
+module.exports = async (setupDbConfig) => {
+  const mergedDbConfig = _.merge(config.get('dbManager'), setupDbConfig)
+  validateSetupDbConfig(mergedDbConfig)
   try {
     await checkNoDb()
     generateEnv()
-    return await setupDb(setupDbConfig)
+    return await setupDb(mergedDbConfig)
   } catch (e) {
     logger.error('Database setup failed')
     throw e
diff --git a/src/setup-db/setup-db.js b/src/setup-db/setup-db.js
index f16435c12..e6e3876e8 100644
--- a/src/setup-db/setup-db.js
+++ b/src/setup-db/setup-db.js
@@ -1,17 +1,12 @@
 const logger = require('@pubsweet/logger')
-const config = require('config')
 const _ = require('lodash/fp')
 
 const createAdminUser = async (userData) => {
   const User = require('pubsweet-server/src/models/User')
   logger.info('Creating the admin user')
 
-  const user = new User({
-    username: userData.username,
-    email: userData.email,
-    password: userData.password,
-    admin: true
-  })
+  userData.admin = true
+  const user = new User(userData)
   await user.save()
 
   logger.info('Saved admin user: ', user.username)
@@ -33,10 +28,9 @@ const createCollection = async (title, user) => {
   return collection
 }
 
-module.exports = async (setupDbConfig) => {
-  const mergedDbConfig = _.merge({}, config.get('dbManager'), setupDbConfig)
+module.exports = async (mergedDbConfig) => {
   const collectionTitle = mergedDbConfig.collection
-  const userData = _.pick(['username','password','admin', 'email'], mergedDbConfig)
+  const userData = _.pick(['username', 'password', 'admin', 'email'], mergedDbConfig)
   logger.info('Setting up the database')
   const user = await createAdminUser(userData)
   const collection = collectionTitle ? await createCollection(collectionTitle, user) : null
diff --git a/src/validations.js b/src/validations.js
index a878ea82b..c0b8aaa83 100644
--- a/src/validations.js
+++ b/src/validations.js
@@ -1,5 +1,4 @@
 const Joi = require('joi')
-const config = require('config')
 const schemas = require('pubsweet-server/src/models/validations')
 const _ = require('lodash/fp')
 
@@ -11,19 +10,22 @@ const userSchema = Joi.object({
 })
 
 const setupDbSchema = userSchema.keys({
+  clobber: Joi.boolean().optional(),
   collection: _.get('collection.title', schemas) || Joi.string().optional()
 })
 
-const schema = Joi.object({
-  dbManager: setupDbSchema.required(),
-  'pubsweet-server': Joi.object({
-    dbPath: Joi.string().required()
-  }).required()
+const serverSchema = Joi.object({
+  dbPath: Joi.string().required()
 })
 
 module.exports = {
-  validateConfig: function validateConfig () {
-    const result = Joi.validate(config, schema, { allowUnknown: true })
+  validateServerConfig: function validateServerConfig (serverConfig) {
+    const result = Joi.validate(serverConfig, serverSchema, { allowUnknown: true })
+    if (result.error) throw result.error
+    return null
+  },
+  validateSetupDbConfig: function validateSetupDbConfig (setupDbConfig) {
+    const result = Joi.validate(setupDbConfig, setupDbSchema, { allowUnknown: true })
     if (result.error) throw result.error
     return null
   },
-- 
GitLab