a mongoose model generator with a change stream
APACHE-2.0 License
a mongoose model generator with a change stream
info:
yarn add mongoose-model-stream
or
npm install --save mongoose-model-stream
const moduleStream = require('mongoose-model-stream');
This moduleStream
function takes two arguments.
modelName
: The name of the modelschema
: The schema definition of the model.There is also an optional 3rd argument.
options
OR enableDownStream
enableDownStream
as a Property on optionstrue
)
const ChatSchema = new mongoose.schema({
text: String
});
const Chat = moduleStream('Chat', ChatSchema);
Attached to Chat
will be a .stream
baced on RxJs. This will emit change events baced on rfc6902
The payload looks like:
Property | Type | Description |
---|---|---|
patchs | Array | Present for all changes to the item. - An array of rfc6902 operations. |
target | String(ID) | The Unique identifier for the target Object |
_id | String(ID) | The Unique identifier for this diff |
createdAt | String(Date) | The time the chage was made |
tag | String | A customisable identifier for this change |
action | String(Enum) | This will be "CREATE", "UPDATE" or "DELETE" depending on the state of the document in the database |
getChange | fn() ➜ Obj | an object with only the changes applied |
getTarget | fn() ➜ promise ➜ doc | get the target document from the Database |
A new function will be added to the model
saveBy
: This is used the tag a change with who made it.event.when = "today";
event.saveBy(user);
A saveBy
id will be add to the change record
Outputted change
{ patchs:
[ {
op: 'add',
path: '/when',
value: 'today'
} ],
_id: '5a958d12fc413a44ac760fb1',
target: '5a958d11fc413a44ac760fa9',
saveBy: '5a95872c39c0be3afaeb9a86',
createdAt: '2018-08-12T04:46:02.009Z',
action: "UPDATE"
}
update
function(s)
update
, updateMany
, updateOne
, findOneAndUpdate
, findByIdAndUpdate
You said the "saveBy" bypassing it in the "options" argument. This can be an ID of an object(String) that will be used for all patchs or a function to calculate the ID for each specific updated document
const conditions = {foo:true },
updateValues = {setBarTo:false},
options = {savedBy:(oldDoc,newDoc,patchs)=>oldDoc.user_id}
event.updateMany(conditions,update,options)
A custom string denoting the change can be added to the following functions
const event = await Module.create({ text:updateTextTag },{ tag :"FOO_1" })
event.save("FOO_2")
or event.save({ tag :"FOO_3"})
event.saveBy(user,"FOO_4")
Module.updateOne({_id},{$set:{text:"bar"}},{ tag : "FOO_5" })
node example/sample.js
require('mongoose-model-stream');
const { Schema, moduleStream } = require('mongoose');
// create a schema
const ChatSchema = new Schema({ text: String }, { timestamps: true });
// create a module
const Chat = moduleStream('Chat', ChatSchema);
// subscribe to change events
Chat.stream.subscribe(console.log, console.error, console.info);
Chat.create({ text: "foo" })
.then(function (chatMessage) {
chatMessage.text = "bar";
return chatMessage.save();
}).then(function (chatMessage) {
chatMessage.text = "baz";
chatMessage.save();
}).catch(console.error);
Change: 1
{ patchs:
[ {
op: 'add',
path: '/text',
value: :'foo'
}, {
op: 'add',
path: '/_id',
value: '5a86eea992f78d54f1cd65e9'
}, {
op: 'add',
path: '/updatedAt',
value: :'2018-08-12T04:46:01.993Z'
}, {
op: 'add',
path: '/createdAt',
value: '2018-08-12T04:46:01.993Z'
} ],
_id: '5a86eeaa92f78d54f1cd65ea',
target: '5a86eea992f78d54f1cd65e9',
createdAt: '2018-08-12T04:46:02.009Z',
action: "CREATE"
}
Change: 2
{ patchs:
[ { op: 'test', path: '/updatedAt', value: '2018-08-12T04:46:01.993Z' },
{ op: 'replace', path: '/text', value: 'bar' },
{ op: 'replace', path: '/updatedAt', value: '2018-08-12T04:46:02.116Z' }, ],
_id: '5a86eeaa92f78d54f1cd65eb',
target: '5a86eea992f78d54f1cd65e9',
createdAt: '2018-08-12T04:46:02.022Z',
action: "UPDATE"
}
Change: 3
{ patchs:
[ { op: 'test', path: '/updatedAt', value: '2018-08-12T04:46:02.116Z' },
{ op: 'replace', path: '/text', value: 'baz' },
{ op: 'replace', path: '/updatedAt', value: '2018-08-12T04:46:02.342Z' }, ],
_id: '5a86eeaa92f78d54f1cd65ec',
target: '5a86eea992f78d54f1cd65e9',
createdAt: '2018-08-12T04:46:02.122Z',
action: "UPDATE"
}