-
Notifications
You must be signed in to change notification settings - Fork 0
/
tasks.js
95 lines (84 loc) · 2.51 KB
/
tasks.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
var parse = require('./parse.js'),
fs = require('fs'),
path = require('path'),
// place ID → task UID → Jive Task ID
mappingsDb = {}
module.exports = {
compareCurrentAndNewProject: compareCurrentAndNewProject,
getJiveIdForTaskUid: getId,
putJiveIdForTaskUid: putId
}
function compareCurrentAndNewProject(listener, rootPath, placeId) {
var existingProject = { Tasks: {} },
basePath = rootPath + '/' + placeId + '/'
existingPath = basePath + 'current.xml'
if (fs.existsSync(existingPath)) {
console.log('PARSING EXISTING', existingPath)
parse.parseXml(existingPath, function (err, data) {
if (err) throw err
existingProject = data
parseNew()
})
} else {
parseNew()
}
function parseNew() {
var newPath = basePath + 'new.xml'
parse.parseXml(newPath, function (err, data) {
if (err) throw err
compareTasks(existingProject, data, listener)
})
}
}
function compareTasks(existingProject, newProject, listener) {
// parse._dump(newProject)
var existingTasks = existingProject.Tasks,
newTasks = newProject.Tasks
// delete tasks from Jive that are not in the project anymore
// and update new tasks with a reference to the old task definition
for (var uid in existingTasks) {
if (!existingTasks.hasOwnProperty(uid)) continue
var existingTask = existingTasks[uid],
newTask = newTasks[uid]
if (newTask) {
if (JSON.stringify(newTask) !== JSON.stringify(existingTask)) {
listener.updateTask(newTask)
}
newTask._exists = true
} else {
listener.deleteTask(existingTask)
}
}
for (var uid in newTasks) {
if (!newTasks.hasOwnProperty(uid)) continue
var newTask = newTasks[uid]
if (!newTask._exists) {
listener.createTask(newTask)
}
}
}
function getId(placeId, taskUid) {
var mappings = ensureDb(placeId)
return mappings[taskUid]
}
function putId(placeId, taskUid, jiveTaskId) {
var mappings = ensureDb(placeId)
mappings[taskUid] = jiveTaskId
fs.writeFileSync(getPath(placeId), JSON.stringify(mappings))
}
function ensureDb(placeId) {
var mappings = mappingsDb[placeId]
if (mappings) {
return mappings
}
var path = getPath(placeId)
if (!fs.existsSync(path)) {
console.log('writing empty mappings file', path)
fs.writeFileSync(path, '{}')
}
mappings = require(path)
return mappingsDb[placeId] = mappings
}
function getPath(placeId) {
return path.normalize(__dirname + '/db/_places/' + placeId + '/mappings.json')
}