Updated to nearly fully functional. Pre-release 1. Still needs some UI changes in the slideshow and admin pages (move the save button & fix the save detection for the internship list). Customer had one more page change request which I need to re-define and handle.
This commit is contained in:
137
imports/api/Slideshow.js
Normal file
137
imports/api/Slideshow.js
Normal file
@@ -0,0 +1,137 @@
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
import { Mongo } from 'meteor/mongo';
|
||||
import { check } from 'meteor/check';
|
||||
import SimpleSchema from 'simpl-schema';
|
||||
|
||||
let Slideshow = new Mongo.Collection('Slideshow');
|
||||
let SlideshowImage = new Mongo.Collection("SlideshowImage");
|
||||
|
||||
Slideshow.attachSchema(new SimpleSchema({
|
||||
name: {
|
||||
type: String,
|
||||
label: "Name",
|
||||
optional: false,
|
||||
trim: true,
|
||||
index: 1,
|
||||
unique: true
|
||||
},
|
||||
images: { //A JSON array of image URL's.
|
||||
type: Array,
|
||||
label: "Images",
|
||||
optional: false,
|
||||
defaultValue: []
|
||||
},
|
||||
'images.$': {
|
||||
type: String
|
||||
},
|
||||
createdAt: {
|
||||
type: Date,
|
||||
label: "Created On",
|
||||
optional: true
|
||||
},
|
||||
updatedAt: {
|
||||
type: Date,
|
||||
label: "Updated On",
|
||||
optional: true
|
||||
}
|
||||
}));
|
||||
|
||||
SlideshowImage.attachSchema(new SimpleSchema({
|
||||
image: {
|
||||
type: String,
|
||||
label: "Image",
|
||||
optional: false,
|
||||
trim: false
|
||||
}
|
||||
}));
|
||||
|
||||
if(Meteor.isServer) Meteor.publish('slideshow', function() {
|
||||
return Slideshow.find({});
|
||||
});
|
||||
|
||||
if(Meteor.isServer) {
|
||||
WebApp.connectHandlers.use("/slideshow-image/", (req, res, next) => {
|
||||
try {
|
||||
let id = req.url.substr(1);
|
||||
|
||||
let slide = SlideshowImage.findOne(id);
|
||||
|
||||
if(slide) {
|
||||
let i = slide.image.indexOf(";base64,");
|
||||
let header = slide.image.substr(5, i);
|
||||
let content = slide.image.substr(i + 8);
|
||||
let buffer = new Buffer(content, 'base64');
|
||||
|
||||
res.writeHead(200, {'Content-Type': header});
|
||||
res.write(buffer);
|
||||
res.end();
|
||||
}
|
||||
else {
|
||||
//TODO: Write out a bad image picture.
|
||||
}
|
||||
} catch(err) {
|
||||
console.log(err);
|
||||
res.end();
|
||||
}
|
||||
});
|
||||
|
||||
Meteor.methods({
|
||||
addSlideshowImage: function(slideshowId, image) {
|
||||
check(slideshowId, String);
|
||||
check(image, String);
|
||||
|
||||
if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) {
|
||||
let id = SlideshowImage.insert({image});
|
||||
|
||||
if(id) {
|
||||
Slideshow.update(slideshowId, {$push: {images: id}});
|
||||
}
|
||||
else {
|
||||
throw new Meteor.Error(400, "Image storage failed.");
|
||||
}
|
||||
}
|
||||
else throw new Meteor.Error(403, "Not authorized.");
|
||||
},
|
||||
removeSlideshowImage: function(slideshowId, imageId) {
|
||||
check(slideshowId, String);
|
||||
check(imageId, String);
|
||||
|
||||
//Note: there is currently no way in mongo to remove an element at an index.
|
||||
Slideshow.update(slideshowId, {$pull: {images: imageId}});
|
||||
},
|
||||
swapSlideshowImages: function(slideshowId, firstIndex, secondIndex) {
|
||||
check(slideshowId, String);
|
||||
check(firstIndex, Number);
|
||||
check(secondIndex, Number);
|
||||
|
||||
let slideshow = Slideshow.findOne(slideshowId);
|
||||
let temp = slideshow.images[firstIndex];
|
||||
|
||||
slideshow.images[firstIndex] = slideshow.images[secondIndex];
|
||||
slideshow.images[secondIndex] = temp;
|
||||
|
||||
Slideshow.update(slideshowId, {$set: {images: slideshow.images}});
|
||||
},
|
||||
addSlideshow: function(name) {
|
||||
check(name, String);
|
||||
if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) {
|
||||
const createdAt = new Date();
|
||||
const updatedAt = createdAt;
|
||||
const images = [];
|
||||
|
||||
//Returns the id of the object created.
|
||||
return Slideshow.insert({name, images, createdAt, updatedAt});
|
||||
}
|
||||
else throw new Meteor.Error(403, "Not authorized.");
|
||||
},
|
||||
removeSlideshow: function(_id) {
|
||||
check(_id, String);
|
||||
if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) {
|
||||
Slideshow.remove({_id});
|
||||
}
|
||||
else throw new Meteor.Error(403, "Not authorized.");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export default Slideshow;
|
||||
Reference in New Issue
Block a user