last_modified is no longer required

This commit is contained in:
daladim 2021-03-23 00:13:03 +01:00
parent 5c3c5c8090
commit cbb4378581
6 changed files with 20 additions and 98 deletions

View file

@ -33,15 +33,6 @@ impl CachedCalendar {
deleted_items: BTreeMap::new(),
}
}
/// Returns the list of tasks that this calendar contains
pub async fn get_tasks(&self) -> Result<HashMap<ItemId, &Item>, Box<dyn Error>> {
self.get_tasks_modified_since(None).await
}
/// Returns the tasks that have been last-modified after `since`
pub async fn get_tasks_modified_since(&self, since: Option<DateTime<Utc>>) -> Result<HashMap<ItemId, &Item>, Box<dyn Error>> {
self.get_items_modified_since(since, Some(SearchFilter::Tasks)).await
}
}
#[async_trait]
@ -106,43 +97,11 @@ impl PartialCalendar for CachedCalendar {
#[async_trait]
impl CompleteCalendar for CachedCalendar {
/// Returns the items that have been deleted after `since`
async fn get_items_deleted_since(&self, since: DateTime<Utc>) -> Result<HashSet<ItemId>, Box<dyn Error>> {
Ok(self.deleted_items.range(since..)
.map(|(_key, id)| id.clone())
.collect())
}
/// Returns the list of items that this calendar contains
async fn get_items(&self) -> Result<HashMap<ItemId, &Item>, Box<dyn Error>> {
self.get_items_modified_since(None, None).await
}
async fn get_items_modified_since(&self, since: Option<DateTime<Utc>>, filter: Option<SearchFilter>) -> Result<HashMap<ItemId, &Item>, Box<dyn Error>> {
let filter = filter.unwrap_or_default();
let mut map = HashMap::new();
for (_id, item) in &self.items {
match since {
None => (),
Some(since) => if item.last_modified() < since {
continue;
},
}
match filter {
SearchFilter::Tasks => {
if item.is_task() == false {
continue;
}
},
_ => (),
}
map.insert(item.id().clone(), item);
}
Ok(map)
Ok(self.items.iter()
.map(|(id, item)| (id.clone(), item))
.collect()
)
}
}

View file

@ -1,7 +1,6 @@
//! Calendar events
use serde::{Deserialize, Serialize};
use chrono::{Utc, DateTime};
use crate::item::ItemId;
use crate::item::SyncStatus;
@ -12,7 +11,6 @@ use crate::item::SyncStatus;
pub struct Event {
id: ItemId,
name: String,
last_modified: DateTime<Utc>,
sync_status: SyncStatus,
}
@ -25,10 +23,6 @@ impl Event {
&self.name
}
pub fn last_modified(&self) -> DateTime<Utc> {
self.last_modified
}
pub fn sync_status(&self) -> &SyncStatus {
&self.sync_status
}

View file

@ -2,7 +2,6 @@ use std::fmt::{Display, Formatter};
use std::str::FromStr;
use serde::{Deserialize, Serialize};
use chrono::{Utc, DateTime};
use url::Url;
use crate::resource::Resource;
@ -30,13 +29,6 @@ impl Item {
}
}
pub fn last_modified(&self) -> DateTime<Utc> {
match self {
Item::Event(e) => e.last_modified(),
Item::Task(t) => t.last_modified(),
}
}
pub fn sync_status(&self) -> &SyncStatus {
match self {
Item::Event(e) => e.sync_status(),

View file

@ -1,4 +1,3 @@
use chrono::{Utc, DateTime};
use serde::{Deserialize, Serialize};
use crate::item::ItemId;
@ -10,8 +9,6 @@ pub struct Task {
/// The task unique ID, that will never change
id: ItemId,
/// The last modification date of this task
last_modified: DateTime<Utc>,
/// The sync status of this item
sync_status: SyncStatus,
@ -23,11 +20,10 @@ pub struct Task {
impl Task {
/// Create a new Task
pub fn new(name: String, id: ItemId, last_modified: DateTime<Utc>, sync_status: SyncStatus) -> Self {
pub fn new(name: String, id: ItemId, sync_status: SyncStatus) -> Self {
Self {
id,
name,
last_modified,
sync_status,
completed: false,
}
@ -36,27 +32,23 @@ impl Task {
pub fn id(&self) -> &ItemId { &self.id }
pub fn name(&self) -> &str { &self.name }
pub fn completed(&self) -> bool { self.completed }
pub fn last_modified(&self) -> DateTime<Utc> { self.last_modified }
pub fn sync_status(&self) -> &SyncStatus { &self.sync_status }
pub fn set_sync_status(&mut self, new_status: SyncStatus) {
self.sync_status = new_status;
}
fn update_last_modified(&mut self) {
self.last_modified = Utc::now();
}
/// Rename a task.
/// This updates its "last modified" field
pub fn set_name(&mut self, new_name: String) {
self.update_last_modified();
self.name = new_name;
}
pub fn set_completed(&mut self, new_value: bool) {
// TODO: either require a reference to the DataSource, so that it is aware
// or change a flag here, and the DataSource will be able to check the flags of all its content (but then the Calendar should only give a reference/Arc, not a clone)
self.update_last_modified();
self.completed = new_value;
}
}

View file

@ -3,7 +3,6 @@ use std::collections::{HashMap, HashSet};
use std::sync::{Arc, Mutex};
use async_trait::async_trait;
use chrono::{DateTime, Utc};
use crate::item::Item;
use crate::item::ItemId;
@ -79,15 +78,6 @@ pub trait PartialCalendar {
/// Usually, this is a calendar fully stored on a local disk
#[async_trait]
pub trait CompleteCalendar : PartialCalendar {
/// Returns the items that have been deleted after `since`
///
/// See also [`PartialCalendar::get_items_deleted_since`]
async fn get_items_deleted_since(&self, since: DateTime<Utc>) -> Result<HashSet<ItemId>, Box<dyn Error>>;
/// Returns the items that have been last-modified after `since`
async fn get_items_modified_since(&self, since: Option<DateTime<Utc>>, filter: Option<crate::calendar::SearchFilter>)
-> Result<HashMap<ItemId, &Item>, Box<dyn Error>>;
/// Returns the list of items that this calendar contains
async fn get_items(&self) -> Result<HashMap<ItemId, &Item>, Box<dyn Error>>;
}

View file

@ -3,7 +3,6 @@
use std::path::PathBuf;
use std::sync::{Arc, Mutex};
use chrono::{Utc, TimeZone};
use url::Url;
use my_tasks::traits::CalDavSource;
@ -56,23 +55,19 @@ async fn populate_test_provider() -> Provider<Cache, CachedCalendar, Cache, Cach
let cal_id = Url::parse("http://todo.list/cal").unwrap();
let task_a = Item::Task(Task::new("task A".into(), ItemId::random(), Utc.ymd(2000, 1, 1).and_hms(0, 0, 0), SyncStatus::random_synced()));
let task_b = Item::Task(Task::new("task B".into(), ItemId::random(), Utc.ymd(2000, 1, 2).and_hms(0, 0, 0), SyncStatus::random_synced()));
let task_c = Item::Task(Task::new("task C".into(), ItemId::random(), Utc.ymd(2000, 1, 3).and_hms(0, 0, 0), SyncStatus::random_synced()));
let task_d = Item::Task(Task::new("task D".into(), ItemId::random(), Utc.ymd(2000, 1, 4).and_hms(0, 0, 0), SyncStatus::random_synced()));
let task_e = Item::Task(Task::new("task E".into(), ItemId::random(), Utc.ymd(2000, 1, 5).and_hms(0, 0, 0), SyncStatus::random_synced()));
let task_f = Item::Task(Task::new("task F".into(), ItemId::random(), Utc.ymd(2000, 1, 6).and_hms(0, 0, 0), SyncStatus::random_synced()));
let task_g = Item::Task(Task::new("task G".into(), ItemId::random(), Utc.ymd(2000, 1, 7).and_hms(0, 0, 0), SyncStatus::random_synced()));
let task_h = Item::Task(Task::new("task H".into(), ItemId::random(), Utc.ymd(2000, 1, 8).and_hms(0, 0, 0), SyncStatus::random_synced()));
let task_i = Item::Task(Task::new("task I".into(), ItemId::random(), Utc.ymd(2000, 1, 9).and_hms(0, 0, 0), SyncStatus::random_synced()));
let task_j = Item::Task(Task::new("task J".into(), ItemId::random(), Utc.ymd(2000, 1, 10).and_hms(0, 0, 0), SyncStatus::random_synced()));
let task_k = Item::Task(Task::new("task K".into(), ItemId::random(), Utc.ymd(2000, 1, 11).and_hms(0, 0, 0), SyncStatus::random_synced()));
let task_l = Item::Task(Task::new("task L".into(), ItemId::random(), Utc.ymd(2000, 1, 12).and_hms(0, 0, 0), SyncStatus::random_synced()));
let task_m = Item::Task(Task::new("task M".into(), ItemId::random(), Utc.ymd(2000, 1, 12).and_hms(0, 0, 0), SyncStatus::random_synced()));
// let last_sync = task_m.last_modified();
// local.update_last_sync(Some(last_sync));
// assert!(last_sync < Utc::now());
let task_a = Item::Task(Task::new("task A".into(), ItemId::random(), SyncStatus::random_synced()));
let task_b = Item::Task(Task::new("task B".into(), ItemId::random(), SyncStatus::random_synced()));
let task_c = Item::Task(Task::new("task C".into(), ItemId::random(), SyncStatus::random_synced()));
let task_d = Item::Task(Task::new("task D".into(), ItemId::random(), SyncStatus::random_synced()));
let task_e = Item::Task(Task::new("task E".into(), ItemId::random(), SyncStatus::random_synced()));
let task_f = Item::Task(Task::new("task F".into(), ItemId::random(), SyncStatus::random_synced()));
let task_g = Item::Task(Task::new("task G".into(), ItemId::random(), SyncStatus::random_synced()));
let task_h = Item::Task(Task::new("task H".into(), ItemId::random(), SyncStatus::random_synced()));
let task_i = Item::Task(Task::new("task I".into(), ItemId::random(), SyncStatus::random_synced()));
let task_j = Item::Task(Task::new("task J".into(), ItemId::random(), SyncStatus::random_synced()));
let task_k = Item::Task(Task::new("task K".into(), ItemId::random(), SyncStatus::random_synced()));
let task_l = Item::Task(Task::new("task L".into(), ItemId::random(), SyncStatus::random_synced()));
let task_m = Item::Task(Task::new("task M".into(), ItemId::random(), SyncStatus::random_synced()));
let task_b_id = task_b.id().clone();
let task_c_id = task_c.id().clone();
@ -132,7 +127,7 @@ async fn populate_test_provider() -> Provider<Cache, CachedCalendar, Cache, Cach
cal_server.delete_item(&task_l_id).await.unwrap();
let task_n = Item::Task(Task::new("task N (new from server)".into(), ItemId::random(), Utc::now(), SyncStatus::random_synced()));
let task_n = Item::Task(Task::new("task N (new from server)".into(), ItemId::random(), SyncStatus::random_synced()));
cal_server.add_item(task_n).await;
@ -161,7 +156,7 @@ async fn populate_test_provider() -> Provider<Cache, CachedCalendar, Cache, Cach
cal_local.delete_item(&task_k_id).await.unwrap();
cal_local.delete_item(&task_l_id).await.unwrap();
let task_o = Item::Task(Task::new("task O (new from local)".into(), ItemId::random(), Utc::now(), SyncStatus::NotSynced));
let task_o = Item::Task(Task::new("task O (new from local)".into(), ItemId::random(), SyncStatus::NotSynced));
cal_local.add_item(task_o).await;
Provider::new(server, local)