RentriWebServer / main.py
MatteoScript's picture
Update main.py
2efccc9 verified
raw
history blame
4.6 kB
from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import JSONResponse
import json
from datetime import datetime
import pyodbc
import os
from dotenv import load_dotenv
load_dotenv()
app = FastAPI()
# --------------------------------------------| CONNESSIONE DB |-------------------------------------------------
# Connessione al DB Web (Amazon RDS)
def get_db_connection():
server = os.getenv('SERVER_DB')
username = os.getenv('USERNAME_DB')
password = os.getenv('PASSWORD_DB')
connection_string = f"DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};UID={username};PWD={password}"
return pyodbc.connect(connection_string)
# --------------------------------------------| CREAZIONE AZIENDA-DB |-------------------------------------------------
# Controllo se presente il Database e la tabella aziendale. Se non ci sono le creo
def crea_database_azienda(database, azienda):
tabella = f"{azienda.upper()}transazioni"
conn = get_db_connection()
cursor = conn.cursor()
# Controllo presenza DATABASE
conn.autocommit = True
check_db_query = f"""
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = '{database}')
BEGIN
CREATE DATABASE {database};
END
"""
cursor.execute(check_db_query)
cursor.execute(f"USE {database}")
conn.autocommit = False
#Controllo presenza TABELLA
check_table_query = f"""
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '{tabella}')
BEGIN
EXEC('CREATE TABLE dbo.{tabella} (
id INT IDENTITY(1,1) PRIMARY KEY,
datreg DATETIME NOT NULL,
azione VARCHAR(255) NOT NULL,
id_transazione VARCHAR(50) NOT NULL,
jsonCompleto NVARCHAR(MAX) NOT NULL
)');
END
"""
cursor.execute(check_table_query)
conn.commit()
cursor.close()
conn.close()
# ------------------------------------------------| POST |--------------------------------------------------
# Inizio transazione (questo endpoint viene chiamato dal RENTRI come CALLBACK per il PUSH Request)
@app.post("/{azione}/{versione}/{database}/{azienda}/start")
async def receive_post(request: Request, azione: str, versione :str, database: str, azienda: str):
data = await request.json()
print(azione + " " + database + " " + azienda + " " + json.dumps(data, indent=3))
conn = get_db_connection()
cursor = conn.cursor()
crea_database_azienda(database, azienda)
insert_query = f"INSERT INTO [{database}].dbo.{azienda}transazioni (datreg, azione, id_transazione, JsonCompleto) VALUES (?, ?, ?, ?)"
cursor.execute(insert_query, (datetime.now(), azione, data.get('transazione_id'), json.dumps(data)))
conn.commit()
cursor.close()
conn.close()
return JSONResponse(content={"message": "Received", "data": data})
# ------------------------------------------------| GET |-----------------------------------------------------
# Result/Status transazione (Questo endpoint viene chiamato da AdHoc per leggere il risultato della transazione) /dati-registri/v1.0/id_transazione/STATUS/Azienda
@app.get("/{azione}/{versione}/{database}/{azienda}/{id_transazione}/{tipo}")
async def get_status(azione: str, versione: str, id_transazione: str, tipo: str, database: str, azienda: str):
conn = get_db_connection()
cursor = conn.cursor()
select_query = f"SELECT TOP 1 JsonCompleto FROM [{database}].dbo.{azienda}transazioni WHERE azione = ? AND id_transazione = ? order by id desc"
cursor.execute(select_query, (azione, id_transazione))
row = cursor.fetchone()
cursor.close()
conn.close()
# STATUS: Restituisce 303 se esiste la riga della transazione (cioè se per il rentri è terminata)
if tipo == "status":
if not row:
raise HTTPException(status_code=200, detail="Transazione non terminata")
else:
raise HTTPException(status_code=303, detail="Transazione terminata")
# RESULT: Restituisce 303 se esiste la riga della transazione (cioè se per il rentri è terminata)
elif tipo == "result":
if not row:
raise HTTPException(status_code=404, detail="Transazione non terminata")
else:
result = json.loads(row.JsonCompleto)
return JSONResponse(content=result)
else:
raise HTTPException(status_code=404, detail="Endpoint non trovato")
@app.get("/")
def read_general():
return {"response": "Benvenuto. Per maggiori info: https://matteoscript-RentriWebServer.hf.space/docs"}