MatteoScript/RentriWebServer
0
1from fastapi import FastAPI, Request, HTTPException2from fastapi.responses import JSONResponse3import json4from datetime import datetime5import pyodbc6import os7from dotenv import load_dotenv8 9load_dotenv()10app = FastAPI()11 12# --------------------------------------------| CONNESSIONE DB |-------------------------------------------------13# Connessione al DB Web (Amazon RDS)14def get_db_connection():15 server = os.getenv('SERVER_DB')16 username = os.getenv('USERNAME_DB')17 password = os.getenv('PASSWORD_DB')18 connection_string = f"DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};UID={username};PWD={password}"19 return pyodbc.connect(connection_string)20 21# --------------------------------------------| CREAZIONE AZIENDA-DB |-------------------------------------------------22# Controllo se presente il Database e la tabella aziendale. Se non ci sono le creo23def crea_database_azienda(database, azienda):24 tabella = f"{azienda.upper()}transazioni"25 conn = get_db_connection()26 cursor = conn.cursor()27 # Controllo presenza DATABASE28 conn.autocommit = True29 check_db_query = f"""30 IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = '{database}')31 BEGIN32 CREATE DATABASE {database};33 END34 """35 cursor.execute(check_db_query)36 cursor.execute(f"USE {database}")37 conn.autocommit = False38 #Controllo presenza TABELLA 39 check_table_query = f"""40 IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '{tabella}')41 BEGIN42 CREATE TABLE dbo.{tabella} (43 id INT IDENTITY(1,1) PRIMARY KEY,44 datreg DATETIME NOT NULL,45 azione VARCHAR(255) NOT NULL,46 id_transazione VARCHAR(50) NOT NULL,47 jsonCompleto NVARCHAR(MAX) NOT NULL48 );49 END50 """51 cursor.execute(check_table_query)52 conn.commit()53 cursor.close()54 conn.close()55 56# ------------------------------------------------| POST |--------------------------------------------------57# Inizio transazione (questo endpoint viene chiamato dal RENTRI come CALLBACK per il PUSH Request)58@app.post("/{azione}/{versione}/{database}/{azienda}/start")59async def receive_post(request: Request, azione: str, versione :str, database: str, azienda: str):60 data = await request.json()61 print(json.dumps(data, indent=3))62 #conn = get_db_connection()63 #cursor = conn.cursor()64 #crea_database_azienda(database, azienda)65 #insert_query = f"INSERT INTO [{database}].dbo.{azienda}transazioni (datreg, azione, id_transazione, JsonCompleto) VALUES (?, ?, ?, ?)"66 #cursor.execute(insert_query, (datetime.now(), azione, data.get('transazione_id'), json.dumps(data)))67 #conn.commit()68 #cursor.close()69 #conn.close()70 return JSONResponse(content={"message": "Received", "data": data}) 71 72# ------------------------------------------------| GET |-----------------------------------------------------73# Result/Status transazione (Questo endpoint viene chiamato da AdHoc per leggere il risultato della transazione) /dati-registri/v1.0/id_transazione/STATUS/Azienda74@app.get("/{azione}/{versione}/{database}/{azienda}/{id_transazione}/{tipo}")75async def get_status(azione: str, versione: str, id_transazione: str, tipo: str, database: str, azienda: str):76 print('{"message": "OK"}')77 return '{"message": "OK"}'78 #conn = get_db_connection()79 #cursor = conn.cursor()80 #select_query = f"SELECT TOP 1 JsonCompleto FROM [{database}].dbo.{azienda}transazioni WHERE azione = ? AND id_transazione = ? order by id desc"81 #cursor.execute(select_query, (azione, id_transazione))82 #row = cursor.fetchone()83 #cursor.close()84 #conn.close()85 # STATUS: Restituisce 303 se esiste la riga della transazione (cioè se per il rentri è terminata)86 #if tipo == "status": 87 # if not row:88 # raise HTTPException(status_code=200, detail="Transazione non terminata")89 # else:90 # raise HTTPException(status_code=303, detail="Transazione terminata")91 # RESULT: Restituisce 303 se esiste la riga della transazione (cioè se per il rentri è terminata)92 #elif tipo == "result": 93 # if not row:94 # raise HTTPException(status_code=404, detail="Transazione non terminata")95 # else: 96 # result = json.loads(row.JsonCompleto)97 # return JSONResponse(content=result)98 #else:99 # raise HTTPException(status_code=404, detail="Endpoint non trovato")100 101@app.get("/")102def read_general(): 103 return {"response": "Benvenuto. Per maggiori info: https://matteoscript-RentriWebServer.hf.space/docs"} 