You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.4 KiB
TypeScript
94 lines
2.4 KiB
TypeScript
import "server-only";
|
|
|
|
import { asc, count, eq, like } from "drizzle-orm";
|
|
import { amigoDb } from "@/db/amigo";
|
|
import { no_barang, satuan_barang } from "@/db/amigo/schema";
|
|
import { PER_PAGE } from "@/lib/pagination";
|
|
import { escapeLike } from "@/lib/utils";
|
|
|
|
export type SatuanBarang = {
|
|
idSatuanBarang: number;
|
|
namaSatuanBarang: string | null;
|
|
};
|
|
|
|
export type SatuanBarangPage = {
|
|
rows: SatuanBarang[];
|
|
hasNext: boolean;
|
|
};
|
|
|
|
// Kolom DB nullable, tapi isian form wajib string.
|
|
export type SatuanBarangInput = {
|
|
namaSatuanBarang: NonNullable<SatuanBarang["namaSatuanBarang"]>;
|
|
};
|
|
|
|
export async function insertSatuanBarang(
|
|
input: SatuanBarangInput,
|
|
): Promise<number> {
|
|
const [res] = await amigoDb.insert(satuan_barang).values({
|
|
namaSatuanBarang: input.namaSatuanBarang,
|
|
});
|
|
|
|
return res.insertId;
|
|
}
|
|
|
|
export async function updateSatuanBarang(
|
|
idSatuanBarang: number,
|
|
input: SatuanBarangInput,
|
|
): Promise<boolean> {
|
|
const [res] = await amigoDb
|
|
.update(satuan_barang)
|
|
.set({ namaSatuanBarang: input.namaSatuanBarang })
|
|
.where(eq(satuan_barang.idSatuanBarang, idSatuanBarang));
|
|
|
|
return res.affectedRows > 0;
|
|
}
|
|
|
|
// `no_barang.satuan` menyimpan idSatuanBarang sebagai varchar.
|
|
export async function countPemakaianSatuanBarang(
|
|
idSatuanBarang: number,
|
|
): Promise<number> {
|
|
const [row] = await amigoDb
|
|
.select({ total: count() })
|
|
.from(no_barang)
|
|
.where(eq(no_barang.satuan, String(idSatuanBarang)));
|
|
|
|
return row?.total ?? 0;
|
|
}
|
|
|
|
export async function deleteSatuanBarang(
|
|
idSatuanBarang: number,
|
|
): Promise<boolean> {
|
|
const [res] = await amigoDb
|
|
.delete(satuan_barang)
|
|
.where(eq(satuan_barang.idSatuanBarang, idSatuanBarang));
|
|
|
|
return res.affectedRows > 0;
|
|
}
|
|
|
|
export async function listSatuanBarang(
|
|
search?: string,
|
|
page = 1,
|
|
): Promise<SatuanBarangPage> {
|
|
const q = search?.trim();
|
|
const pattern = q ? `%${escapeLike(q)}%` : "";
|
|
|
|
const rows = await amigoDb
|
|
.select({
|
|
idSatuanBarang: satuan_barang.idSatuanBarang,
|
|
namaSatuanBarang: satuan_barang.namaSatuanBarang,
|
|
})
|
|
.from(satuan_barang)
|
|
.where(q ? like(satuan_barang.namaSatuanBarang, pattern) : undefined)
|
|
.orderBy(
|
|
asc(satuan_barang.namaSatuanBarang),
|
|
asc(satuan_barang.idSatuanBarang),
|
|
)
|
|
.limit(PER_PAGE + 1)
|
|
.offset((page - 1) * PER_PAGE);
|
|
|
|
return {
|
|
rows: rows.slice(0, PER_PAGE),
|
|
hasNext: rows.length > PER_PAGE,
|
|
};
|
|
}
|