fix(items/list): 마이그레이션 미적용 환경에서도 동작하도록 컬럼 자동 보장
Deploy momo-erp / deploy (push) Successful in 51s

증상: 마스터 품목 관리 화면에 품목이 하나도 안 보임.
원인: 마이그레이션 016 (vendor_objid) 이 운영 DB 에 적용 안 된 상태에서
       SELECT I.vendor_objid 가 'column does not exist' 로 실패 → 빈 배열 응답.

해결: API 첫 호출 시 ALTER TABLE ... ADD COLUMN IF NOT EXISTS 로
       vendor_objid + max_order_qty + is_hidden + requires_delivery 모두 자동 보장.
       idempotent 하므로 이미 적용된 환경에서도 NOOP.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
chpark
2026-05-07 23:24:58 +09:00
parent 58645a0b3f
commit b95ac11015
+21 -1
View File
@@ -1,12 +1,32 @@
import { NextRequest, NextResponse } from "next/server";
import { queryRows, queryOne } from "@/lib/db";
import { queryRows, queryOne, pool } from "@/lib/db";
import { requireMomoUser } from "@/lib/momo-guard";
// 마이그레이션 016/011 등이 운영 DB에 아직 안 들어간 환경에서도 안전하게 동작하도록
// 첫 호출 시 필요한 컬럼이 없으면 ADD COLUMN IF NOT EXISTS 로 보장한다.
let columnsEnsured = false;
async function ensureColumns() {
if (columnsEnsured) return;
try {
await pool.query(`
ALTER TABLE momo_items
ADD COLUMN IF NOT EXISTS vendor_objid TEXT,
ADD COLUMN IF NOT EXISTS max_order_qty INTEGER,
ADD COLUMN IF NOT EXISTS is_hidden CHAR(1) DEFAULT 'N',
ADD COLUMN IF NOT EXISTS requires_delivery CHAR(1) DEFAULT 'N';
`);
columnsEnsured = true;
} catch (err) {
console.error("[items/list ensureColumns]", err);
}
}
// 품목 목록 — USER 는 재고 있는 ACTIVE 만, ADMIN 은 전체 표시
// 숨김(is_hidden='Y') 품목: view_hidden='Y' 권한 회원과 관리자에게만 노출
export async function POST(req: NextRequest) {
const r = await requireMomoUser();
if (r instanceof NextResponse) return r;
await ensureColumns();
const body = await req.json().catch(() => ({}));
const { keyword, isTaxFree, makerObjid, status, onlyAvailable } = body as {