This repository has been archived by the owner on Jul 7, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
126 lines (106 loc) · 2.79 KB
/
index.js
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
118
119
120
121
122
123
124
125
126
module.exports = function(schema, options) {
// add fields to mongoose schema
schema.add({
removed: Boolean,
removedAt: Date
});
// All mongoose queries are built using these base queries,
// therefore adding the `archived` and `removed` logic to these queries adds it to all queries.
var queries = ['find', 'findOne', 'findOneAndUpdate', 'update', 'count'];
// add pre-query logic
queries.forEach(function(query) {
schema.pre(query, function(next) {
// Only query documents that do not have the removed flag set to ture.
// Setting {removed: true} overrides this and only queries removed documents.
this.where({
removed: {
'$ne': true
}
});
next();
});
});
schema.statics.remove = function(first, second) {
// TODO if archived. removed from archived
var callback;
var update = {
removed: true,
removedAt: new Date()
};
var conditions;
var options = {
multi: false
};
if (typeof first === 'function') {
callback = first;
conditions = {};
options.multi = true;
} else {
callback = second;
conditions = first;
}
if (typeof callback !== 'function') {
throw ('Wrong arguments!');
}
this.update(conditions, update, options, function(err, numAffected) {
if (err) {
return callback(err);
}
callback(null, numAffected);
});
};
schema.methods.remove = function(callback) {
// TODO test this conditional.
// when document is removed, it is no longer archived
if (this.archived) {
this.archived = undefined;
this.archivedAt = undefined;
}
this.removed = true;
this.removedAt = new Date();
this.save(callback);
};
schema.statics.restore = function(first, second) {
var callback;
var conditions;
if (typeof first === 'function') {
callback = first;
conditions = {};
} else {
callback = second;
conditions = first;
}
if (typeof callback !== 'function') {
throw ('Wrong arguments!');
}
var update = {
$unset: {
removed: 1
},
$unset: {
removedAt: 1
}
};
// TODO use mongoose .update
this.update(conditions, update, function(err, numberAffected) {
if (err) {
return callback(err);
}
if (numberAffected === 0) {
return callback('Wrong arguments!');
}
callback(null);
});
};
schema.methods.restore = function(callback) {
this.removed = undefined;
this.removedAt = undefined;
this.save(callback);
};
schema.statics.destroy = function(callback) {
// save instance of remove
// TODO fix this
// return this.remove.apply(this, arguments);
this.collection(conditions, callback)
};
};