From 1b7dff92d96dbe707156ef21990ba413615fdbf2 Mon Sep 17 00:00:00 2001 From: Jori Lallo Date: Wed, 25 May 2016 22:38:45 -0700 Subject: [PATCH] Added slugified urls to documents --- package.json | 2 ++ server/models/Document.js | 19 +++++++++++++++++++ server/presenters.js | 1 + 3 files changed, 22 insertions(+) diff --git a/package.json b/package.json index bc215ea0..acdac3d5 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,7 @@ "pg": "^4.5.3", "pg-hstore": "^2.3.2", "querystring": "^0.2.0", + "randomstring": "^1.1.5", "react": "^0.14.7", "react-codemirror": "^0.2.5", "react-dom": "^0.14.7", @@ -98,6 +99,7 @@ "sequelize": "^3.21.0", "sequelize-cli": "^2.3.1", "sequelize-encrypted": "^0.1.0", + "slug": "^0.9.1", "style-loader": "^0.13.0", "to-markdown": "^2.0.1", "truncate-html": "0.0.6", diff --git a/server/models/Document.js b/server/models/Document.js index 9e8544a9..b5d75b59 100644 --- a/server/models/Document.js +++ b/server/models/Document.js @@ -1,3 +1,5 @@ +import slug from 'slug'; +import randomstring from 'randomstring'; import { DataTypes, sequelize, @@ -10,14 +12,25 @@ import Atlas from './Atlas'; import Team from './Team'; import User from './User'; +slug.defaults.mode ='rfc3986'; + +const generateSlug = (title, urlId) => { + const slugifiedTitle = slug(title); + return `${slugifiedTitle}-${urlId}`; +}; + const Document = sequelize.define('document', { id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true }, + urlId: { type: DataTypes.STRING, primaryKey: true }, title: DataTypes.STRING, text: DataTypes.TEXT, html: DataTypes.TEXT, preview: DataTypes.TEXT, }, { hooks: { + beforeValidate: (doc) => { + doc.urlId = randomstring.generate(15); + }, beforeCreate: (doc) => { doc.html = convertToMarkdown(doc.text); doc.preview = truncateMarkdown(doc.text, 160); @@ -26,6 +39,12 @@ const Document = sequelize.define('document', { doc.html = convertToMarkdown(doc.text); doc.preview = truncateMarkdown(doc.text, 160); }, + }, + instanceMethods: { + buildUrl() { + const slugifiedTitle = slug(this.title); + return `${slugifiedTitle}-${this.urlId}`; + } } }); diff --git a/server/presenters.js b/server/presenters.js index c835af72..86beddee 100644 --- a/server/presenters.js +++ b/server/presenters.js @@ -56,6 +56,7 @@ export function presentAtlas(atlas, includeRecentDocuments=false) { export async function presentDocument(document, includeAtlas=false) { const data = { id: document.id, + url: document.buildUrl(), title: document.title, text: document.text, html: document.html,