fix(core): Improve logging consistency, record update functionality, and API error handling in Cloudflare modules

This commit is contained in:
2025-03-19 07:07:08 +00:00
parent 4600749442
commit ba49c42dd8
12 changed files with 937 additions and 35 deletions

View File

@@ -26,6 +26,40 @@ export class CloudflareAccount {
});
}
/**
* Make a request to the Cloudflare API
* @param method HTTP method (GET, POST, PUT, DELETE)
* @param endpoint API endpoint path
* @param data Optional request body data
* @returns API response
*/
public async request<T = any>(
method: 'GET' | 'POST' | 'PUT' | 'DELETE',
endpoint: string,
data?: any
): Promise<T> {
try {
const options: plugins.smartrequest.ISmartRequestOptions = {
method,
url: `https://api.cloudflare.com/client/v4${endpoint}`,
headers: {
'Authorization': `Bearer ${this.authToken}`,
'Content-Type': 'application/json',
},
};
if (data) {
options.json = data;
}
const response = await plugins.smartrequest.request(options);
return JSON.parse(response.body);
} catch (error) {
logger.log('error', `Cloudflare API request failed: ${error.message}`);
throw error;
}
}
public async preselectAccountByName(nameArg: string) {
const accounts = await this.convenience.listAccounts();
const account = accounts.find((accountArg) => {
@@ -130,7 +164,7 @@ export class CloudflareAccount {
* cleanrecord allows the cleaning of any previous records to avoid unwanted sideeffects
*/
cleanRecord: async (domainNameArg: string, typeArg: plugins.tsclass.network.TDnsRecordType) => {
console.log(`cleaning record for ${domainNameArg}`);
logger.log('info', `Cleaning ${typeArg} records for ${domainNameArg}`);
const records = await this.convenience.listRecords(domainNameArg);
const recordsToDelete = records.filter((recordArg) => {
return recordArg.type === typeArg;
@@ -144,17 +178,39 @@ export class CloudflareAccount {
/**
* updates a record
* @param domainNameArg
* @param typeArg
* @param valueArg
* @param domainNameArg Domain name for the record
* @param typeArg Type of DNS record
* @param contentArg New content for the record
* @param ttlArg Time to live in seconds (optional)
* @returns Updated record
*/
updateRecord: async (
domainNameArg: string,
typeArg: plugins.tsclass.network.TDnsRecordType,
valueArg
) => {
// TODO: implement
contentArg: string,
ttlArg: number = 1
): Promise<plugins.ICloudflareTypes['Record']> => {
const domain = new plugins.smartstring.Domain(domainNameArg);
const zoneId = await this.convenience.getZoneId(domain.zoneName);
// Find existing record
const record = await this.convenience.getRecord(domainNameArg, typeArg);
if (!record) {
logger.log('warn', `Record ${domainNameArg} of type ${typeArg} not found for update, creating instead`);
return this.convenience.createRecord(domainNameArg, typeArg, contentArg, ttlArg);
}
// Update the record
const updatedRecord = await this.apiAccount.dns.records.edit(record.id, {
zone_id: zoneId,
type: typeArg as any,
name: domain.fullName,
content: contentArg,
ttl: ttlArg
});
return updatedRecord;
},
/**
* list all records of a specified domain name
@@ -208,4 +264,4 @@ export class CloudflareAccount {
await this.convenience.removeRecord(dnsChallenge.hostName, 'TXT');
},
};
}
}