4 // Retrieve Notion API token from environment variable
5 const notionToken = Deno.env.get("NOTION_API_TOKEN");
6 const databaseId = Deno.env.get("NOTION_DATABASE_ID");
7
8 if (!notionToken || !databaseId) {
9 return new Response("Notion API token or database ID not configured", { status: 500 });
10 }
11
13
14 try {
15 // Fetch database metadata
16 const databaseMetadata = await notion.databases.retrieve({
17 database_id: databaseId,
18 });
19
20 // Fetch pages from the database
21 const response = await notion.databases.query({
22 database_id: databaseId,
23 filter: {
24 property: "Published", // Customize based on your database schema
25 checkbox: {
26 equals: true, // Only fetch published pages
29 sorts: [
30 {
31 timestamp: "last_edited_time", // Customize based on your database schema
32 direction: "descending",
33 },
39 const rssXml = generateRSSFeed(
40 response.results,
41 databaseMetadata,
42 );
43
53}
54
55function generateRSSFeed(pages: any[], databaseMetadata: any): string {
56 // Get database title from database metadata
57 const databaseTitle = databaseMetadata.title[0]?.text.content
58 || `RSS Feed from Notion Database ${databaseMetadata.id}`;
59
60 // Get database description from database metadata
61 const databaseDescription = databaseMetadata.description[0]?.text.content
62 || "";
63
69
70 const itemsXml = pages.map(page => {
71 // Extract page metadata. Customize based on your database
72 const title = page.properties.Name?.title[0]?.plain_text || "Untitled";
73 const url = page.public_url;
75 const lastEditedTime = new Date(page.last_edited_time).toUTCString();
76
77 // Extract tags, handling different Notion multi-select tag formats. Customize based on your database
78 const tags = page.properties.Tags?.multi_select?.map(tag => tag.name) || [];
79
93<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
94<channel>
95 <title>${escapeXml(databaseTitle)}</title>
96 <link>https://baolei.org</link>
97 <description>${escapeXml(databaseDescription)}</description>
98 <pubDate>${pubDate}</pubDate>
99 <atom:link href="${import.meta.url}" rel="self" type="application/rss+xml" />