From b07a2c8a53a1b4dc7800297b49b84d30438bb6dd Mon Sep 17 00:00:00 2001
From: Julia Friesel <julia.friesel@gmail.com>
Date: Thu, 9 Aug 2018 11:48:28 +0200
Subject: [PATCH] Move db operations back to db module

---
 db/index.js                               | 36 +++++++++++++++++++++--
 lib/import-export/get-csv-column-names.js |  8 ++---
 lib/import-export/import-from-csv.js      | 32 ++++----------------
 3 files changed, 43 insertions(+), 33 deletions(-)

diff --git a/db/index.js b/db/index.js
index ea76bd67..6847aea2 100644
--- a/db/index.js
+++ b/db/index.js
@@ -176,9 +176,38 @@ function getPreviousTemperature(cycleDay) {
   return winner.temperature.value
 }
 
+const schema = db.schema.reduce((acc, curr) => {
+  acc[curr.name] = curr.properties
+  return acc
+}, {})
+
+function tryToCreateCycleDay(day, i) {
+  try {
+    db.create('CycleDay', day)
+  } catch (err) {
+    const msg = `Line ${i + 1}(${day.date}): ${err.message}`
+    throw new Error(msg)
+  }
+}
+
+function tryToImportWithDelete(cycleDays) {
+  db.write(() => {
+    db.delete(db.objects('CycleDay'))
+    cycleDays.forEach(tryToCreateCycleDay)
+  })
+}
+
+function tryToImportWithoutDelete(cycleDays) {
+  db.write(() => {
+    cycleDays.forEach((day, i) => {
+      const existing = getCycleDay(day.date)
+      if (existing) db.delete(existing)
+      tryToCreateCycleDay(day, i)
+    })
+  })
+}
 
 export {
-  db,
   saveSymptom,
   getOrCreateCycleDay,
   bleedingDaysSortedByDate,
@@ -187,5 +216,8 @@ export {
   fillWithDummyData,
   deleteAll,
   getPreviousTemperature,
-  getCycleDay
+  getCycleDay,
+  schema,
+  tryToImportWithDelete,
+  tryToImportWithoutDelete
 }
diff --git a/lib/import-export/get-csv-column-names.js b/lib/import-export/get-csv-column-names.js
index f637593e..1b63943a 100644
--- a/lib/import-export/get-csv-column-names.js
+++ b/lib/import-export/get-csv-column-names.js
@@ -1,13 +1,13 @@
-import { db } from '../../db'
+import { schema } from '../../db'
 
 export default function getColumnNamesForCsv() {
   return getPrefixedKeys('CycleDay')
 
   function getPrefixedKeys(schemaName, prefix) {
-    const schema = db.schema.find(x => x.name === schemaName).properties
-    return Object.keys(schema).reduce((acc, key) => {
+    const model = schema[schemaName]
+    return Object.keys(model).reduce((acc, key) => {
       const prefixedKey = prefix ? [prefix, key].join('.') : key
-      const childSchemaName = schema[key].objectType
+      const childSchemaName = model[key].objectType
       if (!childSchemaName) {
         acc.push(prefixedKey)
         return acc
diff --git a/lib/import-export/import-from-csv.js b/lib/import-export/import-from-csv.js
index 698586dc..77c24444 100644
--- a/lib/import-export/import-from-csv.js
+++ b/lib/import-export/import-from-csv.js
@@ -1,6 +1,6 @@
 import csvParser from 'csvtojson'
 import isObject from 'isobject'
-import { db, getCycleDay } from '../../db'
+import { schema, tryToImportWithDelete, tryToImportWithoutDelete } from '../../db'
 import getColumnNamesForCsv from './get-csv-column-names'
 
 export default async function importCsv(csv, deleteFirst) {
@@ -23,12 +23,11 @@ export default async function importCsv(csv, deleteFirst) {
     return Number(val)
   }
 
-  const cycleDayDbSchema = db.schema.find(x => x.name === 'CycleDay').properties
   const config = {
     ignoreEmpty: true,
     colParser: getColumnNamesForCsv().reduce((acc, colName) => {
       const path = colName.split('.')
-      const dbType = getDbType(cycleDayDbSchema, path)
+      const dbType = getDbType(schema.CycleDay, path)
       acc[colName] = item => {
         if (item === '') return null
         return parseFuncs[dbType](item)
@@ -45,29 +44,9 @@ export default async function importCsv(csv, deleteFirst) {
   putNullForEmptySymptoms(cycleDays)
 
   if (deleteFirst) {
-    db.write(() => {
-      db.delete(db.objects('CycleDay'))
-      cycleDays.forEach(tryToCreateCycleDay)
-    })
+    tryToImportWithDelete(cycleDays)
   } else {
-    db.write(() => {
-      cycleDays.forEach((day, i) => {
-        const existing = getCycleDay(day.date)
-        if (existing) {
-          db.delete(existing)
-        }
-        tryToCreateCycleDay(day, i)
-      })
-    })
-  }
-}
-
-function tryToCreateCycleDay(day, i) {
-  try {
-    db.create('CycleDay', day)
-  } catch (err) {
-    const msg = `Line ${i + 1}(${day.date}): ${err.message}`
-    throw new Error(msg)
+    tryToImportWithoutDelete(cycleDays)
   }
 }
 
@@ -99,6 +78,5 @@ function putNullForEmptySymptoms(data) {
 function getDbType(modelProperties, path) {
   if (path.length === 1) return modelProperties[path[0]].type
   const modelName = modelProperties[path[0]].objectType
-  const model = db.schema.find(x => x.name === modelName)
-  return getDbType(model.properties, path.slice(1))
+  return getDbType(schema[modelName], path.slice(1))
 }
\ No newline at end of file
-- 
GitLab