From b701efbf9cef49b40bcc1cdab66a39000b246dee Mon Sep 17 00:00:00 2001 From: Thorsten Marx Date: Wed, 23 Apr 2025 11:35:58 +0200 Subject: [PATCH 1/4] #442 add content aliases --- CHANGELOG.md | 1 + .../com/condation/cms/api/db/Content.java | 2 ++ .../cms/content/ContentResolver.java | 27 ++++++++++++++----- .../condation/cms/filesystem/FileContent.java | 5 ++++ cms-server/hosts/test/content/test.md | 3 +++ .../cms/content/ContentResolverTest.java | 14 ++++++++++ 6 files changed, 45 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc3f5044c..5f5403381 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ see wiki for more information: [wiki](https://github.com/thmarx/cms/wiki) * **MAINTENANCE** multiple dependencies updated * **MAINTENANCE** maven wrapper added to project +* **FEATURE** Developer Experience [PR-440](https://github.com/CondationCMS/cms-server/pull/440) ### Developer experience diff --git a/cms-api/src/main/java/com/condation/cms/api/db/Content.java b/cms-api/src/main/java/com/condation/cms/api/db/Content.java index 794cb998d..a9372ac0c 100644 --- a/cms-api/src/main/java/com/condation/cms/api/db/Content.java +++ b/cms-api/src/main/java/com/condation/cms/api/db/Content.java @@ -35,6 +35,8 @@ public interface Content { boolean isVisible (String uri); + boolean isVisible (ContentNode node); + List listSections(final ReadOnlyFile contentFile); List listContent(final ReadOnlyFile base, final String start); diff --git a/cms-content/src/main/java/com/condation/cms/content/ContentResolver.java b/cms-content/src/main/java/com/condation/cms/content/ContentResolver.java index 09a28db8c..0fd86795b 100644 --- a/cms-content/src/main/java/com/condation/cms/content/ContentResolver.java +++ b/cms-content/src/main/java/com/condation/cms/content/ContentResolver.java @@ -101,24 +101,37 @@ private Optional getContent(final RequestContext context, boole var tempFile = contentPath.resolve("index.md"); if (tempFile.exists()) { contentFile = tempFile; - } else { - return Optional.empty(); } } else { var temp = contentBase.resolve(path + ".md"); if (temp.exists()) { contentFile = temp; - } else { - return Optional.empty(); } } - var uri = PathUtil.toRelativeFile(contentFile, contentBase); - if (checkVisibility && !db.getContent().isVisible(uri)) { + // handle alias + ContentNode contentNode = null; + if (contentFile == null || !contentFile.exists()) { + var query = db.getContent().query((node, count) -> node); + var result = query.whereContains("aliases", "/" + path).get(); + if (!result.isEmpty()) { + contentNode = result.getFirst(); + contentFile = contentBase.resolve(contentNode.uri()); + } + } else { + var uri = PathUtil.toRelativeFile(contentFile, contentBase); + contentNode = db.getContent().byUri(uri).get(); + } + + if (contentNode == null) { return Optional.empty(); } - final ContentNode contentNode = db.getContent().byUri(uri).get(); + if (checkVisibility && !db.getContent().isVisible(contentNode)) { + return Optional.empty(); + } + + if (contentNode.isRedirect()) { return Optional.of(new ContentResponse(contentNode)); } else if (!Constants.NodeType.PAGE.equals(contentNode.nodeType())) { diff --git a/cms-filesystem/src/main/java/com/condation/cms/filesystem/FileContent.java b/cms-filesystem/src/main/java/com/condation/cms/filesystem/FileContent.java index de1db200a..051386a0b 100644 --- a/cms-filesystem/src/main/java/com/condation/cms/filesystem/FileContent.java +++ b/cms-filesystem/src/main/java/com/condation/cms/filesystem/FileContent.java @@ -49,6 +49,11 @@ public boolean isVisible(String uri) { return fileSystem.isVisible(uri); } + @Override + public boolean isVisible(ContentNode node) { + return fileSystem.isVisible(node.uri()); + } + @Override public List listSections(ReadOnlyFile contentFile) { String folder = PathUtil.toRelativePath(contentFile, cmsFileSystem.contentBase()); diff --git a/cms-server/hosts/test/content/test.md b/cms-server/hosts/test/content/test.md index ce3a8f878..74a8a4043 100644 --- a/cms-server/hosts/test/content/test.md +++ b/cms-server/hosts/test/content/test.md @@ -4,6 +4,9 @@ template: test.ftl tags: [eins,zwei,drei] date: 2023-12-02 datetime: 2023-12-02T13:10:12 +aliases: + - /alias2 + - /alias3/sub1 --- Und hier der Inhalt \ No newline at end of file diff --git a/cms-server/src/test/java/com/condation/cms/content/ContentResolverTest.java b/cms-server/src/test/java/com/condation/cms/content/ContentResolverTest.java index c726958d0..9c354d227 100644 --- a/cms-server/src/test/java/com/condation/cms/content/ContentResolverTest.java +++ b/cms-server/src/test/java/com/condation/cms/content/ContentResolverTest.java @@ -100,5 +100,19 @@ public void test_hidden_folder() throws IOException { optional = contentResolver.getErrorContent(context); Assertions.assertThat(optional).isPresent(); } + + @Test + public void testAliases() throws IOException { + + var context = TestHelper.requestContext("alias2"); + var optional = contentResolver.getContent(context); + Assertions.assertThat(optional).isPresent(); + Assertions.assertThat(optional.get().node().data()).containsEntry("title", "StartseiteView"); + + context = TestHelper.requestContext("alias3/sub1"); + optional = contentResolver.getContent(context); + Assertions.assertThat(optional).isPresent(); + Assertions.assertThat(optional.get().node().data()).containsEntry("title", "StartseiteView"); + } } From f0a32c0e1a47dac8976c993b354b1e4db6cbf934 Mon Sep 17 00:00:00 2001 From: Thorsten Marx Date: Wed, 23 Apr 2025 11:41:30 +0200 Subject: [PATCH 2/4] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f5403381..4a815df9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ see wiki for more information: [wiki](https://github.com/thmarx/cms/wiki) * **MAINTENANCE** multiple dependencies updated * **MAINTENANCE** maven wrapper added to project * **FEATURE** Developer Experience [PR-440](https://github.com/CondationCMS/cms-server/pull/440) +* **FEATURE** Aliases for content [442](https://github.com/CondationCMS/cms-server/issues/442) ### Developer experience From 464d23df7ca5ba4d790d3d138366e159f831221f Mon Sep 17 00:00:00 2001 From: Thorsten Marx Date: Wed, 23 Apr 2025 12:55:41 +0200 Subject: [PATCH 3/4] add some tests --- cms-server/hosts/test/content/alias-hidden.md | 12 ++++++++++++ .../condation/cms/content/ContentResolverTest.java | 12 ++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 cms-server/hosts/test/content/alias-hidden.md diff --git a/cms-server/hosts/test/content/alias-hidden.md b/cms-server/hosts/test/content/alias-hidden.md new file mode 100644 index 000000000..515d73114 --- /dev/null +++ b/cms-server/hosts/test/content/alias-hidden.md @@ -0,0 +1,12 @@ +--- +title: StartseiteView +template: test.ftl +tags: [eins,zwei,drei] +date: 2023-12-02 +datetime: 2023-12-02T13:10:12 +published: false +aliases: + - /hidden +--- + +Und hier der Inhalt \ No newline at end of file diff --git a/cms-server/src/test/java/com/condation/cms/content/ContentResolverTest.java b/cms-server/src/test/java/com/condation/cms/content/ContentResolverTest.java index 9c354d227..498cf88e3 100644 --- a/cms-server/src/test/java/com/condation/cms/content/ContentResolverTest.java +++ b/cms-server/src/test/java/com/condation/cms/content/ContentResolverTest.java @@ -114,5 +114,17 @@ public void testAliases() throws IOException { Assertions.assertThat(optional).isPresent(); Assertions.assertThat(optional.get().node().data()).containsEntry("title", "StartseiteView"); } + + @Test + public void test_not_published() throws IOException { + + var context = TestHelper.requestContext("alias-hidden"); + var optional = contentResolver.getContent(context); + Assertions.assertThat(optional).isEmpty(); + + context = TestHelper.requestContext("hidden"); + optional = contentResolver.getContent(context); + Assertions.assertThat(optional).isEmpty(); + } } From f6f57128deb3f0e358f0ea16bd85b54ac68d1fb0 Mon Sep 17 00:00:00 2001 From: Thorsten Marx Date: Wed, 23 Apr 2025 12:58:27 +0200 Subject: [PATCH 4/4] refactor --- .../main/java/com/condation/cms/content/ContentResolver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cms-content/src/main/java/com/condation/cms/content/ContentResolver.java b/cms-content/src/main/java/com/condation/cms/content/ContentResolver.java index 0fd86795b..202b40dbe 100644 --- a/cms-content/src/main/java/com/condation/cms/content/ContentResolver.java +++ b/cms-content/src/main/java/com/condation/cms/content/ContentResolver.java @@ -150,7 +150,7 @@ private Optional getContent(final RequestContext context, boole var contentType = contentNode.contentType(); return Optional.of(new ContentResponse(content, contentType, contentNode)); - } catch (Exception ex) { + } catch (IOException ex) { log.error(null, ex); return Optional.empty(); }