notion-service.ts•4.47 kB
import { Client } from '@notionhq/client';
export class NotionService {
private notion: Client;
constructor() {
const token = process.env.NOTION_TOKEN;
if (!token) {
throw new Error('NOTION_TOKEN environment variable is required');
}
this.notion = new Client({
auth: token,
});
}
async getPage(pageId: string) {
try {
const response = await this.notion.pages.retrieve({
page_id: pageId,
});
return response;
} catch (error) {
throw new Error(`Failed to get page: ${error instanceof Error ? error.message : String(error)}`);
}
}
async searchPages(query: string, filter?: { property?: string; value?: any }) {
try {
const searchParams: any = {
query,
sort: {
direction: 'descending',
timestamp: 'last_edited_time',
},
};
if (filter) {
searchParams.filter = {
property: 'object',
value: 'page',
};
}
const response = await this.notion.search(searchParams);
return response;
} catch (error) {
throw new Error(`Failed to search pages: ${error instanceof Error ? error.message : String(error)}`);
}
}
async createPage(
parent: { database_id?: string; page_id?: string },
properties: Record<string, any>,
children?: any[]
) {
try {
const createParams: any = {
parent,
properties,
};
if (children) {
createParams.children = children;
}
const response = await this.notion.pages.create(createParams);
return response;
} catch (error) {
throw new Error(`Failed to create page: ${error instanceof Error ? error.message : String(error)}`);
}
}
async updatePage(pageId: string, properties: Record<string, any>) {
try {
const response = await this.notion.pages.update({
page_id: pageId,
properties,
});
return response;
} catch (error) {
throw new Error(`Failed to update page: ${error instanceof Error ? error.message : String(error)}`);
}
}
async queryDatabase(
databaseId: string,
filter?: any,
sorts?: any[],
startCursor?: string,
pageSize?: number
) {
try {
const queryParams: any = {
database_id: databaseId,
};
if (filter) {
queryParams.filter = filter;
}
if (sorts) {
queryParams.sorts = sorts;
}
if (startCursor) {
queryParams.start_cursor = startCursor;
}
if (pageSize) {
queryParams.page_size = pageSize;
}
const response = await this.notion.databases.query(queryParams);
return response;
} catch (error) {
throw new Error(`Failed to query database: ${error instanceof Error ? error.message : String(error)}`);
}
}
async getRecentPages() {
try {
const response = await this.notion.search({
sort: {
direction: 'descending',
timestamp: 'last_edited_time',
},
filter: {
property: 'object',
value: 'page',
},
page_size: 10,
});
return response;
} catch (error) {
throw new Error(`Failed to get recent pages: ${error instanceof Error ? error.message : String(error)}`);
}
}
async getDatabases() {
try {
const response = await this.notion.search({
filter: {
property: 'object',
value: 'database',
},
sort: {
direction: 'descending',
timestamp: 'last_edited_time',
},
});
return response;
} catch (error) {
throw new Error(`Failed to get databases: ${error instanceof Error ? error.message : String(error)}`);
}
}
async getPageContent(pageId: string) {
try {
const response = await this.notion.blocks.children.list({
block_id: pageId,
});
return response;
} catch (error) {
throw new Error(`Failed to get page content: ${error instanceof Error ? error.message : String(error)}`);
}
}
async appendBlocksToPage(pageId: string, blocks: any[]) {
try {
const response = await this.notion.blocks.children.append({
block_id: pageId,
children: blocks,
});
return response;
} catch (error) {
throw new Error(`Failed to append blocks: ${error instanceof Error ? error.message : String(error)}`);
}
}
}