From 43c1f67b33979d507415db669aaaa10e91eecd0b Mon Sep 17 00:00:00 2001 From: Tim <135014430+nagisa77@users.noreply.github.com> Date: Wed, 30 Jul 2025 20:19:05 +0800 Subject: [PATCH] feat: add dynamic sitemap endpoint --- .../controller/SitemapController.java | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/main/java/com/openisle/controller/SitemapController.java diff --git a/src/main/java/com/openisle/controller/SitemapController.java b/src/main/java/com/openisle/controller/SitemapController.java new file mode 100644 index 000000000..32c316e3e --- /dev/null +++ b/src/main/java/com/openisle/controller/SitemapController.java @@ -0,0 +1,67 @@ +package com.openisle.controller; + +import com.openisle.model.Post; +import com.openisle.model.PostStatus; +import com.openisle.repository.PostRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * Controller for dynamic sitemap generation. + */ +@RestController +@RequiredArgsConstructor +public class SitemapController { + private final PostRepository postRepository; + + @Value("${app.website-url:https://www.open-isle.com}") + private String websiteUrl; + + @GetMapping(value = "/sitemap.xml", produces = MediaType.APPLICATION_XML_VALUE) + public ResponseEntity sitemap() { + List posts = postRepository.findByStatus(PostStatus.PUBLISHED); + + StringBuilder body = new StringBuilder(); + body.append("\n"); + body.append("\n"); + + List staticRoutes = List.of( + "/", + "/about", + "/activities", + "/login", + "/signup" + ); + + for (String path : staticRoutes) { + body.append(" ") + .append(websiteUrl) + .append(path) + .append("\n"); + } + + for (Post p : posts) { + body.append(" \n") + .append(" ") + .append(websiteUrl) + .append("/posts/") + .append(p.getId()) + .append("\n") + .append(" ") + .append(p.getCreatedAt()) + .append("\n") + .append(" \n"); + } + + body.append(""); + return ResponseEntity.ok() + .contentType(MediaType.APPLICATION_XML) + .body(body.toString()); + } +}