From 11d5144db5a2efb643b4c7186ad52f84fe3f9715 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Mon, 31 Aug 2026 12:12:14 +0300 Subject: [PATCH] Added repositories into AppState --- src/app.rs | 36 ++++++++++++++++-------------- src/data/entities.rs | 11 +++++++++ src/data/repositories.rs | 21 ++++++++++++++++- src/data_provider/card_states.rs | 2 +- src/data_provider/custom_fields.rs | 2 +- src/data_provider/decks.rs | 3 ++- src/data_provider/mod.rs | 9 ++++++++ src/data_provider/word_groups.rs | 3 ++- src/data_provider/words.rs | 3 ++- 9 files changed, 67 insertions(+), 23 deletions(-) diff --git a/src/app.rs b/src/app.rs index d565458..dc7e187 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,11 +1,9 @@ use std::sync::Arc; use crate::data::Id; -use crate::data::entities::DeckSettings; -use crate::data::entities::{WordData, WordGroup}; -use crate::data_provider::decks::load_sets; +use crate::data_provider::decks::{DeckRepository}; use crate::data_provider::settings::get_setting; use crate::data_provider::sqlite::{SqliteConnection}; -use crate::data_provider::words::{load_word_groups, load_words}; +use crate::data_provider::words::{WordRepository}; use crate::navigation::RootMessage::Keyboard; use crate::navigation::{AppSettings, RootMessage, ScreenState}; use chrono::NaiveDate; @@ -18,6 +16,9 @@ use iced_core::{Font, Size, Theme}; use log::info; use parking_lot::RwLock; use rusqlite::Connection; +use crate::data::repositories::Repository; +use crate::data_provider::word_groups::WordGroupRepository; + pub const USER_FONT: Font = Font::with_name("Noto Sans JP"); pub fn start() -> iced::Result { @@ -61,9 +62,9 @@ fn subscription(_state: &ScreenState) -> Subscription { #[derive(Clone)] pub struct AppState { - pub dictionary: Vec, - pub decks: Vec, - pub word_groups: Vec, + pub dictionary: WordRepository, + pub decks: DeckRepository, + pub word_groups: WordGroupRepository, pub connection: Arc>, pub sync_data: Arc>, pub activity: HashMap>, @@ -77,30 +78,31 @@ impl Default for AppState { impl AppState { pub fn new() -> Self { + let connection = Arc::new(RwLock::new(SqliteConnection::default())); Self { - dictionary: vec![], - decks: vec![], - word_groups: vec![], - connection: Arc::new(RwLock::new(Default::default())), + dictionary: WordRepository::new(connection.clone()), + decks: DeckRepository::new(connection.clone()), + word_groups: WordGroupRepository::new(connection.clone()), sync_data: Arc::new(RwLock::new(AppSettings { key: None, auto_web_fetch: false, })), activity: Default::default(), + connection, } } } pub fn fill_state(state: &mut AppState) { let connection = state.connection.read(); - let list = load_words(&connection); - let sets = load_sets(&connection); - let groups = load_word_groups(&connection); + let setting = load_settings(&connection); - state.dictionary = list.unwrap_or_default(); - state.decks = sets.unwrap_or_default(); - state.word_groups = groups.unwrap_or_default(); + state.word_groups.write().start().unwrap(); + state.dictionary.write().start().unwrap(); + state.decks.write().start().unwrap(); + + state.sync_data = Arc::new(RwLock::new(setting)) } diff --git a/src/data/entities.rs b/src/data/entities.rs index f4027fa..9f42fc1 100644 --- a/src/data/entities.rs +++ b/src/data/entities.rs @@ -79,6 +79,17 @@ pub struct DeckSettings { pub count: Option, pub open_mode: OrderMode, } + +impl EntityData for DeckSettings { + fn id(&self) -> Id { + self.id + } + + fn set_id(&mut self, id: Id) { + self.id = id; + } +} + impl DeckSettings { pub(crate) fn with_name(name: String) -> DeckSettings { DeckSettings { diff --git a/src/data/repositories.rs b/src/data/repositories.rs index 971c5df..2c23a7d 100644 --- a/src/data/repositories.rs +++ b/src/data/repositories.rs @@ -10,6 +10,7 @@ use rusqlite::Connection; use std::marker::PhantomData; use std::ops::Deref; use std::sync::Arc; +use crate::data_provider::sqlite::SqliteConnection; pub trait Repository where @@ -192,13 +193,31 @@ pub struct DataRepositoryInner> cache: Vec, temporal: Vec, next_temporal: u32, - connection: Arc>, + connection: Arc>, data_layer: D, query_manger: QueryManger, version: u16, shifts: u16, } +impl + std::default::Default> DataRepository { + pub fn new(connection: Arc>) -> DataRepository { + Self{ + inner: Arc::new(RwLock::new(DataRepositoryInner{ + cache: vec![], + temporal: vec![], + next_temporal: 0, + connection, + data_layer: Default::default(), + query_manger: QueryManger { queries: vec![] }, + version: 0, + shifts: 0, + })), + } + } +} + + impl> Deref for DataRepository { type Target = Arc>>; diff --git a/src/data_provider/card_states.rs b/src/data_provider/card_states.rs index 837dfba..7be5ec8 100644 --- a/src/data_provider/card_states.rs +++ b/src/data_provider/card_states.rs @@ -9,7 +9,7 @@ use rusqlite::{Connection, Error, Params, Row, params}; use std::time::Instant; use crate::data::repositories::DataRepository; -type CardStateRepository = DataRepository>; +pub type CardStateRepository = DataRepository>; pub struct CardStatesQuerySet; impl TableAccessQuerySet for CardStatesQuerySet { fn load() -> &'static str { diff --git a/src/data_provider/custom_fields.rs b/src/data_provider/custom_fields.rs index a3f2454..6f09efa 100644 --- a/src/data_provider/custom_fields.rs +++ b/src/data_provider/custom_fields.rs @@ -3,7 +3,7 @@ use crate::data::repositories::DataRepository; use crate::data_provider::{SqliteDbLayer, TableAccessQuerySet}; use rusqlite::{Error, Params, Row}; -type CustomFieldRepository = DataRepository>; +pub type CustomFieldRepository = DataRepository>; pub struct CustomFieldsQuerySet; impl TableAccessQuerySet for CustomFieldsQuerySet { diff --git a/src/data_provider/decks.rs b/src/data_provider/decks.rs index f23b499..f498b20 100644 --- a/src/data_provider/decks.rs +++ b/src/data_provider/decks.rs @@ -8,8 +8,9 @@ use rusqlite::{Connection, Error, Params, Row}; use crate::data::repositories::DataRepository; use crate::data_provider::card_states::CardStatesQuerySet; -type DeckRepository = DataRepository>; +pub type DeckRepository = DataRepository>; +#[derive(Clone)] pub struct DeckQuerySet; impl TableAccessQuerySet for DeckQuerySet { fn load() -> &'static str { diff --git a/src/data_provider/mod.rs b/src/data_provider/mod.rs index adffc77..94dc435 100644 --- a/src/data_provider/mod.rs +++ b/src/data_provider/mod.rs @@ -30,6 +30,7 @@ pub trait TableAccessQuerySet { fn update_params(entity: &T) -> impl Params; } +#[derive(Clone)] pub struct SqliteDbLayer where Q: TableAccessQuerySet, @@ -37,6 +38,14 @@ where _phantom: PhantomData<(T, Q)>, } +impl> Default for SqliteDbLayer{ + fn default() -> Self { + Self{ + _phantom: PhantomData, + } + } +} + impl> DbLayer for SqliteDbLayer { fn write_entity(&self, entity: &T, connection: &Connection) -> MaybeError { let time = Instant::now(); diff --git a/src/data_provider/word_groups.rs b/src/data_provider/word_groups.rs index eaafd14..93fe5f2 100644 --- a/src/data_provider/word_groups.rs +++ b/src/data_provider/word_groups.rs @@ -4,8 +4,9 @@ use rusqlite::{Error, Params, Row}; use crate::data::repositories::DataRepository; use crate::data_provider::decks::DeckQuerySet; -type WordGroupRepository = DataRepository>; +pub type WordGroupRepository = DataRepository>; +#[derive(Clone)] pub struct WordGroupQuerySet; impl TableAccessQuerySet for WordGroupQuerySet { fn load() -> &'static str { diff --git a/src/data_provider/words.rs b/src/data_provider/words.rs index 3491c50..45f780e 100644 --- a/src/data_provider/words.rs +++ b/src/data_provider/words.rs @@ -7,8 +7,9 @@ use rusqlite::{Connection, Error, Params, Row, params}; use std::collections::HashMap; use crate::data::repositories::DataRepository; -type DeckRepository = DataRepository>; +pub type WordRepository = DataRepository>; +#[derive(Clone)] pub struct WordQuerySet; impl TableAccessQuerySet for WordQuerySet { fn load() -> &'static str {