Add Lamassu database configuration: implement CRUD operations, polling tasks, and UI components for managing database settings. Introduce hourly transaction polling and manual poll functionality.

This commit is contained in:
padreug 2025-06-18 10:56:05 +02:00
parent c9f7140d95
commit 1f7999a556
9 changed files with 870 additions and 5 deletions

95
crud.py
View file

@ -11,7 +11,8 @@ from .models import (
CreateDcaClientData, DcaClient, UpdateDcaClientData,
CreateDepositData, DcaDeposit, UpdateDepositStatusData,
CreateDcaPaymentData, DcaPayment,
ClientBalanceSummary
ClientBalanceSummary,
CreateLamassuConfigData, LamassuConfig, UpdateLamassuConfigData
)
db = Database("ext_myextension")
@ -292,3 +293,95 @@ async def get_fixed_mode_clients() -> List[DcaClient]:
"SELECT * FROM myextension.dca_clients WHERE dca_mode = 'fixed' AND status = 'active'",
model=DcaClient,
)
# Lamassu Configuration CRUD Operations
async def create_lamassu_config(data: CreateLamassuConfigData) -> LamassuConfig:
config_id = urlsafe_short_hash()
# Deactivate any existing configs first (only one active config allowed)
await db.execute(
"UPDATE myextension.lamassu_config SET is_active = false, updated_at = :updated_at",
{"updated_at": datetime.now()}
)
await db.execute(
"""
INSERT INTO myextension.lamassu_config
(id, host, port, database_name, username, password, is_active, created_at, updated_at)
VALUES (:id, :host, :port, :database_name, :username, :password, :is_active, :created_at, :updated_at)
""",
{
"id": config_id,
"host": data.host,
"port": data.port,
"database_name": data.database_name,
"username": data.username,
"password": data.password,
"is_active": True,
"created_at": datetime.now(),
"updated_at": datetime.now()
}
)
return await get_lamassu_config(config_id)
async def get_lamassu_config(config_id: str) -> Optional[LamassuConfig]:
return await db.fetchone(
"SELECT * FROM myextension.lamassu_config WHERE id = :id",
{"id": config_id},
LamassuConfig,
)
async def get_active_lamassu_config() -> Optional[LamassuConfig]:
return await db.fetchone(
"SELECT * FROM myextension.lamassu_config WHERE is_active = true ORDER BY created_at DESC LIMIT 1",
model=LamassuConfig,
)
async def get_all_lamassu_configs() -> List[LamassuConfig]:
return await db.fetchall(
"SELECT * FROM myextension.lamassu_config ORDER BY created_at DESC",
model=LamassuConfig,
)
async def update_lamassu_config(config_id: str, data: UpdateLamassuConfigData) -> Optional[LamassuConfig]:
update_data = {k: v for k, v in data.dict().items() if v is not None}
if not update_data:
return await get_lamassu_config(config_id)
update_data["updated_at"] = datetime.now()
set_clause = ", ".join([f"{k} = :{k}" for k in update_data.keys()])
update_data["id"] = config_id
await db.execute(
f"UPDATE myextension.lamassu_config SET {set_clause} WHERE id = :id",
update_data
)
return await get_lamassu_config(config_id)
async def update_config_test_result(config_id: str, success: bool) -> None:
await db.execute(
"""
UPDATE myextension.lamassu_config
SET test_connection_last = :test_time, test_connection_success = :success, updated_at = :updated_at
WHERE id = :id
""",
{
"id": config_id,
"test_time": datetime.now(),
"success": success,
"updated_at": datetime.now()
}
)
async def delete_lamassu_config(config_id: str) -> None:
await db.execute(
"DELETE FROM myextension.lamassu_config WHERE id = :id",
{"id": config_id}
)