lorenzomalferrari / gestiscicasa

Progetto che nasce privato con lo scopo di gestire al meglio la propria casa in tutte le sue necessita
Other
1 stars 0 forks source link

Aggiungere alla api import e download #109

Open lorenzomalferrari opened 1 month ago

lorenzomalferrari commented 1 month ago

Per gestire il nuovo formato del contesto (import_users, download_users, ecc.), modifichiamo le classi ImportData e DownloadData per accettare un ulteriore parametro che indichi la tabella su cui lavorare. Inoltre, aggiorneremo il codice principale per estrarre e gestire correttamente questi valori.

Aggiornamento delle Classi

Classe ImportData

<?php

class ImportData {
    private $pdo;
    private $table;

    public function __construct($dsn, $dbUsername, $dbPassword, $table) {
        $this->pdo = new PDO($dsn, $dbUsername, $dbPassword);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->table = $table;
    }

    public function handle($jsonParams) {
        // Implementa la logica per l'importazione dei dati
        if (isset($jsonParams[$this->table])) {
            foreach ($jsonParams[$this->table] as $row) {
                // Prepara l'inserimento dinamicamente in base alla tabella
                $columns = implode(", ", array_keys($row));
                $placeholders = implode(", ", array_fill(0, count($row), "?"));
                $stmt = $this->pdo->prepare("INSERT INTO {$this->table} ($columns) VALUES ($placeholders)");
                $stmt->execute(array_values($row));
            }
        }

        return ['status' => 'success', 'message' => 'Dati importati con successo.'];
    }
}

Classe DownloadData

<?php

class DownloadData {
    private $pdo;
    private $table;

    public function __construct($dsn, $dbUsername, $dbPassword, $table) {
        $this->pdo = new PDO($dsn, $dbUsername, $dbPassword);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->table = $table;
    }

    public function handle($jsonParams) {
        // Recupera i dati dalla tabella specificata
        $stmt = $this->pdo->query("SELECT * FROM {$this->table}");
        $data[$this->table] = $stmt->fetchAll(PDO::FETCH_ASSOC);

        return ['status' => 'success', 'data' => $data];
    }
}

Aggiornamento del Codice Principale

Aggiorna il codice principale per gestire il nuovo formato del contesto:

require_once("../../app/controller/lib/libs.php");

// Carica il file di configurazione
$config = include(ROOT . 'public/config/config.php');

// Recupera i dati POST
$input = file_get_contents('php://input');
print_r($input);
$data = json_decode($input, true);

// Verifica che i dati siano stati inviati correttamente
if (!isset($data['context']) || !isset($data['username']) || !isset($data['password']) || !isset($data['json'])) {
    die(json_encode(['status' => 'error', 'message' => 'Parametri mancanti.', 'post' => var_dump($data) ]));
}

// Verifica le credenziali
$username = $data['username'];
$password = $data['password'];
if (!isset($config['allowed_users'][$username]) || $config['allowed_users'][$username] !== $password) {
    die(json_encode(['status' => 'error', 'message' => 'Credenziali non valide.']));
}

// Convalida il JSON
$jsonParams = $data['json'];
if (!is_array($jsonParams)) {
    die(json_encode(['status' => 'error', 'message' => 'JSON non valido.']));
}

// Seleziona la classe da eseguire in base al contesto
list($action, $table) = explode('_', $data['context'], 2);
$response = [];

switch ($action) {
    case 'update':
        require_once(ROOT . 'app/model/api/UpdateDB.php');
        $handler = new UpdateDB();
        $response = $handler->handle($jsonParams);
        break;
    case 'sends':
        require_once(ROOT . 'app/model/api/SendsLog.php');
        $handler = new SendsLog();
        $response = $handler->handle($jsonParams);
        break;
    case 'resend':
        require_once(ROOT . 'app/model/api/ResendEmail.php');
        $dsn = 'mysql:host=localhost;dbname=your_db_name'; // Modifica con il tuo DSN
        $dbUsername = 'db_user'; // Modifica con il tuo username DB
        $dbPassword = 'db_password'; // Modifica con la tua password DB
        $emailHost = 'smtp.example.com'; // Sostituisci con il tuo server SMTP
        $emailPort = 587; // Porta SMTP, tipicamente 587 per TLS
        $emailUsername = 'email_user'; // Sostituisci con il tuo username email
        $emailPassword = 'email_password'; // Sostituisci con la tua password email

        $handler = new ResendEmail($dsn, $dbUsername, $dbPassword, $emailHost, $emailPort, $emailUsername, $emailPassword);
        $response = $handler->handle($jsonParams);
        break;
    case 'import':
        require_once(ROOT . 'app/model/api/ImportData.php');
        $dsn = 'mysql:host=localhost;dbname=your_db_name'; // Modifica con il tuo DSN
        $dbUsername = 'db_user'; // Modifica con il tuo username DB
        $dbPassword = 'db_password'; // Modifica con la tua password DB

        $handler = new ImportData($dsn, $dbUsername, $dbPassword, $table);
        $response = $handler->handle($jsonParams);
        break;
    case 'download':
        require_once(ROOT . 'app/model/api/DownloadData.php');
        $dsn = 'mysql:host=localhost;dbname=your_db_name'; // Modifica con il tuo DSN
        $dbUsername = 'db_user'; // Modifica con il tuo username DB
        $dbPassword = 'db_password'; // Modifica con la tua password DB

        $handler = new DownloadData($dsn, $dbUsername, $dbPassword, $table);
        $response = $handler->handle($jsonParams);
        break;
    default:
        $response = ['status' => 'error', 'message' => 'Contesto non riconosciuto. Contattare info@lorenzomalferrari.com'];
        break;
}

// Restituisce il risultato come JSON
echo json_encode($response);

Spiegazione

  1. Parsing del Contesto:

    • Il contesto viene separato in due parti: l'azione (import, download, ecc.) e la tabella (users, buildings, ecc.).
  2. Costruttori delle Classi:

    • Le classi ImportData e DownloadData ora accettano un parametro aggiuntivo $table nel costruttore.
  3. Switch nel Codice Principale:

    • Il caso import crea un'istanza di ImportData passando il nome della tabella.
    • Il caso download crea un'istanza di DownloadData passando il nome della tabella.

Questo approccio rende il sistema più flessibile e modulare, permettendo di gestire facilmente diverse azioni su diverse tabelle tramite un unico punto di ingresso.

lorenzomalferrari commented 1 month ago

Lavorare meglio il case. Vorrei che negli switch troveremo import_users. E solo nella classe si vada a esplodere la variabile per poi usare users.

Usiamo sempre un array per interrogare e trovare a users che tabella corrisponda.

Anche perché vorrei che api.php gli arrivasse import_utenti e poi la tabella sarà lmgc_Users