working
This commit is contained in:
1 parent
eeabd35f8d
commit
44eaced13d
3 files changed
+159
-26
No files matched your search
+59
-23
@@ -17,6 +17,14 @@ from fastapi.responses import PlainTextResponse, RedirectResponse
|
||||
from fastapi.security.api_key import APIKeyHeader
|
||||
from pydantic import BaseModel
|
||||
|
||||
import logging
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.DEBUG,
|
||||
format="%(asctime)s %(levelname)s [%(name)s] %(message)s",
|
||||
)
|
||||
log = logging.getLogger("4server.api")
|
||||
|
||||
# ---------------------- Constants ----------------------
|
||||
DB_PATH = "/4server/data/contracts.db"
|
||||
BIN_PATH = "/4server/sbin"
|
||||
@@ -89,13 +97,29 @@ def init_db():
|
||||
|
||||
|
||||
def execute_db(query: str, params: tuple = (), fetch: bool = False):
|
||||
log.debug("DB open: path=%s fetch=%s", DB_PATH, fetch)
|
||||
conn = sqlite3.connect(DB_PATH)
|
||||
conn.row_factory = sqlite3.Row
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(query, params)
|
||||
conn.commit()
|
||||
data = cursor.fetchall() if fetch else None
|
||||
conn.close()
|
||||
try:
|
||||
cursor.execute(query, params)
|
||||
conn.commit()
|
||||
rowcount = cursor.rowcount
|
||||
data = cursor.fetchall() if fetch else None
|
||||
except Exception as exc:
|
||||
log.error(
|
||||
"DB error: %s | query=%s | params=%s", exc, query, params
|
||||
)
|
||||
raise
|
||||
finally:
|
||||
conn.close()
|
||||
log.debug(
|
||||
"DB done: rowcount=%s rows=%s | query=%s | params=%s",
|
||||
rowcount,
|
||||
len(data) if data else 0,
|
||||
query,
|
||||
params,
|
||||
)
|
||||
if data and fetch:
|
||||
return [dict(row) for row in data]
|
||||
return None
|
||||
@@ -160,22 +184,6 @@ class ImageRequest(BaseModel):
|
||||
image: str
|
||||
|
||||
|
||||
# ---------------------- Routes ----------------------
|
||||
@app.get("/", include_in_schema=False)
|
||||
def redirect_to_odoo():
|
||||
return RedirectResponse(url="https://ODOO4PROJECTS.com")
|
||||
|
||||
|
||||
import json
|
||||
from typing import Any, Dict, Optional
|
||||
|
||||
from fastapi import Depends, FastAPI
|
||||
from fastapi.responses import RedirectResponse
|
||||
from pydantic import BaseModel
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
|
||||
# ---------------------- Routes ----------------------
|
||||
@app.get("/", include_in_schema=False)
|
||||
def redirect_to_odoo():
|
||||
@@ -184,11 +192,24 @@ def redirect_to_odoo():
|
||||
|
||||
@app.post("/container/update", dependencies=[Depends(verify_api_key)])
|
||||
def update_container(request: ContainerModel):
|
||||
payload = (
|
||||
request.model_dump()
|
||||
if hasattr(request, "model_dump")
|
||||
else request.dict()
|
||||
)
|
||||
log.info("update_container called: UUID=%r payload=%s", request.UUID, payload)
|
||||
|
||||
# Fetch existing record
|
||||
existing = execute_db(
|
||||
"SELECT * FROM containers WHERE UUID = ?", (request.UUID,), fetch=True
|
||||
)
|
||||
log.info(
|
||||
"update_container lookup: UUID=%r existing=%s",
|
||||
request.UUID,
|
||||
existing,
|
||||
)
|
||||
if not existing:
|
||||
log.info("update_container: no record for UUID=%r -> INSERT", request.UUID)
|
||||
# If record does not exist, insert a new one with all given fields
|
||||
execute_db(
|
||||
"""
|
||||
@@ -221,15 +242,21 @@ def update_container(request: ContainerModel):
|
||||
request.env_list,
|
||||
),
|
||||
)
|
||||
inserted = execute_db(
|
||||
"SELECT * FROM containers WHERE UUID = ?", (request.UUID,), fetch=True
|
||||
)
|
||||
log.info("update_container INSERT result: %s", inserted)
|
||||
return {"UUID": request.UUID, "status": "created"}
|
||||
|
||||
# Existing record found, do partial update
|
||||
existing = existing[0] # Assuming fetch returns list of dicts
|
||||
log.info("update_container: existing row before update=%s", existing)
|
||||
updates = {}
|
||||
params = []
|
||||
|
||||
# Only add fields that are not None in the request
|
||||
for field in ContainerModel.__fields__:
|
||||
model_fields = getattr(ContainerModel, "model_fields", None) or ContainerModel.__fields__
|
||||
for field in model_fields:
|
||||
if field == "UUID":
|
||||
continue
|
||||
value = getattr(request, field)
|
||||
@@ -237,17 +264,26 @@ def update_container(request: ContainerModel):
|
||||
updates[field] = value
|
||||
params.append(value)
|
||||
|
||||
log.info("update_container: computed updates=%s params=%s", updates, params)
|
||||
|
||||
if updates:
|
||||
# Build SQL dynamically
|
||||
set_clause = ", ".join(f"{k}=?" for k in updates.keys())
|
||||
params.append(request.UUID) # UUID for WHERE clause
|
||||
execute_db(f"UPDATE containers SET {set_clause} WHERE UUID=?", tuple(params))
|
||||
sql = f"UPDATE containers SET {set_clause} WHERE UUID=?"
|
||||
log.info("update_container: executing SQL=%s params=%s", sql, tuple(params))
|
||||
execute_db(sql, tuple(params))
|
||||
after = execute_db(
|
||||
"SELECT * FROM containers WHERE UUID = ?", (request.UUID,), fetch=True
|
||||
)
|
||||
log.info("update_container: row after update=%s", after)
|
||||
return {
|
||||
"UUID": request.UUID,
|
||||
"status": "updated",
|
||||
"fields_updated": list(updates.keys()),
|
||||
}
|
||||
|
||||
log.info("update_container: no non-None fields supplied -> no_change")
|
||||
return {"UUID": request.UUID, "status": "no_change"}
|
||||
|
||||
|
||||
@@ -257,7 +293,7 @@ def start_container(request: UUIDRequest):
|
||||
|
||||
|
||||
@app.post("/container/restartAllContainers", dependencies=[Depends(verify_api_key)])
|
||||
def start_container(request: ImageRequest):
|
||||
def restart_all_containers_by_image(request: ImageRequest):
|
||||
return {"message": run_command([f"{BIN_PATH}/restartContainers", request.image])}
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user