forked from kriskbx/gitlab-time-tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgtt-sync.js
More file actions
103 lines (89 loc) · 3.75 KB
/
gtt-sync.js
File metadata and controls
103 lines (89 loc) · 3.75 KB
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
const _ = require('underscore');
const moment = require('moment');
const program = require('commander');
const FrameCollection = require('./models/frameCollection');
const Issue = require('./models/issue');
const MergeRequest = require('./models/mergeRequest');
const Config = require('./include/file-config');
const Cli = require('./include/cli');
program
.option('-p --proxy <proxy>', 'use a proxy server with the given url')
.parse(process.argv);
let config = new Config(process.cwd());
let frames = new FrameCollection(config);
config.set('proxy', program.proxy);
let classes = {
issue: Issue,
merge_request: MergeRequest
};
let resources = {
issue: {},
merge_request: {}
};
function createTime(frame, time) {
return new Promise((resolve, reject) => {
resources[frame.resource.type][frame.resource.id].createTime(Math.ceil(time))
.then(() => resources[frame.resource.type][frame.resource.id].getNotes())
.then(() => {
frame.notes.push({
id: resources[frame.resource.type][frame.resource.id].notes[0].id,
time: Math.ceil(time)
});
frame.write();
resolve();
})
.catch(error => reject(error))
});
}
// filter out frames, that don't need an update
frames.filter(frame => {
return !(Math.ceil(frame.duration) === _.reduce(frame.notes, (n, m) => (n + m.time), 0));
});
if (frames.length === 0) process.exit(0);
Cli.bar(`${Cli.process} Syncing time records...`, frames.length);
frames.forEach((frame, done) => {
new Promise(resolve => resolve())
// set resource if it isn't already set
.then(() => new Promise((resolve, reject) => {
if (resources[frame.resource.type][frame.resource.id] !== undefined
&& resources[frame.resource.type][frame.resource.id].data.project_id) return resolve();
resources[frame.resource.type][frame.resource.id] = new classes[frame.resource.type](config, {});
resources[frame.resource.type][frame.resource.id]
.make(frame.project, frame.resource.id)
.then(() => resolve())
.catch(error => reject(error));
}))
.catch(error => Cli.x(`Could not resolve issue/merge_request ${frame.resource.id} on "${frame.project}"`, error))
// set notes if not already set
.then(() => new Promise((resolve, reject) => {
let notes;
if ((notes = resources[frame.resource.type][frame.resource.id].notes) && notes.length > 0) return;
resources[frame.resource.type][frame.resource.id]
.getNotes()
.then(() => resolve())
.catch(error => reject(error));
}))
.catch(error => Cli.x(`Could not get notes from "${frame.project}"`, error))
// create note if completely missing
.then(() => new Promise((resolve, reject) => {
if (frame.notes.length > 0) return resolve();
createTime(frame, frame.duration)
.then(() => {
Cli.advance();
done();
})
.catch(error => reject(error))
}))
.catch(error => Cli.error('Could not create time spent.', error))
// check for mismatches and update times
.then(() => new Promise((resolve, reject) => {
let diff = Math.ceil(frame.duration) - parseInt(_.reduce(frame.notes, (n, m) => (n + m.time), 0));
createTime(frame, diff)
.then(() => {
Cli.advance();
done();
})
.catch(error => reject(error))
}))
.catch(error => Cli.error('Could not create time spent.', error))
});