Files
nosys_libs/noSys/dataManager.py
2026-01-25 13:55:46 +10:00

145 lines
5.6 KiB
Python

from typing import Dict, List, Optional, Any
from libs.app.common.store import DataStore
from libs.fspn.utils.sha256_util import hash_string
class DataManager():
def __init__(self, nosys_core):
from .noSysCore import NoSysCore
self.nosys_core:NoSysCore = nosys_core
self.store = DataStore(path="noSys/data.json", default_data={"users":[], "rendezvous":[], "networks":[]})
# ------------------- USER CRUD -------------------
def add_user(self, user_id: str):
if self.get_user(user_id):
raise ValueError(f"User {user_id} already exists")
user = {"id": user_id, "networks":[]}
self.store.add_item("users", user, unique=True, id_field="id", id=user_id)
return user
def get_user(self, user_id: str):
return self.store.get_item("users", "id", user_id)
def list_users(self):
return self.store.list_items("users")
def delete_user(self, user_id: str) -> bool:
return self.store.remove_item("users", "id", user_id)
def update_user(self, user_id: str, updates: Dict[str, Any]) -> bool:
return self.store.update_item("users", "id", user_id, updates)
# ------------------- USER NETWORK MANAGEMENT -------------------
def user_add_network(self, user_id: str, network_id: str) -> bool:
user = self.get_user(user_id)
if not user:
return False
if network_id not in user.get("networks"):
user.setdefault("networks").append(network_id)
return self.update_user(user_id, {"networks": user["networks"]})
return False
def user_remove_network(self, user_id: str, network_id: str) -> bool:
user = self.get_user(user_id)
if not user:
return False
if network_id not in user.get("networks"):
new_networks = [n for n in user["networks"] if n != network_id]
return self.update_user(user_id, {"networks": new_networks})
return False
def user_list_networks(self, user_id: str) -> List[str]:
user = self.get_user(user_id)
return user["networks", []] if user else []
# ------------------- RENDEZVOUS CRUD -------------------
def add_rendezvous(self, rv_id: str, address: str):
if self.get_rendezvous(rv_id):
raise ValueError(f"Rendezvous {rv_id} already exists")
rv = {"id": rv_id, "address": address}
self.store.add_item("rendezvous", rv, unique=True, id_field="id", id=rv_id)
def get_rendezvous(self, rv_id: str):
return self.store.get_item("rendezvous", "id", rv_id)
def list_rendezvous(self):
return self.store.list_items("rendezvous")
def delete_rendezvous(self, rv_id: str) -> bool:
return self.store.remove_item("rendezvous", "id", rv_id)
def update_rendezvous(self, rv_id: str, updates: Dict[str, Any]) -> bool:
return self.store.update_item("rendezvous", "id", rv_id, updates)
# ------------------- NETWORK CRUD -------------------
def _default_config(self, net_type: str) -> Dict[str, Any]:
defaults = {
"test_network": {
"auto_connect": True,
"min_connections": 10,
"max_connections": 20,
"max_store_size": 1000,
"max_message_size": 64_000,
"message_ttl": 86400,
"ack_required": True,
"min_pow": 4
}
}
return defaults.get(net_type, {})
def _generate_id(self, name, net_type):
payload = f"{name}:{net_type}".encode()
return hash_string(payload)
def create_network(
self,
name: str,
description: str,
net_type: str,
modules: Optional[List[str]] = None,
config: Optional[Dict[str, Any]] = None,
):
network_id = self._generate_id(name, net_type)
if self.get_network(network_id):
raise ValueError(f"Network {network_id} already exists")
final_config = {**self._default_config(net_type), **(config or {})}
network = {
"id": network_id,
"name": name,
"description": description,
"type": net_type,
"modules": modules or [],
"peers": [],
"rendezvous": [],
"config": final_config
}
self.store.add_item("networks", network, unique=True, id_field="id", id=network_id)
return network
def get_network(self, network_id: str) -> Optional[Dict[str, Any]]:
return self.store.get_item("networks", "id", network_id)
def list_networks(self) -> List[Dict[str, Any]]:
return self.store.list_items("networks")
def delete_network(self, network_id: str) -> bool:
return self.store.remove_item("networks", "id", network_id)
def update_network(self, network_id: str, updates: Dict[str, Any]) -> bool:
return self.store.update_item("networks", "id", network_id, updates)
def network_assign_rendezvous(self, network_id: str, rv_id: str):
network = self.store.get_item("networks", "id", network_id)
if not network:
return False
if rv_id not in network.get("rendezvous", []):
network.setdefault("rendezvous", []).append(rv_id)
return self.store.update_item("networks", "id", network_id, {"rendezvous": network["rendezvous"]})
return False
# ------------------- NETWORK QUERY -------------------
def network_find_by_module(self, module_name: str) -> List[Dict[str, Any]]:
"""Return all networks that use a given module"""
return [n for n in self.list_networks() if module_name in n.get("modules", [])]