From 99607fb75b60fcc13a816c50158cf8ede0f5d492 Mon Sep 17 00:00:00 2001 From: tungdtsothink Date: Sun, 6 Jul 2025 10:18:10 +0700 Subject: [PATCH] add lowdb --- src/database/database.schema.ts | 101 +++++++++++++++++++++++++++++++ src/database/database.ts | 33 ++++++++++ src/database/db.json | 15 +++++ src/database/defaultAdminUser.ts | 11 ++++ 4 files changed, 160 insertions(+) create mode 100644 src/database/database.schema.ts create mode 100644 src/database/database.ts create mode 100644 src/database/db.json create mode 100644 src/database/defaultAdminUser.ts diff --git a/src/database/database.schema.ts b/src/database/database.schema.ts new file mode 100644 index 0000000..d652ee1 --- /dev/null +++ b/src/database/database.schema.ts @@ -0,0 +1,101 @@ +// database.schema.ts + +export interface Customer { + id: number; + firstNameEn: string; + lastNameEn: string; + // firstNameJp: string; + // lastNameJp: string; + // firstNameJpKana: string; + // lastNameJpKana: string; + email: string; + // email2?: string; + mobile: string; + // originAdd1: string; + // originAdd2: string; + // originAdd3: string; + // originCity: string; + // originState: string; + // originPostcode: string; + // originCountry: string; + // localAdd1: string; + // localAdd2: string; + // localAdd3: string; + // localCity: string; + // localState: string; + // localPostcode: string; + // localCountry: string; + // preferLang: string; + // dob: string; // ISO string + // gender: string; + // martial: string; + // occupation: string; + // ecName: string; + // ecRelation: string; + // ecEmail: string; + // ecMobile: string; + // initialOutReach?: string; + // initialOutReachRemark?: string; + // consentGiven?: string; + // contentDate?: string; + // status: string; + // remarks: string; + // potcustId?: string; + // isDeleted: boolean; +} + +export interface User { + id: number; + username: string; + email: string; + firstName: string; + lastName: string; + password: string; + isDeleted: boolean; +} + +export interface CustomerDependant { + id: number; + custId: string; + // deptSeq: number; + firstNameEn: string; + lastNameEn: string; + // firstNameJp: string; + // lastNameJp: string; + // firstNameJpKana: string; + // lastNameJpKana: string; + email: string; + email2?: string; + // mobile: string; + // originAdd1: string; + // originAdd2: string; + // originAdd3: string; + // originCity: string; + // originState: string; + // originPostcode: string; + // originCountry: string; + // localAdd1: string; + // localAdd2: string; + // localAdd3: string; + // localCity: string; + // localState: string; + // localPostcode: string; + // localCountry: string; + // preferLang: string; + // dob: string; + // gender: string; + // martial: string; + // occupation: string; + // ecName: string; + // ecRelation: string; + // ecEmail: string; + // ecMobile: string; + // isDeleted: boolean; +} + +// Lowdb root schema +export interface DBSchema { + customers: Customer[]; + users: User[]; + customerDependants: CustomerDependant[]; +} diff --git a/src/database/database.ts b/src/database/database.ts new file mode 100644 index 0000000..bba58e1 --- /dev/null +++ b/src/database/database.ts @@ -0,0 +1,33 @@ +import { Low } from "lowdb"; +import { JSONFile } from "lowdb/node"; +import { DBSchema } from "./database.schema"; +import { defaultAdminUser } from "./defaultAdminUser"; +import path from "path"; + +// File path for db.json +const file = path.resolve(process.cwd(), "src/database/db.json"); +const adapter = new JSONFile(file); +const db = new Low(adapter, { + customers: [], + users: [], + customerDependants: [], +}); + + +// Helper to generate next id for a collection +export function getNextId(items: T[]): number { + if (!items || items.length === 0) return 1; + return Math.max(...items.map((item) => item.id)) + 1; +} + +// Initialize DB and ensure default admin user exists +export async function initDB() { + await db.read(); + db.data ||= { customers: [], users: [], customerDependants: [] }; + if (db.data.users.length === 0) { + db.data.users.push(defaultAdminUser); + await db.write(); + } +} + +export { db }; diff --git a/src/database/db.json b/src/database/db.json new file mode 100644 index 0000000..6618d3b --- /dev/null +++ b/src/database/db.json @@ -0,0 +1,15 @@ +{ + "customers": [], + "users": [ + { + "id": 1, + "username": "admin", + "email": "admin@example.com", + "firstName": "Admin", + "lastName": "User", + "password": "admin123", + "isDeleted": false + } + ], + "customerDependants": [] +} \ No newline at end of file diff --git a/src/database/defaultAdminUser.ts b/src/database/defaultAdminUser.ts new file mode 100644 index 0000000..1c0ab9e --- /dev/null +++ b/src/database/defaultAdminUser.ts @@ -0,0 +1,11 @@ +import { User } from "./database.schema"; + +export const defaultAdminUser: User = { + id: 1, + username: "admin", + email: "admin@example.com", + firstName: "Admin", + lastName: "User", + password: "admin123", // You should hash this in production + isDeleted: false, +};