136 lines
3.6 KiB
JavaScript
136 lines
3.6 KiB
JavaScript
import { ValidatedMethod } from 'meteor/mdg:validated-method';
|
|
import { RateLimiterMixin } from 'ddp-rate-limiter-mixin';
|
|
import SimpleSchema from 'simpl-schema';
|
|
import SharingSchema from '/imports/api/sharing/SharingSchema.js';
|
|
import simpleSchemaMixin from '/imports/api/creature/mixins/simpleSchemaMixin.js';
|
|
import { assertEditPermission, assertOwnership } from '/imports/api/sharing/sharingPermissions.js';
|
|
import { getUserTier } from '/imports/api/users/patreon/tiers.js'
|
|
import STORAGE_LIMITS from '/imports/constants/STORAGE_LIMITS.js';
|
|
|
|
/**
|
|
* LibraryCollections are groups of libraries that are subscribed together at once
|
|
*/
|
|
const LibraryCollections = new Mongo.Collection('libraryCollections');
|
|
|
|
const LibraryCollectionSchema = new SimpleSchema({
|
|
name: {
|
|
type: String,
|
|
optional: true,
|
|
max: STORAGE_LIMITS.name,
|
|
},
|
|
description: {
|
|
type: String,
|
|
optional: true,
|
|
max: STORAGE_LIMITS.summary,
|
|
},
|
|
libraries: {
|
|
type: Array,
|
|
defaultValue: [],
|
|
maxCount: STORAGE_LIMITS.libraryCollectionCount,
|
|
},
|
|
'libraries.$': {
|
|
type: String,
|
|
regEx: SimpleSchema.RegEx.Id,
|
|
},
|
|
});
|
|
|
|
LibraryCollectionSchema.extend(SharingSchema);
|
|
LibraryCollections.attachSchema(LibraryCollectionSchema);
|
|
|
|
export default LibraryCollections;
|
|
|
|
const insertLibraryCollection = new ValidatedMethod({
|
|
name: 'libraryCollections.insert',
|
|
mixins: [
|
|
simpleSchemaMixin,
|
|
],
|
|
schema: LibraryCollectionSchema.omit('owner'),
|
|
run(libraryCollection) {
|
|
if (!this.userId) {
|
|
throw new Meteor.Error('LibraryCollections.methods.insert.denied',
|
|
'You need to be logged in to insert a library');
|
|
}
|
|
let tier = getUserTier(this.userId);
|
|
if (!tier.paidBenefits){
|
|
throw new Meteor.Error('LibraryCollections.methods.insert.denied',
|
|
`The ${tier.name} tier does not allow you to insert a library collection`);
|
|
}
|
|
libraryCollection.owner = this.userId;
|
|
return LibraryCollections.insert(libraryCollection);
|
|
},
|
|
});
|
|
|
|
const updateLibraryCollection = new ValidatedMethod({
|
|
name: 'libraryCollections.update',
|
|
mixins: [
|
|
simpleSchemaMixin,
|
|
],
|
|
schema: {
|
|
_id: {
|
|
type: String,
|
|
regEx: SimpleSchema.RegEx.Id,
|
|
},
|
|
update: {
|
|
type: LibraryCollectionSchema
|
|
.pick('name', 'description', 'libraries')
|
|
.extend({ //make libraries optional
|
|
libraries: {
|
|
optional: true,
|
|
defaultValue: undefined,
|
|
},
|
|
}),
|
|
}
|
|
},
|
|
rateLimit: {
|
|
numRequests: 5,
|
|
timeInterval: 5000,
|
|
},
|
|
run({_id, update}){
|
|
const libraryCollection = LibraryCollections.findOne(_id, {
|
|
fields: {
|
|
owner: 1,
|
|
writers: 1,
|
|
}
|
|
});
|
|
assertEditPermission(libraryCollection, this.userId);
|
|
return LibraryCollections.update(_id, {$set: update});
|
|
},
|
|
});
|
|
|
|
const removeLibraryCollection = new ValidatedMethod({
|
|
name: 'libraryCollections.remove',
|
|
validate: new SimpleSchema({
|
|
_id: {
|
|
type: String,
|
|
regEx: SimpleSchema.RegEx.id
|
|
},
|
|
}).validator(),
|
|
mixins: [RateLimiterMixin],
|
|
rateLimit: {
|
|
numRequests: 5,
|
|
timeInterval: 5000,
|
|
},
|
|
run({_id}){
|
|
const libraryCollection = LibraryCollections.findOne(_id, {
|
|
fields: {
|
|
owner: 1,
|
|
}
|
|
});
|
|
assertOwnership(libraryCollection, this.userId);
|
|
return LibraryCollections.remove(_id);
|
|
}
|
|
});
|
|
|
|
function getLibraryIdsByCollectionId(libraryCollectionId) {
|
|
const libraryCollection = LibraryCollections.findOne(libraryCollectionId)
|
|
return libraryCollection?.libraries || [];
|
|
}
|
|
|
|
export {
|
|
LibraryCollectionSchema,
|
|
insertLibraryCollection,
|
|
updateLibraryCollection,
|
|
removeLibraryCollection,
|
|
getLibraryIdsByCollectionId,
|
|
};
|