from dataclasses import dataclass, field import db @dataclass class SFTPConfig: host: str = "" port: int = 22 user: str = "" auth_method: str = "key" # "key" or "password" key: str = "" password: str = "" remote_path: str = "" @dataclass class GrimmoryConfig: url: str = "" user: str = "" password: str = "" bookdrop_path: str = "" @dataclass class AppConfig: sftp: SFTPConfig = field(default_factory=SFTPConfig) grimmory: GrimmoryConfig = field(default_factory=GrimmoryConfig) work_dir: str = "/tmp/calibresync" def load() -> AppConfig: s = db.get_all_settings() return AppConfig( sftp=SFTPConfig( host=s.get("sftp_host", ""), port=int(s.get("sftp_port", "22")), user=s.get("sftp_user", ""), auth_method=s.get("sftp_auth_method", "key"), key=s.get("sftp_key", ""), password=s.get("sftp_password", ""), remote_path=s.get("sftp_remote_path", ""), ), grimmory=GrimmoryConfig( url=s.get("grimmory_url", ""), user=s.get("grimmory_user", ""), password=s.get("grimmory_password", ""), bookdrop_path=s.get("grimmory_bookdrop_path", ""), ), work_dir=s.get("work_dir", "/tmp/calibresync"), ) def save(form: dict) -> None: keys = [ "sftp_host", "sftp_port", "sftp_user", "sftp_auth_method", "sftp_remote_path", "grimmory_url", "grimmory_user", "grimmory_bookdrop_path", "work_dir", "scheduler_interval_minutes", "sync_batch_size", ] for key in keys: if key in form and form[key] is not None: db.set_setting(key, str(form[key])) # Only overwrite secrets if a non-empty value was submitted for secret in ("sftp_key", "sftp_password", "grimmory_password"): if form.get(secret, "").strip(): db.set_setting(secret, form[secret].strip())