Skip to content

Commit 743364c

Browse files
authored
Merge pull request #4070 from rtibbles/where_is_my_mind
Localize change sync operations
2 parents a4cdf4f + 05fccf0 commit 743364c

File tree

26 files changed

+1905
-709
lines changed

26 files changed

+1905
-709
lines changed

contentcuration/contentcuration/frontend/channelEdit/vuex/assessmentItem/actions.js

Lines changed: 52 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,20 @@ export function addAssessmentItem(context, assessmentItem) {
4141
hints: JSON.stringify(assessmentItem.hints || []),
4242
};
4343

44-
return db.transaction('rw', [TABLE_NAMES.CONTENTNODE, TABLE_NAMES.ASSESSMENTITEM], () => {
45-
return AssessmentItem.put(stringifiedAssessmentItem).then(([contentnode, assessment_id]) => {
46-
context.commit('UPDATE_ASSESSMENTITEM', {
47-
...assessmentItem,
48-
contentnode,
49-
assessment_id,
44+
return db.transaction(
45+
'rw',
46+
[TABLE_NAMES.CONTENTNODE, TABLE_NAMES.ASSESSMENTITEM, TABLE_NAMES.CHANGES_TABLE],
47+
() => {
48+
return AssessmentItem.add(stringifiedAssessmentItem).then(([contentnode, assessment_id]) => {
49+
context.commit('UPDATE_ASSESSMENTITEM', {
50+
...assessmentItem,
51+
contentnode,
52+
assessment_id,
53+
});
54+
return updateNodeComplete(contentnode, context);
5055
});
51-
return updateNodeComplete(contentnode, context);
52-
});
53-
});
56+
}
57+
);
5458
}
5559
export function updateAssessmentItem(context, assessmentItem) {
5660
return updateAssessmentItems(context, [assessmentItem]);
@@ -65,38 +69,46 @@ export function updateAssessmentItems(context, assessmentItems) {
6569
context.commit('UPDATE_ASSESSMENTITEM', assessmentItem);
6670
});
6771

68-
return db.transaction('rw', [TABLE_NAMES.CONTENTNODE, TABLE_NAMES.ASSESSMENTITEM], () => {
69-
return Promise.all(
70-
assessmentItems.map(assessmentItem => {
71-
// API accepts answers and hints as strings
72-
const stringifiedAssessmentItem = {
73-
...assessmentItem,
74-
};
75-
if (assessmentItem.answers) {
76-
stringifiedAssessmentItem.answers = JSON.stringify(assessmentItem.answers);
77-
}
78-
if (assessmentItem.hints) {
79-
stringifiedAssessmentItem.hints = JSON.stringify(assessmentItem.hints);
80-
}
81-
return AssessmentItem.update(
82-
[assessmentItem.contentnode, assessmentItem.assessment_id],
83-
stringifiedAssessmentItem
84-
).then(() => {
85-
updateNodeComplete(assessmentItem.contentnode, context);
86-
});
87-
})
88-
);
89-
});
72+
return db.transaction(
73+
'rw',
74+
[TABLE_NAMES.CONTENTNODE, TABLE_NAMES.ASSESSMENTITEM, TABLE_NAMES.CHANGES_TABLE],
75+
() => {
76+
return Promise.all(
77+
assessmentItems.map(assessmentItem => {
78+
// API accepts answers and hints as strings
79+
const stringifiedAssessmentItem = {
80+
...assessmentItem,
81+
};
82+
if (assessmentItem.answers) {
83+
stringifiedAssessmentItem.answers = JSON.stringify(assessmentItem.answers);
84+
}
85+
if (assessmentItem.hints) {
86+
stringifiedAssessmentItem.hints = JSON.stringify(assessmentItem.hints);
87+
}
88+
return AssessmentItem.update(
89+
[assessmentItem.contentnode, assessmentItem.assessment_id],
90+
stringifiedAssessmentItem
91+
).then(() => {
92+
updateNodeComplete(assessmentItem.contentnode, context);
93+
});
94+
})
95+
);
96+
}
97+
);
9098
}
9199

