notion.js•4.11 kB
const notionService = require('../services/notion');
/**
* Search pages controller
* @param {Object} req - Express request object
* @param {Object} res - Express response object
*/
const searchPages = async (req, res) => {
try {
const { query } = req.body;
if (!query) {
return res.status(400).json({
error: 'Query parameter is required'
});
}
const results = await notionService.searchPages(query);
return res.json({ results });
} catch (error) {
console.error('Controller error - searchPages:', error);
return res.status(500).json({
error: 'Failed to search pages',
details: error.message
});
}
};
/**
* Get page controller
* @param {Object} req - Express request object
* @param {Object} res - Express response object
*/
const getPage = async (req, res) => {
try {
const { page_id } = req.body;
if (!page_id) {
return res.status(400).json({
error: 'Page ID is required'
});
}
const pageData = await notionService.getPage(page_id);
return res.json(pageData);
} catch (error) {
console.error('Controller error - getPage:', error);
return res.status(500).json({
error: 'Failed to retrieve page',
details: error.message
});
}
};
/**
* Query database controller
* @param {Object} req - Express request object
* @param {Object} res - Express response object
*/
const queryDatabase = async (req, res) => {
try {
const { database_id, filter, sorts } = req.body;
const results = await notionService.queryDatabase({
database_id,
filter,
sorts
});
return res.json({ results });
} catch (error) {
console.error('Controller error - queryDatabase:', error);
return res.status(500).json({
error: 'Failed to query database',
details: error.message
});
}
};
/**
* Create page controller
* @param {Object} req - Express request object
* @param {Object} res - Express response object
*/
const createPage = async (req, res) => {
try {
const { parent, properties, children } = req.body;
if (!parent || !properties) {
return res.status(400).json({
error: 'Parent and properties are required'
});
}
const page = await notionService.createPage({
parent,
properties,
children
});
return res.status(201).json(page);
} catch (error) {
console.error('Controller error - createPage:', error);
return res.status(500).json({
error: 'Failed to create page',
details: error.message
});
}
};
// MCP function handlers
const mcpHandlers = {
search_pages: async (params) => {
const { query } = params;
return await notionService.searchPages(query);
},
get_page: async (params) => {
const { page_id } = params;
return await notionService.getPage(page_id);
},
query_database: async (params) => {
const { database_id, filter, sorts } = params;
return await notionService.queryDatabase({
database_id,
filter,
sorts
});
},
create_page: async (params) => {
const { parent, properties, children } = params;
return await notionService.createPage({
parent,
properties,
children
});
}
};
/**
* Handle MCP function invocation
* @param {Object} req - Express request object
* @param {Object} res - Express response object
*/
const handleMcpCall = async (req, res) => {
try {
const { function_name, parameters } = req.body;
if (!function_name || !mcpHandlers[function_name]) {
return res.status(400).json({
error: 'Invalid or missing function name'
});
}
const result = await mcpHandlers[function_name](parameters || {});
return res.json({ result });
} catch (error) {
console.error('MCP function error:', error);
return res.status(500).json({
error: 'Function execution failed',
details: error.message
});
}
};
module.exports = {
searchPages,
getPage,
queryDatabase,
createPage,
handleMcpCall
};