-
-
Notifications
You must be signed in to change notification settings - Fork 746
/
migrate-task-state.util.ts
117 lines (104 loc) · 3.63 KB
/
migrate-task-state.util.ts
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
import {Dictionary} from '@ngrx/entity';
import {Task, TaskArchive, TaskState} from './task.model';
import {GITHUB_TYPE} from '../issue/issue.const';
import {MODEL_VERSION_KEY, WORKLOG_DATE_STR_FORMAT} from '../../app.constants';
import * as moment from 'moment';
import {convertToWesternArabic} from '../../util/numeric-converter';
const MODEL_VERSION = 3.13;
export const LEGACY_GITHUB_TYPE = 'GIT';
export const migrateTaskState = (taskState: TaskState): TaskState => {
if (!taskState || (taskState && taskState[MODEL_VERSION_KEY] === MODEL_VERSION)) {
return taskState;
}
const taskEntities: Dictionary<Task> = {...taskState.entities};
Object.keys(taskEntities).forEach((key) => {
taskEntities[key] = _addNewIssueFields(taskEntities[key]);
taskEntities[key] = _replaceLegacyGitType(taskEntities[key]);
taskEntities[key] = _addTagIds(taskEntities[key]);
taskEntities[key] = _deleteUnusedFields(taskEntities[key]);
taskEntities[key] = _convertToWesternArabicDateKeys(taskEntities[key]);
});
taskState[MODEL_VERSION_KEY] = MODEL_VERSION;
return {...taskState, entities: taskEntities};
};
export const migrateTaskArchiveState = (
taskArchiveState: TaskArchive,
): TaskArchive => {
if (!taskArchiveState || (taskArchiveState && taskArchiveState[MODEL_VERSION_KEY] === MODEL_VERSION)) {
return taskArchiveState;
}
const taskEntities: Dictionary<Task> = {...taskArchiveState.entities};
Object.keys(taskEntities).forEach((key) => {
taskEntities[key] = _addNewIssueFields(taskEntities[key]);
taskEntities[key] = _replaceLegacyGitType(taskEntities[key]);
taskEntities[key] = _deleteUnusedFields(taskEntities[key]);
taskEntities[key] = _convertToWesternArabicDateKeys(taskEntities[key]);
});
};
const _addTagIds = (task: Task): Task => {
return (task.hasOwnProperty('tagIds'))
? task
: {
...task,
tagIds: []
};
};
const _addNewIssueFields = (task: Task): Task => {
if (!task.hasOwnProperty('issueLastUpdated')) {
return (task.issueId !== null)
? {
// NOTE: we intentionally leave it as is, to allow for an update
// issueAttachmentNr: null,
// issueLastUpdated: Date.now(),
// issueWasUpdated: false,
...task,
}
: {
issueAttachmentNr: null,
issueLastUpdated: null,
issueWasUpdated: null,
...task
};
} else {
return task;
}
};
const _replaceLegacyGitType = (task: Task) => {
const issueType = task.issueType as string;
return (issueType === LEGACY_GITHUB_TYPE)
? {...task, issueType: GITHUB_TYPE}
: task;
};
const _convertToWesternArabicDateKeys = (task: Task) => {
return (task.timeSpentOnDay)
? {
...task,
timeSpentOnDay: Object.keys(task.timeSpentOnDay).reduce((acc, dateKey) => {
const date = moment(convertToWesternArabic(dateKey));
if (!date.isValid()) {
throw new Error('Cannot migrate invalid non western arabic date string ' + dateKey);
}
const westernArabicKey = date.locale('en').format(WORKLOG_DATE_STR_FORMAT);
const totalTimeSpentOnDay = Object.keys(task.timeSpentOnDay).filter((key) => {
return key === westernArabicKey && westernArabicKey !== dateKey;
}).reduce((tot, val) => {
return tot + task.timeSpentOnDay[val];
}, task.timeSpentOnDay[dateKey]);
return {
...acc,
[westernArabicKey]: totalTimeSpentOnDay
};
}, {})
}
: task;
};
const _deleteUnusedFields = (task: Task) => {
const {
// legacy
_isAdditionalInfoOpen,
_currentTab,
// the rest
...cleanTask
}: any | Task = task;
return cleanTask;
};