summaryrefslogtreecommitdiff
path: root/lib/knox-api/approval/service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/knox-api/approval/service.ts')
-rw-r--r--lib/knox-api/approval/service.ts140
1 files changed, 140 insertions, 0 deletions
diff --git a/lib/knox-api/approval/service.ts b/lib/knox-api/approval/service.ts
new file mode 100644
index 00000000..6ef1b1f6
--- /dev/null
+++ b/lib/knox-api/approval/service.ts
@@ -0,0 +1,140 @@
+"use server"
+import db from '@/db/db';
+import { ApprovalLine } from "./approval";
+import { approval } from '@/db/schema/knox/approvals';
+import { eq, and } from 'drizzle-orm';
+
+// ========== 데이터베이스 서비스 함수들 ==========
+
+
+
+/**
+ * 결재 상신 데이터를 데이터베이스에 저장
+ */
+export async function saveApprovalToDatabase(
+ apInfId: string,
+ userId: string,
+ epId: string,
+ emailAddress: string,
+ subject: string,
+ content: string,
+ aplns: ApprovalLine[]
+): Promise<void> {
+ try {
+ await db.insert(approval).values({
+ apInfId,
+ userId,
+ epId,
+ emailAddress,
+ subject,
+ content,
+ status: '1', // 진행중 상태로 초기 설정
+ aplns,
+ isDeleted: false,
+ createdAt: new Date(),
+ updatedAt: new Date(),
+ });
+ } catch (error) {
+ console.error('결재 데이터 저장 실패:', error);
+ throw new Error(
+ '결재 데이터를 데이터베이스에 저장하는 중 오류가 발생했습니다.'
+ );
+ }
+}
+
+/**
+ * 결재 상태 업데이트
+ */
+export async function updateApprovalStatus(
+ apInfId: string,
+ status: string
+): Promise<void> {
+ try {
+ await db
+ .update(approval)
+ .set({
+ status,
+ updatedAt: new Date(),
+ })
+ .where(eq(approval.apInfId, apInfId));
+ } catch (error) {
+ console.error('결재 상태 업데이트 실패:', error);
+ throw new Error('결재 상태를 업데이트하는 중 오류가 발생했습니다.');
+ }
+}
+
+/**
+ * 결재 상세 정보 조회
+ */
+export async function getApprovalFromDatabase(
+ apInfId: string,
+ includeDeleted: boolean = false
+): Promise<typeof approval.$inferSelect | null> {
+ try {
+ const whereCondition = includeDeleted
+ ? eq(approval.apInfId, apInfId)
+ : and(eq(approval.apInfId, apInfId), eq(approval.isDeleted, false));
+
+ const result = await db
+ .select()
+ .from(approval)
+ .where(whereCondition)
+ .limit(1);
+
+ return result[0] || null;
+ } catch (error) {
+ console.error('결재 데이터 조회 실패:', error);
+ throw new Error('결재 데이터를 조회하는 중 오류가 발생했습니다.');
+ }
+}
+
+/**
+ * 사용자별 결재 목록 조회
+ */
+export async function getApprovalsByUser(
+ userId: string,
+ limit: number = 50,
+ offset: number = 0,
+ includeDeleted: boolean = false
+): Promise<typeof approval.$inferSelect[]> {
+ try {
+ const whereCondition = includeDeleted
+ ? eq(approval.userId, userId)
+ : and(eq(approval.userId, userId), eq(approval.isDeleted, false));
+
+ const result = await db
+ .select()
+ .from(approval)
+ .where(whereCondition)
+ .orderBy(approval.createdAt)
+ .limit(limit)
+ .offset(offset);
+
+ return result;
+ } catch (error) {
+ console.error('사용자 결재 목록 조회 실패:', error);
+ throw new Error('사용자 결재 목록을 조회하는 중 오류가 발생했습니다.');
+ }
+}
+
+/**
+ * 결재 삭제 (상신 취소 시) - Soft Delete
+ */
+export async function deleteApprovalFromDatabase(
+ apInfId: string
+): Promise<void> {
+ try {
+ await db
+ .update(approval)
+ .set({
+ isDeleted: true,
+ updatedAt: new Date(),
+ })
+ .where(eq(approval.apInfId, apInfId));
+ } catch (error) {
+ console.error('결재 데이터 삭제 실패:', error);
+ throw new Error('결재 데이터를 삭제하는 중 오류가 발생했습니다.');
+ }
+}
+
+