92100
export function deleteAssessmentItem(context, assessmentItem) {
93-
return db.transaction('rw', [TABLE_NAMES.CONTENTNODE, TABLE_NAMES.ASSESSMENTITEM], () => {
94-
return AssessmentItem.delete([assessmentItem.contentnode, assessmentItem.assessment_id]).then(
95-
() => {
96-
context.commit('DELETE_ASSESSMENTITEM', assessmentItem);
97-
const contentnode = assessmentItem.contentnode;
98-
return updateNodeComplete(contentnode, context);
99-
}
100-
);
101-
});
101+
return db.transaction(
102+
'rw',
103+
[TABLE_NAMES.CONTENTNODE, TABLE_NAMES.ASSESSMENTITEM, TABLE_NAMES.CHANGES_TABLE],
104+
() => {
105+
return AssessmentItem.delete([assessmentItem.contentnode, assessmentItem.assessment_id]).then(
106+
() => {
107+
context.commit('DELETE_ASSESSMENTITEM', assessmentItem);
108+
const contentnode = assessmentItem.contentnode;
109+
return updateNodeComplete(contentnode, context);
110+
}
111+
);
112+
}
113+
);
102114
}

contentcuration/contentcuration/frontend/channelEdit/vuex/contentNode/__tests__/actions.spec.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import assessmentItem from '../../assessmentItem/index';
44
import file from 'shared/vuex/file';
55
import { ContentNode } from 'shared/data/resources';
66
import storeFactory from 'shared/vuex/baseStore';
7+
import { mockChannelScope, resetMockChannelScope } from 'shared/utils/testing';
78

89
jest.mock('../../currentChannel/index');
910

