use std::io::Error;
use std::path::{Path, PathBuf};
use std::pin::Pin;
-use sea_orm::{ActiveModelTrait, Database, DatabaseConnection, EntityTrait, QueryFilter, ColumnTrait, Set, QueryOrder, DbErr, ExprTrait, UpdateResult};
+use sea_orm::{ActiveModelTrait, Database, DatabaseConnection, EntityTrait, QueryFilter, ColumnTrait, Set, QueryOrder, DbErr, ExprTrait, UpdateResult, QuerySelect};
use tokio::runtime::Runtime;
use std::sync::{Arc};
use std::thread::JoinHandle;
});
let _ = self.tx.send(cmd);
}
+
+ pub fn move_note_to_trash<F>(&self, note_id: i32, callback: F)
+ where F: FnOnce(Result<(), DbErr>) + Send + 'static {
+ let backend = self.backend.clone();
+ let cmd = Box::pin(async move {
+ let profile_id = backend.current_profile.id;
+
+ let res: Result<(), DbErr> = async {
+ let trash_id = BackendHandle::get_trash_id(&backend.db, profile_id)
+ .await?
+ .ok_or_else(|| DbErr::Custom("Trash not found".into()))?;
+
+ let result = note::Entity::update_many()
+ .filter(note::Column::NoteId.eq(note_id))
+ .col_expr(Column::CollectionId, Expr::value(trash_id))
+ .exec(&backend.db).await?;
+
+ if result.rows_affected == 1 {
+ Ok(())
+ } else {
+ Err(DbErr::Custom("unexpected number of affected rows".into()))
+ }
+ }.await;
+
+ callback(res);
+ });
+ let _ = self.tx.send(cmd);
+ }
+
+ async fn get_trash_id(db: &DatabaseConnection, profile_id: i32) -> Result<Option<i32>, DbErr> {
+ Collection::find()
+ .filter(collection::Column::ProfileId.eq(profile_id))
+ .select_only()
+ .column(collection::Column::CollectionId)
+ .into_tuple::<(i32)>()
+ .one(db).await
+ }
}