1+ const _ = require('underscore');
2+ const moment = require('moment');
3+ const program = require('commander');
4+
5+ const FrameCollection = require('./models/frameCollection');
6+ const Issue = require('./models/issue');
7+ const MergeRequest = require('./models/mergeRequest');
8+ const Config = require('./include/file-config');
9+ const Cli = require('./include/cli');
10+
11+ program.parse(process.argv);
12+
13+ let config = new Config(process.cwd());
14+ let frames = new FrameCollection(config);
15+
16+ let classes = {
17+ issue: Issue,
18+ merge_request: MergeRequest
19+ };
20+ let resources = {
21+ issue: {},
22+ merge_request: {}
23+ };
24+
25+ function createTime(frame, time) {
26+ return new Promise((resolve, reject) => {
27+ resources[frame.resource.type][frame.resource.id].createTime(Math.ceil(time))
28+ .then(() => resources[frame.resource.type][frame.resource.id].getNotes())
29+ .then(() => {
30+ frame.notes.push({
31+ id: resources[frame.resource.type][frame.resource.id].notes[0].id,
32+ time: Math.ceil(time)
33+ });
34+ frame.write();
35+ resolve();
36+ })
37+ .catch(error => reject(error))
38+ });
39+ }
40+
41+ Cli.bar(`${Cli.process} Syncing time records...`, frames.length);
42+
43+ frames.forEach((frame, done) => {
44+ // filter out frames, that don't need an update
45+ if (Math.ceil(frame.duration) === _.reduce(frame.notes, (n, m) => (n + m.time), 0)) {
46+ Cli.advance();
47+ return done();
48+ }
49+
50+ new Promise(resolve => resolve())
51+
52+ // set resource if it isn't already set
53+ .then(() => new Promise((resolve, reject) => {
54+ if (resources[frame.resource.type][frame.resource.id]) return resolve();
55+ resources[frame.resource.type][frame.resource.id] = new classes[frame.resource.type](config, {});
56+ resources[frame.resource.type][frame.resource.id].make(frame.project, frame.resource.id)
57+ .then(() => resolve())
58+ .catch(error => reject(error));
59+ }))
60+ .catch(error => Cli.x(`Could not resolve issue/merge_request ${frame.resource.id} on "${frame.project}"`, error))
61+
62+ // set notes if not already set
63+ .then(() => new Promise((resolve, reject) => {
64+ let notes;
65+ if ((notes = resources[frame.resource.type][frame.resource.id].notes) && notes.length > 0) return;
66+ resources[frame.resource.type][frame.resource.id].getNotes()
67+ .then(() => resolve())
68+ .catch(error => reject(error));
69+ }))
70+ .catch(error => Cli.x(`Could not get notes from "${frame.project}"`, error))
71+
72+ // create note if completely missing
73+ .then(() => new Promise((resolve, reject) => {
74+ if (frame.notes.length > 0) return resolve();
75+ createTime(frame, frame.duration)
76+ .then(() => {
77+ Cli.advance();
78+ done();
79+ })
80+ .catch(error => reject(error))
81+ }))
82+ .catch(error => Cli.error('Could not create time spent.', error))
83+
84+ // check for mismatches and update times
85+ .then(() => new Promise((resolve, reject) => {
86+ let diff = Math.ceil(frame.duration) - parseInt(_.reduce(frame.notes, (n, m) => (n + m.time), 0));
87+ createTime(frame, diff)
88+ .then(() => {
89+ Cli.advance();
90+ done();
91+ })
92+ .catch(error => reject(error))
93+ }))
94+ .catch(error => Cli.error('Could not create time spent.', error))
95+ });
0 commit comments