Skip to content

Commit 918dfd3

Browse files
fix(Database): fix deleteing history from the corresponding sections
1 parent c6e97a1 commit 918dfd3

6 files changed

Lines changed: 84 additions & 70 deletions

File tree

src/backend/database.rs

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -911,9 +911,13 @@ impl<'a> Database<'a> {
911911
/// // Remove manga from user's history lists
912912
/// db.remove_from_history("manga_123")?;
913913
/// ```
914-
pub fn remove_from_history(&self, manga_id: &str) -> rusqlite::Result<()> {
915-
self.connection
916-
.execute("DELETE FROM manga_history_union WHERE manga_history_union.manga_id = ?1", params![manga_id])?;
914+
pub fn remove_from_history(&self, manga_id: &str, hist_type: MangaHistoryType) -> rusqlite::Result<()> {
915+
let hist_type_id = self.get_history_type(hist_type)?;
916+
917+
self.connection.execute(
918+
"DELETE FROM manga_history_union WHERE manga_history_union.manga_id = ?1 AND manga_history_union.type_id = ?2",
919+
params![manga_id, hist_type_id],
920+
)?;
917921

918922
Ok(())
919923
}
@@ -938,16 +942,17 @@ impl<'a> Database<'a> {
938942
pub fn remove_all_from_history(&self, hist_type: MangaHistoryType, provider: MangaProviders) -> rusqlite::Result<()> {
939943
let history_type_id = self.get_history_type(hist_type)?;
940944

941-
let get_ids_manga_to_delete_statement = r#"SELECT mangas.id from mangas
945+
let get_ids_manga_to_delete_statement = r#"SELECT mangas.id from mangas
942946
INNER JOIN manga_history_union ON mangas.id = manga_history_union.manga_id
943947
WHERE manga_history_union.type_id = ?1 AND mangas.manga_provider = ?2
944948
"#;
945949

946-
let delete_statement =
947-
format!("DELETE FROM manga_history_union WHERE manga_history_union.manga_id IN ({get_ids_manga_to_delete_statement})");
950+
let delete_statement = format!(
951+
"DELETE FROM manga_history_union WHERE manga_history_union.manga_id IN ({get_ids_manga_to_delete_statement}) AND manga_history_union.type_id = ?3"
952+
);
948953

949954
self.connection
950-
.execute(&delete_statement, params![history_type_id, provider.to_string()])?;
955+
.execute(&delete_statement, params![history_type_id, provider.to_string(), history_type_id])?;
951956

952957
Ok(())
953958
}
@@ -2179,7 +2184,7 @@ mod test {
21792184
/* at this point 2 mangas must be stored in reading history */
21802185
assert_eq!(expected.mangas.len(), 2);
21812186

2182-
database.remove_from_history(&manga_id_mangadex)?;
2187+
database.remove_from_history(&manga_id_mangadex, MangaHistoryType::ReadingHistory)?;
21832188

21842189
let expected = database.get_history(GetHistoryArgs {
21852190
hist_type: MangaHistoryType::ReadingHistory,
@@ -2233,7 +2238,7 @@ mod test {
22332238
/* at this point 2 mangas must be stored in reading history */
22342239
assert_eq!(expected.mangas.len(), 2);
22352240

2236-
database.remove_from_history(&manga_id_mangadex)?;
2241+
database.remove_from_history(&manga_id_mangadex, MangaHistoryType::PlanToRead)?;
22372242

22382243
let expected = database.get_history(GetHistoryArgs {
22392244
hist_type: MangaHistoryType::PlanToRead,
@@ -2246,6 +2251,17 @@ mod test {
22462251
/* now only one should exist */
22472252
assert_eq!(expected.mangas.len(), 1);
22482253

2254+
let expected = database.get_history(GetHistoryArgs {
2255+
hist_type: MangaHistoryType::ReadingHistory,
2256+
page: 1,
2257+
search: None,
2258+
items_per_page: 10,
2259+
provider: MangaProviders::Mangadex,
2260+
})?;
2261+
2262+
/* the reading history should be ketp the same */
2263+
assert_eq!(expected.mangas.len(), 2);
2264+
22492265
Ok(())
22502266
}
22512267

@@ -2265,7 +2281,7 @@ mod test {
22652281
let manga_id_weeb_central = Uuid::new_v4().to_string();
22662282
let manga_id_weeb_centra2 = Uuid::new_v4().to_string();
22672283

2268-
database.create_manga_if_not_exists(MangaInsert {
2284+
database.save_plan_to_read(MangaPlanToReadSave {
22692285
id: &manga_id_mangadex,
22702286
title: "of mangadex 1",
22712287
img_url: None,
@@ -2274,7 +2290,7 @@ mod test {
22742290

22752291
database.insert_manga_in_reading_history(&manga_id_mangadex)?;
22762292

2277-
database.create_manga_if_not_exists(MangaInsert {
2293+
database.save_plan_to_read(MangaPlanToReadSave {
22782294
id: &manga_id_mangadex2,
22792295
title: "of mangadex 2",
22802296
img_url: None,
@@ -2357,8 +2373,8 @@ mod test {
23572373
provider: MangaProviders::Mangadex,
23582374
})?;
23592375

2360-
/* at this point 2 mangas in plant to read should exist */
2361-
assert_eq!(expected.mangas.len(), 2);
2376+
/* at this point 4 mangas in plant to read should exist */
2377+
assert_eq!(expected.mangas.len(), 4);
23622378

23632379
database.remove_all_from_history(MangaHistoryType::ReadingHistory, MangaProviders::Mangadex)?;
23642380

@@ -2393,7 +2409,7 @@ mod test {
23932409
})?;
23942410

23952411
/* the plan to read history should remain untouched */
2396-
assert_eq!(expected.mangas.len(), 2);
2412+
assert_eq!(expected.mangas.len(), 4);
23972413

23982414
Ok(())
23992415
}

src/backend/manga_provider/mangadex.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,22 @@ impl MangadexClient {
382382
}
383383
}
384384
}
385+
386+
fn save_filters_on_close(&self, filters: Filters) {
387+
let filters_cache_writer = FiltersCache::new(&*MANGADEX_CACHE_BASE_DIRECTORY, MANGADEX_CACHE_FILENAME);
388+
389+
filters_cache_writer
390+
.write_to_cache(&filters)
391+
.inspect_err(|e| {
392+
#[cfg(not(test))]
393+
{
394+
use crate::backend::error_log::{ErrorType, write_to_error_log};
395+
396+
write_to_error_log(ErrorType::String(&e.to_string()));
397+
}
398+
})
399+
.ok();
400+
}
385401
}
386402

387403
impl GetRawImage for MangadexClient {
@@ -891,6 +907,7 @@ impl SearchPageProvider for MangadexClient {
891907
None => "".to_string(),
892908
};
893909

910+
let filters_to_save = filters.clone();
894911
let filters = filters.into_param();
895912
let items_per_page = pagination.items_per_page;
896913

@@ -982,6 +999,8 @@ impl SearchPageProvider for MangadexClient {
982999
})
9831000
.collect();
9841001

1002+
self.save_filters_on_close(filters_to_save);
1003+
9851004
Ok(GetMangasResponse {
9861005
mangas,
9871006
total_mangas,

src/backend/manga_provider/mangadex/filters/filter_provider.rs

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@ use tui_input::backend::crossterm::EventHandler;
1313

1414
use super::super::{API_URL_BASE, COVER_IMG_URL_BASE};
1515
use crate::backend::cache::in_memory::InMemoryCache;
16-
use crate::backend::manga_provider::filters::FiltersCache;
16+
use crate::backend::manga_provider::mangadex::MangadexClient;
1717
use crate::backend::manga_provider::mangadex::api_responses::authors::AuthorsResponse;
1818
use crate::backend::manga_provider::mangadex::api_responses::tags::TagsResponse;
1919
use crate::backend::manga_provider::mangadex::filters::api_parameter::*;
20-
use crate::backend::manga_provider::mangadex::{MANGADEX_CACHE_BASE_DIRECTORY, MANGADEX_CACHE_FILENAME, MangadexClient};
2120
use crate::backend::manga_provider::{EventHandler as FiltersEventHandler, FiltersHandler, Languages};
2221
use crate::backend::tui::Events;
2322

@@ -689,11 +688,8 @@ impl FiltersEventHandler for MangadexFilterProvider {
689688
impl FiltersHandler for MangadexFilterProvider {
690689
type InnerState = Filters;
691690

691+
#[inline]
692692
fn toggle(&mut self) {
693-
if self.is_open {
694-
self.save_filters_on_close();
695-
}
696-
697693
self.is_open = !self.is_open;
698694
}
699695

@@ -714,22 +710,6 @@ impl FiltersHandler for MangadexFilterProvider {
714710
}
715711

716712
impl MangadexFilterProvider {
717-
fn save_filters_on_close(&self) {
718-
let filters_cache_writer = FiltersCache::new(&*MANGADEX_CACHE_BASE_DIRECTORY, MANGADEX_CACHE_FILENAME);
719-
720-
filters_cache_writer
721-
.write_to_cache(&self.filters)
722-
.inspect_err(|e| {
723-
#[cfg(not(test))]
724-
{
725-
use crate::backend::error_log::{ErrorType, write_to_error_log};
726-
727-
write_to_error_log(ErrorType::String(&e.to_string()));
728-
}
729-
})
730-
.ok();
731-
}
732-
733713
pub fn reset(&mut self) {
734714
if self.tags_state.tags.is_some() {
735715
self.tags_state
@@ -1012,7 +992,7 @@ impl MangadexFilterProvider {
1012992
.already_existings_tags
1013993
.as_ref()
1014994
.and_then(|tags| {
1015-
let found_tag = tags.iter().find(|tag| tag.id == data.id);
995+
let found_tag = tags.iter().find(|tag| !tag.id.is_empty() && tag.id == data.id);
1016996

1017997
found_tag.map(|existing_tag| TagListItemState::from(existing_tag.state))
1018998
})

src/view/app.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,8 @@ use ::crossterm::event::KeyCode;
44
use crossterm::event::{KeyEvent, KeyModifiers};
55
use ratatui::Frame;
66
use ratatui::buffer::Buffer;
7-
use ratatui::layout::{Constraint, Layout, Margin, Rect};
8-
use ratatui::style::Styled;
9-
use ratatui::text::Line;
10-
use ratatui::widgets::block::Title;
11-
use ratatui::widgets::{Block, Borders, Clear, Paragraph, Tabs, Widget, Wrap};
7+
use ratatui::layout::{Constraint, Layout, Rect};
8+
use ratatui::widgets::{Block, Borders, Tabs, Widget};
129
use ratatui_image::picker::Picker;
1310
use tokio::sync::mpsc::{UnboundedReceiver, UnboundedSender, unbounded_channel};
1411

@@ -23,7 +20,6 @@ use crate::backend::tracker::MangaTracker;
2320
use crate::backend::tui::{Action, Events};
2421
use crate::config::MangaTuiConfig;
2522
use crate::global::INSTRUCTIONS_STYLE;
26-
use crate::utils::centered_rect;
2723
use crate::view::pages::*;
2824
use crate::view::widgets::ErrorModal;
2925

src/view/pages/feed.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -399,9 +399,7 @@ where
399399

400400
fn render_ask_modal_confirmation_delete_all_mangas(&mut self, area: Rect, buf: &mut Buffer) {
401401
if self.state == FeedState::AskingDeleteAllConfirmation {
402-
AskConfirmationDeleteAllModal::new()
403-
.with_manga_provider(self.manga_provider.as_ref().unwrap().name())
404-
.render(area, buf);
402+
AskConfirmationDeleteAllModal::new(self.tabs, self.manga_provider.as_ref().unwrap().name()).render(area, buf);
405403
}
406404
}
407405

@@ -445,8 +443,8 @@ where
445443
let connection = Database::get_connection().unwrap();
446444
let database = Database::new(&connection);
447445

448-
if let Err(err) = database.remove_from_history(&manga.id) {
449-
self.global_event_tx.as_ref().unwrap().send(Events::Error(err.to_string()));
446+
if let Err(err) = database.remove_from_history(&manga.id, self.tabs.into()) {
447+
self.global_event_tx.as_ref().unwrap().send(Events::Error(err.to_string())).ok();
450448
} else {
451449
self.search_history();
452450
}
@@ -496,7 +494,7 @@ where
496494
} else if self.state == FeedState::AskingDeleteAllConfirmation {
497495
match key_event.code {
498496
KeyCode::Char('w') => self.remove_all_mangas(),
499-
KeyCode::Char('q') => self.state = FeedState::DisplayingHistory,
497+
KeyCode::Char('q') | KeyCode::Esc => self.state = FeedState::DisplayingHistory,
500498
_ => {},
501499
}
502500
} else {

src/view/widgets/feed.rs

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1+
use std::fmt::Display;
2+
13
use chrono::NaiveDate;
2-
use crossterm::event::{KeyCode, KeyEvent};
34
use ratatui::buffer::Buffer;
45
use ratatui::layout::{Constraint, Layout, Margin, Rect};
5-
use ratatui::style::{Color, Style, Styled, Stylize};
6+
use ratatui::style::{Color, Style, Stylize};
67
use ratatui::text::Line;
7-
use ratatui::widgets::block::Title;
88
use ratatui::widgets::{Block, Borders, List, ListItem, Paragraph, StatefulWidget, Widget, WidgetRef, Wrap};
99
use tui_widget_list::PreRender;
1010

1111
use crate::backend::database::MangaHistoryResponse;
12-
use crate::backend::manga_provider::{Languages, LatestChapter, MangaProvider, MangaProviders};
13-
use crate::global::{CURRENT_LIST_ITEM_STYLE, INSTRUCTIONS_STYLE};
12+
use crate::backend::manga_provider::{Languages, LatestChapter, MangaProviders};
13+
use crate::global::CURRENT_LIST_ITEM_STYLE;
1414
use crate::utils::display_dates_since_publication;
1515
use crate::view::widgets::ModalBuilder;
1616

@@ -20,6 +20,15 @@ pub enum FeedTabs {
2020
PlantToRead,
2121
}
2222

23+
impl Display for FeedTabs {
24+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25+
match self {
26+
Self::History => write!(f, "Reading history"),
27+
Self::PlantToRead => write!(f, "Plan to Read"),
28+
}
29+
}
30+
}
31+
2332
impl FeedTabs {
2433
pub fn cycle(self) -> Self {
2534
match self {
@@ -220,29 +229,27 @@ impl StatefulWidget for HistoryWidget {
220229
#[derive(Debug)]
221230
struct AskConfirmationDeleteAllModalBody {
222231
manga_provider: MangaProviders,
232+
tab: FeedTabs,
223233
}
224234

225235
impl WidgetRef for AskConfirmationDeleteAllModalBody {
226236
fn render_ref(&self, area: Rect, buf: &mut Buffer) {
227-
Block::bordered()
228-
//.title(Title::from(Line::from(vec![
229-
// "Some error ocurred, press ".into(),
230-
// "<q>".set_style(*INSTRUCTIONS_STYLE),
231-
// " to close this popup".into(),
232-
//])))
233-
.render(area, buf);
237+
Block::bordered().render(area, buf);
234238

235239
let inner = area.inner(Margin {
236240
horizontal: 2,
237241
vertical: 2,
238242
});
239243

240-
let warning = format!("Are you sure you want to delete ALL mangas from the manga provider: {}?", self.manga_provider);
244+
let warning = format!(
245+
"Are you sure you want to delete ALL mangas from the manga provider: {} in the section {}?",
246+
self.manga_provider, self.tab
247+
);
241248

242249
let as_list = List::new(Line::from(vec![
243250
warning.into(),
244251
"".into(),
245-
"Your reading history will still be kept but not from this `Feed` page".into(),
252+
"Your reading history and download status will still be kept but not from this `Feed` page".into(),
246253
"Yes: <w>".bold().fg(Color::Red),
247254
"No: <q>".bold().fg(Color::Green),
248255
]));
@@ -254,19 +261,16 @@ impl WidgetRef for AskConfirmationDeleteAllModalBody {
254261
#[derive(Debug)]
255262
pub struct AskConfirmationDeleteAllModal {
256263
manga_provider: MangaProviders,
264+
tab: FeedTabs,
257265
}
258266

259267
impl AskConfirmationDeleteAllModal {
260-
pub fn new() -> Self {
268+
pub fn new(tab: FeedTabs, provider: MangaProviders) -> Self {
261269
Self {
262-
manga_provider: MangaProviders::default(),
270+
manga_provider: provider,
271+
tab,
263272
}
264273
}
265-
266-
pub fn with_manga_provider(mut self, manga_prov: MangaProviders) -> Self {
267-
self.manga_provider = manga_prov;
268-
self
269-
}
270274
}
271275

272276
impl Widget for AskConfirmationDeleteAllModal {
@@ -276,6 +280,7 @@ impl Widget for AskConfirmationDeleteAllModal {
276280
{
277281
let modal = ModalBuilder::new(AskConfirmationDeleteAllModalBody {
278282
manga_provider: self.manga_provider,
283+
tab: self.tab,
279284
})
280285
.with_dimensions(super::ModalDimensions {
281286
width: 70,

0 commit comments

Comments
 (0)