0.3.0 • Published 4 years ago

mongoose-serialization-proxy-plugin v0.3.0

Weekly downloads
2
License
MIT
Repository
github
Last release
4 years ago

mongoose-serialization-proxy-plugin Actions Status

Hide secret properties of mongo model when serialize the model with JSON.stringify.

Motivation

  • TODO

Features

  • Support Schema#toJSON
  • Support assignment value using Proxy
  • Support dry-run mode
  • Support logging

Install

Install with npm:

npm install mongoose-serialization-proxy-plugin

Usage

import { mongooseSerializationProxyPlugin } from "mongoose-serialization-proxy-plugin";
(async function(){
    const UserSchema = new Schema({
        name: String,
        email: String,
        password: {
            type: String,
            access: "private"
        },
        secretSettings: {
            type: Schema.Types.Mixed,
            access: "private"
        },
        secretObject: {
            child: {
                type: Schema.Types.Mixed,
                access: "private"
            }
        }
    });
    // Register plugin
    UserSchema.plugin(mongooseSerializationProxyPlugin({
        // No "access" defined value, will be "public" 
        defaultSchemaAccess: "public"
    }));
    // Create Model
    const User = model("User", UserSchema);
    const userJoe = new User({
        name: "Joe",
        email: "joe@example.com",
        password: "secret",
        secretSettings: {
            age: 12
        }
    });
    await userJoe.save();
    const user = await User.findOne({
        name: "Joe"
    });
    if (!user) {
        throw new Error("Not found findUserJoe");
    }
    // property reference is ok
    assert.strictEqual(user.password, "secret");
    assert.deepStrictEqual(user.secretSettings, { age: 12 });
    // serialization should be filtered
    // password and secretSettings should be omit
    assert.deepStrictEqual(user.toJSON(), { "name": "Joe", "email": "joe@example.com" });
    assert.strictEqual(JSON.stringify(user), `{"name":"Joe","email":"joe@example.com"}`);
    // Assignment value should be filtered
    // secretSettings should be omit
    const secretSettings = user.secretSettings;
    assert.strictEqual(JSON.stringify(secretSettings), `{}`);
})();

Example: Only Logging

Pass through toJSON, but call toJSONCallback function.

import { mongooseSerializationProxyPlugin } from "mongoose-serialization-proxy-plugin";
(async function(){
    const UserSchema = new Schema({
        name: String,
        email: String,
        password: {
            type: String,
        },
        secretSettings: {
            type: Schema.Types.Mixed,
        },
        secretObject: {
            child: {
                type: Schema.Types.Mixed,
            }
        }
    });
    // Register plugin
    UserSchema.plugin(mongooseSerializationProxyPlugin({
        // no modify json object
        dryRun: true,
        // callback
        toJSONCallback: (oldJSON, newJSON) => {
            // It is called when json stringify the mongo model
        }
    }));
    // Create Model
    const User = model("User", UserSchema);
    const userJoe = new User({
        name: "Joe",
        email: "joe@example.com",
        password: "secret",
        secretSettings: {
            age: 12
        }
    });
    await userJoe.save();
    const user = await User.findOne({
        name: "Joe"
    });
    if (!user) {
        throw new Error("Not found findUserJoe");
    }
    // it will call `toJSONCallback` callback
    JSON.stringify(user);
})();

Changelog

See Releases page.

Running tests

Install devDependencies and Run npm test:

make up
npm test

Contributing

Pull requests and stars are always welcome.

For bugs and feature requests, please create an issue.

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :D

Author

License

MIT © azu