notion.js•3.09 kB
const { Client } = require('@notionhq/client');
// Initialize Notion client
const notion = new Client({ auth: process.env.NOTION_API_KEY });
/**
* Search for Notion pages
* @param {string} query - Search query
* @returns {Promise<Array>} - Search results
*/
const searchPages = async (query) => {
try {
const response = await notion.search({
query,
sort: {
direction: 'descending',
timestamp: 'last_edited_time',
},
});
return response.results;
} catch (error) {
console.error('Error searching pages:', error);
throw error;
}
};
/**
* Get a page by ID
* @param {string} pageId - Notion page ID
* @returns {Promise<Object>} - Page data
*/
const getPage = async (pageId) => {
try {
const page = await notion.pages.retrieve({ page_id: pageId });
// Get page content (blocks)
const blocks = await getPageBlocks(pageId);
return {
page,
blocks
};
} catch (error) {
console.error('Error getting page:', error);
throw error;
}
};
/**
* Get all blocks for a page
* @param {string} pageId - Page ID
* @returns {Promise<Array>} - Array of blocks
*/
const getPageBlocks = async (pageId) => {
try {
let results = [];
let hasMore = true;
let cursor = undefined;
while (hasMore) {
const response = await notion.blocks.children.list({
block_id: pageId,
start_cursor: cursor,
});
results = [...results, ...response.results];
hasMore = response.has_more;
cursor = response.next_cursor;
}
return results;
} catch (error) {
console.error('Error getting page blocks:', error);
throw error;
}
};
/**
* Query a database
* @param {Object} options - Query options
* @returns {Promise<Array>} - Database items
*/
const queryDatabase = async (options = {}) => {
try {
const database_id = options.database_id || process.env.NOTION_DATABASE_ID;
if (!database_id) {
throw new Error('Database ID is required');
}
const queryParams = {
database_id,
};
if (options.filter) {
queryParams.filter = options.filter;
}
if (options.sorts) {
queryParams.sorts = options.sorts;
}
const response = await notion.databases.query(queryParams);
return response.results;
} catch (error) {
console.error('Error querying database:', error);
throw error;
}
};
/**
* Create a new page
* @param {Object} params - Page parameters
* @returns {Promise<Object>} - Created page
*/
const createPage = async (params) => {
try {
const { parent, properties, children } = params;
const pageParams = {
parent,
properties
};
if (children) {
pageParams.children = children;
}
const response = await notion.pages.create(pageParams);
return response;
} catch (error) {
console.error('Error creating page:', error);
throw error;
}
};
module.exports = {
searchPages,
getPage,
getPageBlocks,
queryDatabase,
createPage
};