mirror of
https://github.com/getnamingo/registry.git
synced 2025-05-15 00:56:59 +02:00
More work on issue 192
This commit is contained in:
parent
79eca91eb1
commit
ea88b14234
4 changed files with 349 additions and 36 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue