Merge feature-nested-sets into develop

This commit is contained in:
ThaumRystra
2023-12-18 18:27:17 +02:00
523 changed files with 5492 additions and 3763 deletions

View File

@@ -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';

View File

@@ -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('#/', ''),
}),
};

View File

@@ -1,3 +1,3 @@
import LibraryNodes from '/imports/api/library/LibraryNodes.js';
import LibraryNodes from '/imports/api/library/LibraryNodes';
LibraryNodes.startCaching?.();

View File

@@ -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(() => {

View File

@@ -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({

View File

@@ -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 }),
];
});
});

View File

@@ -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 } };

View File

@@ -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 [

View File

@@ -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 });

View File

@@ -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';

View File

@@ -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 = {

View File

@@ -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 }),
]
});
});

View File

@@ -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);

View File

@@ -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: {

View File

@@ -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) {

View File

@@ -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]
})
});

View File

@@ -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({

View File

@@ -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 [

View File

@@ -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) {

View File

@@ -1,2 +1,2 @@
import './creature.js';
import './healthCheck.js';
import './creature';
import './healthCheck';

View File

@@ -1,2 +1,2 @@
import './restLogin.js';
import './apiPublications/index.js';
import './restLogin';
import './apiPublications/index';

View File

@@ -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