250 lines
5.5 KiB
TypeScript
250 lines
5.5 KiB
TypeScript
export const CLOUDFLARE_API_URL = "https://api.cloudflare.com/client/v4";
|
|
|
|
export interface CreateDNSRecord {
|
|
id: string;
|
|
zone_name: string;
|
|
type: string;
|
|
name: string;
|
|
content: string;
|
|
proxied?: boolean;
|
|
ttl?: number;
|
|
tags?: string[];
|
|
comment?: string;
|
|
}
|
|
|
|
export interface UpdateDNSRecord extends Omit<CreateDNSRecord, "id"> {}
|
|
|
|
export interface DNSRecordResponse {
|
|
success: boolean;
|
|
errors: ResultMeta[];
|
|
messages: ResultMeta[];
|
|
result?: DNSRecordResult;
|
|
result_info?: {
|
|
count: number;
|
|
page: number;
|
|
per_page: number;
|
|
total_count: number;
|
|
};
|
|
}
|
|
|
|
export interface DNSRecordResult {
|
|
id: string;
|
|
zone_id: string;
|
|
zone_name: string;
|
|
name: string;
|
|
type: string;
|
|
content: string;
|
|
proxiable: boolean;
|
|
proxied: boolean;
|
|
ttl: number;
|
|
meta: {
|
|
auto_added: boolean;
|
|
managed_by_apps: boolean;
|
|
managed_by_argo_tunnel: boolean;
|
|
};
|
|
comment: string;
|
|
tags: string[];
|
|
created_on: string;
|
|
modified_on: string;
|
|
}
|
|
|
|
export interface ResultMeta {
|
|
code: number;
|
|
message: string;
|
|
}
|
|
|
|
export type RecordType = "A" | "CNAME";
|
|
|
|
export const createDNSRecord = async (
|
|
zoneId: string,
|
|
apiKey: string,
|
|
email: string,
|
|
record: CreateDNSRecord,
|
|
): Promise<DNSRecordResponse> => {
|
|
try {
|
|
const url = `${CLOUDFLARE_API_URL}/zones/${zoneId}/dns_records`;
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
Authorization: `Bearer ${apiKey}`,
|
|
"X-Auth-Email": email,
|
|
"X-Auth-Key": apiKey,
|
|
};
|
|
|
|
const response = await fetch(url, {
|
|
method: "POST",
|
|
headers,
|
|
body: JSON.stringify(record),
|
|
});
|
|
|
|
// console.log("response.status", await response.json());
|
|
|
|
// if (!response.ok) {
|
|
// throw new Error(`HTTP error status: ${response.status}`);
|
|
// }
|
|
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (error) {
|
|
// console.error("Error creating DNS record.", error);
|
|
return error;
|
|
}
|
|
};
|
|
|
|
export const deleteDNSRecord = async (
|
|
zoneId: string,
|
|
apiKey: string,
|
|
email: string,
|
|
recordId: string,
|
|
): Promise<Pick<DNSRecordResponse, "result">> => {
|
|
try {
|
|
const url = `${CLOUDFLARE_API_URL}/zones/${zoneId}/dns_records/${recordId}`;
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
Authorization: `Bearer ${apiKey}`,
|
|
"X-Auth-Email": email,
|
|
"X-Auth-Key": apiKey,
|
|
};
|
|
|
|
const response = await fetch(url, {
|
|
method: "DELETE",
|
|
headers,
|
|
});
|
|
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (error) {
|
|
console.error("Error deleting DNS record.", error);
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
export const updateDNSRecord = async (
|
|
zoneId: string,
|
|
apiKey: string,
|
|
email: string,
|
|
recordId: string,
|
|
data: UpdateDNSRecord,
|
|
): Promise<DNSRecordResponse> => {
|
|
try {
|
|
const url = `${CLOUDFLARE_API_URL}/zones/${zoneId}/dns_records/${recordId}`;
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
Authorization: `Bearer ${apiKey}`,
|
|
"X-Auth-Email": email,
|
|
"X-Auth-Key": apiKey,
|
|
};
|
|
|
|
const response = await fetch(url, {
|
|
method: "PATCH",
|
|
headers,
|
|
body: JSON.stringify(data),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error status: ${response.status}`);
|
|
}
|
|
|
|
const res = await response.json();
|
|
return res;
|
|
} catch (error) {
|
|
console.error("Error updating DNS record.", error);
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
export const getDNSRecordsList = async (
|
|
zoneId: string,
|
|
apiKey: string,
|
|
email: string,
|
|
type?: RecordType,
|
|
name?: string,
|
|
page = 1,
|
|
perPage = 100,
|
|
): Promise<DNSRecordResult[]> => {
|
|
try {
|
|
const url = `${CLOUDFLARE_API_URL}/zones/${zoneId}/dns_records?page=${page}&per_page=${perPage}&type=${type}&name=${name}`;
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
Authorization: `Bearer ${apiKey}`,
|
|
"X-Auth-Email": email,
|
|
"X-Auth-Key": apiKey,
|
|
};
|
|
|
|
const response = await fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error status: ${response.status}`);
|
|
}
|
|
|
|
const data = await response.json();
|
|
return data.result;
|
|
} catch (error) {
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
export const getDNSRecordDetail = async (
|
|
zoneId: string,
|
|
apiKey: string,
|
|
email: string,
|
|
recordId: string,
|
|
): Promise<DNSRecordResponse> => {
|
|
try {
|
|
const url = `${CLOUDFLARE_API_URL}/zones/${zoneId}/dns_records/${recordId}`;
|
|
|
|
const headers = {
|
|
"Content-Type": "application/json",
|
|
Authorization: `Bearer ${apiKey}`,
|
|
"X-Auth-Email": email,
|
|
"X-Auth-Key": apiKey,
|
|
};
|
|
|
|
const response = await fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error status: ${response.status}`);
|
|
}
|
|
|
|
const data = await response.json();
|
|
return data;
|
|
} catch (error) {
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
export const getZoneDetail = async (
|
|
zoneId: string,
|
|
apiKey: string,
|
|
email: string,
|
|
) => {
|
|
try {
|
|
const url = `${CLOUDFLARE_API_URL}/zones/${zoneId}`;
|
|
|
|
const headers = {
|
|
"X-Auth-Email": email,
|
|
"X-Auth-Key": apiKey,
|
|
};
|
|
|
|
const response = await fetch(url, {
|
|
method: "GET",
|
|
headers,
|
|
});
|
|
|
|
console.log(response.status);
|
|
|
|
return response.status;
|
|
} catch (error) {
|
|
throw error;
|
|
}
|
|
};
|