diff options
Diffstat (limited to 'lib/items/service.ts')
| -rw-r--r-- | lib/items/service.ts | 84 |
1 files changed, 69 insertions, 15 deletions
diff --git a/lib/items/service.ts b/lib/items/service.ts index ef14a5f0..226742ca 100644 --- a/lib/items/service.ts +++ b/lib/items/service.ts @@ -9,7 +9,7 @@ import { filterColumns } from "@/lib/filter-columns"; import { unstable_cache } from "@/lib/unstable-cache"; import { getErrorMessage } from "@/lib/handle-error"; -import { asc, desc, ilike, inArray, and, gte, lte, not, or } from "drizzle-orm"; +import { asc, desc, ilike, inArray, and, gte, lte, not, or ,eq} from "drizzle-orm"; import { CreateItemSchema, GetItemsSchema, UpdateItemSchema } from "./validations"; import { Item, items } from "@/db/schema/items"; import { countItems, deleteItemById, deleteItemsByIds, findAllItems, insertItem, selectItems, updateItem } from "./repository"; @@ -102,32 +102,86 @@ export async function getItems(input: GetItemsSchema) { /* ----------------------------------------------------- 2) 생성(Create) ----------------------------------------------------- */ +export interface ItemCreateData { + itemCode: string + itemName: string + description: string | null +} /** * Item 생성 후, (가장 오래된 Item 1개) 삭제로 * 전체 Item 개수를 고정 */ -export async function createItem(input: CreateItemSchema) { - unstable_noStore(); // Next.js 서버 액션 캐싱 방지 +export async function createItem(input: ItemCreateData) { + unstable_noStore() // Next.js 서버 액션 캐싱 방지 + try { - await db.transaction(async (tx) => { - // 새 Item 생성 - const [newTask] = await insertItem(tx, { - itemCode: input.itemCode, - itemName: input.itemName, - description: input.description, - }); - return newTask; + if (!input.itemCode || !input.itemName) { + return { + success: false, + message: "아이템 코드와 아이템 명은 필수입니다", + data: null, + error: "필수 필드 누락" + } + } - }); + // result 변수에 명시적으로 타입과 초기값 할당 + let result: any[] = [] + + // 트랜잭션 결과를 result에 할당 + result = await db.transaction(async (tx) => { + // 기존 아이템 확인 (itemCode는 unique) + const existingItem = await tx.query.items.findFirst({ + where: eq(items.itemCode, input.itemCode), + }) + + let txResult + if (existingItem) { + // 기존 아이템 업데이트 + txResult = await updateItem(tx, existingItem.id, { + itemName: input.itemName, + description: input.description, + }) + } else { + // 새 아이템 생성 + txResult = await insertItem(tx, { + itemCode: input.itemCode, + itemName: input.itemName, + description: input.description, + }) + } + + return txResult + }) // 캐시 무효화 - revalidateTag("items"); + revalidateTag("items") - return { data: null, error: null }; + return { + success: true, + data: result[0] || null, + error: null + } } catch (err) { - return { data: null, error: getErrorMessage(err) }; + console.error("아이템 생성/업데이트 오류:", err) + + // 중복 키 오류 처리 + if (err instanceof Error && err.message.includes("unique constraint")) { + return { + success: false, + message: "이미 존재하는 아이템 코드입니다", + data: null, + error: "중복 키 오류" + } + } + + return { + success: false, + message: getErrorMessage(err), + data: null, + error: getErrorMessage(err) + } } } |
