From e6ce3bb5ec8b3a92f20720b85da10c8c62b87c25 Mon Sep 17 00:00:00 2001 From: Adi Levy Date: Tue, 16 May 2023 11:35:08 +0300 Subject: [PATCH] Issue #93: Add insertMany Pre hook - Added a pre hook for insertMany operation. - Added a test --- lib/mongoose-field-encryption.js | 14 +++++++++++ package.json | 2 +- test/test-basic-usage.js | 43 +++++++++++++++++++++++++------- 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/lib/mongoose-field-encryption.js b/lib/mongoose-field-encryption.js index 9636ec2..a1be699 100644 --- a/lib/mongoose-field-encryption.js +++ b/lib/mongoose-field-encryption.js @@ -249,6 +249,20 @@ const fieldEncryption = function (schema, options) { } }); + schema.pre("insertMany", function (_next, docs) { + const next = getCompatitibleNextFunc(_next); + + try { + for (let doc of docs) { + encryptFields(doc, fieldsToEncrypt, secret()); + } + + next(); + } catch (err) { + next(err); + } + }); + schema.pre("findOneAndUpdate", updateHook); schema.pre("update", updateHook); diff --git a/package.json b/package.json index 7bfb680..19430d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mongoose-field-encryption", - "version": "6.0.0", + "version": "6.0.1", "description": "A simple symmetric encryption plugin for individual fields. Dependency free, only mongoose peer dependency.", "main": "lib/mongoose-field-encryption.js", "types": "lib/mongoose-field-encryption.d.ts", diff --git a/test/test-basic-usage.js b/test/test-basic-usage.js index ef57238..2c503ce 100644 --- a/test/test-basic-usage.js +++ b/test/test-basic-usage.js @@ -14,6 +14,15 @@ const mongooseFieldEncryption = require("../lib/mongoose-field-encryption").fiel const uri = process.env.URI || "mongodb://127.0.0.1:27017/mongoose-field-encryption-test"; +const postSchema = new Schema({ + title: String, + message: String, +}); + +postSchema.plugin(mongooseFieldEncryption, { fields: ["message"], secret: "some secret key" }); + +const Post = mongoose.model("Post", postSchema); + describe("basic usage", function () { this.timeout(5000); @@ -25,6 +34,7 @@ describe("basic usage", function () { }); setupMongoose(mongoose); + }); after(function (done) { @@ -34,15 +44,7 @@ describe("basic usage", function () { }); it("should save a document", function (done) { - // given - const postSchema = new Schema({ - title: String, - message: String, - }); - - postSchema.plugin(mongooseFieldEncryption, { fields: ["message"], secret: "some secret key" }); - - const Post = mongoose.model("Post", postSchema); + const post = new Post({ title: "some text", message: "hello all" }); // when @@ -64,6 +66,29 @@ describe("basic usage", function () { }); }); + it("should save many documents", function (done) { + + const post = [new Post({ title: "some text", message: "hello all" }), + new Post({title: "some other text", message: "hello many" }), + new Post({title: "some other other text", message: "aloha!" })]; + + // when + Post.insertMany(post, function (err) { + // then + if (err) { + return done(err); + } + + expect(post[0].title).to.equal("some text"); + expect(post[0].message).to.not.be.undefined; + const split = post[0].message.split(":"); + expect(split.length).to.equal(2); + expect(post[0].__enc_message).to.be.true; + + done(); + }); + }); + it("should search for a document on an encrypted field", function (done) { // given const messageSchema = new Schema({