@@ -15,8 +16,9 @@ describe('contentNode actions', () => {
1516
let store;
1617
let id;
1718
const contentNodeDatum = { title: 'test', parent: parentId, lft: 1, tags: {} };
18-
beforeEach(() => {
19-
return ContentNode._put(contentNodeDatum).then(newId => {
19+
beforeEach(async () => {
20+
await mockChannelScope('test-123');
21+
return ContentNode._add(contentNodeDatum).then(newId => {
2022
id = newId;
2123
contentNodeDatum.id = newId;
2224
jest
@@ -25,7 +27,7 @@ describe('contentNode actions', () => {
2527
jest
2628
.spyOn(ContentNode, 'fetchModel')
2729
.mockImplementation(() => Promise.resolve(contentNodeDatum));
28-
return ContentNode._put({ title: 'notatest', parent: newId, lft: 2 }).then(() => {
30+
return ContentNode._add({ title: 'notatest', parent: newId, lft: 2 }).then(() => {
2931
store = storeFactory({
3032
modules: {
3133
assessmentItem,
@@ -38,7 +40,8 @@ describe('contentNode actions', () => {
3840
});
3941
});
4042
});
41-
afterEach(() => {
43+
afterEach(async () => {
44+
await resetMockChannelScope();
4245
jest.restoreAllMocks();
4346
return ContentNode.table.toCollection().delete();
4447
});

contentcuration/contentcuration/frontend/channelEdit/vuex/contentNode/actions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ export function createContentNode(context, { parent, kind, ...payload }) {
191191
assessmentItems: [],
192192
files: [],
193193
});
194-
return ContentNode.put(contentNodeData).then(id => {
194+
return ContentNode.add(contentNodeData).then(id => {
195195
context.commit('ADD_CONTENTNODE', {
196196
id,
197197
...contentNodeData,

contentcuration/contentcuration/frontend/channelEdit/vuex/importFromChannels/actions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export function createSearch({ commit, rootState }, params) {
3838
saved_by: rootState.session.currentUser.id,
3939
created: new Date(),
4040
};
41-
return SavedSearch.put(data).then(id => {
41+
return SavedSearch.add(data).then(id => {
4242
commit('UPDATE_SAVEDSEARCH', {
4343
id,
4444
...data,

contentcuration/contentcuration/frontend/channelList/vuex/channelList/__tests__/module.spec.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import channelList from '../index';
33
import { Channel, Invitation } from 'shared/data/resources';
44
import storeFactory from 'shared/vuex/baseStore';
55

6-
jest.mock('shared/client');
76
jest.mock('shared/vuex/connectionPlugin');
87

98
const channel_id = '11111111111111111111111111111111';
@@ -18,7 +17,7 @@ describe('invitation actions', () => {
1817
let store;
1918
let id;
2019
beforeEach(() => {
21-
return Invitation.put(invitation).then(newId => {
20+
return Invitation.add(invitation).then(newId => {
2221
id = newId;
2322
store = storeFactory({
2423
modules: {
@@ -59,7 +58,7 @@ describe('invitation actions', () => {
5958
// const channel = { id: channel_id, name: 'test', deleted: false, edit: true };
6059
// beforeEach(() => {
6160
// store.commit('channelList/SET_INVITATION_LIST', [{ id, ...invitation }]);
62-
// return Channel.put(channel);
61+
// return Channel.add(channel);
6362
// });
6463
// afterEach(() => {
6564
// return Channel.table.toCollection().delete();

contentcuration/contentcuration/frontend/channelList/vuex/channelSet/__tests__/module.spec.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import channelSet from '../index';
2-
import { ChannelSet } from 'shared/data/resources';
2+
import { ChannelSet, injectVuexStore } from 'shared/data/resources';
33
import storeFactory from 'shared/vuex/baseStore';
44

55
jest.mock('shared/vuex/connectionPlugin');
@@ -14,17 +14,19 @@ describe('channelSet actions', () => {
1414
edit: true,
1515
};
1616
beforeEach(() => {
17-
return ChannelSet.put(channelSetDatum).then(newId => {
17+
store = storeFactory({
18+
modules: {
19+
channelSet,
20+
},
21+
});
22+
store.state.session.currentUser.id = userId;
23+
injectVuexStore(store);
24+
return ChannelSet.add(channelSetDatum).then(newId => {
1825
id = newId;
19-
store = storeFactory({
20-
modules: {
21-
channelSet,
22-
},
23-
});
24-
store.state.session.currentUser.id = userId;
2526
});
2627
});
2728
afterEach(() => {
29+
injectVuexStore();
2830
return ChannelSet.table.toCollection().delete();
2931
});
3032
describe('loadChannelSetList action', () => {

contentcuration/contentcuration/frontend/shared/__tests__/app.spec.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ describe('startApp', () => {
4545

4646
describe('if there is a current user saved in a session', () => {
4747
beforeEach(async () => {
48-
await Session.put({ ...USER_1, CURRENT_USER });
48+
await Session.table.put({ ...USER_1, CURRENT_USER });
4949

5050
const sessionTable = await Session.table.toArray();
5151
expect(sessionTable).toEqual([{ ...USER_1, CURRENT_USER }]);
@@ -77,7 +77,7 @@ describe('startApp', () => {
7777

7878
describe('if there is the same current user saved in a session', () => {
7979
beforeEach(async () => {
80-
await Session.put({ ...USER_1, CURRENT_USER });
80+
await Session.table.put({ ...USER_1, CURRENT_USER });
8181

8282
const sessionTable = await Session.table.toArray();
8383
expect(sessionTable).toEqual([{ ...USER_1, CURRENT_USER }]);
@@ -91,7 +91,7 @@ describe('startApp', () => {
9191

9292
describe('if there is a different current user saved in a session', () => {
9393
beforeEach(async () => {
94-
await Session.put({ ...USER_2, CURRENT_USER });
94+
await Session.table.put({ ...USER_2, CURRENT_USER });
9595

9696
const sessionTable = await Session.table.toArray();
9797
expect(sessionTable).toEqual([{ ...USER_2, CURRENT_USER }]);

contentcuration/contentcuration/frontend/shared/app.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ Vue.component('Menu', Menu);
256256
function initiateServiceWorker() {
257257
// Second conditional must be removed if you are doing dev work on the service
258258
// worker.
259-
if ('serviceWorker' in navigator && process.env.NODE_ENV === 'production') {
259+
if ('serviceWorker' in navigator) {
260260
const wb = new Workbox(window.Urls.service_worker());
261261
let registration;
262262

0 commit comments

Comments
 (0)