gatsby-source-notion-churnotion 1.0.7 → 1.0.10
Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,39 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.getBooks = void 0;
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
8
|
+
const constants_1 = require("../constants");
|
9
|
+
const fetchData_1 = require("../util/fetchData");
|
10
|
+
const getBooks = async ({ bookDatabaseId, reporter, createNode, createNodeId, }) => {
|
11
|
+
const databaseUrl = `databases/${bookDatabaseId}/query`;
|
12
|
+
const body = {};
|
13
|
+
const result = await (0, fetchData_1.fetchPostWithRetry)(databaseUrl, body);
|
14
|
+
if (result?.results?.length) {
|
15
|
+
reporter.info(`[SUCCESS] total BOOK pages > ${result.results.length}`);
|
16
|
+
}
|
17
|
+
for (const page of result.results) {
|
18
|
+
reporter.info(`[CHECK] BOOK page: ${page.id}`);
|
19
|
+
const nodeId = createNodeId(`${page.id}-book`);
|
20
|
+
const bookNode = {
|
21
|
+
id: nodeId,
|
22
|
+
book_name: page.properties?.[`이름`]?.title?.[0]?.plain_text || `Unnamed`,
|
23
|
+
slug: page.properties?.slug?.rich_text?.plain_text || `unnamed-slug`,
|
24
|
+
parent: null,
|
25
|
+
children: [],
|
26
|
+
internal: {
|
27
|
+
type: constants_1.NODE_TYPE.Category,
|
28
|
+
contentDigest: crypto_1.default
|
29
|
+
.createHash(`md5`)
|
30
|
+
.update(JSON.stringify(page))
|
31
|
+
.digest(`hex`),
|
32
|
+
},
|
33
|
+
create_date: page.created_time,
|
34
|
+
update_date: page.last_edited_time,
|
35
|
+
};
|
36
|
+
createNode(bookNode);
|
37
|
+
}
|
38
|
+
};
|
39
|
+
exports.getBooks = getBooks;
|
@@ -17,7 +17,7 @@ const getPages = async ({ databaseId, reporter, getCache, actions, createNode, c
|
|
17
17
|
* @param databaseId 데이터베이스 아이디
|
18
18
|
* @param parentCategoryId 부모 데이터베이스 아이디
|
19
19
|
*/
|
20
|
-
const processDatabase = async (databaseId, parentCategoryId = null, categoryPath = []) => {
|
20
|
+
const processDatabase = async (databaseId, parentCategoryId = null, categoryPath = [], tagMap = {}) => {
|
21
21
|
try {
|
22
22
|
while (hasMore) {
|
23
23
|
const databaseUrl = `databases/${databaseId}/query`;
|
@@ -27,7 +27,7 @@ const getPages = async ({ databaseId, reporter, getCache, actions, createNode, c
|
|
27
27
|
reporter.info(`[SUCCESS] total pages > ${result.results.length}`);
|
28
28
|
}
|
29
29
|
for (const page of result.results) {
|
30
|
-
reporter.info(`[CHECK
|
30
|
+
reporter.info(`[CHECK] page: ${page.id}`);
|
31
31
|
const pageUrl = `blocks/${page.id}/children?page_size=100`;
|
32
32
|
// 페이지 데이터
|
33
33
|
const pageData = await (0, fetchData_1.fetchGetWithRetry)(pageUrl);
|
@@ -68,7 +68,7 @@ const getPages = async ({ databaseId, reporter, getCache, actions, createNode, c
|
|
68
68
|
}
|
69
69
|
}
|
70
70
|
const newCategoryPath = [...categoryPath, categoryNode];
|
71
|
-
await processDatabase(categoryJsonData.id, nodeId, newCategoryPath);
|
71
|
+
await processDatabase(categoryJsonData.id, nodeId, newCategoryPath, tagMap);
|
72
72
|
}
|
73
73
|
else {
|
74
74
|
// 페이지인 경우
|
@@ -86,21 +86,34 @@ const getPages = async ({ databaseId, reporter, getCache, actions, createNode, c
|
|
86
86
|
const tagIds = [];
|
87
87
|
if (page.properties.tags && page.properties.tags.multi_select) {
|
88
88
|
page.properties.tags.multi_select.forEach((tagData) => {
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
89
|
+
if (tagMap[tagData.name]) {
|
90
|
+
// 이미 존재하는 태그라면 tagMap에서 가져오기
|
91
|
+
const existingTagId = tagMap[tagData.name];
|
92
|
+
tagIds.push(existingTagId); // 기존 태그 ID 추가
|
93
|
+
reporter.info(`[INFO] Reusing existing tag: ${tagData.name}`);
|
94
|
+
}
|
95
|
+
else {
|
96
|
+
// 새로운 태그 생성
|
97
|
+
const tagNodeId = createNodeId(`${tagData.id}-tag`);
|
98
|
+
tagMap[tagData.name] = tagNodeId; // tagMap에 저장
|
99
|
+
tagIds.push(tagNodeId); // 새로운 태그 ID 추가
|
100
|
+
// 태그 노드 생성
|
101
|
+
const tagNode = {
|
102
|
+
id: tagNodeId,
|
103
|
+
tag_name: tagData.name,
|
104
|
+
color: tagData.color,
|
105
|
+
churnotions: [], // 연결된 페이지 리스트 초기화
|
106
|
+
internal: {
|
107
|
+
type: constants_1.NODE_TYPE.Tag,
|
108
|
+
contentDigest: crypto_1.default
|
109
|
+
.createHash(`md5`)
|
110
|
+
.update(JSON.stringify(tagData))
|
111
|
+
.digest(`hex`),
|
112
|
+
},
|
113
|
+
};
|
114
|
+
createNode(tagNode);
|
115
|
+
reporter.info(`[SUCCESS] Created new tag: ${tagData.name}`);
|
116
|
+
}
|
104
117
|
});
|
105
118
|
}
|
106
119
|
const bookId = page.properties?.book?.relation?.[0]?.id || null;
|
@@ -109,12 +122,13 @@ const getPages = async ({ databaseId, reporter, getCache, actions, createNode, c
|
|
109
122
|
const postNode = {
|
110
123
|
id: nodeId,
|
111
124
|
category: parentCategoryId,
|
112
|
-
|
125
|
+
book: getNode(`${bookId}-book`),
|
126
|
+
book_index: page.properties?.bookIndex?.number || 0,
|
113
127
|
title: title,
|
114
128
|
content: markdownContent,
|
115
129
|
create_date: page.created_time,
|
116
130
|
update_date: page.last_edited_time,
|
117
|
-
version: page.properties?.version?.
|
131
|
+
version: page.properties?.version?.number || null,
|
118
132
|
description: null,
|
119
133
|
slug: slug || `no-title-${nodeId}`,
|
120
134
|
category_list: categoryPath,
|
@@ -130,6 +144,29 @@ const getPages = async ({ databaseId, reporter, getCache, actions, createNode, c
|
|
130
144
|
parent: null,
|
131
145
|
};
|
132
146
|
await createNode(postNode);
|
147
|
+
// book과 post 부모-자식 관계 설정
|
148
|
+
const bookNode = getNode(bookId);
|
149
|
+
if (bookNode) {
|
150
|
+
createParentChildLink({
|
151
|
+
parent: bookNode,
|
152
|
+
child: postNode,
|
153
|
+
});
|
154
|
+
}
|
155
|
+
// tag와 post 부모-자식 관계 설정
|
156
|
+
tagIds.forEach((tagId) => {
|
157
|
+
const tagNode = getNode(tagId);
|
158
|
+
if (tagNode) {
|
159
|
+
createParentChildLink({
|
160
|
+
parent: tagNode,
|
161
|
+
child: postNode,
|
162
|
+
});
|
163
|
+
reporter.info(`[SUCCESS] Linked tag: ${tagNode.tag_name} -> page: ${postNode.title}`);
|
164
|
+
}
|
165
|
+
else {
|
166
|
+
reporter.warn(`[WARNING] Tag node not found for ID: ${tagId}`);
|
167
|
+
}
|
168
|
+
});
|
169
|
+
// category와 post 부모-자식 관계 설정
|
133
170
|
if (parentCategoryId && postNode) {
|
134
171
|
const parentNode = getNode(parentCategoryId); // Gatsby에서 노드를 검색
|
135
172
|
if (parentNode) {
|
@@ -9,7 +9,8 @@ const createSchemaCustomization = ({ actions }) => {
|
|
9
9
|
id: ID!
|
10
10
|
category: ${constants_1.NODE_TYPE.Category}! @link(by: "id", from: "category")
|
11
11
|
tags: [${constants_1.NODE_TYPE.Tag}] @link(by: "id")
|
12
|
-
|
12
|
+
book: ${constants_1.NODE_TYPE.Book} @link(by: "id")
|
13
|
+
book_index: Int
|
13
14
|
title: String
|
14
15
|
content: [JSON]
|
15
16
|
create_date: Date! @dateformat
|
package/dist/source-nodes.js
CHANGED
@@ -1,18 +1,25 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.sourceNodes = void 0;
|
4
|
-
const
|
4
|
+
const getPages_1 = require("./api/getPages");
|
5
|
+
const getBooks_1 = require("./api/getBooks");
|
5
6
|
const sourceNodes = async (gatsbyApi, options) => {
|
6
7
|
const { actions, reporter, createNodeId, getNode, getCache } = gatsbyApi;
|
7
8
|
const { createNode, createParentChildLink } = actions;
|
8
|
-
const { token, databaseId } = options;
|
9
|
+
const { token, databaseId, bookDatabaseId } = options;
|
9
10
|
if (!token || !databaseId) {
|
10
11
|
reporter.error(`[ERROR] Missing Notion API token or database ID.`);
|
11
12
|
return;
|
12
13
|
}
|
13
14
|
reporter.info(`[INFO] Fetching pages from Notion database...`);
|
14
15
|
try {
|
15
|
-
await (0,
|
16
|
+
await (0, getBooks_1.getBooks)({
|
17
|
+
bookDatabaseId,
|
18
|
+
reporter,
|
19
|
+
createNode,
|
20
|
+
createNodeId,
|
21
|
+
});
|
22
|
+
await (0, getPages_1.getPages)({
|
16
23
|
token,
|
17
24
|
databaseId,
|
18
25
|
reporter,
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "gatsby-source-notion-churnotion",
|
3
3
|
"description": "Gatsby plugin that can connect with One Notion Database RECURSIVELY using official API",
|
4
|
-
"version": "1.0.
|
4
|
+
"version": "1.0.10",
|
5
5
|
"skipLibCheck": true,
|
6
6
|
"license": "0BSD",
|
7
7
|
"main": "./dist/gatsby-node.js",
|
File without changes
|