More work on issue 192

This commit is contained in:
Pinga 2024-12-06 15:17:32 +02:00
parent 79eca91eb1
commit ea88b14234
4 changed files with 349 additions and 36 deletions

View file

@ -366,4 +366,290 @@ class DapiController extends Controller
$response->getBody()->write(json_encode($payload, JSON_UNESCAPED_UNICODE));
return $response;
}
public function listPayments(Request $request, Response $response): Response
{
$params = $request->getQueryParams();
$db = $this->container->get('db');
// Map fields to fully qualified columns for filtering/sorting
// Adjust field names if needed
$allowedFieldsMap = [
'date' => 'ph.date',
'registrar_id' => 'ph.registrar_id',
'description' => 'ph.description',
'amount' => 'ph.amount',
'registrar_name' => 'r.name'
];
// --- SORTING ---
$sortField = 'ph.date'; // default sort by date
$sortDir = 'desc';
if (!empty($params['order'])) {
$orderParts = explode(',', $params['order']);
if (count($orderParts) === 2) {
$fieldCandidate = preg_replace('/[^a-zA-Z0-9_]/', '', $orderParts[0]);
if (array_key_exists($fieldCandidate, $allowedFieldsMap)) {
$sortField = $allowedFieldsMap[$fieldCandidate];
}
$sortDir = strtolower($orderParts[1]) === 'asc' ? 'asc' : 'desc';
}
}
// --- PAGINATION ---
$page = 1;
$size = 10;
if (!empty($params['page'])) {
$pageParts = explode(',', $params['page']);
if (count($pageParts) === 2) {
$pageNum = (int)$pageParts[0];
$pageSize = (int)$pageParts[1];
if ($pageNum > 0) {
$page = $pageNum;
}
if ($pageSize > 0) {
$size = $pageSize;
}
}
}
$offset = ($page - 1) * $size;
// --- FILTERING ---
$whereClauses = [];
$bindParams = [];
foreach ($params as $key => $value) {
if (preg_match('/^filter\d+$/', $key)) {
$fParts = explode(',', $value);
if (count($fParts) === 3) {
list($fField, $fOp, $fVal) = $fParts;
$fField = preg_replace('/[^a-zA-Z0-9_]/', '', $fField);
// Ensure the field is allowed and fully qualify it
if (!array_key_exists($fField, $allowedFieldsMap)) {
// Skip unknown fields
continue;
}
$column = $allowedFieldsMap[$fField];
switch ($fOp) {
case 'eq':
$whereClauses[] = "$column = :f_{$key}";
$bindParams["f_{$key}"] = $fVal;
break;
case 'cs':
$whereClauses[] = "$column LIKE :f_{$key}";
$bindParams["f_{$key}"] = "%$fVal%";
break;
case 'sw':
$whereClauses[] = "$column LIKE :f_{$key}";
$bindParams["f_{$key}"] = "$fVal%";
break;
case 'ew':
$whereClauses[] = "$column LIKE :f_{$key}";
$bindParams["f_{$key}"] = "%$fVal";
break;
// Add other cases if needed
}
}
}
}
// Base SQL
$sqlBase = "
FROM payment_history ph
LEFT JOIN registrar r ON ph.registrar_id = r.id
";
// If you want all filters combined with OR, keep " OR ".
// If you want AND logic for multiple filters, change to "AND".
$sqlWhere = '';
if (!empty($whereClauses)) {
$sqlWhere = "WHERE " . implode(" OR ", $whereClauses);
}
// Count total results
$totalSql = "SELECT COUNT(DISTINCT ph.id) AS total $sqlBase $sqlWhere";
$totalCount = $db->selectValue($totalSql, $bindParams);
// Data query
$selectFields = "
ph.id,
ph.registrar_id,
ph.date,
ph.description,
ph.amount,
r.name AS registrar_name
";
$dataSql = "
SELECT $selectFields
$sqlBase
$sqlWhere
ORDER BY $sortField $sortDir
LIMIT $offset, $size
";
$records = $db->select($dataSql, $bindParams);
// Ensure records is always an array
if (!$records) {
$records = [];
}
$payload = [
'records' => $records,
'results' => $totalCount
];
$response = $response->withHeader('Content-Type', 'application/json; charset=UTF-8');
$response->getBody()->write(json_encode($payload, JSON_UNESCAPED_UNICODE));
return $response;
}
public function listStatements(Request $request, Response $response): Response
{
$params = $request->getQueryParams();
$db = $this->container->get('db');
// Map fields to fully qualified columns for filtering/sorting
$allowedFieldsMap = [
'date' => 'st.date',
'registrar_id' => 'st.registrar_id',
'command' => 'st.command',
'domain_name' => 'st.domain_name',
'length_in_months' => 'st.length_in_months',
'fromS' => 'st.fromS',
'toS' => 'st.toS',
'amount' => 'st.amount',
'registrar_name' => 'r.name'
];
// --- SORTING ---
$sortField = 'st.date'; // default sort by date
$sortDir = 'desc';
if (!empty($params['order'])) {
$orderParts = explode(',', $params['order']);
if (count($orderParts) === 2) {
$fieldCandidate = preg_replace('/[^a-zA-Z0-9_]/', '', $orderParts[0]);
if (array_key_exists($fieldCandidate, $allowedFieldsMap)) {
$sortField = $allowedFieldsMap[$fieldCandidate];
}
$sortDir = strtolower($orderParts[1]) === 'asc' ? 'asc' : 'desc';
}
}
// --- PAGINATION ---
$page = 1;
$size = 10;
if (!empty($params['page'])) {
$pageParts = explode(',', $params['page']);
if (count($pageParts) === 2) {
$pageNum = (int)$pageParts[0];
$pageSize = (int)$pageParts[1];
if ($pageNum > 0) {
$page = $pageNum;
}
if ($pageSize > 0) {
$size = $pageSize;
}
}
}
$offset = ($page - 1) * $size;
// --- FILTERING ---
$whereClauses = [];
$bindParams = [];
foreach ($params as $key => $value) {
if (preg_match('/^filter\d+$/', $key)) {
$fParts = explode(',', $value);
if (count($fParts) === 3) {
list($fField, $fOp, $fVal) = $fParts;
$fField = preg_replace('/[^a-zA-Z0-9_]/', '', $fField);
// Ensure the field is allowed and fully qualify it
if (!array_key_exists($fField, $allowedFieldsMap)) {
// Skip unknown fields
continue;
}
$column = $allowedFieldsMap[$fField];
switch ($fOp) {
case 'eq':
$whereClauses[] = "$column = :f_{$key}";
$bindParams["f_{$key}"] = $fVal;
break;
case 'cs':
$whereClauses[] = "$column LIKE :f_{$key}";
$bindParams["f_{$key}"] = "%$fVal%";
break;
case 'sw':
$whereClauses[] = "$column LIKE :f_{$key}";
$bindParams["f_{$key}"] = "$fVal%";
break;
case 'ew':
$whereClauses[] = "$column LIKE :f_{$key}";
$bindParams["f_{$key}"] = "%$fVal";
break;
// Add other cases if needed
}
}
}
}
// Base SQL
$sqlBase = "
FROM statement st
LEFT JOIN registrar r ON st.registrar_id = r.id
";
// Combine filters with OR (common approach)
$sqlWhere = '';
if (!empty($whereClauses)) {
$sqlWhere = "WHERE " . implode(" OR ", $whereClauses);
}
// Count total results
$totalSql = "SELECT COUNT(DISTINCT st.id) AS total $sqlBase $sqlWhere";
$totalCount = $db->selectValue($totalSql, $bindParams);
// Data query
$selectFields = "
st.id,
st.registrar_id,
st.date,
st.command,
st.domain_name,
st.length_in_months,
st.fromS,
st.toS,
st.amount,
r.name AS registrar_name
";
$dataSql = "
SELECT $selectFields
$sqlBase
$sqlWhere
ORDER BY $sortField $sortDir
LIMIT $offset, $size
";
$records = $db->select($dataSql, $bindParams);
// Ensure records is always an array
if (!$records) {
$records = [];
}
$payload = [
'records' => $records,
'results' => $totalCount
];
$response = $response->withHeader('Content-Type', 'application/json; charset=UTF-8');
$response->getBody()->write(json_encode($payload, JSON_UNESCAPED_UNICODE));
return $response;
}
}