Route publish URLs through MindSpace facade

This commit is contained in:
john
2026-07-02 21:07:51 +08:00
parent 253ee870e7
commit a700bb3edb
3 changed files with 27 additions and 7 deletions
+6
View File
@@ -54,6 +54,12 @@ export function createMindSpacePublicUrl({ publicBaseUrl, ownerKey, relativePath
return `${base}/${MINDSPACE_PUBLIC_ROOT}/${encodeURIComponent(owner)}/${encodedRelative}`; 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 }) { export function createMindSpacePublicPageUrl({ publicBaseUrl, ownerKey, filename }) {
const clean = normalizeMindSpacePublicRelativePath(filename); const clean = normalizeMindSpacePublicRelativePath(filename);
const relative = clean.startsWith(`${MINDSPACE_PUBLIC_ZONE}/`) const relative = clean.startsWith(`${MINDSPACE_PUBLIC_ZONE}/`)
+11
View File
@@ -4,6 +4,7 @@ import {
canonicalizeMindSpacePublicUrl, canonicalizeMindSpacePublicUrl,
createMindSpacePublicPageUrl, createMindSpacePublicPageUrl,
createMindSpacePublicUrl, createMindSpacePublicUrl,
createMindSpaceUserRootUrl,
normalizeMindSpacePublicRelativePath, normalizeMindSpacePublicRelativePath,
parseMindSpacePublicUrl, parseMindSpacePublicUrl,
} from './mindspace-canonical-url.mjs'; } 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', () => { test('createMindSpacePublicPageUrl always places html pages under public zone', () => {
assert.equal( assert.equal(
createMindSpacePublicPageUrl({ createMindSpacePublicPageUrl({
+10 -7
View File
@@ -1,6 +1,11 @@
import fs from 'node:fs'; import fs from 'node:fs';
import path from 'node:path'; import path from 'node:path';
import { fileURLToPath } from 'node:url'; import { fileURLToPath } from 'node:url';
import {
createMindSpacePublicPageUrl,
createMindSpacePublicUrl,
createMindSpaceUserRootUrl,
} from './mindspace-canonical-url.mjs';
const __dirname = path.dirname(fileURLToPath(import.meta.url)); 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 = '') { export function buildPublicUrl(publicBaseUrl, publishKey, filename = '') {
const base = `${publicBaseUrl}/${PUBLISH_ROOT_DIR}/${encodeURIComponent(publishKey)}`; if (!filename) {
if (!filename) return `${base}/`; return createMindSpaceUserRootUrl({ publicBaseUrl, ownerKey: publishKey });
const clean = filename.replace(/^\/+/, ''); }
return `${base}/${clean.split('/').map(encodeURIComponent).join('/')}`; return createMindSpacePublicUrl({ publicBaseUrl, ownerKey: publishKey, relativePath: filename });
} }
/** Public-zone HTML pages live under \`public/\`; share URLs must include that segment. */ /** Public-zone HTML pages live under \`public/\`; share URLs must include that segment. */
export function buildPublicZonePageUrl(publicBaseUrl, publishKey, filename) { export function buildPublicZonePageUrl(publicBaseUrl, publishKey, filename) {
const clean = String(filename ?? '').replace(/^\/+/, ''); return createMindSpacePublicPageUrl({ publicBaseUrl, ownerKey: publishKey, filename });
const relative = clean.startsWith(`${PUBLIC_ZONE_DIR}/`) ? clean : `${PUBLIC_ZONE_DIR}/${clean}`;
return buildPublicUrl(publicBaseUrl, publishKey, relative);
} }
export function renderPublishSkill({ slug, username, publicBaseUrl, publishDir, displayName }) { export function renderPublishSkill({ slug, username, publicBaseUrl, publishDir, displayName }) {