Docs orders

This commit is contained in:
2026-04-27 09:33:55 +02:00
parent 9ec127433d
commit 4e02ea021d
32 changed files with 349 additions and 40 deletions

View File

@@ -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)
})
})

View File

@@ -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