Docs orders
This commit is contained in:
@@ -94,4 +94,19 @@ export type ErrorOrderDTO =
|
||||
stackTrace?: string
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Se considera cada entrada de conditions como un filtro sobre un campo
|
||||
* cada fila se podrá expresar como campo:filtro
|
||||
* ```json
|
||||
* {
|
||||
* "value": "-gte 200" // Un valor >= 200
|
||||
* "text": "-eq 'busqueda' " // El campo tiene que ser exactamente 'busqueada'
|
||||
* }
|
||||
* ```
|
||||
* TODO: sacar opciones de paginación
|
||||
* */
|
||||
export type OrderQuery = {
|
||||
conditions: Record<string, string>,
|
||||
limit?: number | undefined,
|
||||
offset?: number | undefined,
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { before, describe, it } from "node:test";
|
||||
import { OrderRepository } from "./OrderRepository.js";
|
||||
import { CreateOrderDTO } from "../domain/Order.js";
|
||||
import { CreateOrderDTO, OrderQuery } from "../domain/Order.js";
|
||||
import { postgresClient } from "../config/config.test.js";
|
||||
import assert from "node:assert";
|
||||
import { Query } from "pg";
|
||||
|
||||
const order1 = <CreateOrderDTO>{
|
||||
correlation_id: "fakeRMQid-1234",
|
||||
@@ -169,4 +170,16 @@ describe("Test OrderRepository", {}, (ctx) => {
|
||||
assert(result.data.status === "dlx")
|
||||
assert(result.data.finish_date != null)
|
||||
})
|
||||
|
||||
it("Query generates with parameters", async () => {
|
||||
const params: OrderQuery = {
|
||||
conditions: {
|
||||
status: "-eq 'pending'"
|
||||
}
|
||||
}
|
||||
//@ts-expect-error
|
||||
const res = orderRepo.generateTableQuery("test", params)
|
||||
console.log("Query:", res)
|
||||
assert.ok(res != undefined)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* TODO: Usar
|
||||
*/
|
||||
import { PoolClient, QueryResult, QueryResultRow } from "pg";
|
||||
import { CreateOrderDTO, ErrorOrderDTO, FinishOrderDTO, OrderTracking, UpdateOrderDTO } from "../domain/Order.js";
|
||||
import { CreateOrderDTO, ErrorOrderDTO, FinishOrderDTO, OrderQuery, OrderTracking, UpdateOrderDTO } from "../domain/Order.js";
|
||||
import { Result, tryCatch } from "../domain/Result.js";
|
||||
import { PgClient } from "./PgClient.js";
|
||||
import assert from "node:assert";
|
||||
@@ -55,7 +55,77 @@ export class OrderRepository {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mapeo de prefijos a operadores SQL
|
||||
*/
|
||||
private OPERATOR_MAP: Record<string, string> = {
|
||||
"-eq": "=",
|
||||
"-neq": "!=",
|
||||
"-gt": ">",
|
||||
"-gte": ">=",
|
||||
"-lt": "<",
|
||||
"-lte": "<=",
|
||||
"-like": "LIKE",
|
||||
};
|
||||
|
||||
/**
|
||||
* Tabla general para sacar datos de la tabla en base a unas condiciones
|
||||
* TODO:
|
||||
* - Dar la opción de generar los campos a devolver en vez de *
|
||||
* - Garantizar el numero de parametros de respuesta
|
||||
*/
|
||||
private generateTableQuery(table: string, query: OrderQuery) {
|
||||
const { conditions, limit, offset } = query;
|
||||
const whereClauses: string[] = [];
|
||||
const queryValues: any[] = [];
|
||||
|
||||
let paramIndex = 1; // Para los parametros de PostgreSQL ($1, $2) (que empiezan por 1)
|
||||
|
||||
for (const [column, filter] of Object.entries(conditions)) {
|
||||
const match = filter.match(/^(-\w+)\s+(.+)$/);
|
||||
|
||||
if (match) {
|
||||
const [_, prefix, value] = match;
|
||||
const operator = this.OPERATOR_MAP[prefix];
|
||||
|
||||
if (operator) {
|
||||
// Eliminación de comillas
|
||||
const cleanValue = value.replace(/^'|'$/g, "");
|
||||
|
||||
whereClauses.push(`${column} ${operator} $${paramIndex}`);
|
||||
queryValues.push(operator === "LIKE" ? `%${cleanValue}%` : cleanValue);
|
||||
paramIndex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Query completa
|
||||
// TODO: Cambair el * por parametros
|
||||
let sql = `SELECT * FROM ${table}`;
|
||||
|
||||
if (whereClauses.length > 0) {
|
||||
sql += ` WHERE ${whereClauses.join(" AND ")}`;
|
||||
}
|
||||
|
||||
// 3. Paginacion
|
||||
if (limit !== undefined) {
|
||||
sql += ` LIMIT ${Number(limit)}`;
|
||||
}
|
||||
if (offset !== undefined) {
|
||||
sql += ` OFFSET ${Number(offset)}`;
|
||||
}
|
||||
|
||||
return {
|
||||
sql,
|
||||
values: queryValues,
|
||||
};
|
||||
}
|
||||
|
||||
public async getOrdersByQuery(args: OrderQuery) {
|
||||
const query = this.generateTableQuery('order_tracking', args)
|
||||
const queryPromise = this.pgClient.query<OrderTracking<Record<string, any>>>(query.sql, query.values)
|
||||
const result = await this.getAll(queryPromise)
|
||||
}
|
||||
|
||||
/**
|
||||
* El tipo <T> representa el contenido del mensaje de los order
|
||||
|
||||
Reference in New Issue
Block a user