From d0c602dda3d96b1761aa430df7d4602129c4c8a1 Mon Sep 17 00:00:00 2001 From: chpark Date: Fri, 29 May 2026 10:51:26 +0900 Subject: [PATCH] =?UTF-8?q?fix(push):=20=EC=83=88=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=EC=97=90=EC=84=9C=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EC=9E=90=EB=8F=84=20=EC=A0=9C=EC=99=B8=20=EC=95=88=20=ED=95=A8?= =?UTF-8?q?=20+=20=EC=A7=84=EB=8B=A8=20=EB=A1=9C=EA=B7=B8=20=EA=B0=95?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 관리자(user_type='A') 가 본인 구독으로 테스트해도 알람 미수신이던 문제 — notifyItemSale 의 generalOnly 옵션을 해제. 관리자도 본인의 변경분으로 발송 확인 가능. items/save 와 bulk-sale-range 양쪽에 sent/failed/스킵 사유 로그 추가. --- src/app/api/m/items/bulk-sale-range/route.ts | 10 +++++----- src/app/api/m/items/save/route.ts | 13 ++++++++----- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/app/api/m/items/bulk-sale-range/route.ts b/src/app/api/m/items/bulk-sale-range/route.ts index 0125343..5eebd97 100644 --- a/src/app/api/m/items/bulk-sale-range/route.ts +++ b/src/app/api/m/items/bulk-sale-range/route.ts @@ -69,13 +69,13 @@ export async function POST(req: NextRequest) { if (rows.length === 1) { const r = rows[0]; const body = r.orderable_now ? r.item_name : `${r.item_name} (${r.start_txt ?? "곧"} 판매 예정)`; - await sendPush({ title: "새 상품이 등록되었습니다", body, url: "/m/orders/new", tag: "item-bulk" }, undefined, { generalOnly: true }); + const sr = await sendPush({ title: "새 상품이 등록되었습니다", body, url: "/m/orders/new", tag: "item-bulk" }); + console.log(`[bulk-sale-range notify] item=${r.item_name} sent=${sr.sent} failed=${sr.failed}`); } else if (rows.length > 1) { - await sendPush( - { title: "새 상품이 등록되었습니다", body: `${rows.length}개 상품이 등록되었습니다. 지금 확인해보세요.`, url: "/m/orders/new", tag: "item-bulk" }, - undefined, - { generalOnly: true } + const sr = await sendPush( + { title: "새 상품이 등록되었습니다", body: `${rows.length}개 상품이 등록되었습니다. 지금 확인해보세요.`, url: "/m/orders/new", tag: "item-bulk" } ); + console.log(`[bulk-sale-range notify] count=${rows.length} sent=${sr.sent} failed=${sr.failed}`); } } catch (e) { console.error("[bulk-sale-range notify]", e); diff --git a/src/app/api/m/items/save/route.ts b/src/app/api/m/items/save/route.ts index 27b82b7..9cd20a4 100644 --- a/src/app/api/m/items/save/route.ts +++ b/src/app/api/m/items/save/route.ts @@ -73,17 +73,17 @@ async function getSaleInfo(objid: string): Promise { }; } -// 판매 일정 등록/변경 시 일반 사용자(거래처) 전체에게 푸시 (실패해도 저장에는 영향 없음) +// 판매 일정 등록/변경 시 모든 구독자(거래처 + 관리자 본인 포함) 에게 푸시. +// 관리자 본인도 본인 변경분을 받아 새 상품 등록 사실/시점을 확인할 수 있게 함. async function notifyItemSale(itemName: string, objid: string, info: SaleInfo) { try { const body = info.orderableNow ? itemName : `${itemName} (${info.startTxt ?? "곧"} 판매 예정)`; - await sendPush( - { title: "새 상품이 등록되었습니다", body, url: "/m/orders/new", tag: `item-${objid}` }, - undefined, - { generalOnly: true } + const res = await sendPush( + { title: "새 상품이 등록되었습니다", body, url: "/m/orders/new", tag: `item-${objid}` } ); + console.log(`[items/save notify] item=${itemName} sent=${res.sent} failed=${res.failed}`); } catch (err) { console.error("[items/save notify]", err); } @@ -191,8 +191,11 @@ export async function POST(req: NextRequest) { (beforeInfo?.startTxt ?? null) !== (afterInfo?.startTxt ?? null) || (beforeInfo?.endTxt ?? null) !== (afterInfo?.endTxt ?? null) || (beforeInfo?.alwaysSale ?? false) !== (afterInfo?.alwaysSale ?? false); + console.log(`[items/save] update item=${cleanName} objid=${objid} datesChanged=${datesChanged} sellable=${afterInfo?.sellable} alwaysSale=${afterInfo?.alwaysSale} startBefore="${beforeInfo?.startTxt ?? ""}" startAfter="${afterInfo?.startTxt ?? ""}" endBefore="${beforeInfo?.endTxt ?? ""}" endAfter="${afterInfo?.endTxt ?? ""}"`); if (datesChanged && afterInfo?.sellable) { await notifyItemSale(cleanName, objid, afterInfo); + } else { + console.log(`[items/save] notify SKIPPED — datesChanged=${datesChanged} sellable=${afterInfo?.sellable}`); } return NextResponse.json({ success: true, objId: objid }); }