From 21467900f9fb1df35df6b4a7f0ef3e4762af3b81 Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Mon, 29 Oct 2018 10:09:26 -0400 Subject: [PATCH 01/15] add channelShortId to claim data in getClaimData --- server/utils/getClaimData.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/server/utils/getClaimData.js b/server/utils/getClaimData.js index 68c367e2..f247a4d3 100644 --- a/server/utils/getClaimData.js +++ b/server/utils/getClaimData.js @@ -10,11 +10,17 @@ module.exports = async (data) => { channelName = await chainquery.claim.queries.getClaimChannelName(certificateId).catch(()=>{}); } + let channelShortId = null; + if (certificateId && channelName) { + channelShortId = await chainquery.claim.queries.getShortClaimIdFromLongClaimId(certificateId, channelName).catch(() => null); + } + return ({ name: data.name, title: data.title, certificateId, channelName, + channelShortId, contentType: data.content_type || data.contentType, claimId: data.claim_id || data.claimId, fileExt: data.generated_extension || data.fileExt, From e706c1c6610ad8b11fb6bb2ecfdd7c7af8c91ac7 Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Mon, 29 Oct 2018 10:49:14 -0400 Subject: [PATCH 02/15] use channelShortId in createCanonicalLink --- client/src/utils/createCanonicalLink.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/utils/createCanonicalLink.js b/client/src/utils/createCanonicalLink.js index d73e183d..5c193aac 100644 --- a/client/src/utils/createCanonicalLink.js +++ b/client/src/utils/createCanonicalLink.js @@ -11,12 +11,12 @@ const createBasicCanonicalLink = (page) => { }; const createAssetCanonicalLink = (asset) => { - let channelName, certificateId, name, claimId; + let channelName, channelShortId, name, claimId; if (asset.claimData) { - ({ channelName, certificateId, name, claimId } = asset.claimData); + ({ channelName, channelShortId, name, claimId } = asset.claimData); } if (channelName) { - return `${host}/${channelName}:${certificateId}/${name}`; + return `${host}/${channelName}:${channelShortId}/${name}`; } return `${host}/${claimId}/${name}`; }; From 46675107cd2dabbdae888f0df950b947ae275013 Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Mon, 29 Oct 2018 10:50:00 -0400 Subject: [PATCH 03/15] spell canonical correctly --- client/src/containers/SEO/view.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/containers/SEO/view.jsx b/client/src/containers/SEO/view.jsx index 4f64f9a3..05f9d83f 100644 --- a/client/src/containers/SEO/view.jsx +++ b/client/src/containers/SEO/view.jsx @@ -21,7 +21,7 @@ class SEO extends React.Component { asset, channel, }); - const cannonicalLink = createCanonicalLink(asset, channel, pageUri); + const canonicalLink = createCanonicalLink(asset, channel, pageUri); // render results return ( ); From bfd3971bd540b84d335cd131d17b46983410a66e Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Mon, 29 Oct 2018 14:47:47 -0400 Subject: [PATCH 04/15] alter createCanonicalLink to take an object parameter --- client/src/containers/AssetInfo/view.jsx | 24 ++++++++++++++---------- client/src/containers/SEO/view.jsx | 7 ++++++- client/src/utils/createCanonicalLink.js | 24 ++++++++++++------------ 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index 63d16e10..14d514a0 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -6,19 +6,23 @@ import Row from '@components/Row'; import SpaceBetween from '@components/SpaceBetween'; import AssetShareButtons from '@components/AssetShareButtons'; import ClickToCopy from '@components/ClickToCopy'; +import createCanonicalLink from '../../utils/createCanonicalLink'; class AssetInfo extends React.Component { render () { - const { - asset: { - shortId, - claimData : { - channelName, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host - }, - claimViews, - } - } = this.props; + const { asset } = this.props; + const { shortId, claimData: { channelName, channelShortId, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host } } = asset; + const assetCanonicalUrl = createCanonicalLink({asset}); + + let channelCanonicalUrl; + if (channelName) { + const channel = { + name: channelName, + shortId: channelShortId, + }; + channelCanonicalUrl = createCanonicalLink({channel}); + } return (
{channelName && ( @@ -29,7 +33,7 @@ class AssetInfo extends React.Component { } content={ - {channelName} + {channelName} } /> diff --git a/client/src/containers/SEO/view.jsx b/client/src/containers/SEO/view.jsx index 05f9d83f..869976ba 100644 --- a/client/src/containers/SEO/view.jsx +++ b/client/src/containers/SEO/view.jsx @@ -21,7 +21,12 @@ class SEO extends React.Component { asset, channel, }); - const canonicalLink = createCanonicalLink(asset, channel, pageUri); + const canonicalLink = createCanonicalLink({ + asset, + channel, + page: pageUri, + absolute: true, + }); // render results return ( { - return `${host}/${page}`; +const createBasicCanonicalLink = (absolute, page) => { + return `${absolute ? host : ''}/${page}`; }; -const createAssetCanonicalLink = (asset) => { +const createAssetCanonicalLink = (absolute, asset) => { let channelName, channelShortId, name, claimId; if (asset.claimData) { ({ channelName, channelShortId, name, claimId } = asset.claimData); } if (channelName) { - return `${host}/${channelName}:${channelShortId}/${name}`; + return `${absolute ? host : ''}/${channelName}:${channelShortId}/${name}`; } - return `${host}/${claimId}/${name}`; + return `${absolute ? host : ''}/${claimId}/${name}`; }; -const createChannelCanonicalLink = (channel) => { - const { name, longId } = channel; - return `${host}/${name}:${longId}`; +const createChannelCanonicalLink = (absolute, channel) => { + const { name, longId, shortId } = channel; + return `${absolute ? host : ''}/${name}:${shortId ? shortId : longId}`; }; -const createCanonicalLink = (asset, channel, page) => { +const createCanonicalLink = ({asset, channel, page, absolute = false}) => { if (asset) { - return createAssetCanonicalLink(asset); + return createAssetCanonicalLink(absolute, asset); } if (channel) { - return createChannelCanonicalLink(channel); + return createChannelCanonicalLink(absolute, channel); } - return createBasicCanonicalLink(page); + return createBasicCanonicalLink(absolute, page); }; export default createCanonicalLink; From c912226ae9ab1e6b74d5d1b572b959985fa1c5b1 Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Mon, 29 Oct 2018 16:35:57 -0400 Subject: [PATCH 05/15] move createCanonicalLink to shared utils --- client/src/utils/createCanonicalLink.js | 39 ------------------------- utils/createCanonicalLink.js | 31 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 39 deletions(-) delete mode 100644 client/src/utils/createCanonicalLink.js create mode 100644 utils/createCanonicalLink.js diff --git a/client/src/utils/createCanonicalLink.js b/client/src/utils/createCanonicalLink.js deleted file mode 100644 index bc888b3a..00000000 --- a/client/src/utils/createCanonicalLink.js +++ /dev/null @@ -1,39 +0,0 @@ -import siteConfig from '@config/siteConfig.json'; - -const { - details: { - host, - }, -} = siteConfig; - -const createBasicCanonicalLink = (absolute, page) => { - return `${absolute ? host : ''}/${page}`; -}; - -const createAssetCanonicalLink = (absolute, asset) => { - let channelName, channelShortId, name, claimId; - if (asset.claimData) { - ({ channelName, channelShortId, name, claimId } = asset.claimData); - } - if (channelName) { - return `${absolute ? host : ''}/${channelName}:${channelShortId}/${name}`; - } - return `${absolute ? host : ''}/${claimId}/${name}`; -}; - -const createChannelCanonicalLink = (absolute, channel) => { - const { name, longId, shortId } = channel; - return `${absolute ? host : ''}/${name}:${shortId ? shortId : longId}`; -}; - -const createCanonicalLink = ({asset, channel, page, absolute = false}) => { - if (asset) { - return createAssetCanonicalLink(absolute, asset); - } - if (channel) { - return createChannelCanonicalLink(absolute, channel); - } - return createBasicCanonicalLink(absolute, page); -}; - -export default createCanonicalLink; diff --git a/utils/createCanonicalLink.js b/utils/createCanonicalLink.js new file mode 100644 index 00000000..1f068f2b --- /dev/null +++ b/utils/createCanonicalLink.js @@ -0,0 +1,31 @@ +const createBasicCanonicalLink = (page) => { + return `/${page}`; +}; + +const createAssetCanonicalLink = (asset) => { + let channelName, channelShortId, name, claimId; + if (asset.claimData) { + ({ channelName, channelShortId, name, claimId } = asset.claimData); + } + if (channelName) { + return `/${channelName}:${channelShortId}/${name}`; + } + return `/${claimId}/${name}`; +}; + +const createChannelCanonicalLink = (channel) => { + const { name, shortId } = channel; + return `/${name}:${shortId}`; +}; + +const createCanonicalLink = ({asset, channel, page}) => { + if (asset) { + return createAssetCanonicalLink(asset); + } + if (channel) { + return createChannelCanonicalLink(channel); + } + return createBasicCanonicalLink(page); +}; + +module.exports = createCanonicalLink; From 85372726926aeed9f02df08cd10904ea100e485c Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Mon, 29 Oct 2018 16:39:08 -0400 Subject: [PATCH 06/15] convert all links on asset page to canonial urls --- .../src/components/AssetShareButtons/index.js | 14 +++++------ client/src/containers/AssetInfo/view.jsx | 25 +++++++++++-------- client/src/containers/SEO/view.jsx | 9 +++---- client/src/utils/createAssetMetaTags.js | 9 ++++--- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/client/src/components/AssetShareButtons/index.js b/client/src/components/AssetShareButtons/index.js index a3557f53..6ac868e5 100644 --- a/client/src/components/AssetShareButtons/index.js +++ b/client/src/components/AssetShareButtons/index.js @@ -1,48 +1,48 @@ import React from 'react'; import SocialShareLink from '@components/SocialShareLink'; -const AssetShareButtons = ({ host, name, shortId }) => { +const AssetShareButtons = ({ assetUrl, name }) => { return ( twitter facebook tumblr reddit mastodon diaspora diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index 14d514a0..38e55678 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -6,14 +6,20 @@ import Row from '@components/Row'; import SpaceBetween from '@components/SpaceBetween'; import AssetShareButtons from '@components/AssetShareButtons'; import ClickToCopy from '@components/ClickToCopy'; -import createCanonicalLink from '../../utils/createCanonicalLink'; + +import siteConfig from '@config/siteConfig.json'; +const { details: { host } } = siteConfig; +import createCanonicalLink from '../../../../utils/createCanonicalLink'; class AssetInfo extends React.Component { render () { const { asset } = this.props; const { shortId, claimData: { channelName, channelShortId, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host } } = asset; - const assetCanonicalUrl = createCanonicalLink({asset}); + const assetCanonicalUrl = `${host}${createCanonicalLink({ + asset, + absolute: true, + })}`; let channelCanonicalUrl; if (channelName) { @@ -21,7 +27,7 @@ class AssetInfo extends React.Component { name: channelName, shortId: channelShortId, }; - channelCanonicalUrl = createCanonicalLink({channel}); + channelCanonicalUrl = `${createCanonicalLink({channel})}`; } return (
@@ -62,9 +68,8 @@ class AssetInfo extends React.Component { } content={ } /> @@ -78,7 +83,7 @@ class AssetInfo extends React.Component { content={ } /> @@ -94,12 +99,12 @@ class AssetInfo extends React.Component { {(contentType === 'video/mp4') ? ( `} + value={``} /> ) : ( `} + value={``} /> )}
@@ -111,13 +116,13 @@ class AssetInfo extends React.Component { Direct Link Download diff --git a/client/src/containers/SEO/view.jsx b/client/src/containers/SEO/view.jsx index 869976ba..057e5d9b 100644 --- a/client/src/containers/SEO/view.jsx +++ b/client/src/containers/SEO/view.jsx @@ -2,12 +2,12 @@ import React from 'react'; import Helmet from 'react-helmet'; import PropTypes from 'prop-types'; -import siteConfig from '@config/siteConfig.json'; import createPageTitle from '../../utils/createPageTitle'; import createMetaTags from '../../utils/createMetaTags'; import oEmbed from '../../utils/oEmbed.js'; -import createCanonicalLink from '../../utils/createCanonicalLink'; +import createCanonicalLink from '../../../../utils/createCanonicalLink'; +import siteConfig from '@config/siteConfig.json'; const { details: { host } } = siteConfig; class SEO extends React.Component { @@ -21,12 +21,11 @@ class SEO extends React.Component { asset, channel, }); - const canonicalLink = createCanonicalLink({ + const canonicalLink = `${host}${createCanonicalLink({ asset, channel, page: pageUri, - absolute: true, - }); + })}`; // render results return ( { const createAssetMetaTags = (asset) => { const { claimData } = asset; const { contentType } = claimData; - const showUrl = `${host}/${claimData.claimId}/${claimData.name}`; - const serveUrl = `${host}/${claimData.claimId}/${claimData.name}.${claimData.fileExt}`; + const canonicalLink = createCanonicalLink({asset}); + const showUrl = `${host}${canonicalLink}`; + const serveUrl = `${showUrl}.${claimData.fileExt}`; + const ogTitle = claimData.title || claimData.name; const ogDescription = claimData.description || defaultDescription; const ogThumbnailContentType = determineContentTypeFromExtension(claimData.thumbnail); @@ -55,7 +58,7 @@ const createAssetMetaTags = (asset) => { 'fb:app_id' : '1371961932852223', }; if (determineMediaType(contentType) === VIDEO) { - const videoEmbedUrl = `${host}/video-embed/${claimData.name}/${claimData.claimId}`; + const videoEmbedUrl = `${host}/video-embed/${canonicalLink}`; // card type tags metaTags['og:type'] = 'video.other'; metaTags['twitter:card'] = 'player'; From 4e16cde75789780abe832433cfc6d575269535e2 Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Mon, 29 Oct 2018 17:29:48 -0400 Subject: [PATCH 07/15] fix videoEmbedUrl --- client/src/utils/createAssetMetaTags.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/utils/createAssetMetaTags.js b/client/src/utils/createAssetMetaTags.js index fd479c72..3e0f49eb 100644 --- a/client/src/utils/createAssetMetaTags.js +++ b/client/src/utils/createAssetMetaTags.js @@ -58,7 +58,7 @@ const createAssetMetaTags = (asset) => { 'fb:app_id' : '1371961932852223', }; if (determineMediaType(contentType) === VIDEO) { - const videoEmbedUrl = `${host}/video-embed/${canonicalLink}`; + const videoEmbedUrl = `${host}/video-embed${canonicalLink}`; // card type tags metaTags['og:type'] = 'video.other'; metaTags['twitter:card'] = 'player'; From b41f985d2b132c94c49864d679df7515d532ae25 Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Mon, 29 Oct 2018 17:59:28 -0400 Subject: [PATCH 08/15] use canonical urls in asset preview --- client/src/components/AssetPreview/index.jsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/src/components/AssetPreview/index.jsx b/client/src/components/AssetPreview/index.jsx index 17a26f1f..87a01166 100644 --- a/client/src/components/AssetPreview/index.jsx +++ b/client/src/components/AssetPreview/index.jsx @@ -1,9 +1,11 @@ import React from 'react'; import { Link } from 'react-router-dom'; +import createCanonicalLink from '../../../../utils/createCanonicalLink'; -const AssetPreview = ({ defaultThumbnail, claimData: { name, claimId, fileExt, contentType, thumbnail, title } }) => { - const embedUrl = `/${claimId}/${name}.${fileExt}`; - const showUrl = `/${claimId}/${name}`; +const AssetPreview = ({ defaultThumbnail, claimData }) => { + const { name, fileExt, contentType, thumbnail, title } = claimData; + const showUrl = createCanonicalLink({ asset: { claimData } }); + const embedUrl = `${showUrl}.${fileExt}`; return ( {(() => { From 7575ab937fad01c6c8ee2042bdfdd1cc1ac778a9 Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Mon, 29 Oct 2018 18:07:28 -0400 Subject: [PATCH 09/15] use canonical urls in createChannelMetaTags --- client/src/utils/createChannelMetaTags.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/src/utils/createChannelMetaTags.js b/client/src/utils/createChannelMetaTags.js index fea67ec5..b5f530d6 100644 --- a/client/src/utils/createChannelMetaTags.js +++ b/client/src/utils/createChannelMetaTags.js @@ -1,6 +1,7 @@ import siteConfig from '@config/siteConfig.json'; import determineContentTypeFromExtension from './determineContentTypeFromExtension'; import createMetaTagsArray from './createMetaTagsArray'; +import createCanonicalLink from '../../../utils/createCanonicalLink'; const { details: { @@ -14,7 +15,7 @@ const { } = siteConfig; export const createChannelMetaTags = (channel) => { - const { name, longId } = channel; + const { name, shortId } = channel; const metaTags = { // page detail tags 'og:title' : `${name} on ${siteTitle}`, @@ -22,7 +23,7 @@ export const createChannelMetaTags = (channel) => { 'og:description' : `${name}, a channel on ${siteTitle}`, 'twitter:description': `${name}, a channel on ${siteTitle}`, // url - 'og:url' : `${host}/${name}:${longId}`, + 'og:url' : `${host}/${createCanonicalLink({ channel })}`, // site info 'og:site_name' : siteTitle, 'twitter:site' : twitter, From 033c3d7f125391751609588e3b3f58194a5d9d77 Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Wed, 31 Oct 2018 16:08:02 -0400 Subject: [PATCH 10/15] re-add claimViews (lost in rebase) --- client/src/containers/AssetInfo/view.jsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index 38e55678..d7f2ca22 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -14,12 +14,9 @@ import createCanonicalLink from '../../../../utils/createCanonicalLink'; class AssetInfo extends React.Component { render () { const { asset } = this.props; - const { shortId, claimData: { channelName, channelShortId, certificateId, description, name, claimId, fileExt, contentType, thumbnail, host } } = asset; + const { claimViews, claimData: { channelName, channelShortId, description, name, fileExt, contentType, thumbnail, host } } = asset; - const assetCanonicalUrl = `${host}${createCanonicalLink({ - asset, - absolute: true, - })}`; + const assetCanonicalUrl = `${host}${createCanonicalLink({asset})}`; let channelCanonicalUrl; if (channelName) { From bc4f3eec10f5c16e011461430281af324c3e59e4 Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Wed, 31 Oct 2018 16:58:06 -0400 Subject: [PATCH 11/15] use canonical url in channel dropdown --- client/src/containers/NavigationLinks/view.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/src/containers/NavigationLinks/view.jsx b/client/src/containers/NavigationLinks/view.jsx index 01775688..f6e4e087 100644 --- a/client/src/containers/NavigationLinks/view.jsx +++ b/client/src/containers/NavigationLinks/view.jsx @@ -1,6 +1,7 @@ import React from 'react'; import { NavLink, withRouter } from 'react-router-dom'; import NavBarChannelOptionsDropdown from '@components/NavBarChannelOptionsDropdown'; +import createCanonicalLink from '../../../../utils/createCanonicalLink'; const VIEW = 'VIEW'; const LOGOUT = 'LOGOUT'; @@ -14,6 +15,7 @@ class NavigationLinks extends React.Component { this.props.checkForLoggedInChannel(); } handleSelection (event) { + const { history, channelName: name, channelShortId: shortId } = this.props; const value = event.target.selectedOptions[0].value; switch (value) { case LOGOUT: @@ -21,7 +23,7 @@ class NavigationLinks extends React.Component { break; case VIEW: // redirect to channel page - this.props.history.push(`/${this.props.channelName}:${this.props.channelLongId}`); + history.push(createCanonicalLink({ channel: { name, shortId } })); break; default: break; From 379835288c8e3caaf274698f41d982ce65429835 Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Wed, 31 Oct 2018 18:28:12 -0400 Subject: [PATCH 12/15] use shortId in non-channel urls --- utils/createCanonicalLink.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/createCanonicalLink.js b/utils/createCanonicalLink.js index 1f068f2b..fec9a2e5 100644 --- a/utils/createCanonicalLink.js +++ b/utils/createCanonicalLink.js @@ -10,7 +10,7 @@ const createAssetCanonicalLink = (asset) => { if (channelName) { return `/${channelName}:${channelShortId}/${name}`; } - return `/${claimId}/${name}`; + return `/${asset.shortId || claimId}/${name}`; }; const createChannelCanonicalLink = (channel) => { From 1833c326a45daec33337e177212142bfee945ff0 Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Thu, 1 Nov 2018 10:58:12 -0400 Subject: [PATCH 13/15] redirect to canonical urls --- server/render/build/handleShowRender.js | 30 +++++++++++++++++++++++++ server/render/src/handleShowRender.jsx | 26 +++++++++++++++++++-- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/server/render/build/handleShowRender.js b/server/render/build/handleShowRender.js index 854717dc..11c2c9ee 100644 --- a/server/render/build/handleShowRender.js +++ b/server/render/build/handleShowRender.js @@ -34,6 +34,28 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var createCanonicalLink = require('../../../utils/createCanonicalLink'); + +var getCanonicalUrlFromShow = function getCanonicalUrlFromShow(show) { + var requestId = show.requestList[show.request.id]; + var requestType = show.request.type; + + switch (requestType) { + case 'ASSET_DETAILS': + return createCanonicalLink({ + asset: show.assetList[requestId.key] + }); + + case 'CHANNEL': + return createCanonicalLink({ + channel: show.channelList[requestId.key] + }); + + default: + return null; + } +}; + var returnSagaWithParams = function returnSagaWithParams(saga, params) { return ( /*#__PURE__*/ @@ -115,6 +137,14 @@ module.exports = function (req, res) { var boundSaga = returnSagaWithParams(saga, boundAction); // run the saga middleware with the saga call sagaMiddleware.run(boundSaga).done.then(function () { + // redirect if request does not use canonical url + var canonicalUrl = getCanonicalUrlFromShow(store.getState().show); + + if (canonicalUrl && canonicalUrl !== req.originalUrl) { + console.log("redirecting ".concat(req.originalUrl, " to ").concat(canonicalUrl)); + res.redirect(canonicalUrl); + } + return renderPage(store); }); } else { diff --git a/server/render/src/handleShowRender.jsx b/server/render/src/handleShowRender.jsx index 721e0f60..f8445283 100644 --- a/server/render/src/handleShowRender.jsx +++ b/server/render/src/handleShowRender.jsx @@ -15,12 +15,26 @@ import App from '@app'; import Sagas from '@sagas'; import Actions from '@actions'; +const createCanonicalLink = require('../../../utils/createCanonicalLink'); + +const getCanonicalUrlFromShow = show => { + const requestId = show.requestList[show.request.id]; + const requestType = show.request.type; + switch (requestType) { + case 'ASSET_DETAILS': + return createCanonicalLink({ asset: show.assetList[requestId.key] }); + case 'CHANNEL': + return createCanonicalLink({ channel: show.channelList[requestId.key] }); + default: + return null; + } +}; + const returnSagaWithParams = (saga, params) => { return function * () { yield call(saga, params); }; }; - module.exports = (req, res) => { let context = {}; @@ -90,7 +104,15 @@ module.exports = (req, res) => { sagaMiddleware .run(boundSaga) .done - .then(() => renderPage(store) ); + .then(() => { + // redirect if request does not use canonical url + const canonicalUrl = getCanonicalUrlFromShow(store.getState().show); + if (canonicalUrl && canonicalUrl !== req.originalUrl) { + console.log(`redirecting ${req.originalUrl} to ${canonicalUrl}`); + res.redirect(canonicalUrl); + } + return renderPage(store) + }); } else { const store = createStore(Reducers); renderPage(store); From 458441600d55c0b7a642769c2c6a692cc251dd7f Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Fri, 2 Nov 2018 13:27:18 -0400 Subject: [PATCH 14/15] refactor createAssetCanonicalLink and usages --- client/src/components/AssetPreview/index.jsx | 2 +- client/src/containers/AssetInfo/view.jsx | 2 +- client/src/containers/SEO/view.jsx | 2 +- client/src/utils/createAssetMetaTags.js | 2 +- server/render/src/handleShowRender.jsx | 3 ++- utils/createCanonicalLink.js | 10 ++-------- 6 files changed, 8 insertions(+), 13 deletions(-) diff --git a/client/src/components/AssetPreview/index.jsx b/client/src/components/AssetPreview/index.jsx index 87a01166..6bfd5e68 100644 --- a/client/src/components/AssetPreview/index.jsx +++ b/client/src/components/AssetPreview/index.jsx @@ -4,7 +4,7 @@ import createCanonicalLink from '../../../../utils/createCanonicalLink'; const AssetPreview = ({ defaultThumbnail, claimData }) => { const { name, fileExt, contentType, thumbnail, title } = claimData; - const showUrl = createCanonicalLink({ asset: { claimData } }); + const showUrl = createCanonicalLink({ asset: { ...claimData }}); const embedUrl = `${showUrl}.${fileExt}`; return ( diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index d7f2ca22..c4bc14df 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -16,7 +16,7 @@ class AssetInfo extends React.Component { const { asset } = this.props; const { claimViews, claimData: { channelName, channelShortId, description, name, fileExt, contentType, thumbnail, host } } = asset; - const assetCanonicalUrl = `${host}${createCanonicalLink({asset})}`; + const assetCanonicalUrl = `${host}${createCanonicalLink({ asset: { ...asset.claimData, shortId: asset.shortId }})}`; let channelCanonicalUrl; if (channelName) { diff --git a/client/src/containers/SEO/view.jsx b/client/src/containers/SEO/view.jsx index 057e5d9b..989dacc3 100644 --- a/client/src/containers/SEO/view.jsx +++ b/client/src/containers/SEO/view.jsx @@ -22,7 +22,7 @@ class SEO extends React.Component { channel, }); const canonicalLink = `${host}${createCanonicalLink({ - asset, + asset: asset ? { ...asset.claimData, shortId: asset.shortId } : undefined, channel, page: pageUri, })}`; diff --git a/client/src/utils/createAssetMetaTags.js b/client/src/utils/createAssetMetaTags.js index 3e0f49eb..980a0df4 100644 --- a/client/src/utils/createAssetMetaTags.js +++ b/client/src/utils/createAssetMetaTags.js @@ -38,7 +38,7 @@ const determineMediaType = (contentType) => { const createAssetMetaTags = (asset) => { const { claimData } = asset; const { contentType } = claimData; - const canonicalLink = createCanonicalLink({asset}); + const canonicalLink = createCanonicalLink({ asset: { ...asset.claimData, shortId: asset.shortId }}); const showUrl = `${host}${canonicalLink}`; const serveUrl = `${showUrl}.${claimData.fileExt}`; diff --git a/server/render/src/handleShowRender.jsx b/server/render/src/handleShowRender.jsx index f8445283..a0640ffa 100644 --- a/server/render/src/handleShowRender.jsx +++ b/server/render/src/handleShowRender.jsx @@ -22,7 +22,8 @@ const getCanonicalUrlFromShow = show => { const requestType = show.request.type; switch (requestType) { case 'ASSET_DETAILS': - return createCanonicalLink({ asset: show.assetList[requestId.key] }); + const asset = show.assetList[requestId.key]; + return createCanonicalLink({ asset: { ...asset.claimData, shortId: asset.shortId }}); case 'CHANNEL': return createCanonicalLink({ channel: show.channelList[requestId.key] }); default: diff --git a/utils/createCanonicalLink.js b/utils/createCanonicalLink.js index fec9a2e5..210bcd86 100644 --- a/utils/createCanonicalLink.js +++ b/utils/createCanonicalLink.js @@ -3,14 +3,8 @@ const createBasicCanonicalLink = (page) => { }; const createAssetCanonicalLink = (asset) => { - let channelName, channelShortId, name, claimId; - if (asset.claimData) { - ({ channelName, channelShortId, name, claimId } = asset.claimData); - } - if (channelName) { - return `/${channelName}:${channelShortId}/${name}`; - } - return `/${asset.shortId || claimId}/${name}`; + const { channelName, channelShortId, name, claimId, shortId } = asset; + return channelName ? `/${channelName}:${channelShortId}/${name}` : `/${shortId || claimId}/${name}`; }; const createChannelCanonicalLink = (channel) => { From bbd437d1ad340ec88fda21cdf810c7b50b246e7f Mon Sep 17 00:00:00 2001 From: Travis Eden Date: Mon, 5 Nov 2018 10:26:59 -0500 Subject: [PATCH 15/15] fix video embed url --- client/src/containers/AssetInfo/view.jsx | 5 +++-- server/controllers/pages/sendVideoEmbedPage.js | 9 ++++++++- server/render/build/handleShowRender.js | 9 ++++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/client/src/containers/AssetInfo/view.jsx b/client/src/containers/AssetInfo/view.jsx index c4bc14df..af742617 100644 --- a/client/src/containers/AssetInfo/view.jsx +++ b/client/src/containers/AssetInfo/view.jsx @@ -16,7 +16,8 @@ class AssetInfo extends React.Component { const { asset } = this.props; const { claimViews, claimData: { channelName, channelShortId, description, name, fileExt, contentType, thumbnail, host } } = asset; - const assetCanonicalUrl = `${host}${createCanonicalLink({ asset: { ...asset.claimData, shortId: asset.shortId }})}`; + const canonicalUrl = createCanonicalLink({ asset: { ...asset.claimData, shortId: asset.shortId }}); + const assetCanonicalUrl = `${host}${canonicalUrl}`; let channelCanonicalUrl; if (channelName) { @@ -96,7 +97,7 @@ class AssetInfo extends React.Component { {(contentType === 'video/mp4') ? ( `} + value={``} /> ) : ( { } const sendVideoEmbedPage = async ({ params }, res) => { - const { + let { claimId, config, name, } = params; + // if channel then swap name and claimId for order + if (name[0] === '@' && name.includes(':')) { + const temp = name; + name = claimId; + claimId = temp; + } + const logoConfig = await parseLogoConfigParam(config); // test setting response headers diff --git a/server/render/build/handleShowRender.js b/server/render/build/handleShowRender.js index 11c2c9ee..277b9630 100644 --- a/server/render/build/handleShowRender.js +++ b/server/render/build/handleShowRender.js @@ -34,6 +34,10 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + var createCanonicalLink = require('../../../utils/createCanonicalLink'); var getCanonicalUrlFromShow = function getCanonicalUrlFromShow(show) { @@ -42,8 +46,11 @@ var getCanonicalUrlFromShow = function getCanonicalUrlFromShow(show) { switch (requestType) { case 'ASSET_DETAILS': + var asset = show.assetList[requestId.key]; return createCanonicalLink({ - asset: show.assetList[requestId.key] + asset: _objectSpread({}, asset.claimData, { + shortId: asset.shortId + }) }); case 'CHANNEL':