Skip to content

Commit 387c3c6

Browse files
committed
feat(getter): add manager RPC methods and wire database init into api::init
- api.rs: call database::init_db() inside init() so DB is ready after first RPC call - rpc/data.rs: add manager request/response types (App/Hub CRUD, ignore, virtual apps, extra hub) - rpc/server.rs: register global APP_MANAGER + HUB_MANAGER (OnceCell<Arc<RwLock<...>>>) initialised during 'init' RPC; expose 14 new manager methods: manager_get_apps, manager_save_app, manager_delete_app, manager_get_app_status, manager_set_virtual_apps, manager_renew_all, manager_get_hubs, manager_save_hub, manager_delete_hub, manager_hub_ignore_app, manager_set_applications_mode, manager_get_extra_hubs, manager_save_extra_hub, manager_delete_extra_hub
1 parent 63c9da7 commit 387c3c6

4 files changed

Lines changed: 318 additions & 34 deletions

File tree

src/api.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::path::Path;
33

44
use crate::cache::init_cache_manager_with_expire;
55
use crate::core::config::world::{init_world_list, world_list};
6+
use crate::database;
67
use crate::error::Result;
78
use crate::websdk::repo::api;
89

@@ -16,6 +17,8 @@ pub async fn init(data_dir: &Path, cache_dir: &Path, global_expire_time: u64) ->
1617
// cache
1718
let local_cache_path = cache_dir.join("local_cache");
1819
init_cache_manager_with_expire(local_cache_path.as_path(), global_expire_time).await;
20+
// database
21+
database::init_db(data_dir)?;
1922
Ok(())
2023
}
2124

src/manager/app_manager.rs

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,7 @@ use crate::database::get_db;
1010
use crate::database::models::app::AppRecord;
1111
use crate::error::Result;
1212

13-
/// Update event emitted when an app's status changes during a renew cycle.
14-
#[derive(Debug, Clone)]
15-
pub struct UpdateEvent {
16-
pub app_id: String,
17-
pub status: AppStatus,
18-
}
19-
20-
pub type UpdateCallback = Arc<dyn Fn(UpdateEvent) + Send + Sync>;
13+
pub type UpdateCallback = Arc<dyn Fn(usize, usize) + Send + Sync>;
2114

2215
/// Manages all tracked apps and their version data.
2316
///
@@ -30,8 +23,6 @@ pub struct AppManager {
3023
/// In-memory version maps keyed by app record id
3124
version_maps: Arc<RwLock<HashMap<String, VersionMap>>>,
3225
data_getter: Arc<DataGetter>,
33-
/// Optional callback invoked on each status change during renew
34-
update_callback: Option<UpdateCallback>,
3526
}
3627

3728
impl AppManager {
@@ -43,14 +34,9 @@ impl AppManager {
4334
virtual_apps: Arc::new(RwLock::new(vec![])),
4435
version_maps: Arc::new(RwLock::new(HashMap::new())),
4536
data_getter: Arc::new(DataGetter::new()),
46-
update_callback: None,
4737
})
4838
}
4939

