From 192ef5ad8679b012aee75bbd593cf61014d8e95d Mon Sep 17 00:00:00 2001 From: Johannes Millan Date: Thu, 24 Sep 2020 22:05:14 +0200 Subject: [PATCH] feat(autoRepair): make _removeMissingIdsFromLists work --- .../core/data-repair/data-repair.util.spec.ts | 79 ++++++++++++++++++- src/app/core/data-repair/data-repair.util.ts | 35 ++++---- 2 files changed, 99 insertions(+), 15 deletions(-) diff --git a/src/app/core/data-repair/data-repair.util.spec.ts b/src/app/core/data-repair/data-repair.util.spec.ts index 76ad5747c7..c53f92c0dd 100644 --- a/src/app/core/data-repair/data-repair.util.spec.ts +++ b/src/app/core/data-repair/data-repair.util.spec.ts @@ -5,6 +5,8 @@ import { fakeEntityStateFromArray } from '../../util/fake-entity-state-from-arra import { DEFAULT_TASK, Task } from '../../features/tasks/task.model'; import { createEmptyEntity } from '../../util/create-empty-entity'; import { Tag, TagState } from '../../features/tag/tag.model'; +import { ProjectState } from '../../features/project/store/project.reducer'; +import { Project } from '../../features/project/project.model'; fdescribe('dataRepair()', () => { let mock: AppDataComplete; @@ -38,7 +40,7 @@ fdescribe('dataRepair()', () => { }); }); - xit('should delete missing tasks for tags today list', () => { + it('should delete missing tasks for tags today list', () => { const taskState = { ...mock.task, ...fakeEntityStateFromArray([{ @@ -77,8 +79,83 @@ fdescribe('dataRepair()', () => { }); it('should delete missing tasks for projects today list', () => { + const taskState = { + ...mock.task, + ...fakeEntityStateFromArray([{ + ...DEFAULT_TASK, + id: 'TEST', + title: 'TEST', + }]) + } as any; + + const projectState: ProjectState = { + ...fakeEntityStateFromArray([{ + title: 'TEST_PROJECT', + id: 'TEST_ID_PROJECT', + taskIds: ['goneProject', 'TEST', 'noneExisting'], + backlogTaskIds: [], + }] as Partial []), + }; + + expect(dataRepair({ + ...mock, + project: projectState, + task: taskState, + })).toEqual({ + ...mock, + task: taskState as any, + project: { + ...projectState, + entities: { + TEST_ID_PROJECT: { + title: 'TEST_PROJECT', + id: 'TEST_ID_PROJECT', + taskIds: ['TEST'], + backlogTaskIds: [], + }, + } as any + } + }); }); + it('should delete missing tasks for projects backlog list', () => { + const taskState = { + ...mock.task, + ...fakeEntityStateFromArray([{ + ...DEFAULT_TASK, + id: 'TEST', + title: 'TEST', + }]) + } as any; + + const projectState: ProjectState = { + ...fakeEntityStateFromArray([{ + title: 'TEST_PROJECT', + id: 'TEST_ID_PROJECT', + taskIds: [], + backlogTaskIds: ['goneProject', 'TEST', 'noneExisting'], + }] as Partial []), + }; + + expect(dataRepair({ + ...mock, + project: projectState, + task: taskState, + })).toEqual({ + ...mock, + task: taskState as any, + project: { + ...projectState, + entities: { + TEST_ID_PROJECT: { + title: 'TEST_PROJECT', + id: 'TEST_ID_PROJECT', + taskIds: [], + backlogTaskIds: ['TEST'], + }, + } as any + } + }); }); describe('should fix duplicate entities for', () => { diff --git a/src/app/core/data-repair/data-repair.util.ts b/src/app/core/data-repair/data-repair.util.ts index 9b636b1ac7..1c218db685 100644 --- a/src/app/core/data-repair/data-repair.util.ts +++ b/src/app/core/data-repair/data-repair.util.ts @@ -1,12 +1,16 @@ import { AppBaseDataEntityLikeStates, AppDataComplete } from '../../imex/sync/sync.model'; +import { TagCopy } from '../../features/tag/tag.model'; +import { ProjectCopy } from '../../features/project/project.model'; const ENTITY_STATE_KEYS: (keyof AppDataComplete)[] = ['task', 'taskArchive', 'taskRepeatCfg', 'tag', 'project', 'simpleCounter']; export const dataRepair = (data: AppDataComplete): AppDataComplete => { // console.time('dataRepair'); let dataOut: AppDataComplete = data; + // let dataOut: AppDataComplete = dirtyDeepCopy(data); dataOut = _fixEntityStates(dataOut); dataOut = _removeDuplicatesFromArchive(dataOut); + dataOut = _removeMissingIdsFromLists(dataOut); // console.timeEnd('dataRepair'); return dataOut; }; @@ -19,7 +23,6 @@ const _fixEntityStates = (data: AppDataComplete): AppDataComplete => { return data; }; -// const _removeDuplicatesFromArchive = (data: AppDataComplete): AppDataComplete => { const taskIds = data.task.ids as string[]; const archiveTaskIds = data.taskArchive.ids as string[]; @@ -36,20 +39,24 @@ const _removeDuplicatesFromArchive = (data: AppDataComplete): AppDataComplete => return data; }; -// const _removeDuplicatesFromArchive = (data: AppDataComplete): AppDataComplete => { -// return data; -// }; -// -// const _removeDuplicatesFromArchive = (data: AppDataComplete): AppDataComplete => { -// return data; -// }; +const _removeMissingIdsFromLists = (data: AppDataComplete): AppDataComplete => { + const {task, project, tag} = data; -// const _makeEntityIdsUnique = (data: AppBaseDataEntityLikeStates): AppBaseDataEntityLikeStates => { -// return { -// ...data, -// ids: unique(data.ids as any) as any -// }; -// }; + project.ids.forEach(() => { + }); + + project.ids.forEach((pId: string | number) => { + const projectItem = project.entities[pId] as ProjectCopy; + projectItem.taskIds = projectItem.taskIds.filter(id => task.ids.includes(id)); + projectItem.backlogTaskIds = projectItem.backlogTaskIds.filter(id => task.ids.includes(id)); + }); + tag.ids.forEach((tId: string | number) => { + const tagItem = tag.entities[tId] as TagCopy; + tagItem.taskIds = tagItem.taskIds.filter(id => task.ids.includes(id)); + }); + + return data; +}; const _resetEntityIdsFromObjects = (data: AppBaseDataEntityLikeStates): AppBaseDataEntityLikeStates => { return {