-
Notifications
You must be signed in to change notification settings - Fork 0
/
accountEvent.js
90 lines (76 loc) · 1.92 KB
/
accountEvent.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
'use strict'
const fs = require('fs')
const path = require('path')
const os = require('os')
const _ = require('lodash')
const EVENT_LOG_PATH = path.join(__dirname, 'event_log.txt')
const EVENT = {
open: 'open',
close: 'close',
transfer: 'transfer'
}
function reset () {
fs.writeFileSync(EVENT_LOG_PATH, '')
}
function append (event) {
fs.appendFileSync(EVENT_LOG_PATH, JSON.stringify(event) + os.EOL)
}
function getEvents () {
const eventLines = fs.readFileSync(EVENT_LOG_PATH, 'utf-8')
return eventLines
.split(os.EOL)
.filter((eventLineStr) => eventLineStr.length)
.map((eventLineStr) => {
let eventLine = {}
try {
eventLine = JSON.parse(eventLineStr)
} catch (err) {
// eslint-disable-next-line
console.error(err)
}
return eventLine
})
}
function rebuild (number) {
let events = getEvents()
if (!isNaN(number)) {
events = events.splice(0, number)
}
return events
.reduce((accounts, event) => {
if (event.type === EVENT.open) {
accounts[event.id] = event.balance
} else if (event.type === EVENT.close) {
delete accounts[event.id]
} else if (event.type === EVENT.transfer) {
accounts[event.fromId] -= event.amount
accounts[event.toId] += event.amount
}
return accounts
}, {})
}
function undo (accounts, lastX) {
return getEvents().splice(-lastX)
.reduceRight((accounts, event) => {
if (event.type === EVENT.open) {
delete accounts[event.id]
} else if (event.type === EVENT.close) {
accounts[event.id] = event.balance
} else if (event.type === EVENT.transfer) {
accounts[event.fromId] += event.amount
accounts[event.toId] -= event.amount
}
return accounts
}, _.clone(accounts))
}
function query (number) {
return rebuild(number)
}
module.exports = {
reset,
append,
rebuild,
undo,
query,
EVENT
}