Skip to content
This repository was archived by the owner on Jun 27, 2019. It is now read-only.

Commit 82d47da

Browse files
committed
soft delete comments
1 parent 0c57868 commit 82d47da

File tree

5 files changed

+82
-43
lines changed

5 files changed

+82
-43
lines changed

server/helper/alter-items.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
const { getItems, replaceItems } = require('feathers-hooks-common');
2+
3+
/**
4+
* Alter items in hook.data or hook.result
5+
*
6+
* Example usage in hook module:
7+
* module.exports = (options = defaults) => alterItems(handleItem(options));
8+
*
9+
* handleItem() is the function in which changes are made
10+
*/
11+
module.exports = func => hook => {
12+
if (!func || typeof func !== 'function') {
13+
return hook;
14+
}
15+
let items = getItems(hook);
16+
if (Array.isArray(items)) {
17+
items.map(item => func(item));
18+
} else if (items) {
19+
items = func(items);
20+
}
21+
replaceItems(hook, items);
22+
return hook;
23+
};

server/hooks/add-deleted.js

Lines changed: 0 additions & 8 deletions
This file was deleted.

server/hooks/hide-deleted-data.js

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,24 @@
11
// Remove data from deleted items
2-
const _ = require('lodash');
3-
const keepFields = [
4-
'_id',
5-
'deleted',
6-
'createdAt',
7-
'updatedAt'
8-
]
2+
const alterItems = require('../helper/alter-items');
93

10-
module.exports = () => hook => {
11-
if (!hook.result) {
12-
return hook;
13-
}
14-
const data = !_.isEmpty(hook.result.data) ? hook.result.data : hook.result;
4+
const defaults = {
5+
fields: [
6+
'_id',
7+
'deleted',
8+
'createdAt',
9+
'updatedAt'
10+
]
11+
};
1512

16-
_.castArray(data).forEach(item => {
17-
if(item.deleted) {
18-
Object.keys(item).forEach(key => {
19-
if (!keepFields.includes(key)) {
20-
delete item[key];
21-
}
22-
});
23-
}
24-
});
13+
module.exports = (options = defaults) => alterItems(handleItem(options));
2514

26-
return hook;
15+
const handleItem = options => item => {
16+
if (item.deleted) {
17+
Object.keys(item).forEach(key => {
18+
if (!options.fields.includes(key)) {
19+
delete item[key];
20+
}
21+
});
22+
}
23+
return item;
2724
};

server/hooks/null-deleted-data.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Null specific fields on deleted records
2+
const alterItems = require('../helper/alter-items');
3+
4+
const defaults = {
5+
fields: [
6+
'content'
7+
]
8+
};
9+
10+
module.exports = (options = defaults) => alterItems(handleItem(options));
11+
12+
const handleItem = options => item => {
13+
if (item.deleted) {
14+
options.fields.forEach(field => {
15+
item[field] = 'DELETED';
16+
});
17+
}
18+
return item;
19+
};

server/services/comments/comments.hooks.js

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const { authenticate } = require('feathers-authentication').hooks;
2-
const { unless, isProvider, populate, discard, softDelete } = require('feathers-hooks-common');
2+
const { unless, isProvider, populate, discard, softDelete, setNow } = require('feathers-hooks-common');
33
const {
44
//queryWithCurrentUser,
55
associateCurrentUser,
@@ -8,7 +8,7 @@ const {
88
} = require('feathers-authentication-hooks');
99
const { isVerified } = require('feathers-authentication-management').hooks;
1010
const createExcerpt = require('../../hooks/create-excerpt');
11-
const addDeleted = require('../../hooks/add-deleted');
11+
const nullDeletedData = require('../../hooks/null-deleted-data');
1212
const hideDeletedData = require('../../hooks/hide-deleted-data');
1313
const createNotifications = require('./hooks/create-notifications');
1414
const createMentionNotifications = require('./hooks/create-mention-notifications');
@@ -30,29 +30,31 @@ const xssFields = ['content', 'contentExcerpt'];
3030
module.exports = {
3131
before: {
3232
all: [
33-
softDelete(),
3433
xss({ fields: xssFields })
3534
],
36-
find: [
37-
addDeleted()
35+
find: [],
36+
get: [
37+
softDelete()
3838
],
39-
get: [],
4039
create: [
4140
authenticate('jwt'),
4241
// Allow seeder to seed comments
4342
unless(isProvider('server'),
4443
isVerified()
4544
),
4645
associateCurrentUser(),
47-
createExcerpt({ length: 180 })
46+
createExcerpt({ length: 180 }),
47+
softDelete()
4848
],
4949
update: [
5050
authenticate('jwt'),
5151
isVerified(),
5252
unless(isProvider('server'),
5353
restrictToOwner()
5454
),
55-
createExcerpt({ length: 180 })
55+
createExcerpt({ length: 180 }),
56+
softDelete(),
57+
setNow('updatedAt')
5658
],
5759
patch: [
5860
authenticate('jwt'),
@@ -68,25 +70,31 @@ module.exports = {
6870
(!_.difference(_.values(valid.$inc), _.values(hook.data.$inc)).length);
6971
}, restrictToOwner())
7072
),
71-
createExcerpt({ length: 180 })
73+
createExcerpt({ length: 180 }),
74+
softDelete(),
75+
setNow('updatedAt'),
76+
// SoftDelete uses patch to delete items
77+
// Make changes to deleted items here
78+
nullDeletedData({ fields: [ 'content', 'contentExcerpt' ]})
7279
],
7380
remove: [
7481
authenticate('jwt'),
7582
isVerified(),
7683
unless(isProvider('server'),
7784
restrictToOwner()
78-
)
85+
),
86+
softDelete()
7987
]
8088
},
8189

8290
after: {
8391
all: [
8492
populate({ schema: userSchema }),
85-
xss({ fields: xssFields })
93+
xss({ fields: xssFields }),
94+
hideDeletedData()
8695
],
8796
find: [
88-
discard('content', 'user.coverImg', 'badgeIds'),
89-
hideDeletedData()
97+
discard('content', 'user.coverImg', 'badgeIds')
9098
],
9199
get: [],
92100
create: [

0 commit comments

Comments
 (0)