diff --git a/package.json b/package.json index b8a7bfc3..c52f9fb8 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "build:webpack": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js --progress", "build:analyze": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js --json | webpack-bundle-size-analyzer", "build": "npm run clean && npm run build:webpack", - "start": "cross-env NODE_ENV=development DEBUG=sql,cache,presenters ./node_modules/.bin/nodemon --watch server index.js", + "start": "cross-env NODE_ENV=development DEBUG=cache,presenters ./node_modules/.bin/nodemon --watch server index.js", "lint": "eslint frontend", "deploy": "git push heroku master", "heroku-postbuild": "npm run build && npm run sequelize db:migrate", diff --git a/server/api/documents.js b/server/api/documents.js index 3a8ba59f..b3ed3c0e 100644 --- a/server/api/documents.js +++ b/server/api/documents.js @@ -4,7 +4,7 @@ import { sequelize, } from '../sequelize'; -const URL_REGEX = /^[a-zA-Z0-9-]*-([a-zA-Z0-9]{15})$/; +const URL_REGEX = /^[a-zA-Z0-9-]*-([a-zA-Z0-9]{10,15})$/; import auth from './authentication'; // import pagination from './middlewares/pagination'; @@ -22,11 +22,16 @@ const getDocumentForId = async (id) => { }, }); } else { - document = await Document.findOne({ - where: { - id, - }, - }); + try { + document = await Document.findOne({ + where: { + id, + }, + }); + } catch (e) { + // Invalid UUID + throw httpErrors.NotFound(); + } } return document; }; diff --git a/server/migrations/20160816082738-add-revision-index.js b/server/migrations/20160816082738-add-revision-index.js new file mode 100644 index 00000000..4206bb59 --- /dev/null +++ b/server/migrations/20160816082738-add-revision-index.js @@ -0,0 +1,11 @@ +'use strict'; + +module.exports = { + up: function (queryInterface, Sequelize) { + queryInterface.addIndex('revisions', ['documentId']); + }, + + down: function (queryInterface, Sequelize) { + queryInterface.removeIndex('revisions', ['documentId']); + }, +}; diff --git a/server/models/Atlas.js b/server/models/Atlas.js index b4b0672b..b8ca7029 100644 --- a/server/models/Atlas.js +++ b/server/models/Atlas.js @@ -142,7 +142,7 @@ const Atlas = sequelize.define('atlas', { return newTree; }, - async addNodeToNavigationTree(document) { + addNodeToNavigationTree(document) { const newNode = { id: document.id, title: document.title, @@ -163,6 +163,7 @@ const Atlas = sequelize.define('atlas', { }; this.navigationTree = insertNode(this.navigationTree); + return this.navigationTree; }, async deleteDocument(document) { const deleteNodeAndDocument = async (node, documentId, shouldDelete = false) => { diff --git a/server/models/Document.js b/server/models/Document.js index 43ea2189..6e2052f2 100644 --- a/server/models/Document.js +++ b/server/models/Document.js @@ -35,9 +35,16 @@ const documentBeforeSave = async (doc) => { doc.revisionCount = doc.revisionCount + 1; // Collaborators - const ids = await Revision.findAll({ - attributes: [[DataTypes.literal('DISTINCT "userId"'), 'userId']], - }).map(rev => rev.userId); + let ids = []; + // Only get previous user IDs if the document already exists + if (doc.id) { + ids = await Revision.findAll({ + attributes: [[DataTypes.literal('DISTINCT "userId"'), 'userId']], + where: { + documentId: doc.id, + }, + }).map(rev => rev.userId); + } // We'll add the current user as revision hasn't been generated yet ids.push(doc.lastModifiedById); doc.collaboratorIds = _.uniq(ids);