Compare commits

...

2 commits

Author SHA1 Message Date
9dda200e10
Release 1.1.10 2024-12-11 23:47:48 +01:00
aadd1760cf
Add Pagination Capability 2024-12-11 23:47:21 +01:00
4 changed files with 21 additions and 6 deletions

2
Cargo.lock generated
View file

@ -114,7 +114,7 @@ dependencies = [
[[package]]
name = "cloudflare-dns-updater"
version = "1.1.9"
version = "1.1.10"
dependencies = [
"chrono",
"confy",

View file

@ -1,7 +1,7 @@
[package]
authors = ["Neshura"]
name = "cloudflare-dns-updater"
version = "1.1.9"
version = "1.1.10"
edition = "2021"
description = "Application for automatically updating Cloudflare DNS records"
license = "GPL-3.0-or-later"

View file

@ -17,6 +17,15 @@ const API_BASE: &str = "https://api.cloudflare.com/client/v4";
struct CloudflareApiResults {
result: Vec<CloudflareDnsRecord>,
success: bool,
result_info: CloudflareApiPagination,
}
#[derive(Serialize, Deserialize, Debug)]
struct CloudflareApiPagination {
count: u8,
page: u8,
per_page: u8,
total_count: u16
}
#[derive(Serialize, Deserialize, Debug)]
@ -55,14 +64,20 @@ impl CloudflareZone {
headers
}
pub(crate) fn get_entries(&self) -> Result<Vec<CloudflareDnsRecord>, ()> {
let endpoint = format!("{}/zones/{}/dns_records", API_BASE, self.id);
pub(crate) fn get_entries(&self, page: Option<u8>) -> Result<Vec<CloudflareDnsRecord>, ()> {
let endpoint = format!("{}/zones/{}/dns_records?page={}", API_BASE, self.id, page.unwrap_or(1));
match self.get(&endpoint) {
Ok(response) => {
if response.status().is_success() {
let entries = match response.json::<CloudflareApiResults>() {
Ok(data) => data,
Ok(mut data) => {
let actual_count: u16 = (data.result_info.per_page * (data.result_info.page - 1) + data.result_info.count) as u16;
if actual_count < data.result_info.total_count {
data.result.append(&mut self.get_entries(Some(page.unwrap_or(1) + 1)).expect("Pagination indicates more results"));
}
data
},
Err(e) => {
let err_msg = format!("Unable to parse API response: {e}");
match connected_to_journal() {

View file

@ -579,7 +579,7 @@ fn main() {
for zone in &zone_cfgs {
let cf_zone = CloudflareZone::new(zone, &config);
let cf_entries = match cf_zone.get_entries() {
let cf_entries = match cf_zone.get_entries(None) {
Ok(entries) => entries,
Err(_) => {
continue