From 5df57179307adc44ba0f85692e1e9b8bc6372e89 Mon Sep 17 00:00:00 2001 From: dotansimha Date: Tue, 24 Jan 2017 22:44:05 +0200 Subject: [PATCH] Step 12.12: Create pictures store --- api/server/collections/pictures.ts | 40 ++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 api/server/collections/pictures.ts diff --git a/api/server/collections/pictures.ts b/api/server/collections/pictures.ts new file mode 100644 index 000000000..1ca26e29e --- /dev/null +++ b/api/server/collections/pictures.ts @@ -0,0 +1,40 @@ +import { MongoObservable } from 'meteor-rxjs'; +import { UploadFS } from 'meteor/jalik:ufs'; +import { Meteor } from 'meteor/meteor'; +import * as Sharp from 'sharp'; +import { Picture, DEFAULT_PICTURE_URL } from '../models'; + +export interface PicturesCollection extends MongoObservable.Collection { + getPictureUrl(selector?: Object | string): string; +} + +export const Pictures = + new MongoObservable.Collection('pictures') as PicturesCollection; + +export const PicturesStore = new UploadFS.store.GridFS({ + collection: Pictures.collection, + name: 'pictures', + filter: new UploadFS.Filter({ + contentTypes: ['image/*'] + }), + permissions: new UploadFS.StorePermissions({ + insert: picturesPermissions, + update: picturesPermissions, + remove: picturesPermissions + }), + transformWrite(from, to) { + // Compress picture to 75% from its original quality + const transform = Sharp().png({ quality: 75 }); + from.pipe(transform).pipe(to); + } +}); + +// Gets picture's url by a given selector +Pictures.getPictureUrl = function (selector) { + const picture = this.findOne(selector) || {}; + return picture.url || DEFAULT_PICTURE_URL; +}; + +function picturesPermissions(userId: string): boolean { + return Meteor.isServer || !!userId; +}