50-
pub fn set_update_callback(&mut self, cb: UpdateCallback) {
51-
self.update_callback = Some(cb);
52-
}
53-
5440
/// Replace the virtual app list (installed Android packages).
5541
pub async fn set_virtual_apps(&self, apps: Vec<AppRecord>) {
5642
*self.virtual_apps.write().await = apps;
@@ -125,7 +111,7 @@ impl AppManager {
125111
pub async fn renew_all(
126112
&self,
127113
hubs: &[crate::database::models::hub::HubRecord],
128-
progress_cb: Option<&dyn Fn(usize, usize)>,
114+
progress_cb: Option<UpdateCallback>,
129115
) {
130116
let apps = self.get_saved_apps().await;
131117
let total = apps.len();
@@ -159,13 +145,9 @@ impl AppManager {
159145
let hub = hub.clone();
160146
let getter = self.data_getter.clone();
161147
let version_maps = self.version_maps.clone();
162-
let _apps_map = self.apps.clone();
163148
let sem = semaphore.clone();
164149
let completed = completed.clone();
165-
let cb_arc: Option<Arc<dyn Fn(usize, usize) + Send + Sync>> = progress_cb.map(|_| {
166-
// Can't capture non-Send closure; skip progress in async context
167-
Arc::new(|_: usize, _: usize| {}) as Arc<dyn Fn(usize, usize) + Send + Sync>
168-
});
150+
let cb = progress_cb.clone();
169151

170152
let handle = tokio::spawn(async move {
171153
let _permit = sem.acquire().await.unwrap();
@@ -213,9 +195,9 @@ impl AppManager {
213195
});
214196
vm.set_error(&hub.uuid);
215197
}
216-
completed.fetch_add(1, std::sync::atomic::Ordering::SeqCst);
217-
if let Some(ref cb) = cb_arc {
218-
cb(completed.load(std::sync::atomic::Ordering::SeqCst), total);
198+
let done = completed.fetch_add(1, std::sync::atomic::Ordering::SeqCst) + 1;
199+
if let Some(ref f) = cb {
200+
f(done, total);
219201
}
220202
}
221203
});
@@ -232,7 +214,6 @@ impl AppManager {
232214
mod tests {
233215
use super::*;
234216
use crate::database;
235-
use std::collections::HashMap;
236217

237218
#[test]
238219
fn test_app_record_save_and_load() {
@@ -251,13 +232,6 @@ mod tests {
251232

252233
#[tokio::test]
253234
async fn test_version_map_get_status_no_data() {
254-
let dir = tempfile::tempdir().unwrap();
255-
// Use Database directly to avoid global init conflict
256-
let db = database::Database::open(dir.path()).unwrap();
257-
let app = AppRecord::new("App".to_string(), HashMap::new());
258-
db.upsert_app(&app).unwrap();
259-
260-
// Simulate with a fresh VersionMap
261235
let mut vm = VersionMap::new(None, None);
262236
let status = get_release_status(&mut vm, Some("1.0.0"), None, true);
263237
// Empty version map + is_saved → NetworkError (no hub_status entries)

src/rpc/data.rs

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,3 +249,94 @@ impl ToRpcParams for RpcUnregisterDownloaderRequest<'_> {
249249
to_raw_value(&self).map(Some)
250250
}
251251
}
252+
253+
// ============================================================================
254+
// Manager RPC Data Structures
255+
// ============================================================================
256+
257+
use crate::database::models::app::AppRecord;
258+
use crate::database::models::extra_hub::ExtraHubRecord;
259+
use crate::database::models::hub::HubRecord;
260+
use crate::manager::app_status::AppStatus;
261+
262+
/// Response wrapping a list of apps with their current status.
263+
#[derive(Serialize, Deserialize, Debug, Clone)]
264+
pub struct AppWithStatus {
265+
pub record: AppRecord,
266+
pub status: AppStatus,
267+
}
268+
269+
/// Request to save/update an app record.
270+
#[derive(Serialize, Deserialize, Debug)]
271+
pub struct RpcSaveAppRequest {
272+
pub record: AppRecord,
273+
}
274+
275+
/// Request to delete an app by record id.
276+
#[derive(Serialize, Deserialize, Debug)]
277+
pub struct RpcDeleteAppRequest {
278+
pub record_id: String,
279+
}
280+
281+
/// Request to get a single app by record id.
282+
#[derive(Serialize, Deserialize, Debug)]
283+
pub struct RpcGetAppRequest {
284+
pub record_id: String,
285+
}
286+
287+
/// Request to save/update a hub record.
288+
#[derive(Serialize, Deserialize, Debug)]
289+
pub struct RpcSaveHubRequest {
290+
pub record: HubRecord,
291+
}
292+
293+
/// Request to delete a hub by UUID.
294+
#[derive(Serialize, Deserialize, Debug)]
295+
pub struct RpcDeleteHubRequest {
296+
pub hub_uuid: String,
297+
}
298+
299+
/// Request to get a hub by UUID.
300+
#[derive(Serialize, Deserialize, Debug)]
301+
pub struct RpcGetHubRequest {
302+
pub hub_uuid: String,
303+
}
304+
305+
/// Request to set the applications mode for a hub.
306+
#[derive(Serialize, Deserialize, Debug)]
307+
pub struct RpcSetApplicationsModeRequest {
308+
pub hub_uuid: String,
309+
pub enable: bool,
310+
}
311+
312+
/// Request to ignore/unignore an app in a hub.
313+
#[derive(Serialize, Deserialize, Debug)]
314+
pub struct RpcHubIgnoreAppRequest {
315+
pub hub_uuid: String,
316+
pub app_id: HashMap<String, Option<String>>,
317+
pub ignore: bool,
318+
}
319+
320+
/// Request to set virtual (installed) apps list from Android.
321+
#[derive(Serialize, Deserialize, Debug)]
322+
pub struct RpcSetVirtualAppsRequest {
323+
pub apps: Vec<AppRecord>,
324+
}
325+
326+
/// Request to get app status.
327+
#[derive(Serialize, Deserialize, Debug)]
328+
pub struct RpcGetAppStatusRequest {
329+
pub record_id: String,
330+
}
331+
332+
/// Request to save/update an ExtraHub record.
333+
#[derive(Serialize, Deserialize, Debug)]
334+
pub struct RpcSaveExtraHubRequest {
335+
pub record: ExtraHubRecord,
336+
}
337+
338+
/// Request to get an ExtraHub by id.
339+
#[derive(Serialize, Deserialize, Debug)]
340+
pub struct RpcGetExtraHubRequest {
341+
pub id: String,
342+
}

0 commit comments

Comments
 (0)