forked from getmoro/moro
-
Notifications
You must be signed in to change notification settings - Fork 0
/
commands.js
176 lines (156 loc) · 4.56 KB
/
commands.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
// natives
const path = require('path')
// packages
const moment = require('moment')
const jsonfile = require('jsonfile')
// ours
const db = require('./db.js')
const {shouldWorkUntil, printSingleDayReport} = require('./utils/helpers.js')
// constants
const TODAY = moment().format('YYYY-MM-DD')
const NOW = moment().format('HH:mm')
const CONFIG_FILE = path.join(__dirname, 'config.json')
// CONFIG has stuff that can be changed in runtime, so
const CONFIG = jsonfile.readFileSync(CONFIG_FILE)
// constants has real un-changeable stuff, they are read-only
const { DB_FILE_MAIN } = require('./constants.json')
// determine whether to setStart | setEnd | report
// based on entered information in database
const nextUndoneAction = (args, options, logger) => {
db.getDateReport(TODAY, db.knex)
.then((data) => {
if (data && !data.start) {
setStart(args, options, logger)
return
}
if (data && !data.end) {
setEnd(args, options, logger)
return
}
if (data && data.start && data.end) {
report(args, options, logger)
return
}
// this one is for when we don't even have the database
setStart(args, options, logger)
})
}
const setStart = (args, options, logger) => {
const start = args.start || NOW
logger.info('\n Your start of the day registered as ', start)
shouldWorkUntil(start, logger, CONFIG)
const payload = {
date: TODAY,
start,
breakDuration: CONFIG.BREAK_DEFAULT,
action: 'setStart'
}
// update database
db.updateDatabase(payload, db.knex)
.catch((err) => { logger.error(err) })
.finally(() => { process.exit(0) })
logger.info('\n TIP: next time you run moro the end of your day will be set')
}
// set total duration of break for today
const setBreak = (args, options, logger, CONFIG) => {
const duration = args.duration || CONFIG.BREAK_DEFAULT
logger.info('Break took: ', duration, 'Minutes', ' And will be removed from your work hours')
const payload = {
date: TODAY,
breakDuration: duration,
action: 'setBreakDuration'
}
db.updateDatabase(payload, db.knex)
.catch((err) => { logger.error(err) })
.then(() => { report() })
}
// report functionality for both single and batch reporting
const report = (args, options, logger = console.log, date = TODAY) => {
if (options && options.all) {
db
.getFullReport(db.knex)
.catch((error) => { console.log(error) })
.finally(() => { process.exit(0) })
return
}
db
.calculateWorkHours(date, db.knex)
.then((result) => {
db.getDateReport(TODAY, db.knex)
.then((data) => {
if (data && result) {
data.dayReport = result.formattedWorkHours
const table = printSingleDayReport(data)
console.log('\n Today looks like this:\n')
// renders the table
console.log(table)
console.log('Run moro --help if you need to edit your start, end or break duration for today \n')
process.exit(0)
}
})
.catch((err) => { logger.error(err) })
})
.catch((err) => { logger.error(err) })
}
const setConfig = (args, options, logger) => {
if (options.day) {
CONFIG.HOURS_IN_A_WORK_DAY = options.day
console.log('Duration of full work day is set to ', options.day)
}
if (options.break) {
CONFIG.BREAK_DEFAULT = options.break
console.log('Default break duration is set to', options.break)
}
jsonfile.writeFileSync(CONFIG_FILE, CONFIG)
process.exit(0)
}
// set end of the work day
const setEnd = (args, options, logger, CONFIG) => {
const end = args.end || NOW
logger.info('Your end of the work day is set at: ', end)
const payload = {
date: TODAY,
end,
action: 'setEnd'
}
db
.updateDatabase(payload, db.knex)
.then(() => { report() })
}
const clearData = (args, options, logger) => {
if (options && options.yes) {
db.removeDatabase(DB_FILE_MAIN)
return
}
logger.info('If you surely want to clear all data in moro run: moro clear --yes')
process.exit()
}
const addNote = (args, options, logger) => {
let note = args.note || '...'
note = note.join(' ')
const createdat = NOW
const payload = {
date: TODAY,
note,
createdat,
action: 'addNote'
}
db.updateDatabase(payload, db.knex)
.then(() => {
report()
})
.catch((err) => { logger.error(err) })
.finally(() => {
console.log('Your note is added! You can see it in report \\O/ ')
})
}
module.exports = {
nextUndoneAction,
setConfig,
setEnd,
setStart,
setBreak,
addNote,
report,
clearData
}