summaryrefslogtreecommitdiff
path: root/lib/equip-class/service.ts
blob: 1b37374095c03ddc3dfaff76872d7d9aba6d7909 (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
"use server"; // Next.js 서버 액션에서 직접 import하려면 (선택)

import { revalidateTag, unstable_noStore } from "next/cache";
import  db  from "@/db/db";
import { unstable_cache } from "@/lib/unstable-cache";
import { filterColumns } from "@/lib/filter-columns";
import { tagClasses } from "@/db/schema/vendorData";
import { asc, desc, ilike, inArray, and, gte, lte, not, or } from "drizzle-orm";
import { GetTagClassesSchema } from "./validation";
import { countTagClassLists, selectTagClassLists } from "./repository";
import { projects } from "@/db/schema";

export async function getTagClassists(input: GetTagClassesSchema) {
    // 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: tagClasses,
            filters: input.filters,
            joinOperator: input.joinOperator,
          });
  
  
          let globalWhere
          if (input.search) {
            const s = `%${input.search}%`
            globalWhere = or(ilike(tagClasses.code, s), ilike(tagClasses.label, s),
            ilike(projects.name, s),
            ilike(projects.code, s)
                 )
            // 필요시 여러 칼럼 OR조건 (status, priority, etc)
          }
  
          const conditions = [];
          if (advancedWhere) conditions.push(advancedWhere);
          if (globalWhere) conditions.push(globalWhere);
          
          let finalWhere;
          if (conditions.length > 0) {
            finalWhere = conditions.length > 1 ? and(...conditions) : conditions[0];
          }
  
          // 아니면 ilike, inArray, gte 등으로 where 절 구성
          const where = finalWhere
          
  
          const orderBy =
          input.sort.length > 0
            ? input.sort.map((item) => {
                // 프로젝트 관련 필드 정렬 처리
                if (item.id === 'projectCode') {
                  return item.desc ? desc(projects.code) : asc(projects.code);
                } else if (item.id === 'projectName') {
                  return item.desc ? desc(projects.name) : asc(projects.name);
                } else {
                  // 기존 필드 정렬
                  return item.desc 
                    ? desc(tagClasses[item.id as keyof typeof tagClasses.$inferSelect]) 
                    : asc(tagClasses[item.id as keyof typeof tagClasses.$inferSelect]);
                }
              })
            : [asc(tagClasses.createdAt)];
          // 트랜잭션 내부에서 Repository 호출
          const { data, total } = await db.transaction(async (tx) => {
            const data = await selectTagClassLists(tx, {
              where,
              orderBy,
              offset,
              limit: input.perPage,
            });
  
            const total = await countTagClassLists(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: ["equip-class"], // revalidateTag("items") 호출 시 무효화
    //   }
    // )();
  }