// WordPress Taxonomy Service (Categories, Tags, Custom Taxonomies)
import { AxiosInstance } from 'axios';
import { logger } from '../../utils/logger.js';
import { ErrorHandler } from '../../utils/error-handler.js';
export interface TaxonomyTermCreateData {
name: string;
description?: string;
slug?: string;
parent?: number;
meta?: Record<string, any>;
}
export interface TaxonomyTermUpdateData extends Partial<TaxonomyTermCreateData> {
id: number;
}
export interface TaxonomyQueryParams {
per_page?: number;
page?: number;
search?: string;
parent?: number;
post?: number;
hide_empty?: boolean;
orderby?: 'id' | 'name' | 'slug' | 'count';
order?: 'asc' | 'desc';
}
export class TaxonomyService {
constructor(private client: AxiosInstance) {}
// Categories
async createCategory(data: TaxonomyTermCreateData): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
logger.info('Creating category', { name: data.name });
const response = await this.client.post('/categories', data);
logger.info('Category created', { id: response.data.id });
return response.data;
}, 'TaxonomyService.createCategory');
}
async getCategory(id: number): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const response = await this.client.get(`/categories/${id}`);
return response.data;
}, 'TaxonomyService.getCategory');
}
async updateCategory(data: TaxonomyTermUpdateData): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const { id, ...updateData } = data;
const response = await this.client.post(`/categories/${id}`, updateData);
return response.data;
}, 'TaxonomyService.updateCategory');
}
async deleteCategory(id: number, force: boolean = false): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const response = await this.client.delete(`/categories/${id}`, {
params: { force }
});
return response.data;
}, 'TaxonomyService.deleteCategory');
}
async listCategories(params: TaxonomyQueryParams = {}): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const response = await this.client.get('/categories', { params });
return {
categories: response.data,
total: response.headers['x-wp-total'],
totalPages: response.headers['x-wp-totalpages']
};
}, 'TaxonomyService.listCategories');
}
// Tags
async createTag(data: TaxonomyTermCreateData): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
logger.info('Creating tag', { name: data.name });
const response = await this.client.post('/tags', data);
logger.info('Tag created', { id: response.data.id });
return response.data;
}, 'TaxonomyService.createTag');
}
async getTag(id: number): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const response = await this.client.get(`/tags/${id}`);
return response.data;
}, 'TaxonomyService.getTag');
}
async updateTag(data: TaxonomyTermUpdateData): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const { id, ...updateData } = data;
const response = await this.client.post(`/tags/${id}`, updateData);
return response.data;
}, 'TaxonomyService.updateTag');
}
async deleteTag(id: number, force: boolean = false): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const response = await this.client.delete(`/tags/${id}`, {
params: { force }
});
return response.data;
}, 'TaxonomyService.deleteTag');
}
async listTags(params: TaxonomyQueryParams = {}): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const response = await this.client.get('/tags', { params });
return {
tags: response.data,
total: response.headers['x-wp-total'],
totalPages: response.headers['x-wp-totalpages']
};
}, 'TaxonomyService.listTags');
}
// Generic Taxonomy Operations
async getTaxonomy(slug: string): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const response = await this.client.get(`/taxonomies/${slug}`);
return response.data;
}, 'TaxonomyService.getTaxonomy');
}
async listTaxonomies(): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const response = await this.client.get('/taxonomies');
return response.data;
}, 'TaxonomyService.listTaxonomies');
}
}