// WordPress Users Service
import { AxiosInstance } from 'axios';
import { logger } from '../../utils/logger.js';
import { ErrorHandler } from '../../utils/error-handler.js';
export interface UserCreateData {
username: string;
email: string;
password: string;
name?: string;
first_name?: string;
last_name?: string;
roles?: string[];
description?: string;
url?: string;
}
export interface UserUpdateData extends Partial<UserCreateData> {
id: number;
}
export interface UserQueryParams {
per_page?: number;
page?: number;
search?: string;
roles?: string[];
orderby?: 'id' | 'name' | 'registered_date' | 'email';
order?: 'asc' | 'desc';
}
export class UsersService {
constructor(private client: AxiosInstance) {}
async createUser(data: UserCreateData): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
logger.info('Creating new user', { username: data.username, email: data.email });
const response = await this.client.post('/users', data);
logger.info('User created successfully', { id: response.data.id });
return response.data;
}, 'UsersService.createUser');
}
async getUser(id: number, context: 'view' | 'edit' = 'view'): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
logger.debug(`Fetching user ${id}`);
const response = await this.client.get(`/users/${id}`, {
params: { context }
});
return response.data;
}, 'UsersService.getUser');
}
async getCurrentUser(): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
logger.debug('Fetching current user');
const response = await this.client.get('/users/me');
return response.data;
}, 'UsersService.getCurrentUser');
}
async updateUser(data: UserUpdateData): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const { id, ...updateData } = data;
logger.info(`Updating user ${id}`);
const response = await this.client.post(`/users/${id}`, updateData);
logger.info('User updated successfully', { id });
return response.data;
}, 'UsersService.updateUser');
}
async deleteUser(id: number, reassign?: number, force: boolean = false): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
logger.info(`Deleting user ${id}`, { reassign, force });
const params: any = { force };
if (reassign) params.reassign = reassign;
const response = await this.client.delete(`/users/${id}`, { params });
logger.info('User deleted successfully', { id });
return response.data;
}, 'UsersService.deleteUser');
}
async listUsers(params: UserQueryParams = {}): Promise<any> {
return ErrorHandler.wrapAsync(async () => {
const defaultParams = {
per_page: 10,
...params
};
logger.debug('Listing users', defaultParams);
const response = await this.client.get('/users', {
params: defaultParams
});
logger.debug(`Found ${response.data.length} users`);
return {
users: response.data,
total: response.headers['x-wp-total'],
totalPages: response.headers['x-wp-totalpages']
};
}, 'UsersService.listUsers');
}
async searchUsers(searchTerm: string, params: Omit<UserQueryParams, 'search'> = {}): Promise<any> {
return this.listUsers({ ...params, search: searchTerm });
}
async getUsersByRole(role: string, params: Omit<UserQueryParams, 'roles'> = {}): Promise<any> {
return this.listUsers({ ...params, roles: [role] });
}
}