Skip to content

Commit a4a5f18

Browse files
committed
cleanup: remove api.rs dead code; fire AppStatusChanged in renew_all and check_invalid_applications; add app_id to AppStatusChanged event
1 parent d209dc6 commit a4a5f18

5 files changed

Lines changed: 95 additions & 89 deletions

File tree

src/api.rs

Lines changed: 0 additions & 54 deletions
This file was deleted.

src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
pub mod api;
21
mod cache;
32
mod core;
43
pub mod database;

src/manager/app_manager.rs

Lines changed: 55 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -189,20 +189,42 @@ impl AppManager {
189189

190190
for (app, (_, maybe_release)) in simple_apps.iter().zip(latest_results.iter()) {
191191
if let Some(release) = maybe_release {
192-
let mut maps = version_maps.write().await;
193-
let vm = maps.entry(app.id.clone()).or_insert_with(|| {
194-
VersionMap::new(
195-
app.invalid_version_number_field_regex.clone(),
196-
app.include_version_number_field_regex.clone(),
192+
let new_status = {
193+
let mut maps = version_maps.write().await;
194+
let vm = maps.entry(app.id.clone()).or_insert_with(|| {
195+
VersionMap::new(
196+
app.invalid_version_number_field_regex.clone(),
197+
app.include_version_number_field_regex.clone(),
198+
)
199+
});
200+
vm.add_single_release(&hub.uuid, release.clone());
201+
let local_version: Option<String> =
202+
match android_api::get_android_api() {
203+
Some(api) => api.get_local_version(&app.app_id).await,
204+
None => None,
205+
};
206+
get_release_status(
207+
vm,
208+
local_version.as_deref(),
209+
app.ignore_version_number.as_deref(),
210+
true,
197211
)
198-
});
199-
vm.add_single_release(&hub.uuid, release.clone());
212+
};
200213
let done =
201214
completed.fetch_add(1, std::sync::atomic::Ordering::SeqCst) + 1;
202215
if let Some(ref f) = cb {
203216
f(done, total);
204217
}
205218
notify_if_registered(ManagerEvent::RenewProgress { done, total }).await;
219+
if new_status != AppStatus::AppPending {
220+
notify_if_registered(ManagerEvent::AppStatusChanged {
221+
record_id: app.id.clone(),
222+
app_id: app.app_id.clone(),
223+
old_status: AppStatus::AppPending,
224+
new_status,
225+
})
226+
.await;
227+
}
206228
} else {
207229
// Batch returned nothing for this app — escalate to full list.
208230
need_full.push(app.clone());
@@ -212,30 +234,44 @@ impl AppManager {
212234

213235
// --- Full release-list path ---
214236
for app in need_full {
215-
if let Some(releases) = getter.get_release_list(&hub, &app.app_id).await {
216-
let mut maps = version_maps.write().await;
217-
let vm = maps.entry(app.id.clone()).or_insert_with(|| {
218-
VersionMap::new(
219-
app.invalid_version_number_field_regex.clone(),
220-
app.include_version_number_field_regex.clone(),
221-
)
222-
});
223-
vm.add_release_list(&hub.uuid, releases);
224-
} else {
237+
let new_status = {
225238
let mut maps = version_maps.write().await;
226239
let vm = maps.entry(app.id.clone()).or_insert_with(|| {
227240
VersionMap::new(
228241
app.invalid_version_number_field_regex.clone(),
229242
app.include_version_number_field_regex.clone(),
230243
)
231244
});
232-
vm.set_error(&hub.uuid);
233-
}
245+
if let Some(releases) = getter.get_release_list(&hub, &app.app_id).await {
246+
vm.add_release_list(&hub.uuid, releases);
247+
} else {
248+
vm.set_error(&hub.uuid);
249+
}
250+
let local_version: Option<String> = match android_api::get_android_api() {
251+
Some(api) => api.get_local_version(&app.app_id).await,
252+
None => None,
253+
};
254+
get_release_status(
255+
vm,
256+
local_version.as_deref(),
257+
app.ignore_version_number.as_deref(),
258+
true,
259+
)
260+
};
234261
let done = completed.fetch_add(1, std::sync::atomic::Ordering::SeqCst) + 1;
235262
if let Some(ref f) = cb {
236263
f(done, total);
237264
}
238265
notify_if_registered(ManagerEvent::RenewProgress { done, total }).await;
266+
if new_status != AppStatus::AppPending {
267+
notify_if_registered(ManagerEvent::AppStatusChanged {
268+
record_id: app.id.clone(),
269+
app_id: app.app_id.clone(),
270+
old_status: AppStatus::AppPending,
271+
new_status,
272+
})
273+
.await;
274+
}
239275
}
240276
});
241277
handles.push(handle);

src/manager/notification.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ pub fn get_notification() -> Option<&'static NotificationDispatcher> {
2121
pub enum ManagerEvent {
2222
AppStatusChanged {
2323
record_id: String,
24+
app_id: std::collections::HashMap<String, Option<String>>,
2425
old_status: AppStatus,
2526
new_status: AppStatus,
2627
},
@@ -109,6 +110,10 @@ mod tests {
109110
fn test_event_serialization_status_changed() {
110111
let event = ManagerEvent::AppStatusChanged {
111112
record_id: "abc-123".to_string(),
113+
app_id: std::collections::HashMap::from([(
114+
"owner".to_string(),
115+
Some("alice".to_string()),
116+
)]),
112117
old_status: AppStatus::AppPending,
113118
new_status: AppStatus::AppOutdated,
114119
};

src/rpc/server.rs

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::data::*;
2-
use crate::api as api_root;
2+
use crate::cache::init_cache_manager_with_expire;
3+
use crate::core::config::world::{init_world_list, world_list};
34
use crate::database::get_db;
45
use crate::database::models::extra_hub::GLOBAL_HUB_ID;
56
use crate::downloader::{DownloadConfig, DownloadTaskManager};
@@ -95,15 +96,25 @@ pub async fn run_server(
9596
let request = params.parse::<RpcInitRequest>()?;
9697
let data_dir = Path::new(request.data_path);
9798
let cache_dir = Path::new(request.cache_path);
98-
api_root::init(data_dir, cache_dir, request.global_expire_time)
99-
.await
100-
.map_err(|e| {
101-
ErrorObjectOwned::owned(
102-
ErrorCode::InternalError.code(),
103-
"Internal error",
104-
Some(e.to_string()),
105-
)
106-
})?;
99+
// Initialize world list, cache, and database.
100+
let world_list_path = data_dir.join(world_list::WORLD_CONFIG_LIST_NAME);
101+
init_world_list(&world_list_path).await.map_err(|e| {
102+
ErrorObjectOwned::owned(
103+
ErrorCode::InternalError.code(),
104+
"Internal error",
105+
Some(e.to_string()),
106+
)
107+
})?;
108+
let local_cache_path = cache_dir.join("local_cache");
109+
init_cache_manager_with_expire(local_cache_path.as_path(), request.global_expire_time)
110+
.await;
111+
crate::database::init_db(data_dir).map_err(|e| {
112+
ErrorObjectOwned::owned(
113+
ErrorCode::InternalError.code(),
114+
"Internal error",
115+
Some(e.to_string()),
116+
)
117+
})?;
107118

108119
// Initialize managers (idempotent: only on first call)
109120
if APP_MANAGER.get().is_none() {
@@ -541,11 +552,20 @@ pub async fn run_server(
541552
let hub_mgr = get_hub_manager().ok_or_else(manager_not_init_err)?;
542553
let hubs = hub_mgr.read().await.get_hub_list().await;
543554
let known_uuids: Vec<String> = hubs.into_iter().map(|h| h.uuid).collect();
544-
let invalid_ids = app_mgr
545-
.read()
546-
.await
547-
.check_invalid_applications(&known_uuids)
548-
.await;
555+
let mgr = app_mgr.read().await;
556+
let invalid_ids = mgr.check_invalid_applications(&known_uuids).await;
557+
// Notify Kotlin UI about each invalid app so it can update status.
558+
for record_id in &invalid_ids {
559+
if let Some(app) = mgr.get_app(record_id).await {
560+
notification::notify_if_registered(notification::ManagerEvent::AppStatusChanged {
561+
record_id: record_id.clone(),
562+
app_id: app.app_id.clone(),
563+
old_status: crate::manager::app_status::AppStatus::AppLatest,
564+
new_status: crate::manager::app_status::AppStatus::AppInactive,
565+
})
566+
.await;
567+
}
568+
}
549569
Ok::<Vec<String>, ErrorObjectOwned>(invalid_ids)
550570
})?;
551571

0 commit comments

Comments
 (0)