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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
"use server"; // Next.js 서버 액션에서 직접 import하려면 (선택)
import db from "@/db/db";
import { projects, type Project } from "@/db/schema";
import { filterColumns } from "@/lib/filter-columns";
import { unstable_cache } from "@/lib/unstable-cache";
import { and, asc, desc, eq, ilike, or } from "drizzle-orm";
import { countProjectLists, selectProjectLists } from "./repository";
import { GetProjectListsSchema } from "./validation";
export async function getProjectLists(input: GetProjectListsSchema) {
return unstable_cache(
async () => {
try {
const offset = (input.page - 1) * input.perPage;
// const advancedTable = input.flags.includes("advancedTable");
const advancedTable = true;
// advancedTable 모드면 filterColumns()로 where 절 구성
const advancedWhere = filterColumns({
table: projects,
filters: input.filters,
joinOperator: input.joinOperator,
});
let globalWhere
if (input.search) {
const s = `%${input.search}%`
globalWhere = or(
ilike(projects.name, s),
ilike(projects.code, s),
ilike(projects.type, s),
)
// 필요시 여러 칼럼 OR조건 (status, priority, etc)
}
const finalWhere = and(
// advancedWhere or your existing conditions
advancedWhere,
globalWhere // and()함수로 결합 or or() 등으로 결합
)
// 아니면 ilike, inArray, gte 등으로 where 절 구성
const where = finalWhere
const orderBy =
input.sort.length > 0
? input.sort.map((item) =>
item.desc ? desc(projects[item.id]) : asc(projects[item.id])
)
: [asc(projects.createdAt)];
// 트랜잭션 내부에서 Repository 호출
const { data, total } = await db.transaction(async (tx) => {
const data = await selectProjectLists(tx, {
where,
orderBy,
offset,
limit: input.perPage,
});
const total = await countProjectLists(tx, where);
return { data, total };
});
const pageCount = Math.ceil(total / input.perPage);
return { data, pageCount };
} catch (err) {
// 에러 발생 시 디폴트
return { data: [], pageCount: 0 };
}
},
[JSON.stringify(input)], // 캐싱 키
{
revalidate: 3600,
tags: ["project-lists"],
}
)();
}
export async function getProjectInfoByProjectCode(projectCode: string) {
const projectInfo = await db.select().from(projects).where(eq(projects.code, projectCode)).limit(1);
if (!projectInfo || projectInfo.length === 0) {
throw new Error(`프로젝트 코드 "${projectCode}"를 찾을 수 없습니다.`);
}
const projectInfoForAvl = {
// 프로젝트코드
projectCode: projectInfo[0].code,
// 프로젝트명
projectName: projectInfo[0].name,
// 선종
shipType: projectInfo[0].SKND || undefined,
// H/T 구분
projectHtDivision: projectInfo[0].type || undefined,
};
return projectInfoForAvl;
}
export async function getAllProjectInfoByProjectCode(projectCode: string) {
return await db
.select()
.from(projects)
.where(eq(projects.code, projectCode))
.limit(1);
}
/**
* projectId로 프로젝트 코드를 가져오는 함수
* @param projectId - 프로젝트 ID
* @returns 프로젝트 코드 또는 null
*/
export async function getProjectCode(projectId: number): Promise<string | null> {
try {
const project = await db
.select({ code: projects.code })
.from(projects)
.where(eq(projects.id, projectId))
.limit(1);
return project[0]?.code || null;
} catch (error) {
console.error("Error fetching project code:", error)
return null
}
}
export async function getProjects(): Promise<Project[]> {
try {
// 트랜잭션을 사용하여 프로젝트 데이터 조회
const projectList = await db.transaction(async (tx) => {
// 모든 프로젝트 조회
const results = await tx
.select({
id: projects.id,
projectCode: projects.code, // 테이블의 실제 컬럼명에 맞게 조정
projectName: projects.name, // 테이블의 실제 컬럼명에 맞게 조정
type: projects.type, // 테이블의 실제 컬럼명에 맞게 조정
})
.from(projects)
.orderBy(projects.code);
return results;
});
return projectList;
} catch (error) {
console.error("프로젝트 목록 가져오기 실패:", error);
return []; // 오류 발생 시 빈 배열 반환
}
}
|