// WordPress Posts Service
import { AxiosInstance } from 'axios';
import { logger } from '../../utils/logger.js';
import { ErrorHandler } from '../../utils/error-handler.js';
export interface PostCreateData {
title: string;
content: string;
status?: 'publish' | 'draft' | 'pending' | 'private' | 'future';
excerpt?: string;
author?: number;
featured_media?: number;
comment_status?: 'open' | 'closed';
ping_status?: 'open' | 'closed';
categories?: number[];
tags?: number[];
meta?: Record<string, any>;
format?: string;
}
export interface PostUpdateData extends Partial<PostCreateData> {
id: number;
}
export interface PostQueryParams {
per_page?: number;
page?: number;
status?: string;
search?: string;
author?: number;
categories?: number[];
tags?: number[];
order?: 'asc' | 'desc';
orderby?: 'date' | 'relevance' | 'id' | 'title' | 'slug';
}
export class PostsService {
constructor(private client: AxiosInstance) {}
async createPost(data: PostCreateData): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
logger.info('Creating new post', { title: data.title });
const response = await this.client.post('/posts', data);
logger.info('Post created successfully', { id: response.data.id });
return response.data;
}, 'PostsService.createPost');
}
async getPost(id: number, context: 'view' | 'edit' = 'edit'): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
logger.debug(`Fetching post ${id}`);
const response = await this.client.get(`/posts/${id}`, {
params: { context }
});
return response.data;
}, 'PostsService.getPost');
}
async updatePost(data: PostUpdateData): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const { id, ...updateData } = data;
logger.info(`Updating post ${id}`);
const response = await this.client.post(`/posts/${id}`, updateData);
logger.info('Post updated successfully', { id });
return response.data;
}, 'PostsService.updatePost');
}
async deletePost(id: number, force: boolean = false): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
logger.info(`Deleting post ${id}`, { force });
const response = await this.client.delete(`/posts/${id}`, {
params: { force }
});
logger.info('Post deleted successfully', { id });
return response.data;
}, 'PostsService.deletePost');
}
async listPosts(params: PostQueryParams = {}): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const defaultParams = {
per_page: 10,
status: 'any',
...params
};
logger.debug('Listing posts', defaultParams);
const response = await this.client.get('/posts', {
params: defaultParams
});
logger.debug(`Found ${response.data.length} posts`);
return {
posts: response.data,
total: response.headers['x-wp-total'],
totalPages: response.headers['x-wp-totalpages']
};
}, 'PostsService.listPosts');
}
async searchPosts(searchTerm: string, params: Omit<PostQueryParams, 'search'> = {}): Promise<any> {
return this.listPosts({ ...params, search: searchTerm });
}
async getPostsByAuthor(authorId: number, params: Omit<PostQueryParams, 'author'> = {}): Promise<any> {
return this.listPosts({ ...params, author: authorId });
}
async getPostsByCategory(categoryId: number, params: Omit<PostQueryParams, 'categories'> = {}): Promise<any> {
return this.listPosts({ ...params, categories: [categoryId] });
}
async getPostsByTag(tagId: number, params: Omit<PostQueryParams, 'tags'> = {}): Promise<any> {
return this.listPosts({ ...params, tags: [tagId] });
}
}