Added libraryCollections on server
This commit is contained in:
128
app/imports/api/library/LibraryCollections.js
Normal file
128
app/imports/api/library/LibraryCollections.js
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
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
|
||||||
|
*/
|
||||||
|
let LibraryCollections = new Mongo.Collection('librarycollections');
|
||||||
|
|
||||||
|
let 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')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
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,
|
||||||
|
};
|
||||||
@@ -8,6 +8,7 @@ import '/imports/api/users/methods/updateFileStorageUsed.js';
|
|||||||
|
|
||||||
import { some } from 'lodash';
|
import { some } from 'lodash';
|
||||||
const defaultLibraries = process.env.DEFAULT_LIBRARIES && process.env.DEFAULT_LIBRARIES.split(',') || [];
|
const defaultLibraries = process.env.DEFAULT_LIBRARIES && process.env.DEFAULT_LIBRARIES.split(',') || [];
|
||||||
|
const defaultLibraryCollections = process.env.DEFAULT_LIBRARY_COLLECTIONS && process.env.DEFAULT_LIBRARY_COLLECTIONS.split(',') || [];
|
||||||
|
|
||||||
const userSchema = new SimpleSchema({
|
const userSchema = new SimpleSchema({
|
||||||
username: {
|
username: {
|
||||||
@@ -74,6 +75,15 @@ const userSchema = new SimpleSchema({
|
|||||||
},
|
},
|
||||||
'subscribedLibraries.$': {
|
'subscribedLibraries.$': {
|
||||||
type: String,
|
type: String,
|
||||||
|
regEx: SimpleSchema.RegEx.Id,
|
||||||
|
},
|
||||||
|
subscribedLibraryCollections: {
|
||||||
|
type: Array,
|
||||||
|
defaultValue: defaultLibraryCollections,
|
||||||
|
max: 100,
|
||||||
|
},
|
||||||
|
'subscribedLibraryCollections.$': {
|
||||||
|
type: String,
|
||||||
regEx: SimpleSchema.RegEx.Id,
|
regEx: SimpleSchema.RegEx.Id,
|
||||||
},
|
},
|
||||||
subscribedCharacters: {
|
subscribedCharacters: {
|
||||||
@@ -270,6 +280,36 @@ Meteor.users.subscribeToLibrary = new ValidatedMethod({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Meteor.users.subscribeToLibraryCollection = new ValidatedMethod({
|
||||||
|
name: 'users.subscribeToLibraryCollection',
|
||||||
|
validate: new SimpleSchema({
|
||||||
|
libraryCollectionId:{
|
||||||
|
type: String,
|
||||||
|
regEx: SimpleSchema.RegEx.Id,
|
||||||
|
},
|
||||||
|
subscribe: {
|
||||||
|
type: Boolean,
|
||||||
|
},
|
||||||
|
}).validator(),
|
||||||
|
mixins: [RateLimiterMixin],
|
||||||
|
rateLimit: {
|
||||||
|
numRequests: 5,
|
||||||
|
timeInterval: 5000,
|
||||||
|
},
|
||||||
|
run({libraryCollectionId, subscribe}){
|
||||||
|
if (!this.userId) throw 'Can only subscribe if logged in';
|
||||||
|
if (subscribe){
|
||||||
|
return Meteor.users.update(this.userId, {
|
||||||
|
$addToSet: {subscribedLibraryCollections: libraryCollectionId},
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return Meteor.users.update(this.userId, {
|
||||||
|
$pullAll: {subscribedLibraryCollections: libraryCollectionId},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Meteor.users.findUserByUsernameOrEmail = new ValidatedMethod({
|
Meteor.users.findUserByUsernameOrEmail = new ValidatedMethod({
|
||||||
name: 'users.findUserByUsernameOrEmail',
|
name: 'users.findUserByUsernameOrEmail',
|
||||||
validate: new SimpleSchema({
|
validate: new SimpleSchema({
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ const STORAGE_LIMITS = Object.freeze({
|
|||||||
statsToTarget: 64,
|
statsToTarget: 64,
|
||||||
tagCount: 64,
|
tagCount: 64,
|
||||||
writersCount: 20,
|
writersCount: 20,
|
||||||
|
libraryCollectionCount: 32,
|
||||||
});
|
});
|
||||||
|
|
||||||
export default STORAGE_LIMITS;
|
export default STORAGE_LIMITS;
|
||||||
|
|||||||
Reference in New Issue
Block a user