ligbox-ops-platform/api/app/vm123/provision_store.py
Ligbox Spec Hub 3a2c64834b Initial import: ligbox-ops-platform + specs + LAPTOP + obsidian merge (CT130)
Source: VM122 /opt + obsidian-infra + LAPTOP
Hub: CT130 spec-hub 10.10.10.130
2026-06-19 17:26:41 +00:00

94 lines
2.7 KiB
Python

"""Persistência vm123_identity_map — Spec 027 data-model."""
from __future__ import annotations
import json
from datetime import datetime, timezone
from typing import Any
def _now() -> str:
return datetime.now(timezone.utc).isoformat()
def init_schema(conn) -> None:
conn.executescript(
"""
CREATE TABLE IF NOT EXISTS vm123_identity_map (
desk_username TEXT PRIMARY KEY,
desk_role TEXT NOT NULL,
foss_staff_id TEXT,
odoo_uid INTEGER,
openpanel_username TEXT,
provision_json TEXT,
provisioned_at TEXT,
updated_at TEXT NOT NULL
);
"""
)
def get_map(conn, desk_username: str) -> dict[str, Any] | None:
row = conn.execute(
"SELECT * FROM vm123_identity_map WHERE desk_username = ?",
(desk_username.strip().lower(),),
).fetchone()
if not row:
return None
out = dict(row)
if out.get("provision_json"):
try:
out["provision"] = json.loads(out["provision_json"])
except json.JSONDecodeError:
out["provision"] = {}
return out
def upsert_map(
conn,
*,
desk_username: str,
desk_role: str,
foss_staff_id: str | None = None,
odoo_uid: int | None = None,
openpanel_username: str | None = None,
provision: dict | None = None,
) -> dict[str, Any]:
user = desk_username.strip().lower()
now = _now()
existing = get_map(conn, user)
prov_json = json.dumps(provision or {}, ensure_ascii=False)
if existing:
conn.execute(
"""
UPDATE vm123_identity_map SET
desk_role = ?, foss_staff_id = COALESCE(?, foss_staff_id),
odoo_uid = COALESCE(?, odoo_uid),
openpanel_username = COALESCE(?, openpanel_username),
provision_json = ?, updated_at = ?,
provisioned_at = COALESCE(provisioned_at, ?)
WHERE desk_username = ?
""",
(
desk_role,
foss_staff_id,
odoo_uid,
openpanel_username,
prov_json,
now,
now,
user,
),
)
else:
conn.execute(
"""
INSERT INTO vm123_identity_map
(desk_username, desk_role, foss_staff_id, odoo_uid, openpanel_username,
provision_json, provisioned_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
""",
(user, desk_role, foss_staff_id, odoo_uid, openpanel_username, prov_json, now, now),
)
conn.commit()
return get_map(conn, user) or {}