From d872e7833954ba058c91317f8935ca3e4a8d3868 Mon Sep 17 00:00:00 2001 From: DorofeevMark Date: Fri, 25 Jan 2019 02:23:00 +0300 Subject: [PATCH] Beautiful urls (#18) * Added uri property to Page model * Added aliases collection * Added routing form aliases * Fixed redirect after page creation * Added abiltity to support few pages with same title * Added ability to change uri manually * Changed hash function * Changed uri parsing * Removed pages controller promise * Modified page's tests * Added tests for alias model * Added tests for aliases * Escaping special characters * Added missed files * Fixed bugs related to translation * Fixed parent page link * Added server validation for uri * Changed css properties order * Made uri property of page be optional * Prevented alias creation from empty uri * Moved alias types to model --- public/dist/code-styling.bundle.js | 2 +- public/dist/editor.bundle.js | 8 +- public/dist/main.bundle.js | 4 +- public/dist/main.css | 2 +- src/controllers/aliases.js | 26 ++++ src/controllers/pages.js | 36 ++++- src/frontend/js/modules/writing.js | 14 +- src/frontend/styles/components/header.pcss | 8 +- src/frontend/styles/components/page.pcss | 2 +- src/frontend/styles/components/writing.pcss | 16 ++- src/frontend/styles/vars.pcss | 5 +- src/models/alias.js | 129 ++++++++++++++++++ src/models/page.js | 75 +++++++++-- src/routes/aliases.js | 35 +++++ src/routes/api/pages.js | 4 +- src/routes/index.js | 2 + src/utils/crypto.js | 12 ++ src/utils/database/aliases.js | 6 + src/utils/database/index.js | 2 + src/utils/translation.js | 78 +++++++++++ src/views/components/aside.twig | 14 +- src/views/components/header.twig | 7 +- src/views/pages/form.twig | 9 +- src/views/pages/page.twig | 7 +- test/models/alias.js | 139 ++++++++++++++++++++ test/models/page.js | 63 ++++++++- test/rest/aliases.js | 58 ++++++++ test/rest/pages.js | 89 ++++++++++++- 28 files changed, 807 insertions(+), 45 deletions(-) create mode 100644 src/controllers/aliases.js create mode 100644 src/models/alias.js create mode 100644 src/routes/aliases.js create mode 100644 src/utils/crypto.js create mode 100644 src/utils/database/aliases.js create mode 100644 src/utils/translation.js create mode 100644 test/models/alias.js create mode 100644 test/rest/aliases.js diff --git a/public/dist/code-styling.bundle.js b/public/dist/code-styling.bundle.js index 42d32e8..2381307 100644 --- a/public/dist/code-styling.bundle.js +++ b/public/dist/code-styling.bundle.js @@ -1 +1 @@ -(window.webpackJsonpDocs=window.webpackJsonpDocs||[]).push([[0],Array(50).concat([function(e,n){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,n,t){var r=t(56),a=t(50);e.exports=function(e){return r(a(e))}},function(e,n,t){var r=t(30)("keys"),a=t(18);e.exports=function(e){return r[e]||(r[e]=a(e))}},function(e,n,t){var r=t(50);e.exports=function(e){return Object(r(e))}},function(e,n,t){"use strict";var r=t(19),a=t(12),i=t(14),o=t(11),s=t(13),c=t(66),u=t(29),l=t(72),f=t(1)("iterator"),g=!([].keys&&"next"in[].keys()),d=function(){return this};e.exports=function(e,n,t,p,v,E,h){c(t,n,p);var b,m,y,_=function(e){if(!g&&e in O)return O[e];switch(e){case"keys":case"values":return function(){return new t(this,e)}}return function(){return new t(this,e)}},R=n+" Iterator",w="values"==v,N=!1,O=e.prototype,x=O[f]||O["@@iterator"]||v&&O[v],M=x||_(v),S=v?w?_("entries"):M:void 0,A="Array"==n&&O.entries||x;if(A&&(y=l(A.call(new e)))!==Object.prototype&&y.next&&(u(y,R,!0),r||"function"==typeof y[f]||o(y,f,d)),w&&x&&"values"!==x.name&&(N=!0,M=function(){return x.call(this)}),r&&!h||!g&&!N&&O[f]||o(O,f,M),s[n]=M,s[R]=d,v)if(b={values:w?M:_("values"),keys:E?M:_("keys"),entries:S},h)for(m in b)m in O||i(O,m,b[m]);else a(a.P+a.F*(g||N),n,b);return b}},function(e,n,t){var r=t(69),a=t(57);e.exports=Object.keys||function(e){return r(e,a)}},function(e,n,t){var r=t(10);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},function(e,n){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},,,,,,,function(e,n,t){"use strict";var r=t(65)(!0);t(54)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,n=this._t,t=this._i;return t>=n.length?{value:void 0,done:!0}:(e=r(n,t),this._i+=e.length,{value:e,done:!1})})},function(e,n,t){var r=t(28),a=t(50);e.exports=function(e){return function(n,t){var i,o,s=String(a(n)),c=r(t),u=s.length;return c<0||c>=u?e?"":void 0:(i=s.charCodeAt(c))<55296||i>56319||c+1===u||(o=s.charCodeAt(c+1))<56320||o>57343?e?s.charAt(c):i:e?s.slice(c,c+2):o-56320+(i-55296<<10)+65536}}},function(e,n,t){"use strict";var r=t(67),a=t(27),i=t(29),o={};t(11)(o,t(1)("iterator"),function(){return this}),e.exports=function(e,n,t){e.prototype=r(o,{next:a(1,t)}),i(e,n+" Iterator")}},function(e,n,t){var r=t(2),a=t(68),i=t(57),o=t(52)("IE_PROTO"),s=function(){},c=function(){var e,n=t(17)("iframe"),r=i.length;for(n.style.display="none",t(34).appendChild(n),n.src="javascript:",(e=n.contentWindow.document).open(),e.write("