PABX da Simples IP
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

137 lines
4.7 KiB

<?php
namespace app\core;
//use app\core\Database;
use app\core\Connection;
use PDO;
use Exception;
use PDOException;
use stdClass;
use app\shared\Logger;
abstract class Repository
{
public DataBase $db;
//protected static string $table;
protected static Logger $logger;
private static function setLog()
{
self::$logger = new Logger('api' . date('Ymd'), true);
}
/**
* Binds the values to the query, executed and returns the information selected in @param string $fetch.
*/
public static function query(string $query, array $params = [], string $fetch = 'all'): array|int|bool
{
try {
self::setLog();
self::$logger->debug("Getting connection", true);
$stmt = Connection::getInstance()->prepare($query);
foreach ($params as $key => $value) {
// menaging LIKE statement in query
if (strpos($query, 'SELECT') !== FALSE && in_array($key, ['src', 'dst', 'entrada', 'fila', 'evento', 'nome'])) {
$value = "%$value%";
self::$logger->debug("treating value $key", true);
}
$stmt->bindValue(":$key", $value, (is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR));
}
self::$logger->debug("Biding values for $query\nwith params: " . print_r($params, true), true);
$stmt->execute();
//selects the type of return
switch ($fetch) {
case 'all':
return $stmt->fetchAll();
case 'one':
return $stmt->fetch(PDO::FETCH_ASSOC);
case 'count':
return $stmt->rowCount();
default:
return $stmt->fetchAll();
}
} catch (PDOException $e) {
self::$logger->error(print_r(['error' => $e->getMessage(), 'query' => $query, 'params' => $params], true));
return ['status' => false, 'data' => ['message' => 'Nenhum resultado encontrado!']];
} catch (Exception $general) {
self::$logger->error(print_r(['error' => $general->getMessage(), 'query' => $query, 'params' => $params], true));
return ['status' => false, 'data' => ['message' => 'Nenhum resultado encontrado!']];
}
}
/** Dinamicaly creates a SELECT query based on passed parameters
* @param string $table: table name
* @param array $columns: list of columns to be returned
* @param array $params: list of parameters to be used in 'WHERE' statement
* @param string fetch: type of return desired
*/
public static function dinamicSelectQuery(string $table, array $columns, array $params, string $fetch): array|int|bool
{
self::setLog();
$query = "SELECT " . implode(', ', $columns) . ' FROM ' . $table . " WHERE 1 = 1 ";
foreach ($params as $key => $value) {
if (empty($value)) {
continue;
}
if (in_array($key, ['src', 'dst', 'entrada', 'fila', 'evento', 'nome'])) {
$query .= " AND $key LIKE :$key";
continue;
}
$query .= " AND $key = :$key";
}
return self::query($query, $params, $fetch);
}
/** Dinamicaly inserts a record into a table
* @param string $table: table name
* @param array $columns: associative array containing the fields and its values to be recorded
* @return int|bool the number of rows modified by the database operation
*/
public static function dinamicInsertQuery(string $table, array $columns): int|bool
{
$query = "INSERT INTO $table (";
$notFirst = false;
foreach ($columns as $key => $value) {
if ($notFirst) {
$query .= ', ';
}
$notFirst = true;
$query .= $key;
}
$query .= ') VALUES (';
$notFirst = false;
foreach ($columns as $key => $value) {
if ($notFirst) {
$query .= ', ';
}
$notFirst = true;
$query .= ":$key";
}
$query .= ')';
return self::query($query, $columns, "count");
}
public static function dinamicDeleteQuery(string $table, array $params): int|bool
{
if (!sizeof($params)) {
throw new Exception("Delete statement must have parameters!");
}
$query = "DELETE FROM $table WHERE 1 = 1 ";
foreach ($params as $key => $value) {
if (empty($value)) {
continue;
}
$query .= " AND $key = :$key";
}
return self::query($query, $params, 'count');
}
}