https://github.com/raisely/parkes-presenter
Simple, flexible JSON presentation methods for sequelize
https://github.com/raisely/parkes-presenter
Last synced: 4 months ago
JSON representation
Simple, flexible JSON presentation methods for sequelize
- Host: GitHub
- URL: https://github.com/raisely/parkes-presenter
- Owner: raisely
- Created: 2017-11-03T08:27:00.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2023-01-25T01:26:47.000Z (over 2 years ago)
- Last Synced: 2025-02-13T14:17:24.117Z (4 months ago)
- Language: JavaScript
- Size: 104 KB
- Stars: 0
- Watchers: 5
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Simple, flexible JSON presentation methods for sequelize
Useful in situations when a separate presentation layer or views would be overkill.
Supports hiding internal ids and mapping them to external keys and creating the
appropriate foreign keys.# Getting Started
```js
Presenter.extendModels(sequelize.models, {
presentationKey: 'uuid', // default
});
``````js
Post = sequelize.define('post', { ... });Post.publicAttributes = ['title', 'body', 'userUuid'];
Post.nestedModels = ['comments'];post = await Post.findOne();
post.toPublic();
// Will yield something like
{
title: 'My Post',
body: 'This is my post',
userUuid: 'uuid_for_user',
comments: {
[
comment1.toPublic(),
]
}
}
```# Methods
Assing parkes-presenter adds 3 methods to instances of your models### presentJson(permittedAttributes, { include, includeMethod })
`permittedAttributes` the attributes to copy from the model, if these end in the
name of your presentation key (eg postUuid), a virtual foreign
`include` array of model names to include when creating JSON
`includeMethod` method to call on nested models to generate their JSON### toPublic
calls `presentJson` with the class's publicAttributes and nestedModels
### toPrivate
Alternate presenter that uses privateAttributes and nestedModels.private
# Lazy Loading
By default, parkes-presenter will lazy load any missing associations.To prevent infinite recursion, it will not repeat a nested model.
This does come at a performance cost. To improve performance you may want to
eager load associations before passing them in.You can disable lazy loading by setting the
`missingAssociations` option. It can be set to either `false`, `'warn'` or `'load'`.`'load'` enables the default behaviour of lazy loading.
If set to `false` then associations (and foreign keys) will only be present if
they have been eager loaded from sequelize (or if you manually add them to the
record).Setting `warn` will cause console warnings when expected associations are missing.
This can get pretty noisy, so you can also pass in an object specifying `'warn'` or
`'load'` for each model name.```js
Presenter.extendModels(sequelize.models, {
missingAssociations: {
post: 'warn',
user: 'load',
comment: 'false'
}
});
```# Eager Loading
To eager load associations use the `include` option. You should also use `duplicating: false`
where possible (eg belongsTo and hasOne associations) to improve query performance.```
User.findOne({ include: [
{ model: Post, as: 'posts' },
{ model: Team, as: 'team', duplicating: false },
]
})
```© 2017 Agency Ventures