From a370d7c7fd6d4bb3cff9f59a198c8625c266fbeb Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Fri, 29 Sep 2017 14:02:58 +0800 Subject: [PATCH] FIX: Compatibility between Client and Server routing. mend --- .../javascripts/discourse/models/topic.js.es6 | 2 ++ .../discourse/routes/app-route-map.js.es6 | 3 ++- .../routes/topic-by-slug-or-id.js.es6 | 16 +++++++++++++++ .../discourse/routes/topic-by-slug.js.es6 | 12 ----------- .../javascripts/discourse/routes/topic.js.es6 | 5 +++++ test/javascripts/acceptance/topic-test.js.es6 | 20 +++++++++++++++++++ .../helpers/create-pretender.js.es6 | 1 + 7 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 app/assets/javascripts/discourse/routes/topic-by-slug-or-id.js.es6 delete mode 100644 app/assets/javascripts/discourse/routes/topic-by-slug.js.es6 diff --git a/app/assets/javascripts/discourse/models/topic.js.es6 b/app/assets/javascripts/discourse/models/topic.js.es6 index fb3e16b8887..3727290485a 100644 --- a/app/assets/javascripts/discourse/models/topic.js.es6 +++ b/app/assets/javascripts/discourse/models/topic.js.es6 @@ -29,6 +29,8 @@ export function loadTopicView(topic, args) { }); } +export const ID_CONSTRAINT = /^\d+$/; + const Topic = RestModel.extend({ message: null, errorLoading: false, diff --git a/app/assets/javascripts/discourse/routes/app-route-map.js.es6 b/app/assets/javascripts/discourse/routes/app-route-map.js.es6 index 7b6e59a8953..8ec183d8b54 100644 --- a/app/assets/javascripts/discourse/routes/app-route-map.js.es6 +++ b/app/assets/javascripts/discourse/routes/app-route-map.js.es6 @@ -9,7 +9,8 @@ export default function() { this.route('fromParams', { path: '/' }); this.route('fromParamsNear', { path: '/:nearPost' }); }); - this.route('topicBySlug', { path: '/t/:slug', resetNamespace: true }); + + this.route('topicBySlugOrId', { path: '/t/:slugOrId', resetNamespace: true }); this.route('topicUnsubscribe', { path: '/t/:slug/:id/unsubscribe' }); this.route('discovery', { path: '/', resetNamespace: true }, function() { diff --git a/app/assets/javascripts/discourse/routes/topic-by-slug-or-id.js.es6 b/app/assets/javascripts/discourse/routes/topic-by-slug-or-id.js.es6 new file mode 100644 index 00000000000..6fcc92151a8 --- /dev/null +++ b/app/assets/javascripts/discourse/routes/topic-by-slug-or-id.js.es6 @@ -0,0 +1,16 @@ +import { default as Topic, ID_CONSTRAINT } from 'discourse/models/topic'; +import DiscourseURL from 'discourse/lib/url'; + +export default Discourse.Route.extend({ + model(params) { + if (params.slugOrId.match(ID_CONSTRAINT)) { + return { url: `/t/topic/${params.slugOrId}` }; + } else { + return Topic.idForSlug(params.slugOrId); + } + }, + + afterModel(result) { + DiscourseURL.routeTo(result.url, { replaceURL: true }); + } +}); diff --git a/app/assets/javascripts/discourse/routes/topic-by-slug.js.es6 b/app/assets/javascripts/discourse/routes/topic-by-slug.js.es6 deleted file mode 100644 index fc402e43c9f..00000000000 --- a/app/assets/javascripts/discourse/routes/topic-by-slug.js.es6 +++ /dev/null @@ -1,12 +0,0 @@ -import Topic from 'discourse/models/topic'; -import DiscourseURL from 'discourse/lib/url'; - -export default Discourse.Route.extend({ - model: function(params) { - return Topic.idForSlug(params.slug); - }, - - afterModel: function(result) { - DiscourseURL.routeTo(result.url, { replaceURL: true }); - } -}); diff --git a/app/assets/javascripts/discourse/routes/topic.js.es6 b/app/assets/javascripts/discourse/routes/topic.js.es6 index 7fc7fd098fd..4e17be6c6b3 100644 --- a/app/assets/javascripts/discourse/routes/topic.js.es6 +++ b/app/assets/javascripts/discourse/routes/topic.js.es6 @@ -1,4 +1,5 @@ import DiscourseURL from 'discourse/lib/url'; +import { ID_CONSTRAINT } from 'discourse/models/topic'; let isTransitioning = false, scheduledReplace = null, @@ -157,6 +158,10 @@ const TopicRoute = Discourse.Route.extend({ }, model(params, transition) { + if (params.slug.match(ID_CONSTRAINT)) { + return DiscourseURL.routeTo(`/t/topic/${params.slug}/${params.id}`, { replaceURL: true }); + }; + const queryParams = transition.queryParams; let topic = this.modelFor('topic'); diff --git a/test/javascripts/acceptance/topic-test.js.es6 b/test/javascripts/acceptance/topic-test.js.es6 index a6510a2f473..530ea1cad35 100644 --- a/test/javascripts/acceptance/topic-test.js.es6 +++ b/test/javascripts/acceptance/topic-test.js.es6 @@ -142,6 +142,26 @@ QUnit.test("Reply as new message", assert => { }); }); +QUnit.test("Visit topic routes", assert => { + visit("/t/12"); + + andThen(() => { + assert.equal( + find('.fancy-title').text().trim(), 'PM for testing', + 'it routes to the right topic' + ); + }); + + visit("/t/280/20"); + + andThen(() => { + assert.equal( + find('.fancy-title').text().trim(), 'Internationalization / localization', + 'it routes to the right topic' + ); + }); +}); + QUnit.test("Updating the topic title with emojis", assert => { visit("/t/internationalization-localization/280"); click('#topic-title .d-icon-pencil'); diff --git a/test/javascripts/helpers/create-pretender.js.es6 b/test/javascripts/helpers/create-pretender.js.es6 index 6c70dad01f1..a466f632ccc 100644 --- a/test/javascripts/helpers/create-pretender.js.es6 +++ b/test/javascripts/helpers/create-pretender.js.es6 @@ -131,6 +131,7 @@ export default function() { this.put('/u/eviltrout.json', () => response({ user: {} })); this.get("/t/280.json", () => response(fixturesByUrl['/t/280/1.json'])); + this.get("/t/280/20.json", () => response(fixturesByUrl['/t/280/1.json'])); this.get("/t/28830.json", () => response(fixturesByUrl['/t/28830/1.json'])); this.get("/t/9.json", () => response(fixturesByUrl['/t/9/1.json'])); this.get("/t/12.json", () => response(fixturesByUrl['/t/12/1.json']));