sequelize-file v0.3.0
Sequelize File
This package allows you to attach files to your sequelize instances as easy as you set your plain attributes and define MIME type validation and post-processing rules next to your models.
Requirements
- ImageMagick (
brew install imagemagick
on OS X).
Usage
First, you define which fileds you want to enhance with attachments logic:
/* models/attachments.js */
import SequelizeFile from 'sequelize-file';
export const picture = SequelizeFile({
attribute: 'picture',
mimetype: /^image/,
crop: true,
sizes: {
small: 64, //width 64
big: 150, //width 150
}
});
export const backgroundImage = SequelizeFile({
attribute: 'backgroundImage',
mimetype: /^image/,
crop: true,
sizes: {
preview: "x350" // height 350
}
});
Then, you attach enhanced attributes to your model:
/* models/User.js */
import sequelize from './db';
import { STRING } from 'sequelize';
import { picture, backgroundImage } from './attachments';
let User = sequelize.define('user', {
name: STRING,
/* And all of your plain sequelize attributes... */
});
picture.addTo(User);
backgroundImage.addTo(User);
export default User;
After this, you'll be able to set files just as ordinary sequelize attributes. You can attach files either as urls (they will be downloaded), or as pre-downloaded multer-style objects (basically, only path
and mimetype
props are required)
sequelize.sync({ force: true }).then(() => {
// If you set url, file will be downloaded and saved
let user1 = User.build({
picture: "http://example.com/somepic.jpg"
});
user1.save();
// Or you can pass multer-style File object, for example
let user2 = User.build({
picture: "http://example.com/somepic2.jpg",
backgroundImage: {
path: '/uploads/tmp/somepic.jpg',
mimetype: 'image/jpeg'
}
});
user2.save()
// Deleting file(s)
user2.update({ picture: null });
});
You access all of your resized images through dot notation. If you didn't setup resizing, you'll get a string path to attached file.
User.findById(1)
.then(user => {
console.log(user.picture.small);
console.log(user.picture.big);
console.log(user.picture.original);
});
Status
This package is under early development. Do use it with caution! Check out tests to see what is currently working.