Merge feature-nested-sets into develop
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { JsonRoutes, RestMiddleware } from 'meteor/simple:json-routes';
|
||||
import { JsonRoutes, RestMiddleware } from 'meteor/simple:json-routes';
|
||||
import { SimpleRest } from 'meteor/simple:rest';
|
||||
|
||||
Meteor.startup(() => {
|
||||
@@ -23,11 +23,11 @@ JsonRoutes.ErrorMiddleware.use(RestMiddleware.handleErrorAsJson);
|
||||
// Hack to stop simple:rest adding routes automatically unless their URL
|
||||
// has been explicitly set to 'api/...'
|
||||
const oldAdd = JsonRoutes.add;
|
||||
JsonRoutes.add = function(method, path, handler){
|
||||
if (path.substring(0,4) !== 'api/'){
|
||||
JsonRoutes.add = function (method, path, handler) {
|
||||
if (path.substring(0, 4) !== 'api/') {
|
||||
return;
|
||||
}
|
||||
oldAdd(method, path, handler);
|
||||
}
|
||||
|
||||
import '/imports/server/rest/restLogin.js';
|
||||
import '/imports/server/rest/restLogin';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Accounts } from 'meteor/accounts-base'
|
||||
import emailTemplate from './emailTemplate.js';
|
||||
import emailTemplate from './emailTemplate';
|
||||
|
||||
Accounts.emailTemplates.from = 'no-reply@dicecloud.com';
|
||||
Accounts.emailTemplates.siteName = 'DiceCloud';
|
||||
@@ -10,7 +10,7 @@ Accounts.emailTemplates.enrollAccount = {
|
||||
heading: 'DiceCloud Invite',
|
||||
text: 'You have been invited to DiceCloud, click the button below to begin.',
|
||||
buttonText: 'Get Started',
|
||||
url: url.replace( '#/', '' ),
|
||||
url: url.replace('#/', ''),
|
||||
}),
|
||||
};
|
||||
|
||||
@@ -20,16 +20,16 @@ Accounts.emailTemplates.resetPassword = {
|
||||
heading: 'Password Reset',
|
||||
text: 'If you did not request this password reset, please ignore this email.',
|
||||
buttonText: 'Reset Password',
|
||||
url: url.replace( '#/', '' ),
|
||||
url: url.replace('#/', ''),
|
||||
}),
|
||||
};
|
||||
|
||||
Accounts.emailTemplates.verifyEmail = {
|
||||
Accounts.emailTemplates.verifyEmail = {
|
||||
subject: () => 'DiceCloud Email Verification',
|
||||
html: (user, url) => emailTemplate({
|
||||
heading: 'DiceCloud Email Verification',
|
||||
text: 'Click below to verify your email address',
|
||||
buttonText: 'Verify Email',
|
||||
url: url.replace( '#/', '' ),
|
||||
url: url.replace('#/', ''),
|
||||
}),
|
||||
};
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
import LibraryNodes from '/imports/api/library/LibraryNodes.js';
|
||||
import LibraryNodes from '/imports/api/library/LibraryNodes';
|
||||
|
||||
LibraryNodes.startCaching?.();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties.js';
|
||||
import LibraryNodes from '/imports/api/library/LibraryNodes.js';
|
||||
import { assertAdmin } from '/imports/api/sharing/sharingPermissions.js';
|
||||
import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties';
|
||||
import LibraryNodes from '/imports/api/library/LibraryNodes';
|
||||
import { assertAdmin } from '/imports/api/sharing/sharingPermissions';
|
||||
import { SyncedCron } from 'meteor/littledata:synced-cron';
|
||||
|
||||
Meteor.startup(() => {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import ArchiveCreatureFiles from '/imports/api/creature/archive/ArchiveCreatureFiles.js';
|
||||
import ArchiveCreatureFiles from '/imports/api/creature/archive/ArchiveCreatureFiles';
|
||||
|
||||
Meteor.publish('archiveCreatureFiles', function () {
|
||||
return ArchiveCreatureFiles.find({
|
||||
|
||||
@@ -1,42 +1,42 @@
|
||||
import Creatures from '/imports/api/creature/creatures/Creatures.js';
|
||||
import CreatureFolders from '/imports/api/creature/creatureFolders/CreatureFolders.js';
|
||||
import Creatures from '/imports/api/creature/creatures/Creatures';
|
||||
import CreatureFolders from '/imports/api/creature/creatureFolders/CreatureFolders';
|
||||
|
||||
Meteor.publish('characterList', function(){
|
||||
this.autorun(function (){
|
||||
Meteor.publish('characterList', function () {
|
||||
this.autorun(function () {
|
||||
var userId = this.userId;
|
||||
if (!userId) {
|
||||
return [];
|
||||
}
|
||||
const user = Meteor.users.findOne(this.userId, {
|
||||
fields: {subscribedCharacters: 1}
|
||||
fields: { subscribedCharacters: 1 }
|
||||
});
|
||||
const subs = user && user.subscribedCharacters || [];
|
||||
return [
|
||||
Creatures.find({
|
||||
$or: [
|
||||
{readers: userId},
|
||||
{writers: userId},
|
||||
{owner: userId},
|
||||
{_id: {$in: subs}},
|
||||
],
|
||||
type: 'pc',
|
||||
}, {
|
||||
fields: {
|
||||
name: 1,
|
||||
initial: 1,
|
||||
alignment: 1,
|
||||
gender: 1,
|
||||
readers: 1,
|
||||
writers:1,
|
||||
owner: 1,
|
||||
color: 1,
|
||||
picture: 1,
|
||||
avatarPicture: 1,
|
||||
public: 1,
|
||||
}
|
||||
Creatures.find({
|
||||
$or: [
|
||||
{ readers: userId },
|
||||
{ writers: userId },
|
||||
{ owner: userId },
|
||||
{ _id: { $in: subs } },
|
||||
],
|
||||
type: 'pc',
|
||||
}, {
|
||||
fields: {
|
||||
name: 1,
|
||||
initial: 1,
|
||||
alignment: 1,
|
||||
gender: 1,
|
||||
readers: 1,
|
||||
writers: 1,
|
||||
owner: 1,
|
||||
color: 1,
|
||||
picture: 1,
|
||||
avatarPicture: 1,
|
||||
public: 1,
|
||||
}
|
||||
}
|
||||
),
|
||||
CreatureFolders.find({owner: userId}),
|
||||
CreatureFolders.find({ owner: userId }),
|
||||
];
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import Docs from '/imports/api/docs/Docs.js';
|
||||
import Docs from '/imports/api/docs/Docs';
|
||||
|
||||
Meteor.publish('docs', function () {
|
||||
const filter = { published: true, removed: { $ne: true } };
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import SimpleSchema from 'simpl-schema';
|
||||
import Creatures from '/imports/api/creature/creatures/Creatures.js';
|
||||
import Experiences from '/imports/api/creature/experience/Experiences.js';
|
||||
import { assertViewPermission } from '/imports/api/creature/creatures/creaturePermissions.js';
|
||||
import Creatures from '/imports/api/creature/creatures/Creatures';
|
||||
import Experiences from '/imports/api/creature/experience/Experiences';
|
||||
import { assertViewPermission } from '/imports/api/creature/creatures/creaturePermissions';
|
||||
|
||||
let schema = new SimpleSchema({
|
||||
creatureId: {
|
||||
@@ -10,9 +10,9 @@ let schema = new SimpleSchema({
|
||||
},
|
||||
});
|
||||
|
||||
Meteor.publish('experiences', function(creatureId){
|
||||
Meteor.publish('experiences', function (creatureId) {
|
||||
schema.validate({ creatureId });
|
||||
this.autorun(function (){
|
||||
this.autorun(function () {
|
||||
let userId = this.userId;
|
||||
if (!userId) {
|
||||
return [];
|
||||
@@ -20,15 +20,15 @@ Meteor.publish('experiences', function(creatureId){
|
||||
let creatureCursor = Creatures.find({
|
||||
_id: creatureId,
|
||||
$or: [
|
||||
{readers: userId},
|
||||
{writers: userId},
|
||||
{owner: userId},
|
||||
{public: true},
|
||||
{ readers: userId },
|
||||
{ writers: userId },
|
||||
{ owner: userId },
|
||||
{ public: true },
|
||||
],
|
||||
});
|
||||
try {
|
||||
assertViewPermission(creatureCursor.fetch()[0], this.userId);
|
||||
} catch (e){
|
||||
} catch (e) {
|
||||
return [];
|
||||
}
|
||||
return [
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import Icons from '/imports/api/icons/Icons.js';
|
||||
import Icons from '/imports/api/icons/Icons';
|
||||
|
||||
Meteor.publish('sampleIcons', function () {
|
||||
return Icons.find({}, { limit: 50 });
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
import '/imports/server/publications/publicationRateLimit.js';
|
||||
import '/imports/server/publications/characterList.js';
|
||||
import '/imports/server/publications/library.js';
|
||||
import '/imports/server/publications/singleCharacter.js';
|
||||
import '/imports/server/publications/experiences.js';
|
||||
import '/imports/server/publications/users.js';
|
||||
import '/imports/server/publications/icons.js';
|
||||
import '/imports/server/publications/tabletops.js';
|
||||
import '/imports/server/publications/slotFillers.js';
|
||||
import '/imports/server/publications/ownedDocuments.js';
|
||||
import '/imports/server/publications/searchLibraryNodes.js';
|
||||
import '/imports/server/publications/archiveFiles.js';
|
||||
import '/imports/server/publications/userImages.js';
|
||||
import '/imports/server/publications/docs.js';
|
||||
import '/imports/server/publications/publicationRateLimit';
|
||||
import '/imports/server/publications/characterList';
|
||||
import '/imports/server/publications/library';
|
||||
import '/imports/server/publications/singleCharacter';
|
||||
import '/imports/server/publications/experiences';
|
||||
import '/imports/server/publications/users';
|
||||
import '/imports/server/publications/icons';
|
||||
import '/imports/server/publications/tabletops';
|
||||
import '/imports/server/publications/slotFillers';
|
||||
import '/imports/server/publications/ownedDocuments';
|
||||
import '/imports/server/publications/searchLibraryNodes';
|
||||
import '/imports/server/publications/archiveFiles';
|
||||
import '/imports/server/publications/userImages';
|
||||
import '/imports/server/publications/docs';
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import SimpleSchema from 'simpl-schema';
|
||||
import Libraries from '/imports/api/library/Libraries.js';
|
||||
import LibraryCollections from '/imports/api/library/LibraryCollections.js';
|
||||
import LibraryNodes from '/imports/api/library/LibraryNodes.js';
|
||||
import { assertViewPermission, assertDocViewPermission } from '/imports/api/sharing/sharingPermissions.js';
|
||||
import Libraries from '/imports/api/library/Libraries';
|
||||
import LibraryCollections from '/imports/api/library/LibraryCollections';
|
||||
import LibraryNodes from '/imports/api/library/LibraryNodes';
|
||||
import { assertViewPermission, assertDocViewPermission } from '/imports/api/sharing/sharingPermissions';
|
||||
import { union } from 'lodash';
|
||||
|
||||
const LIBRARY_NODE_TREE_FIELDS = {
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
import Creatures from '/imports/api/creature/creatures/Creatures.js';
|
||||
import Libraries from '/imports/api/library/Libraries.js';
|
||||
import Creatures from '/imports/api/creature/creatures/Creatures';
|
||||
import Libraries from '/imports/api/library/Libraries';
|
||||
|
||||
Meteor.publish('ownedDocuments', function(){
|
||||
this.autorun(function (){
|
||||
Meteor.publish('ownedDocuments', function () {
|
||||
this.autorun(function () {
|
||||
let userId = this.userId;
|
||||
if (!userId) {
|
||||
return [];
|
||||
}
|
||||
return [
|
||||
Creatures.find({owner: userId}),
|
||||
Libraries.find({owner: userId}),
|
||||
Creatures.find({ owner: userId }),
|
||||
Libraries.find({ owner: userId }),
|
||||
]
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { check } from 'meteor/check';
|
||||
import Libraries from '/imports/api/library/Libraries.js';
|
||||
import LibraryNodes from '/imports/api/library/LibraryNodes.js';
|
||||
import getCreatureLibraryIds from '/imports/api/library/getCreatureLibraryIds.js';
|
||||
import getUserLibraryIds from '/imports/api/library/getUserLibraryIds.js';
|
||||
import { assertViewPermission } from '/imports/api/sharing/sharingPermissions.js';
|
||||
import escapeRegex from '/imports/api/utility/escapeRegex.js';
|
||||
import Libraries from '/imports/api/library/Libraries';
|
||||
import LibraryNodes from '/imports/api/library/LibraryNodes';
|
||||
import getCreatureLibraryIds from '/imports/api/library/getCreatureLibraryIds';
|
||||
import getUserLibraryIds from '/imports/api/library/getUserLibraryIds';
|
||||
import { assertViewPermission } from '/imports/api/sharing/sharingPermissions';
|
||||
import escapeRegex from '/imports/api/utility/escapeRegex';
|
||||
|
||||
Meteor.publish('selectedLibraryNodes', function (selectedNodeIds) {
|
||||
check(selectedNodeIds, Array);
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import SimpleSchema from 'simpl-schema';
|
||||
import Creatures from '/imports/api/creature/creatures/Creatures.js';
|
||||
import Creatures from '/imports/api/creature/creatures/Creatures';
|
||||
import CreatureVariables from '/imports/api/creature/creatures/CreatureVariables';
|
||||
import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties.js';
|
||||
import CreatureLogs from '/imports/api/creature/log/CreatureLogs.js';
|
||||
import Actions from '/imports/api/engine/actions/Actions';
|
||||
import { assertViewPermission } from '/imports/api/creature/creatures/creaturePermissions.js';
|
||||
import computeCreature from '/imports/api/engine/computeCreature.js';
|
||||
import VERSION from '/imports/constants/VERSION.js';
|
||||
import { loadCreature } from '/imports/api/engine/loadCreatures.js';
|
||||
import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties';
|
||||
import CreatureLogs from '/imports/api/creature/log/CreatureLogs';
|
||||
import { assertViewPermission } from '/imports/api/creature/creatures/creaturePermissions';
|
||||
import computeCreature from '/imports/api/engine/computeCreature';
|
||||
import VERSION from '/imports/constants/VERSION';
|
||||
import { loadCreature } from '/imports/api/engine/loadCreatures';
|
||||
|
||||
let schema = new SimpleSchema({
|
||||
creatureId: {
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { check } from 'meteor/check';
|
||||
import Libraries from '/imports/api/library/Libraries.js';
|
||||
import LibraryNodes from '/imports/api/library/LibraryNodes.js';
|
||||
import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties.js';
|
||||
import getSlotFillFilter from '/imports/api/creature/creatureProperties/methods/getSlotFillFilter.js'
|
||||
import getCreatureLibraryIds from '/imports/api/library/getCreatureLibraryIds.js';
|
||||
import { LIBRARY_NODE_TREE_FIELDS } from '/imports/server/publications/library.js';
|
||||
import escapeRegex from '/imports/api/utility/escapeRegex.js';
|
||||
import Libraries from '/imports/api/library/Libraries';
|
||||
import LibraryNodes from '/imports/api/library/LibraryNodes';
|
||||
import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties';
|
||||
import getSlotFillFilter from '/imports/api/creature/creatureProperties/methods/getSlotFillFilter'
|
||||
import getCreatureLibraryIds from '/imports/api/library/getCreatureLibraryIds';
|
||||
import { LIBRARY_NODE_TREE_FIELDS } from '/imports/server/publications/library';
|
||||
import escapeRegex from '/imports/api/utility/escapeRegex';
|
||||
|
||||
// Publish docs the user has already selected so they don't disappear when searching
|
||||
Meteor.publish('selectedFillers', function (slotId, nodeIds, isDummySlot) {
|
||||
|
||||
@@ -1,35 +1,35 @@
|
||||
import Tabletops from '/imports/api/tabletop/Tabletops.js';
|
||||
import Creatures from '/imports/api/creature/creatures/Creatures.js';
|
||||
import Messages from '/imports/api/tabletop/Messages.js';
|
||||
import Tabletops from '/imports/api/tabletop/Tabletops';
|
||||
import Creatures from '/imports/api/creature/creatures/Creatures';
|
||||
import Messages from '/imports/api/tabletop/Messages';
|
||||
|
||||
Meteor.publish('tabletops', function(){
|
||||
Meteor.publish('tabletops', function () {
|
||||
var userId = this.userId;
|
||||
if (!userId) {
|
||||
return [];
|
||||
}
|
||||
return Tabletops.find({
|
||||
$or: [
|
||||
{players: userId},
|
||||
{gameMaster: userId},
|
||||
{ players: userId },
|
||||
{ gameMaster: userId },
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
Meteor.publish('tabletop', function(tabletopId){
|
||||
Meteor.publish('tabletop', function (tabletopId) {
|
||||
var userId = this.userId;
|
||||
if (!userId) {
|
||||
return [];
|
||||
}
|
||||
this.autorun(function (){
|
||||
this.autorun(function () {
|
||||
let tabletopCursor = Tabletops.find({
|
||||
_id: tabletopId,
|
||||
$or: [
|
||||
{players: userId},
|
||||
{gameMaster: userId},
|
||||
{ players: userId },
|
||||
{ gameMaster: userId },
|
||||
]
|
||||
});
|
||||
let tabletop = tabletopCursor.fetch()[0];
|
||||
if (!tabletop){
|
||||
if (!tabletop) {
|
||||
return [];
|
||||
}
|
||||
// Warning, this leaks data to users of the same tabletop who may not have
|
||||
@@ -55,6 +55,6 @@ Meteor.publish('tabletop', function(tabletopId){
|
||||
},
|
||||
limit: 100,
|
||||
});
|
||||
return [ tabletopCursor, creatureSummaries, recentMessages]
|
||||
return [tabletopCursor, creatureSummaries, recentMessages]
|
||||
})
|
||||
});
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import UserImages from '/imports/api/files/UserImages.js';
|
||||
import UserImages from '/imports/api/files/UserImages';
|
||||
|
||||
Meteor.publish('userImages', function () {
|
||||
return UserImages.find({
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import SimpleSchema from 'simpl-schema';
|
||||
import '/imports/api/users/Users.js';
|
||||
import Invites from '/imports/api/users/Invites.js';
|
||||
import '/imports/api/users/Users';
|
||||
import Invites from '/imports/api/users/Invites';
|
||||
|
||||
Meteor.publish('user', function () {
|
||||
return [
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import SimpleSchema from 'simpl-schema';
|
||||
import { JsonRoutes } from 'meteor/simple:json-routes';
|
||||
import { assertViewPermission } from '/imports/api/creature/creatures/creaturePermissions.js';
|
||||
import computeCreature from '/imports/api/engine/computeCreature.js';
|
||||
import VERSION from '/imports/constants/VERSION.js';
|
||||
import { assertViewPermission } from '/imports/api/creature/creatures/creaturePermissions';
|
||||
import computeCreature from '/imports/api/engine/computeCreature';
|
||||
import VERSION from '/imports/constants/VERSION';
|
||||
import { getCreature, getProperties, getVariables } from '/imports/api/engine/loadCreatures';
|
||||
|
||||
JsonRoutes.add('get', 'api/creature/:id', function (req, res) {
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
import './creature.js';
|
||||
import './healthCheck.js';
|
||||
import './creature';
|
||||
import './healthCheck';
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
import './restLogin.js';
|
||||
import './apiPublications/index.js';
|
||||
import './restLogin';
|
||||
import './apiPublications/index';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { JsonRoutes } from 'meteor/simple:json-routes';
|
||||
import authenticateMeteorUserByToken from './middleware/authenticateUserByToken.js';
|
||||
import authenticateMeteorUserByToken from './middleware/authenticateUserByToken';
|
||||
/**
|
||||
* Login with username/email and password:
|
||||
* POST /api/login
|
||||
|
||||
Reference in New Issue
Block a user