Orders en los consumidores y gestion de los demas casos de uso

This commit is contained in:
2026-02-26 17:30:32 +01:00
parent 18422fbe38
commit ca1144b55c
9 changed files with 204 additions and 52 deletions

View File

@@ -61,3 +61,14 @@ export type CreateOrderDTO = Pick<
OrderTracking<any>, // Aqui realmente no importan los campos
'correlation_id' | 'exchange' | 'routing_key' | 'order_type' | 'payload' | 'webhook_host' | 'webhook_endpoint'
>;
export type UpdateOrderDTO =
(
{ id: number, correlation_id?: never } |
{ id?: never, correlation_id: string }
)
&
{
new_status: OrderStatus,
reason?: string
}

View File

@@ -4,11 +4,11 @@
export type Result<E, D> =
{
error: E,
data: undefined
data?: undefined
}
|
{
error: undefined,
error?: undefined,
data: D
}

View File

@@ -2,9 +2,11 @@
* TODO: Usar
*/
import { PoolClient, QueryResult, QueryResultRow } from "pg";
import { CreateOrderDTO, OrderTracking } from "../domain/Order.js";
import { CreateOrderDTO, OrderTracking, UpdateOrderDTO } from "../domain/Order.js";
import { Result } from "../domain/Result.js";
import { PgClient } from "./PgClient.js";
import assert from "node:assert";
import { error } from "node:console";
/**
* Agrupa todas las operaciones de *Order*.
@@ -164,25 +166,35 @@ export class OrderRepository {
return result
}
/**
* Actualizacion "correcta" del estado de un order
*/
public async updateOrder(args: {
id: number,
new_status: string,
reason: string
}) {
public async updateOrder(args: UpdateOrderDTO): Promise<Result<string, OrderTracking<any>>> {
// XOR id o correlation_id
assert((args.id != undefined) != (args.correlation_id != undefined))
const client = await this.pgClient.connect();
await client.query('BEGIN');
const idType = ('id' in args) ? "correlation_id" : "id"
const idValue = (args.id != undefined) ? args.id : args.correlation_id
// 1. Se consulta la order de base
const qCurrentOrder = `
SELECT * FROM order_tracking
WHERE id = $1
WHERE ${idType} = $1
`
const vCurrentOrder = [args.id]
const vCurrentOrder = [idValue]
const currentOrderResult = await this.getFirst(client.query<OrderTracking<any>>(qCurrentOrder, vCurrentOrder))
const orderId = currentOrderResult.data?.id
if (orderId == undefined) {
return {
error: "El order a actualizar no existe " + idType + ": " + idValue
}
}
if (currentOrderResult.error != undefined) {
await client.query("ROLLBACK")
@@ -201,7 +213,7 @@ export class OrderRepository {
WHERE id = $1
RETURNING id, status, update_date;
`
const vOrderTracking = [args.id, args.new_status]
const vOrderTracking = [orderId, args.new_status]
const updatedOrderResult = await this.getFirst(
client.query<{ id: number, status: string, update_date: string }>(uOrderTracking, vOrderTracking)
)