From a700bb3edb7574481fad02c04b7180cba5a75794 Mon Sep 17 00:00:00 2001 From: john Date: Thu, 2 Jul 2026 21:07:51 +0800 Subject: [PATCH] Route publish URLs through MindSpace facade --- mindspace-canonical-url.mjs | 6 ++++++ mindspace-canonical-url.test.mjs | 11 +++++++++++ user-publish.mjs | 17 ++++++++++------- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/mindspace-canonical-url.mjs b/mindspace-canonical-url.mjs index 13b3e03..585817b 100644 --- a/mindspace-canonical-url.mjs +++ b/mindspace-canonical-url.mjs @@ -54,6 +54,12 @@ export function createMindSpacePublicUrl({ publicBaseUrl, ownerKey, relativePath return `${base}/${MINDSPACE_PUBLIC_ROOT}/${encodeURIComponent(owner)}/${encodedRelative}`; } +export function createMindSpaceUserRootUrl({ publicBaseUrl, ownerKey }) { + const base = normalizeMindSpacePublicBaseUrl(publicBaseUrl); + const owner = requiredSegment(ownerKey, 'ownerKey'); + return `${base}/${MINDSPACE_PUBLIC_ROOT}/${encodeURIComponent(owner)}/`; +} + export function createMindSpacePublicPageUrl({ publicBaseUrl, ownerKey, filename }) { const clean = normalizeMindSpacePublicRelativePath(filename); const relative = clean.startsWith(`${MINDSPACE_PUBLIC_ZONE}/`) diff --git a/mindspace-canonical-url.test.mjs b/mindspace-canonical-url.test.mjs index 758958a..4b1d40f 100644 --- a/mindspace-canonical-url.test.mjs +++ b/mindspace-canonical-url.test.mjs @@ -4,6 +4,7 @@ import { canonicalizeMindSpacePublicUrl, createMindSpacePublicPageUrl, createMindSpacePublicUrl, + createMindSpaceUserRootUrl, normalizeMindSpacePublicRelativePath, parseMindSpacePublicUrl, } from './mindspace-canonical-url.mjs'; @@ -19,6 +20,16 @@ test('createMindSpacePublicUrl encodes owner and relative path segments', () => ); }); +test('createMindSpaceUserRootUrl preserves trailing slash root URL', () => { + assert.equal( + createMindSpaceUserRootUrl({ + publicBaseUrl: 'https://m.tkmind.cn/', + ownerKey: 'user 1', + }), + 'https://m.tkmind.cn/MindSpace/user%201/', + ); +}); + test('createMindSpacePublicPageUrl always places html pages under public zone', () => { assert.equal( createMindSpacePublicPageUrl({ diff --git a/user-publish.mjs b/user-publish.mjs index c83f903..5978567 100644 --- a/user-publish.mjs +++ b/user-publish.mjs @@ -1,6 +1,11 @@ import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; +import { + createMindSpacePublicPageUrl, + createMindSpacePublicUrl, + createMindSpaceUserRootUrl, +} from './mindspace-canonical-url.mjs'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -114,17 +119,15 @@ export function migrateUserPublishDir(h5Root, user, legacyUsersRoot = null) { } export function buildPublicUrl(publicBaseUrl, publishKey, filename = '') { - const base = `${publicBaseUrl}/${PUBLISH_ROOT_DIR}/${encodeURIComponent(publishKey)}`; - if (!filename) return `${base}/`; - const clean = filename.replace(/^\/+/, ''); - return `${base}/${clean.split('/').map(encodeURIComponent).join('/')}`; + if (!filename) { + return createMindSpaceUserRootUrl({ publicBaseUrl, ownerKey: publishKey }); + } + return createMindSpacePublicUrl({ publicBaseUrl, ownerKey: publishKey, relativePath: filename }); } /** Public-zone HTML pages live under \`public/\`; share URLs must include that segment. */ export function buildPublicZonePageUrl(publicBaseUrl, publishKey, filename) { - const clean = String(filename ?? '').replace(/^\/+/, ''); - const relative = clean.startsWith(`${PUBLIC_ZONE_DIR}/`) ? clean : `${PUBLIC_ZONE_DIR}/${clean}`; - return buildPublicUrl(publicBaseUrl, publishKey, relative); + return createMindSpacePublicPageUrl({ publicBaseUrl, ownerKey: publishKey, filename }); } export function renderPublishSkill({ slug, username, publicBaseUrl, publishDir, displayName }) {