summaryrefslogtreecommitdiff
path: root/components/common/selectors/nation/nation-service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'components/common/selectors/nation/nation-service.ts')
-rw-r--r--components/common/selectors/nation/nation-service.ts193
1 files changed, 193 insertions, 0 deletions
diff --git a/components/common/selectors/nation/nation-service.ts b/components/common/selectors/nation/nation-service.ts
new file mode 100644
index 00000000..091131fe
--- /dev/null
+++ b/components/common/selectors/nation/nation-service.ts
@@ -0,0 +1,193 @@
+"use server"
+
+import db from '@/db/db'
+import { cmctbCdnm } from '@/db/schema/NONSAP/nonsap'
+import { eq, or, ilike, and } from 'drizzle-orm'
+
+// 국가코드 타입 정의
+export interface NationCode {
+ CD: string // 2글자 국가코드
+ CD2: string // 3글자 국가코드
+ CD3: string // 3글자 숫자 국가코드
+ CDNM: string // 한국어 국가명
+ GRP_DSC: string // 영문 국가명
+}
+
+// 국가코드 검색 옵션
+export interface NationSearchOptions {
+ searchTerm?: string
+ limit?: number
+}
+
+/**
+ * 국가코드 목록 조회
+ * 내부 PostgreSQL DB의 cmctbCdnm 테이블에서 CD_CLF = 'LE0010' 조건으로 조회
+ */
+export async function getNationCodes(options: NationSearchOptions = {}): Promise<{
+ success: boolean
+ data: NationCode[]
+ error?: string
+}> {
+ try {
+ const { searchTerm, limit = 100 } = options
+
+ // 검색어가 있는 경우와 없는 경우를 분리해서 처리
+ let result;
+
+ if (searchTerm && searchTerm.trim()) {
+ const term = `%${searchTerm.trim().toUpperCase()}%`
+ result = await db
+ .select({
+ CD: cmctbCdnm.CD,
+ CD2: cmctbCdnm.CD2,
+ CD3: cmctbCdnm.CD3,
+ CDNM: cmctbCdnm.CDNM,
+ GRP_DSC: cmctbCdnm.GRP_DSC
+ })
+ .from(cmctbCdnm)
+ .where(
+ and(
+ eq(cmctbCdnm.CD_CLF, 'LE0010'),
+ or(
+ ilike(cmctbCdnm.CD, term),
+ ilike(cmctbCdnm.CD2, term),
+ ilike(cmctbCdnm.CD3, term),
+ ilike(cmctbCdnm.CDNM, `%${searchTerm.trim()}%`),
+ ilike(cmctbCdnm.GRP_DSC, term)
+ )
+ )
+ )
+ .orderBy(cmctbCdnm.CD)
+ .limit(limit > 0 ? limit : 100)
+ } else {
+ result = await db
+ .select({
+ CD: cmctbCdnm.CD,
+ CD2: cmctbCdnm.CD2,
+ CD3: cmctbCdnm.CD3,
+ CDNM: cmctbCdnm.CDNM,
+ GRP_DSC: cmctbCdnm.GRP_DSC
+ })
+ .from(cmctbCdnm)
+ .where(eq(cmctbCdnm.CD_CLF, 'LE0010'))
+ .orderBy(cmctbCdnm.CD)
+ .limit(limit > 0 ? limit : 100)
+ }
+
+ // null 값 처리
+ const cleanedResult = result
+ .filter(item => item.CD && item.CD2 && item.CD3 && item.CDNM && item.GRP_DSC)
+ .map(item => ({
+ CD: item.CD!,
+ CD2: item.CD2!,
+ CD3: item.CD3!,
+ CDNM: item.CDNM!,
+ GRP_DSC: item.GRP_DSC!
+ }))
+
+ return {
+ success: true,
+ data: cleanedResult
+ }
+ } catch (error) {
+ console.error('Error fetching nation codes:', error)
+ return {
+ success: false,
+ data: [],
+ error: '국가코드를 조회하는 중 오류가 발생했습니다.'
+ }
+ }
+}
+
+/**
+ * 특정 국가코드 조회 (2글자 코드 기준)
+ * 내부 PostgreSQL DB의 cmctbCdnm 테이블에서 조회
+ */
+export async function getNationCodeByCode(code: string): Promise<NationCode | null> {
+ if (!code.trim()) {
+ return null
+ }
+
+ try {
+ const result = await db
+ .select({
+ CD: cmctbCdnm.CD,
+ CD2: cmctbCdnm.CD2,
+ CD3: cmctbCdnm.CD3,
+ CDNM: cmctbCdnm.CDNM,
+ GRP_DSC: cmctbCdnm.GRP_DSC
+ })
+ .from(cmctbCdnm)
+ .where(
+ and(
+ eq(cmctbCdnm.CD_CLF, 'LE0010'),
+ eq(cmctbCdnm.CD, code.trim().toUpperCase())
+ )
+ )
+ .limit(1)
+
+ if (result.length > 0 && result[0].CD && result[0].CD2 && result[0].CD3 && result[0].CDNM && result[0].GRP_DSC) {
+ return {
+ CD: result[0].CD,
+ CD2: result[0].CD2,
+ CD3: result[0].CD3,
+ CDNM: result[0].CDNM,
+ GRP_DSC: result[0].GRP_DSC
+ }
+ }
+
+ return null
+ } catch (error) {
+ console.error('Error fetching nation code by code:', error)
+ return null
+ }
+}
+
+/**
+ * 여러 국가코드 조회 (2글자 코드 기준)
+ */
+export async function getNationCodesByCodes(codes: string[]): Promise<NationCode[]> {
+ if (!codes || codes.length === 0) {
+ return []
+ }
+
+ try {
+ const cleanedCodes = codes
+ .map(code => code.trim().toUpperCase())
+ .filter(code => code.length > 0)
+
+ if (cleanedCodes.length === 0) {
+ return []
+ }
+
+ const result = await db
+ .select({
+ CD: cmctbCdnm.CD,
+ CD2: cmctbCdnm.CD2,
+ CD3: cmctbCdnm.CD3,
+ CDNM: cmctbCdnm.CDNM,
+ GRP_DSC: cmctbCdnm.GRP_DSC
+ })
+ .from(cmctbCdnm)
+ .where(
+ and(
+ eq(cmctbCdnm.CD_CLF, 'LE0010'),
+ or(...cleanedCodes.map(code => eq(cmctbCdnm.CD, code)))
+ )
+ )
+ .orderBy(cmctbCdnm.CD)
+
+ return result
+ .filter(item => item.CD && item.CD2 && item.CD3 && item.CDNM && item.GRP_DSC)
+ .map(item => ({
+ CD: item.CD!,
+ CD2: item.CD2!,
+ CD3: item.CD3!,
+ CDNM: item.CDNM!,
+ GRP_DSC: item.GRP_DSC!
+ }))
+ } catch (error) {
+ console.error('Error fetching nation codes by codes:', error)
+ return []
+ }
+}