summaryrefslogtreecommitdiff
path: root/lib/items/service.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-04-28 02:13:30 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-04-28 02:13:30 +0000
commitef4c533ebacc2cdc97e518f30e9a9350004fcdfb (patch)
tree345251a3ed0f4429716fa5edaa31024d8f4cb560 /lib/items/service.ts
parent9ceed79cf32c896f8a998399bf1b296506b2cd4a (diff)
~20250428 작업사항
Diffstat (limited to 'lib/items/service.ts')
-rw-r--r--lib/items/service.ts84
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)
+ }
}
}