-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
72 lines (62 loc) · 1.48 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
const inquirer = require('inquirer')
const _ = require('lodash')
const Rx = require('rx-lite-aggregates')
const fs = require('fs-jetpack')
const moment = require('moment')
const DATE_FORMAT = 'YYYYMMDD'
const q = i => ({
type: 'input',
name: `gratitude-${i}`,
message: 'I am grateful for'
})
const ask = n => {
const observable = Rx.Observable.fromArray(_.times(n, q))
return inquirer.prompt(observable)
}
const save = (db_path, database) => answers => {
const db = database || require(db_path)
const today = moment().format(DATE_FORMAT)
db[today] = answers
return fs.writeAsync(db_path, JSON.stringify(db)).then(() => db)
}
const getPrevious = (db, date) => {
const previous = moment(date)
.subtract(1, 'days')
.format(DATE_FORMAT)
return db[previous] ? previous : null
}
const getLatestDate = keys => {
return keys.sort().reverse()[0]
}
const getCurrentStreak = (db = {}, now) => {
const keys = Object.keys(db)
const latest = now || getLatestDate(keys)
let streak = 1
let prev = getPrevious(db, latest)
while (prev) {
streak++
prev = getPrevious(db, prev)
}
return streak
}
const ensureDB = path => {
try {
require(path)
return Promise.resolve()
} catch (err) {
if (err) {
return fs.writeAsync(path, JSON.stringify({}))
}
return Promise.reject(err)
}
}
const doneToday = db => {
return db[moment().format(DATE_FORMAT)] ? true : false
}
module.exports = {
ask,
save,
getCurrentStreak,
ensureDB,
doneToday
}