summaryrefslogtreecommitdiff
path: root/lib/procurement-items/repository.ts
blob: d660c81e0e575befbd448555c33d0595e6905e70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// lib/procurement/items/repository.ts
import db from "@/db/db";
import { ProcurementItem, procurementItems } from "@/db/schema/items";
import {
  eq,
  inArray,
  asc,
  desc,
  count,
} from "drizzle-orm";
import { PgTransaction } from "drizzle-orm/pg-core";

export type NewProcurementItem = typeof procurementItems.$inferInsert

/**
 * 단건/복수 조회 시 공통으로 사용 가능한 SELECT 함수
 * 트랜잭션(tx)을 받아서 사용하도록 구현
 */
export async function selectProcurementItems(
  tx: PgTransaction<any, any, any>,
  params: {
    where?: any;
    orderBy?: (ReturnType<typeof asc> | ReturnType<typeof desc>)[];
    offset?: number;
    limit?: number;
  }
) {
  const { where, orderBy, offset = 0, limit = 10 } = params;

  return tx
    .select()
    .from(procurementItems)
    .where(where)
    .orderBy(...(orderBy ?? []))
    .offset(offset)
    .limit(limit);
}

/** 총 개수 count */
export async function countProcurementItems(
  tx: PgTransaction<any, any, any>,
  where?: any
) {
  const res = await tx.select({ count: count() }).from(procurementItems).where(where);
  return res[0]?.count ?? 0;
}

/** 단건 Insert */
export async function insertProcurementItem(
  tx: PgTransaction<any, any, any>,
  data: NewProcurementItem
) {
  return tx
    .insert(procurementItems)
    .values(data)
    .returning({ id: procurementItems.id, createdAt: procurementItems.createdAt });
}

/** 복수 Insert */
export async function insertProcurementItems(
  tx: PgTransaction<any, any, any>,
  data: ProcurementItem[]
) {
  return tx.insert(procurementItems).values(data).onConflictDoNothing();
}

/** 단건 삭제 */
export async function deleteProcurementItemById(
  tx: PgTransaction<any, any, any>,
  itemId: number
) {
  return tx.delete(procurementItems).where(eq(procurementItems.id, itemId));
}

/** 복수 삭제 */
export async function deleteProcurementItemsByIds(
  tx: PgTransaction<any, any, any>,
  ids: number[]
) {
  return tx.delete(procurementItems).where(inArray(procurementItems.id, ids));
}

/** 전체 삭제 */
export async function deleteAllProcurementItems(
  tx: PgTransaction<any, any, any>,
) {
  return tx.delete(procurementItems);
}

/** 단건 업데이트 */
export async function updateProcurementItem(
  tx: PgTransaction<any, any, any>,
  itemId: number,
  data: Partial<ProcurementItem>
) {
  return tx
    .update(procurementItems)
    .set(data)
    .where(eq(procurementItems.id, itemId))
    .returning({ id: procurementItems.id, createdAt: procurementItems.createdAt });
}

/** 복수 업데이트 */
export async function updateProcurementItems(
  tx: PgTransaction<any, any, any>,
  ids: number[],
  data: Partial<ProcurementItem>
) {
  return tx
    .update(procurementItems)
    .set(data)
    .where(inArray(procurementItems.id, ids))
    .returning({ id: procurementItems.id, createdAt: procurementItems.createdAt });
}

export async function findAllProcurementItems(): Promise<ProcurementItem[]> {
  return db.select().from(procurementItems).orderBy(asc(procurementItems.itemCode));
}