From 36b14690161665860c1fc5948591fa8d6de7beed Mon Sep 17 00:00:00 2001 From: Adisak Date: Wed, 20 May 2026 17:33:02 +0700 Subject: [PATCH] fix api sort 504 time out --- src/controllers/PositionController.ts | 70 +++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 5 deletions(-) diff --git a/src/controllers/PositionController.ts b/src/controllers/PositionController.ts index 98120f30..7973f794 100644 --- a/src/controllers/PositionController.ts +++ b/src/controllers/PositionController.ts @@ -2760,7 +2760,19 @@ export class PositionController extends Controller { id: data.id, posMasterOrder: requestBody.sortId.indexOf(data.id) + 1, })); - await this.posMasterRepository.save(sortData_0, { data: request }); + // Bulk update using CASE WHEN instead of save() per row + const caseClauses_0 = sortData_0 + .map((d) => `WHEN '${d.id}' THEN ${d.posMasterOrder}`) + .join(" "); + const ids_0 = sortData_0.map((d) => `'${d.id}'`).join(","); + await this.posMasterRepository + .createQueryBuilder() + .update(PosMaster) + .set({ + posMasterOrder: () => `CASE id ${caseClauses_0} END`, + }) + .where(`id IN (${ids_0})`) + .execute(); setLogDataDiff(request, { before, after: sortData_0 }); break; } @@ -2789,7 +2801,19 @@ export class PositionController extends Controller { id: data.id, posMasterOrder: requestBody.sortId.indexOf(data.id) + 1, })); - await this.posMasterRepository.save(sortData_1, { data: request }); + // Bulk update using CASE WHEN instead of save() per row + const caseClauses_1 = sortData_1 + .map((d) => `WHEN '${d.id}' THEN ${d.posMasterOrder}`) + .join(" "); + const ids_1 = sortData_1.map((d) => `'${d.id}'`).join(","); + await this.posMasterRepository + .createQueryBuilder() + .update(PosMaster) + .set({ + posMasterOrder: () => `CASE id ${caseClauses_1} END`, + }) + .where(`id IN (${ids_1})`) + .execute(); setLogDataDiff(request, { before, after: sortData_1 }); break; } @@ -2818,7 +2842,19 @@ export class PositionController extends Controller { id: data.id, posMasterOrder: requestBody.sortId.indexOf(data.id) + 1, })); - await this.posMasterRepository.save(sortData_2, { data: request }); + // Bulk update using CASE WHEN instead of save() per row + const caseClauses_2 = sortData_2 + .map((d) => `WHEN '${d.id}' THEN ${d.posMasterOrder}`) + .join(" "); + const ids_2 = sortData_2.map((d) => `'${d.id}'`).join(","); + await this.posMasterRepository + .createQueryBuilder() + .update(PosMaster) + .set({ + posMasterOrder: () => `CASE id ${caseClauses_2} END`, + }) + .where(`id IN (${ids_2})`) + .execute(); setLogDataDiff(request, { before, after: sortData_2 }); break; } @@ -2847,7 +2883,19 @@ export class PositionController extends Controller { id: data.id, posMasterOrder: requestBody.sortId.indexOf(data.id) + 1, })); - await this.posMasterRepository.save(sortData_3, { data: request }); + // Bulk update using CASE WHEN instead of save() per row + const caseClauses_3 = sortData_3 + .map((d) => `WHEN '${d.id}' THEN ${d.posMasterOrder}`) + .join(" "); + const ids_3 = sortData_3.map((d) => `'${d.id}'`).join(","); + await this.posMasterRepository + .createQueryBuilder() + .update(PosMaster) + .set({ + posMasterOrder: () => `CASE id ${caseClauses_3} END`, + }) + .where(`id IN (${ids_3})`) + .execute(); setLogDataDiff(request, { before, after: sortData_3 }); break; } @@ -2876,7 +2924,19 @@ export class PositionController extends Controller { id: data.id, posMasterOrder: requestBody.sortId.indexOf(data.id) + 1, })); - await this.posMasterRepository.save(sortData_4, { data: request }); + // Bulk update using CASE WHEN instead of save() per row + const caseClauses_4 = sortData_4 + .map((d) => `WHEN '${d.id}' THEN ${d.posMasterOrder}`) + .join(" "); + const ids_4 = sortData_4.map((d) => `'${d.id}'`).join(","); + await this.posMasterRepository + .createQueryBuilder() + .update(PosMaster) + .set({ + posMasterOrder: () => `CASE id ${caseClauses_4} END`, + }) + .where(`id IN (${ids_4})`) + .execute(); setLogDataDiff(request, { before, after: sortData_4 }); break; }