262 lines
7.6 KiB
TypeScript
262 lines
7.6 KiB
TypeScript
/**
|
|
* Namecheap API Client - Domains Transfer Module
|
|
*/
|
|
import { HttpClient } from './http-client.js';
|
|
import type {
|
|
ITransferGetListResponse,
|
|
ITransferGetStatusResponse,
|
|
ITransferCreateResponse,
|
|
ITransferUpdateStatusResponse,
|
|
ITransferGetInfoResponse,
|
|
ITransferInfo,
|
|
ITransferStatusInfo
|
|
} from './types.js';
|
|
|
|
export class DomainsTransfer {
|
|
private client: HttpClient;
|
|
|
|
/**
|
|
* Create a new Domains Transfer API handler
|
|
* @param client HTTP client instance
|
|
*/
|
|
constructor(client: HttpClient) {
|
|
this.client = client;
|
|
}
|
|
|
|
/**
|
|
* Get a list of domain transfers
|
|
* @param page Page number
|
|
* @param pageSize Number of items per page
|
|
* @param listType Type of transfers to list
|
|
* @returns List of domain transfers
|
|
*/
|
|
async getList(
|
|
page: number = 1,
|
|
pageSize: number = 20,
|
|
listType: 'ALL' | 'INPROGRESS' | 'COMPLETED' | 'FAILED' = 'ALL'
|
|
): Promise<{
|
|
transfers: ITransferInfo[];
|
|
paging: {
|
|
totalItems: number;
|
|
currentPage: number;
|
|
pageSize: number;
|
|
};
|
|
}> {
|
|
// Make the API request
|
|
const response = await this.client.request<ITransferGetListResponse>(
|
|
'namecheap.domains.transfer.getList',
|
|
{
|
|
Page: page,
|
|
PageSize: pageSize,
|
|
ListType: listType
|
|
}
|
|
);
|
|
|
|
// Extract transfer information from the response
|
|
const commandResponse = response.ApiResponse.CommandResponse[0];
|
|
const transferList = commandResponse.TransferGetListResult[0];
|
|
const paging = commandResponse.Paging[0];
|
|
|
|
// Convert the parsed XML structure to a more usable format
|
|
const transfers = (transferList.Transfer || []).map(transfer => ({
|
|
id: parseInt(transfer.$.ID, 10),
|
|
domainName: transfer.$.DomainName,
|
|
status: transfer.$.Status,
|
|
statusDescription: transfer.$.StatusDescription,
|
|
date: transfer.$.Date,
|
|
lockTransferDate: transfer.$.LockTransferDate || null,
|
|
transferOrderDetailId: parseInt(transfer.$.TransferOrderDetailID || '0', 10),
|
|
isLocked: transfer.$.IsLocked?.toLowerCase() === 'true',
|
|
authInfo: transfer.$.AuthInfo || null
|
|
}));
|
|
|
|
// Convert paging information
|
|
const pagingInfo = paging ? {
|
|
totalItems: parseInt(paging.TotalItems[0], 10),
|
|
currentPage: parseInt(paging.CurrentPage[0], 10),
|
|
pageSize: parseInt(paging.PageSize[0], 10)
|
|
} : {
|
|
totalItems: transfers.length,
|
|
currentPage: 1,
|
|
pageSize: transfers.length
|
|
};
|
|
|
|
return {
|
|
transfers,
|
|
paging: pagingInfo
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Get the status of a domain transfer
|
|
* @param transferId Transfer ID
|
|
* @returns Transfer status information
|
|
*/
|
|
async getStatus(transferId: number): Promise<ITransferStatusInfo> {
|
|
// Make the API request
|
|
const response = await this.client.request<ITransferGetStatusResponse>(
|
|
'namecheap.domains.transfer.getStatus',
|
|
{ TransferID: transferId }
|
|
);
|
|
|
|
// Extract status information from the response
|
|
const commandResponse = response.ApiResponse.CommandResponse[0];
|
|
const statusInfo = commandResponse.TransferGetStatusResult[0].$;
|
|
|
|
return {
|
|
id: parseInt(statusInfo.TransferID, 10),
|
|
status: statusInfo.Status,
|
|
statusDescription: statusInfo.StatusDescription,
|
|
domainName: statusInfo.DomainName,
|
|
date: statusInfo.Date,
|
|
lockTransferDate: statusInfo.LockTransferDate || null,
|
|
transferOrderDetailId: parseInt(statusInfo.TransferOrderDetailID || '0', 10),
|
|
isLocked: statusInfo.IsLocked?.toLowerCase() === 'true',
|
|
authInfo: statusInfo.AuthInfo || null
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Create a new domain transfer
|
|
* @param domainName Domain name to transfer
|
|
* @param years Number of years to renew for
|
|
* @param authCode Authorization code from current registrar
|
|
* @param options Additional options
|
|
* @returns Transfer creation result
|
|
*/
|
|
async create(
|
|
domainName: string,
|
|
years: number,
|
|
authCode: string,
|
|
options?: {
|
|
promotionCode?: string;
|
|
addFreeWhoisguard?: boolean;
|
|
whoisguardEnable?: boolean;
|
|
idnCode?: string;
|
|
premiumPrice?: number;
|
|
eapFee?: number;
|
|
}
|
|
): Promise<{
|
|
transferId: number;
|
|
transferOrderId: number;
|
|
isSuccess: boolean;
|
|
transferStatus: string;
|
|
statusDescription: string;
|
|
chargedAmount: number;
|
|
}> {
|
|
// Prepare the request parameters
|
|
const params: Record<string, string | number | boolean> = {
|
|
DomainName: domainName,
|
|
Years: years,
|
|
EPPCode: authCode
|
|
};
|
|
|
|
// Add optional parameters
|
|
if (options) {
|
|
if (options.promotionCode) {
|
|
params.PromotionCode = options.promotionCode;
|
|
}
|
|
|
|
if (options.addFreeWhoisguard !== undefined) {
|
|
params.AddFreeWhoisguard = options.addFreeWhoisguard;
|
|
}
|
|
|
|
if (options.whoisguardEnable !== undefined) {
|
|
params.WGEnable = options.whoisguardEnable;
|
|
}
|
|
|
|
if (options.idnCode) {
|
|
params.IdnCode = options.idnCode;
|
|
}
|
|
|
|
if (options.premiumPrice !== undefined) {
|
|
params.PremiumPrice = options.premiumPrice;
|
|
}
|
|
|
|
if (options.eapFee !== undefined) {
|
|
params.EapFee = options.eapFee;
|
|
}
|
|
}
|
|
|
|
// Make the API request
|
|
const response = await this.client.request<ITransferCreateResponse>(
|
|
'namecheap.domains.transfer.create',
|
|
params
|
|
);
|
|
|
|
// Extract creation information from the response
|
|
const commandResponse = response.ApiResponse.CommandResponse[0];
|
|
const result = commandResponse.DomainTransferCreateResult[0].$;
|
|
|
|
return {
|
|
transferId: parseInt(result.TransferID, 10),
|
|
transferOrderId: parseInt(result.OrderID, 10),
|
|
isSuccess: result.IsSuccess?.toLowerCase() === 'true',
|
|
transferStatus: result.Status,
|
|
statusDescription: result.StatusDescription,
|
|
chargedAmount: parseFloat(result.ChargedAmount)
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Update the status of a domain transfer
|
|
* @param transferId Transfer ID
|
|
* @param resubmit Whether to resubmit the transfer
|
|
* @returns Success status
|
|
*/
|
|
async updateStatus(transferId: number, resubmit: boolean): Promise<boolean> {
|
|
// Make the API request
|
|
const response = await this.client.request<ITransferUpdateStatusResponse>(
|
|
'namecheap.domains.transfer.updateStatus',
|
|
{
|
|
TransferID: transferId,
|
|
Resubmit: resubmit
|
|
}
|
|
);
|
|
|
|
// Check if the operation was successful
|
|
return response.ApiResponse.$.Status === 'OK';
|
|
}
|
|
|
|
/**
|
|
* Get detailed information about a domain transfer
|
|
* @param transferId Transfer ID
|
|
* @returns Detailed transfer information
|
|
*/
|
|
async getInfo(transferId: number): Promise<{
|
|
transferId: number;
|
|
domainName: string;
|
|
status: string;
|
|
statusDescription: string;
|
|
authInfo: string;
|
|
date: string;
|
|
whoisguardStatus: string;
|
|
orderDate: string;
|
|
orderId: number;
|
|
transferOrderDetailId: number;
|
|
}> {
|
|
// Make the API request
|
|
const response = await this.client.request<ITransferGetInfoResponse>(
|
|
'namecheap.domains.transfer.getInfo',
|
|
{ TransferID: transferId }
|
|
);
|
|
|
|
// Extract detailed information from the response
|
|
const commandResponse = response.ApiResponse.CommandResponse[0];
|
|
const info = commandResponse.TransferGetInfoResult[0].$;
|
|
|
|
return {
|
|
transferId: parseInt(info.TransferID, 10),
|
|
domainName: info.DomainName,
|
|
status: info.Status,
|
|
statusDescription: info.StatusDescription,
|
|
authInfo: info.AuthInfo || '',
|
|
date: info.Date,
|
|
whoisguardStatus: info.WhoisguardStatus || '',
|
|
orderDate: info.OrderDate,
|
|
orderId: parseInt(info.OrderID, 10),
|
|
transferOrderDetailId: parseInt(info.TransferOrderDetailID, 10)
|
|
};
|
|
}
|
|
}
|