@things-factory/integration-data-go-kr 10.0.0-beta.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -0
- package/ROADMAP.md +271 -0
- package/dist-server/engine/connector/data-go-kr-client.d.ts +27 -0
- package/dist-server/engine/connector/data-go-kr-client.js +115 -0
- package/dist-server/engine/connector/data-go-kr-client.js.map +1 -0
- package/dist-server/engine/connector/data-go-kr-connector.d.ts +35 -0
- package/dist-server/engine/connector/data-go-kr-connector.js +59 -0
- package/dist-server/engine/connector/data-go-kr-connector.js.map +1 -0
- package/dist-server/engine/connector/index.d.ts +1 -0
- package/dist-server/engine/connector/index.js +4 -0
- package/dist-server/engine/connector/index.js.map +1 -0
- package/dist-server/engine/index.d.ts +2 -0
- package/dist-server/engine/index.js +5 -0
- package/dist-server/engine/index.js.map +1 -0
- package/dist-server/engine/spec/building-ledger.d.ts +9 -0
- package/dist-server/engine/spec/building-ledger.js +135 -0
- package/dist-server/engine/spec/building-ledger.js.map +1 -0
- package/dist-server/engine/spec/index.d.ts +16 -0
- package/dist-server/engine/spec/index.js +42 -0
- package/dist-server/engine/spec/index.js.map +1 -0
- package/dist-server/engine/spec/types.d.ts +79 -0
- package/dist-server/engine/spec/types.js +30 -0
- package/dist-server/engine/spec/types.js.map +1 -0
- package/dist-server/engine/task/building-ledger/general.d.ts +41 -0
- package/dist-server/engine/task/building-ledger/general.js +92 -0
- package/dist-server/engine/task/building-ledger/general.js.map +1 -0
- package/dist-server/engine/task/building-ledger/index.d.ts +12 -0
- package/dist-server/engine/task/building-ledger/index.js +15 -0
- package/dist-server/engine/task/building-ledger/index.js.map +1 -0
- package/dist-server/engine/task/call.d.ts +33 -0
- package/dist-server/engine/task/call.js +128 -0
- package/dist-server/engine/task/call.js.map +1 -0
- package/dist-server/engine/task/index.d.ts +19 -0
- package/dist-server/engine/task/index.js +22 -0
- package/dist-server/engine/task/index.js.map +1 -0
- package/dist-server/engine/types.d.ts +63 -0
- package/dist-server/engine/types.js +9 -0
- package/dist-server/engine/types.js.map +1 -0
- package/dist-server/index.d.ts +4 -0
- package/dist-server/index.js +10 -0
- package/dist-server/index.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -0
- package/helps/integration/connector/data-go-kr-connector.md +39 -0
- package/helps/integration/services/building-ledger.md +109 -0
- package/helps/integration/task/building-ledger.md +111 -0
- package/helps/integration/task/data-go-kr-call.md +87 -0
- package/package.json +28 -0
- package/server/engine/connector/data-go-kr-client.ts +133 -0
- package/server/engine/connector/data-go-kr-connector.ts +75 -0
- package/server/engine/connector/index.ts +1 -0
- package/server/engine/index.ts +2 -0
- package/server/engine/spec/building-ledger.ts +140 -0
- package/server/engine/spec/index.ts +41 -0
- package/server/engine/spec/types.ts +84 -0
- package/server/engine/task/building-ledger/general.ts +109 -0
- package/server/engine/task/building-ledger/index.ts +12 -0
- package/server/engine/task/call.ts +157 -0
- package/server/engine/task/index.ts +19 -0
- package/server/engine/types.ts +64 -0
- package/server/index.ts +5 -0
- package/things-factory.config.js +1 -0
- package/translations/en.json +11 -0
- package/translations/ja.json +11 -0
- package/translations/ko.json +11 -0
- package/translations/ms.json +11 -0
- package/translations/zh.json +11 -0
- package/tsconfig.json +10 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BldRgstServiceV2 = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* PNU 5요소 파라미터 스펙 — BldRgstServiceV2 의 모든 오퍼레이션이 공유.
|
|
6
|
+
* 별도 배열 분리로 작성해두면 타 서비스(예: 건축물대장 허브) 도 재사용 가능.
|
|
7
|
+
*/
|
|
8
|
+
const pnuParams = [
|
|
9
|
+
{
|
|
10
|
+
name: 'sigunguCd',
|
|
11
|
+
label: 'label.sigungu-cd',
|
|
12
|
+
required: true,
|
|
13
|
+
length: 5,
|
|
14
|
+
description: '시군구코드 5자리 (법정동코드 10자리의 앞 5자리).',
|
|
15
|
+
example: '11680'
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'bjdongCd',
|
|
19
|
+
label: 'label.bjdong-cd',
|
|
20
|
+
required: true,
|
|
21
|
+
length: 5,
|
|
22
|
+
description: '법정동코드 5자리 (법정동코드 10자리의 뒤 5자리).',
|
|
23
|
+
example: '10300'
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'platGbCd',
|
|
27
|
+
label: 'label.plat-gb-cd',
|
|
28
|
+
default: '0',
|
|
29
|
+
length: 1,
|
|
30
|
+
description: '대지구분 1자리. `0` 대지 / `1` 산 / `2` 블록.',
|
|
31
|
+
example: '0',
|
|
32
|
+
enum: [
|
|
33
|
+
{ value: '0', label: '대지' },
|
|
34
|
+
{ value: '1', label: '산' },
|
|
35
|
+
{ value: '2', label: '블록' }
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'bun',
|
|
40
|
+
label: 'label.bun',
|
|
41
|
+
required: true,
|
|
42
|
+
pad: 4,
|
|
43
|
+
description: '본번. 자동으로 4자리 zero-pad 됨 (예: `6` → `0006`). 하이픈 포함 지번은 본번/부번을 각각 입력.',
|
|
44
|
+
example: '223'
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'ji',
|
|
48
|
+
label: 'label.ji',
|
|
49
|
+
default: '0',
|
|
50
|
+
pad: 4,
|
|
51
|
+
description: '부번. 없으면 `0`. 자동 4자리 zero-pad.',
|
|
52
|
+
example: '0'
|
|
53
|
+
}
|
|
54
|
+
];
|
|
55
|
+
/**
|
|
56
|
+
* 국토교통부_건축물대장정보 서비스 v2 (data.go.kr 데이터셋 15044713).
|
|
57
|
+
*
|
|
58
|
+
* 세움터(EAIS) DB 를 원천으로 하는 공공 건축물대장 Open API.
|
|
59
|
+
* 모든 오퍼레이션은 동일한 PNU(필지고유번호) 구성요소로 조회한다:
|
|
60
|
+
* - sigunguCd (5) + bjdongCd (5) + platGbCd (1) + bun (4) + ji (4)
|
|
61
|
+
*/
|
|
62
|
+
exports.BldRgstServiceV2 = {
|
|
63
|
+
serviceId: '1613000/BldRgstService_v2',
|
|
64
|
+
label: '국토교통부_건축물대장정보 서비스 v2',
|
|
65
|
+
description: '세움터(EAIS) 원천의 건축물대장 정보를 조회한다. 표제부·총괄표제부·층별개요·부속지번·전유공용면적·주택가격·소유자현황·기본개요 등 8개 오퍼레이션 제공.',
|
|
66
|
+
homepage: 'https://www.data.go.kr/data/15044713/openapi.do',
|
|
67
|
+
operations: {
|
|
68
|
+
getBrTitleInfo: {
|
|
69
|
+
operationId: 'getBrTitleInfo',
|
|
70
|
+
label: '표제부 조회',
|
|
71
|
+
description: '건축물대장 표제부 (건물 본문) 를 조회한다. 연면적·용적률·지상층수·지하층수·주구조·주용도 등 건물 개요를 반환. 한 필지에 동이 여러 개이면 복수 레코드로 내려온다.',
|
|
72
|
+
params: [...pnuParams],
|
|
73
|
+
responseNotes: '응답 `response.body.items.item` 이 배열 또는 단일 객체로 올 수 있음. 모든 숫자 필드가 문자열(`"114000.00"`)로 내려옴. 집합건축물은 `regstrKindCd=3`, 일반건축물은 `regstrKindCd=2`.',
|
|
74
|
+
externalDocsUrl: 'https://www.data.go.kr/data/15044713/openapi.do',
|
|
75
|
+
examples: [
|
|
76
|
+
{
|
|
77
|
+
label: '서울 강남구 역삼동 823',
|
|
78
|
+
params: { sigunguCd: '11680', bjdongCd: '10300', bun: '823', ji: '0' }
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
getBrRecapTitleInfo: {
|
|
83
|
+
operationId: 'getBrRecapTitleInfo',
|
|
84
|
+
label: '총괄표제부 조회',
|
|
85
|
+
description: '집합건축물(아파트 단지 등) 의 총괄표제부를 조회한다. 단지 전체 연면적·대지면적·동 수·세대수 등을 반환. 일반건축물에는 없음.',
|
|
86
|
+
params: [...pnuParams],
|
|
87
|
+
responseNotes: '일반건축물대장(단동) 의 경우 레코드가 없음. 집합건축물일 때만 유효.',
|
|
88
|
+
examples: [
|
|
89
|
+
{
|
|
90
|
+
label: '아파트 단지 (예시)',
|
|
91
|
+
params: { sigunguCd: '11680', bjdongCd: '10300', bun: '823', ji: '0' }
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
getBrFlrOulnInfo: {
|
|
96
|
+
operationId: 'getBrFlrOulnInfo',
|
|
97
|
+
label: '층별개요 조회',
|
|
98
|
+
description: '층별로 주용도·구조·면적을 조회. 지하 N층부터 지상 M층까지 각 층의 상세 구성을 반환. `regstrKindCd`, `regstrGbCd` 로 어느 대장의 층인지 구분.',
|
|
99
|
+
params: [...pnuParams],
|
|
100
|
+
responseNotes: '한 필지에 동이 여러 개이면 각 동의 각 층이 모두 나옴 → 결과 건수가 많을 수 있음.'
|
|
101
|
+
},
|
|
102
|
+
getBrExposPubuseAreaInfo: {
|
|
103
|
+
operationId: 'getBrExposPubuseAreaInfo',
|
|
104
|
+
label: '전유공용면적 조회',
|
|
105
|
+
description: '집합건축물의 호(세대) 별 전유면적·공용면적을 조회. 아파트 세대별 실제 면적 산출에 사용.',
|
|
106
|
+
params: [...pnuParams],
|
|
107
|
+
responseNotes: '집합건축물일 때만 레코드 존재. 일반건축물에는 해당 없음.'
|
|
108
|
+
},
|
|
109
|
+
getBrAtchJibunInfo: {
|
|
110
|
+
operationId: 'getBrAtchJibunInfo',
|
|
111
|
+
label: '부속지번 조회',
|
|
112
|
+
description: '대장에 연결된 부속지번(인접 필지 등) 목록을 조회.',
|
|
113
|
+
params: [...pnuParams]
|
|
114
|
+
},
|
|
115
|
+
getBrHsprcInfo: {
|
|
116
|
+
operationId: 'getBrHsprcInfo',
|
|
117
|
+
label: '주택가격 조회',
|
|
118
|
+
description: '공동주택/단독주택 공시가격 이력을 조회. 연도별 개별주택가격·공동주택가격 제공.',
|
|
119
|
+
params: [...pnuParams]
|
|
120
|
+
},
|
|
121
|
+
getBrBasisOulnInfo: {
|
|
122
|
+
operationId: 'getBrBasisOulnInfo',
|
|
123
|
+
label: '기본개요 조회',
|
|
124
|
+
description: '대장의 기본개요(대장 구분, 대장 종류, 변동일, 변동원인) 를 조회. 변동 이력 추적 용도.',
|
|
125
|
+
params: [...pnuParams]
|
|
126
|
+
},
|
|
127
|
+
getBrExposInfo: {
|
|
128
|
+
operationId: 'getBrExposInfo',
|
|
129
|
+
label: '전유부 조회',
|
|
130
|
+
description: '집합건축물의 호(세대) 목록과 호별 개요를 조회. 전유공용면적보다 상위 요약 수준.',
|
|
131
|
+
params: [...pnuParams]
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=building-ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"building-ledger.js","sourceRoot":"","sources":["../../../server/engine/spec/building-ledger.ts"],"names":[],"mappings":"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","sourcesContent":["import { OperationParamSpec, ServiceSpec } from './types'\n\n/**\n * PNU 5요소 파라미터 스펙 — BldRgstServiceV2 의 모든 오퍼레이션이 공유.\n * 별도 배열 분리로 작성해두면 타 서비스(예: 건축물대장 허브) 도 재사용 가능.\n */\nconst pnuParams: OperationParamSpec[] = [\n {\n name: 'sigunguCd',\n label: 'label.sigungu-cd',\n required: true,\n length: 5,\n description: '시군구코드 5자리 (법정동코드 10자리의 앞 5자리).',\n example: '11680'\n },\n {\n name: 'bjdongCd',\n label: 'label.bjdong-cd',\n required: true,\n length: 5,\n description: '법정동코드 5자리 (법정동코드 10자리의 뒤 5자리).',\n example: '10300'\n },\n {\n name: 'platGbCd',\n label: 'label.plat-gb-cd',\n default: '0',\n length: 1,\n description: '대지구분 1자리. `0` 대지 / `1` 산 / `2` 블록.',\n example: '0',\n enum: [\n { value: '0', label: '대지' },\n { value: '1', label: '산' },\n { value: '2', label: '블록' }\n ]\n },\n {\n name: 'bun',\n label: 'label.bun',\n required: true,\n pad: 4,\n description: '본번. 자동으로 4자리 zero-pad 됨 (예: `6` → `0006`). 하이픈 포함 지번은 본번/부번을 각각 입력.',\n example: '223'\n },\n {\n name: 'ji',\n label: 'label.ji',\n default: '0',\n pad: 4,\n description: '부번. 없으면 `0`. 자동 4자리 zero-pad.',\n example: '0'\n }\n]\n\n/**\n * 국토교통부_건축물대장정보 서비스 v2 (data.go.kr 데이터셋 15044713).\n *\n * 세움터(EAIS) DB 를 원천으로 하는 공공 건축물대장 Open API.\n * 모든 오퍼레이션은 동일한 PNU(필지고유번호) 구성요소로 조회한다:\n * - sigunguCd (5) + bjdongCd (5) + platGbCd (1) + bun (4) + ji (4)\n */\nexport const BldRgstServiceV2: ServiceSpec = {\n serviceId: '1613000/BldRgstService_v2',\n label: '국토교통부_건축물대장정보 서비스 v2',\n description:\n '세움터(EAIS) 원천의 건축물대장 정보를 조회한다. 표제부·총괄표제부·층별개요·부속지번·전유공용면적·주택가격·소유자현황·기본개요 등 8개 오퍼레이션 제공.',\n homepage: 'https://www.data.go.kr/data/15044713/openapi.do',\n operations: {\n getBrTitleInfo: {\n operationId: 'getBrTitleInfo',\n label: '표제부 조회',\n description:\n '건축물대장 표제부 (건물 본문) 를 조회한다. 연면적·용적률·지상층수·지하층수·주구조·주용도 등 건물 개요를 반환. 한 필지에 동이 여러 개이면 복수 레코드로 내려온다.',\n params: [...pnuParams],\n responseNotes:\n '응답 `response.body.items.item` 이 배열 또는 단일 객체로 올 수 있음. 모든 숫자 필드가 문자열(`\"114000.00\"`)로 내려옴. 집합건축물은 `regstrKindCd=3`, 일반건축물은 `regstrKindCd=2`.',\n externalDocsUrl: 'https://www.data.go.kr/data/15044713/openapi.do',\n examples: [\n {\n label: '서울 강남구 역삼동 823',\n params: { sigunguCd: '11680', bjdongCd: '10300', bun: '823', ji: '0' }\n }\n ]\n },\n getBrRecapTitleInfo: {\n operationId: 'getBrRecapTitleInfo',\n label: '총괄표제부 조회',\n description:\n '집합건축물(아파트 단지 등) 의 총괄표제부를 조회한다. 단지 전체 연면적·대지면적·동 수·세대수 등을 반환. 일반건축물에는 없음.',\n params: [...pnuParams],\n responseNotes: '일반건축물대장(단동) 의 경우 레코드가 없음. 집합건축물일 때만 유효.',\n examples: [\n {\n label: '아파트 단지 (예시)',\n params: { sigunguCd: '11680', bjdongCd: '10300', bun: '823', ji: '0' }\n }\n ]\n },\n getBrFlrOulnInfo: {\n operationId: 'getBrFlrOulnInfo',\n label: '층별개요 조회',\n description:\n '층별로 주용도·구조·면적을 조회. 지하 N층부터 지상 M층까지 각 층의 상세 구성을 반환. `regstrKindCd`, `regstrGbCd` 로 어느 대장의 층인지 구분.',\n params: [...pnuParams],\n responseNotes: '한 필지에 동이 여러 개이면 각 동의 각 층이 모두 나옴 → 결과 건수가 많을 수 있음.'\n },\n getBrExposPubuseAreaInfo: {\n operationId: 'getBrExposPubuseAreaInfo',\n label: '전유공용면적 조회',\n description:\n '집합건축물의 호(세대) 별 전유면적·공용면적을 조회. 아파트 세대별 실제 면적 산출에 사용.',\n params: [...pnuParams],\n responseNotes: '집합건축물일 때만 레코드 존재. 일반건축물에는 해당 없음.'\n },\n getBrAtchJibunInfo: {\n operationId: 'getBrAtchJibunInfo',\n label: '부속지번 조회',\n description: '대장에 연결된 부속지번(인접 필지 등) 목록을 조회.',\n params: [...pnuParams]\n },\n getBrHsprcInfo: {\n operationId: 'getBrHsprcInfo',\n label: '주택가격 조회',\n description: '공동주택/단독주택 공시가격 이력을 조회. 연도별 개별주택가격·공동주택가격 제공.',\n params: [...pnuParams]\n },\n getBrBasisOulnInfo: {\n operationId: 'getBrBasisOulnInfo',\n label: '기본개요 조회',\n description: '대장의 기본개요(대장 구분, 대장 종류, 변동일, 변동원인) 를 조회. 변동 이력 추적 용도.',\n params: [...pnuParams]\n },\n getBrExposInfo: {\n operationId: 'getBrExposInfo',\n label: '전유부 조회',\n description: '집합건축물의 호(세대) 목록과 호별 개요를 조회. 전유공용면적보다 상위 요약 수준.',\n params: [...pnuParams]\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { OperationSpec, ServiceSpec } from './types';
|
|
2
|
+
export { BldRgstServiceV2 } from './building-ledger';
|
|
3
|
+
export * from './types';
|
|
4
|
+
export declare const SpecRegistry: {
|
|
5
|
+
/** 등록된 모든 서비스 스펙을 반환. */
|
|
6
|
+
listServices(): ServiceSpec[];
|
|
7
|
+
/** 서비스 ID 로 서비스 스펙 조회. */
|
|
8
|
+
getService(serviceId: string): ServiceSpec | undefined;
|
|
9
|
+
/** `<serviceId>.<operationId>` 참조 문자열로 오퍼레이션 스펙 조회. */
|
|
10
|
+
resolve(operationRef: string): {
|
|
11
|
+
service: ServiceSpec;
|
|
12
|
+
operation: OperationSpec;
|
|
13
|
+
} | undefined;
|
|
14
|
+
/** (확장용) 외부에서 서비스 스펙을 추가 등록. */
|
|
15
|
+
register(spec: ServiceSpec): void;
|
|
16
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SpecRegistry = exports.BldRgstServiceV2 = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const types_1 = require("./types");
|
|
6
|
+
const building_ledger_1 = require("./building-ledger");
|
|
7
|
+
var building_ledger_2 = require("./building-ledger");
|
|
8
|
+
Object.defineProperty(exports, "BldRgstServiceV2", { enumerable: true, get: function () { return building_ledger_2.BldRgstServiceV2; } });
|
|
9
|
+
tslib_1.__exportStar(require("./types"), exports);
|
|
10
|
+
const services = new Map();
|
|
11
|
+
function registerService(spec) {
|
|
12
|
+
services.set(spec.serviceId, spec);
|
|
13
|
+
}
|
|
14
|
+
registerService(building_ledger_1.BldRgstServiceV2);
|
|
15
|
+
exports.SpecRegistry = {
|
|
16
|
+
/** 등록된 모든 서비스 스펙을 반환. */
|
|
17
|
+
listServices() {
|
|
18
|
+
return Array.from(services.values());
|
|
19
|
+
},
|
|
20
|
+
/** 서비스 ID 로 서비스 스펙 조회. */
|
|
21
|
+
getService(serviceId) {
|
|
22
|
+
return services.get(serviceId);
|
|
23
|
+
},
|
|
24
|
+
/** `<serviceId>.<operationId>` 참조 문자열로 오퍼레이션 스펙 조회. */
|
|
25
|
+
resolve(operationRef) {
|
|
26
|
+
const parts = (0, types_1.parseOperationRef)(operationRef);
|
|
27
|
+
if (!parts)
|
|
28
|
+
return undefined;
|
|
29
|
+
const service = services.get(parts.serviceId);
|
|
30
|
+
if (!service)
|
|
31
|
+
return undefined;
|
|
32
|
+
const operation = service.operations[parts.operationId];
|
|
33
|
+
if (!operation)
|
|
34
|
+
return undefined;
|
|
35
|
+
return { service, operation };
|
|
36
|
+
},
|
|
37
|
+
/** (확장용) 외부에서 서비스 스펙을 추가 등록. */
|
|
38
|
+
register(spec) {
|
|
39
|
+
registerService(spec);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/spec/index.ts"],"names":[],"mappings":";;;;AAAA,mCAAuE;AACvE,uDAAoD;AAEpD,qDAAoD;AAA3C,mHAAA,gBAAgB,OAAA;AACzB,kDAAuB;AAEvB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAA;AAE/C,SAAS,eAAe,CAAC,IAAiB;IACxC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AACpC,CAAC;AAED,eAAe,CAAC,kCAAgB,CAAC,CAAA;AAEpB,QAAA,YAAY,GAAG;IAC1B,yBAAyB;IACzB,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IACtC,CAAC;IAED,0BAA0B;IAC1B,UAAU,CAAC,SAAiB;QAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAChC,CAAC;IAED,uDAAuD;IACvD,OAAO,CAAC,YAAoB;QAC1B,MAAM,KAAK,GAAG,IAAA,yBAAiB,EAAC,YAAY,CAAC,CAAA;QAC7C,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAA;QAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QACvD,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAA;QAChC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;IAC/B,CAAC;IAED,gCAAgC;IAChC,QAAQ,CAAC,IAAiB;QACxB,eAAe,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;CACF,CAAA","sourcesContent":["import { OperationSpec, ServiceSpec, parseOperationRef } from './types'\nimport { BldRgstServiceV2 } from './building-ledger'\n\nexport { BldRgstServiceV2 } from './building-ledger'\nexport * from './types'\n\nconst services = new Map<string, ServiceSpec>()\n\nfunction registerService(spec: ServiceSpec) {\n services.set(spec.serviceId, spec)\n}\n\nregisterService(BldRgstServiceV2)\n\nexport const SpecRegistry = {\n /** 등록된 모든 서비스 스펙을 반환. */\n listServices(): ServiceSpec[] {\n return Array.from(services.values())\n },\n\n /** 서비스 ID 로 서비스 스펙 조회. */\n getService(serviceId: string): ServiceSpec | undefined {\n return services.get(serviceId)\n },\n\n /** `<serviceId>.<operationId>` 참조 문자열로 오퍼레이션 스펙 조회. */\n resolve(operationRef: string): { service: ServiceSpec; operation: OperationSpec } | undefined {\n const parts = parseOperationRef(operationRef)\n if (!parts) return undefined\n const service = services.get(parts.serviceId)\n if (!service) return undefined\n const operation = service.operations[parts.operationId]\n if (!operation) return undefined\n return { service, operation }\n },\n\n /** (확장용) 외부에서 서비스 스펙을 추가 등록. */\n register(spec: ServiceSpec) {\n registerService(spec)\n }\n}\n"]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 공공데이터포털(data.go.kr) Open API 오퍼레이션 스펙 타입.
|
|
3
|
+
*
|
|
4
|
+
* "선언적 레지스트리 + 단일 범용 태스크" 패턴의 핵심.
|
|
5
|
+
*
|
|
6
|
+
* - 런타임에는 `data-go-kr-call` 태스크가 이 스펙으로 파라미터 검증·정규화
|
|
7
|
+
* - 빌드/CI 에서는 이 스펙으로부터 서비스 카탈로그 markdown 을 자동 생성 가능
|
|
8
|
+
* - (장기) 통합 UI 가 이 스펙을 읽어 오퍼레이션 선택 시 **동적 폼 + 인라인 도움말** 을 렌더
|
|
9
|
+
*
|
|
10
|
+
* 즉 스펙 하나가 검증·문서·UI 3가지의 진실의 원천(single source of truth) 이다.
|
|
11
|
+
*/
|
|
12
|
+
/** 단일 파라미터 스펙 (도움말용 메타 포함). */
|
|
13
|
+
export interface OperationParamSpec {
|
|
14
|
+
/** 쿼리 파라미터 이름 (예: `sigunguCd`). */
|
|
15
|
+
name: string;
|
|
16
|
+
/** 화면 라벨 키 (i18n). 생략 시 `name` 사용. */
|
|
17
|
+
label?: string;
|
|
18
|
+
/** 필수 여부. */
|
|
19
|
+
required?: boolean;
|
|
20
|
+
/** 기본값 (입력 생략 시 적용). */
|
|
21
|
+
default?: string;
|
|
22
|
+
/** zero-pad 길이. 예: `bun=6` + pad=4 → `"0006"`. */
|
|
23
|
+
pad?: number;
|
|
24
|
+
/** 정확히 이 길이여야 함. 위반 시 태스크가 ValidationError 던짐. */
|
|
25
|
+
length?: number;
|
|
26
|
+
/** 사람이 읽는 파라미터 설명 (도움말·UI 툴팁). */
|
|
27
|
+
description: string;
|
|
28
|
+
/** 예시 값. */
|
|
29
|
+
example?: string | number;
|
|
30
|
+
/** enum 선택지. 제공 시 태스크가 해당 값만 허용. */
|
|
31
|
+
enum?: Array<{
|
|
32
|
+
value: string;
|
|
33
|
+
label: string;
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
36
|
+
/** 오퍼레이션(엔드포인트) 스펙. */
|
|
37
|
+
export interface OperationSpec {
|
|
38
|
+
/** 오퍼레이션 경로명 (예: `getBrTitleInfo`). */
|
|
39
|
+
operationId: string;
|
|
40
|
+
/** 화면 라벨 (예: '표제부 조회'). */
|
|
41
|
+
label: string;
|
|
42
|
+
/** 사람이 읽는 설명 — 이 오퍼레이션이 무엇을 돌려주는지. */
|
|
43
|
+
description: string;
|
|
44
|
+
/** 파라미터 목록 (검증 + 문서). */
|
|
45
|
+
params: OperationParamSpec[];
|
|
46
|
+
/** 응답 구조 주의사항 (예: 다동 필지는 items 복수, 숫자는 문자열 등). */
|
|
47
|
+
responseNotes?: string;
|
|
48
|
+
/** data.go.kr 원문 상세 페이지 URL. */
|
|
49
|
+
externalDocsUrl?: string;
|
|
50
|
+
/** 자주 쓰는 예시 호출. */
|
|
51
|
+
examples?: Array<{
|
|
52
|
+
label: string;
|
|
53
|
+
params: Record<string, any>;
|
|
54
|
+
comment?: string;
|
|
55
|
+
}>;
|
|
56
|
+
}
|
|
57
|
+
/** 서비스 스펙 (오퍼레이션 묶음). */
|
|
58
|
+
export interface ServiceSpec {
|
|
59
|
+
/** 서비스 경로 (예: `1613000/BldRgstService_v2`). */
|
|
60
|
+
serviceId: string;
|
|
61
|
+
/** 화면 라벨 (예: '국토교통부_건축물대장정보 서비스 v2'). */
|
|
62
|
+
label: string;
|
|
63
|
+
/** 사람이 읽는 설명. */
|
|
64
|
+
description: string;
|
|
65
|
+
/** data.go.kr 활용신청 페이지 URL. */
|
|
66
|
+
homepage?: string;
|
|
67
|
+
/** 오퍼레이션 맵 (operationId → spec). */
|
|
68
|
+
operations: Record<string, OperationSpec>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 오퍼레이션 참조 문자열 파서.
|
|
72
|
+
*
|
|
73
|
+
* 레지스트리 조회 키: `"<serviceId>.<operationId>"` — 점으로 구분.
|
|
74
|
+
* 예: `"1613000/BldRgstService_v2.getBrTitleInfo"`
|
|
75
|
+
*/
|
|
76
|
+
export declare function parseOperationRef(ref: string): {
|
|
77
|
+
serviceId: string;
|
|
78
|
+
operationId: string;
|
|
79
|
+
} | null;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 공공데이터포털(data.go.kr) Open API 오퍼레이션 스펙 타입.
|
|
4
|
+
*
|
|
5
|
+
* "선언적 레지스트리 + 단일 범용 태스크" 패턴의 핵심.
|
|
6
|
+
*
|
|
7
|
+
* - 런타임에는 `data-go-kr-call` 태스크가 이 스펙으로 파라미터 검증·정규화
|
|
8
|
+
* - 빌드/CI 에서는 이 스펙으로부터 서비스 카탈로그 markdown 을 자동 생성 가능
|
|
9
|
+
* - (장기) 통합 UI 가 이 스펙을 읽어 오퍼레이션 선택 시 **동적 폼 + 인라인 도움말** 을 렌더
|
|
10
|
+
*
|
|
11
|
+
* 즉 스펙 하나가 검증·문서·UI 3가지의 진실의 원천(single source of truth) 이다.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.parseOperationRef = parseOperationRef;
|
|
15
|
+
/**
|
|
16
|
+
* 오퍼레이션 참조 문자열 파서.
|
|
17
|
+
*
|
|
18
|
+
* 레지스트리 조회 키: `"<serviceId>.<operationId>"` — 점으로 구분.
|
|
19
|
+
* 예: `"1613000/BldRgstService_v2.getBrTitleInfo"`
|
|
20
|
+
*/
|
|
21
|
+
function parseOperationRef(ref) {
|
|
22
|
+
const idx = ref.lastIndexOf('.');
|
|
23
|
+
if (idx < 0)
|
|
24
|
+
return null;
|
|
25
|
+
return {
|
|
26
|
+
serviceId: ref.substring(0, idx),
|
|
27
|
+
operationId: ref.substring(idx + 1)
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../server/engine/spec/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAkEH,8CAOC;AAbD;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,GAAW;IAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAChC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IACxB,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;QAChC,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;KACpC,CAAA;AACH,CAAC","sourcesContent":["/**\n * 공공데이터포털(data.go.kr) Open API 오퍼레이션 스펙 타입.\n *\n * \"선언적 레지스트리 + 단일 범용 태스크\" 패턴의 핵심.\n *\n * - 런타임에는 `data-go-kr-call` 태스크가 이 스펙으로 파라미터 검증·정규화\n * - 빌드/CI 에서는 이 스펙으로부터 서비스 카탈로그 markdown 을 자동 생성 가능\n * - (장기) 통합 UI 가 이 스펙을 읽어 오퍼레이션 선택 시 **동적 폼 + 인라인 도움말** 을 렌더\n *\n * 즉 스펙 하나가 검증·문서·UI 3가지의 진실의 원천(single source of truth) 이다.\n */\n\n/** 단일 파라미터 스펙 (도움말용 메타 포함). */\nexport interface OperationParamSpec {\n /** 쿼리 파라미터 이름 (예: `sigunguCd`). */\n name: string\n /** 화면 라벨 키 (i18n). 생략 시 `name` 사용. */\n label?: string\n /** 필수 여부. */\n required?: boolean\n /** 기본값 (입력 생략 시 적용). */\n default?: string\n /** zero-pad 길이. 예: `bun=6` + pad=4 → `\"0006\"`. */\n pad?: number\n /** 정확히 이 길이여야 함. 위반 시 태스크가 ValidationError 던짐. */\n length?: number\n /** 사람이 읽는 파라미터 설명 (도움말·UI 툴팁). */\n description: string\n /** 예시 값. */\n example?: string | number\n /** enum 선택지. 제공 시 태스크가 해당 값만 허용. */\n enum?: Array<{ value: string; label: string }>\n}\n\n/** 오퍼레이션(엔드포인트) 스펙. */\nexport interface OperationSpec {\n /** 오퍼레이션 경로명 (예: `getBrTitleInfo`). */\n operationId: string\n /** 화면 라벨 (예: '표제부 조회'). */\n label: string\n /** 사람이 읽는 설명 — 이 오퍼레이션이 무엇을 돌려주는지. */\n description: string\n /** 파라미터 목록 (검증 + 문서). */\n params: OperationParamSpec[]\n /** 응답 구조 주의사항 (예: 다동 필지는 items 복수, 숫자는 문자열 등). */\n responseNotes?: string\n /** data.go.kr 원문 상세 페이지 URL. */\n externalDocsUrl?: string\n /** 자주 쓰는 예시 호출. */\n examples?: Array<{\n label: string\n params: Record<string, any>\n comment?: string\n }>\n}\n\n/** 서비스 스펙 (오퍼레이션 묶음). */\nexport interface ServiceSpec {\n /** 서비스 경로 (예: `1613000/BldRgstService_v2`). */\n serviceId: string\n /** 화면 라벨 (예: '국토교통부_건축물대장정보 서비스 v2'). */\n label: string\n /** 사람이 읽는 설명. */\n description: string\n /** data.go.kr 활용신청 페이지 URL. */\n homepage?: string\n /** 오퍼레이션 맵 (operationId → spec). */\n operations: Record<string, OperationSpec>\n}\n\n/**\n * 오퍼레이션 참조 문자열 파서.\n *\n * 레지스트리 조회 키: `\"<serviceId>.<operationId>\"` — 점으로 구분.\n * 예: `\"1613000/BldRgstService_v2.getBrTitleInfo\"`\n */\nexport function parseOperationRef(ref: string): { serviceId: string; operationId: string } | null {\n const idx = ref.lastIndexOf('.')\n if (idx < 0) return null\n return {\n serviceId: ref.substring(0, idx),\n operationId: ref.substring(idx + 1)\n }\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Context } from '@things-factory/integration-base';
|
|
2
|
+
import { BuildingLedgerResult } from '../../types';
|
|
3
|
+
/**
|
|
4
|
+
* 건축물대장 표제부(`getBrTitleInfo`) 조회 태스크.
|
|
5
|
+
*
|
|
6
|
+
* 순수 fetch 만 수행 — 응답 items 를 그대로 반환한다. 다동 필지 집계·단위 변환
|
|
7
|
+
* 같은 도메인 가공은 소비자 측 후속 스텝(data-mapper / jsonata / 자체 태스크) 에서
|
|
8
|
+
* 처리하도록 책임을 분리.
|
|
9
|
+
*
|
|
10
|
+
* 왜 전용 태스크인가:
|
|
11
|
+
* - 범용 `data-go-kr-call` 로도 호출 가능하지만, 필요한 operationRef 와 PNU 5요소
|
|
12
|
+
* 파라미터를 매번 입력하는 대신 파라미터 폼을 명시적으로 제공해 운영/시나리오
|
|
13
|
+
* 작성 부담을 줄인다.
|
|
14
|
+
* - 건축물대장은 dssp/dkpi·건산연·공인중개·자산관리 등 자주 쓰이는 도메인이므로
|
|
15
|
+
* 범용보다 한 단계 전용화된 표면을 둘 가치가 충분.
|
|
16
|
+
*/
|
|
17
|
+
declare function BuildingLedgerTask(step: any, context: Context): Promise<{
|
|
18
|
+
data: BuildingLedgerResult;
|
|
19
|
+
}>;
|
|
20
|
+
declare namespace BuildingLedgerTask {
|
|
21
|
+
var parameterSpec: ({
|
|
22
|
+
type: string;
|
|
23
|
+
name: string;
|
|
24
|
+
label: string;
|
|
25
|
+
placeholder: string;
|
|
26
|
+
property?: undefined;
|
|
27
|
+
} | {
|
|
28
|
+
type: string;
|
|
29
|
+
name: string;
|
|
30
|
+
label: string;
|
|
31
|
+
property: {
|
|
32
|
+
options: {
|
|
33
|
+
value: string;
|
|
34
|
+
display: string;
|
|
35
|
+
}[];
|
|
36
|
+
};
|
|
37
|
+
placeholder?: undefined;
|
|
38
|
+
})[];
|
|
39
|
+
var help: string;
|
|
40
|
+
}
|
|
41
|
+
export default BuildingLedgerTask;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const integration_base_1 = require("@things-factory/integration-base");
|
|
4
|
+
const building_ledger_1 = require("../../spec/building-ledger");
|
|
5
|
+
/**
|
|
6
|
+
* 건축물대장 표제부(`getBrTitleInfo`) 조회 태스크.
|
|
7
|
+
*
|
|
8
|
+
* 순수 fetch 만 수행 — 응답 items 를 그대로 반환한다. 다동 필지 집계·단위 변환
|
|
9
|
+
* 같은 도메인 가공은 소비자 측 후속 스텝(data-mapper / jsonata / 자체 태스크) 에서
|
|
10
|
+
* 처리하도록 책임을 분리.
|
|
11
|
+
*
|
|
12
|
+
* 왜 전용 태스크인가:
|
|
13
|
+
* - 범용 `data-go-kr-call` 로도 호출 가능하지만, 필요한 operationRef 와 PNU 5요소
|
|
14
|
+
* 파라미터를 매번 입력하는 대신 파라미터 폼을 명시적으로 제공해 운영/시나리오
|
|
15
|
+
* 작성 부담을 줄인다.
|
|
16
|
+
* - 건축물대장은 dssp/dkpi·건산연·공인중개·자산관리 등 자주 쓰이는 도메인이므로
|
|
17
|
+
* 범용보다 한 단계 전용화된 표면을 둘 가치가 충분.
|
|
18
|
+
*/
|
|
19
|
+
async function BuildingLedgerTask(step, context) {
|
|
20
|
+
const { connection: connectionName, params } = step;
|
|
21
|
+
const { domain, user, data, variables, lng, logger } = context;
|
|
22
|
+
const instance = await integration_base_1.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
|
|
23
|
+
if (!instance?.client) {
|
|
24
|
+
throw new Error(`data-go-kr connection '${connectionName}' is not established.`);
|
|
25
|
+
}
|
|
26
|
+
const scope = { domain, user, lng, data, variables, console };
|
|
27
|
+
const evalString = (value) => {
|
|
28
|
+
if (value === undefined || value === null || value === '')
|
|
29
|
+
return undefined;
|
|
30
|
+
try {
|
|
31
|
+
return (0, integration_base_1.evaluateTemplate)(String(value), scope);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
throw new Error(`data-go-kr-building-ledger: failed to evaluate parameter: ${err.message}`);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const sigunguCd = evalString(params.sigunguCd);
|
|
38
|
+
const bjdongCd = evalString(params.bjdongCd);
|
|
39
|
+
const bun = evalString(params.bun);
|
|
40
|
+
if (!sigunguCd)
|
|
41
|
+
throw new Error('data-go-kr-building-ledger: sigunguCd is required');
|
|
42
|
+
if (!bjdongCd)
|
|
43
|
+
throw new Error('data-go-kr-building-ledger: bjdongCd is required');
|
|
44
|
+
if (!bun)
|
|
45
|
+
throw new Error('data-go-kr-building-ledger: bun is required');
|
|
46
|
+
const servicePath = `${building_ledger_1.BldRgstServiceV2.serviceId}/getBrTitleInfo`;
|
|
47
|
+
const normalizedParams = {
|
|
48
|
+
sigunguCd,
|
|
49
|
+
bjdongCd,
|
|
50
|
+
platGbCd: evalString(params.platGbCd) || '0',
|
|
51
|
+
bun: zpad(bun, 4),
|
|
52
|
+
ji: zpad(evalString(params.ji) || '0', 4),
|
|
53
|
+
numOfRows: 100,
|
|
54
|
+
pageNo: 1
|
|
55
|
+
};
|
|
56
|
+
logger?.info?.(`[data-go-kr] ${servicePath} params=${JSON.stringify(normalizedParams)}`);
|
|
57
|
+
const items = await instance.client.getItems(servicePath, normalizedParams);
|
|
58
|
+
if (items.length === 0) {
|
|
59
|
+
throw new Error(`data-go-kr-building-ledger: no 표제부 records for PNU ` +
|
|
60
|
+
`${normalizedParams.sigunguCd}-${normalizedParams.bjdongCd}-${normalizedParams.platGbCd}-` +
|
|
61
|
+
`${normalizedParams.bun}-${normalizedParams.ji}. ` +
|
|
62
|
+
`Possible causes: PNU is wrong, building is pre-approval, or the lot has no registered building.`);
|
|
63
|
+
}
|
|
64
|
+
logger?.info?.(`[data-go-kr] items=${items.length} first.bldNm='${items[0].bldNm || ''}'`);
|
|
65
|
+
return { data: { items } };
|
|
66
|
+
}
|
|
67
|
+
function zpad(value, width) {
|
|
68
|
+
const s = String(value);
|
|
69
|
+
return s.length >= width ? s : '0'.repeat(width - s.length) + s;
|
|
70
|
+
}
|
|
71
|
+
BuildingLedgerTask.parameterSpec = [
|
|
72
|
+
{ type: 'string', name: 'sigunguCd', label: 'label.sigungu-cd', placeholder: '예) 11680' },
|
|
73
|
+
{ type: 'string', name: 'bjdongCd', label: 'label.bjdong-cd', placeholder: '예) 10300' },
|
|
74
|
+
{
|
|
75
|
+
type: 'select',
|
|
76
|
+
name: 'platGbCd',
|
|
77
|
+
label: 'label.plat-gb-cd',
|
|
78
|
+
property: {
|
|
79
|
+
options: [
|
|
80
|
+
{ value: '0', display: '대지 / Plot' },
|
|
81
|
+
{ value: '1', display: '산 / Mountain' },
|
|
82
|
+
{ value: '2', display: '블록 / Block' }
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
{ type: 'string', name: 'bun', label: 'label.bun', placeholder: '예) 223' },
|
|
87
|
+
{ type: 'string', name: 'ji', label: 'label.ji', placeholder: '예) 0' }
|
|
88
|
+
];
|
|
89
|
+
BuildingLedgerTask.help = 'integration/task/building-ledger';
|
|
90
|
+
integration_base_1.TaskRegistry.registerTaskHandler('data-go-kr-building-ledger', BuildingLedgerTask);
|
|
91
|
+
exports.default = BuildingLedgerTask;
|
|
92
|
+
//# sourceMappingURL=general.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"general.js","sourceRoot":"","sources":["../../../../server/engine/task/building-ledger/general.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConnectionManager, Context, TaskRegistry, evaluateTemplate } from '@things-factory/integration-base'\n\nimport { DataGoKrConnectionInstance } from '../../connector/data-go-kr-connector'\nimport { BldRgstServiceV2 } from '../../spec/building-ledger'\nimport { BrTitleItem, BuildingLedgerResult } from '../../types'\n\n/**\n * 건축물대장 표제부(`getBrTitleInfo`) 조회 태스크.\n *\n * 순수 fetch 만 수행 — 응답 items 를 그대로 반환한다. 다동 필지 집계·단위 변환\n * 같은 도메인 가공은 소비자 측 후속 스텝(data-mapper / jsonata / 자체 태스크) 에서\n * 처리하도록 책임을 분리.\n *\n * 왜 전용 태스크인가:\n * - 범용 `data-go-kr-call` 로도 호출 가능하지만, 필요한 operationRef 와 PNU 5요소\n * 파라미터를 매번 입력하는 대신 파라미터 폼을 명시적으로 제공해 운영/시나리오\n * 작성 부담을 줄인다.\n * - 건축물대장은 dssp/dkpi·건산연·공인중개·자산관리 등 자주 쓰이는 도메인이므로\n * 범용보다 한 단계 전용화된 표면을 둘 가치가 충분.\n */\nasync function BuildingLedgerTask(step, context: Context): Promise<{ data: BuildingLedgerResult }> {\n const { connection: connectionName, params } = step\n const { domain, user, data, variables, lng, logger } = context\n\n const instance: DataGoKrConnectionInstance = await ConnectionManager.getConnectionInstanceByName(\n domain,\n connectionName\n )\n if (!instance?.client) {\n throw new Error(`data-go-kr connection '${connectionName}' is not established.`)\n }\n\n const scope = { domain, user, lng, data, variables, console }\n const evalString = (value: string | undefined) => {\n if (value === undefined || value === null || value === '') return undefined\n try {\n return evaluateTemplate(String(value), scope)\n } catch (err) {\n throw new Error(`data-go-kr-building-ledger: failed to evaluate parameter: ${(err as Error).message}`)\n }\n }\n\n const sigunguCd = evalString(params.sigunguCd)\n const bjdongCd = evalString(params.bjdongCd)\n const bun = evalString(params.bun)\n\n if (!sigunguCd) throw new Error('data-go-kr-building-ledger: sigunguCd is required')\n if (!bjdongCd) throw new Error('data-go-kr-building-ledger: bjdongCd is required')\n if (!bun) throw new Error('data-go-kr-building-ledger: bun is required')\n\n const servicePath = `${BldRgstServiceV2.serviceId}/getBrTitleInfo`\n\n const normalizedParams = {\n sigunguCd,\n bjdongCd,\n platGbCd: evalString(params.platGbCd) || '0',\n bun: zpad(bun, 4),\n ji: zpad(evalString(params.ji) || '0', 4),\n numOfRows: 100,\n pageNo: 1\n }\n\n logger?.info?.(`[data-go-kr] ${servicePath} params=${JSON.stringify(normalizedParams)}`)\n\n const items: BrTitleItem[] = await instance.client.getItems(servicePath, normalizedParams)\n\n if (items.length === 0) {\n throw new Error(\n `data-go-kr-building-ledger: no 표제부 records for PNU ` +\n `${normalizedParams.sigunguCd}-${normalizedParams.bjdongCd}-${normalizedParams.platGbCd}-` +\n `${normalizedParams.bun}-${normalizedParams.ji}. ` +\n `Possible causes: PNU is wrong, building is pre-approval, or the lot has no registered building.`\n )\n }\n\n logger?.info?.(`[data-go-kr] items=${items.length} first.bldNm='${items[0].bldNm || ''}'`)\n\n return { data: { items } }\n}\n\nfunction zpad(value: string, width: number): string {\n const s = String(value)\n return s.length >= width ? s : '0'.repeat(width - s.length) + s\n}\n\nBuildingLedgerTask.parameterSpec = [\n { type: 'string', name: 'sigunguCd', label: 'label.sigungu-cd', placeholder: '예) 11680' },\n { type: 'string', name: 'bjdongCd', label: 'label.bjdong-cd', placeholder: '예) 10300' },\n {\n type: 'select',\n name: 'platGbCd',\n label: 'label.plat-gb-cd',\n property: {\n options: [\n { value: '0', display: '대지 / Plot' },\n { value: '1', display: '산 / Mountain' },\n { value: '2', display: '블록 / Block' }\n ]\n }\n },\n { type: 'string', name: 'bun', label: 'label.bun', placeholder: '예) 223' },\n { type: 'string', name: 'ji', label: 'label.ji', placeholder: '예) 0' }\n]\n\nBuildingLedgerTask.help = 'integration/task/building-ledger'\n\nTaskRegistry.registerTaskHandler('data-go-kr-building-ledger', BuildingLedgerTask)\n\nexport default BuildingLedgerTask\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 건축물대장 도메인 전용 태스크 그룹.
|
|
3
|
+
*
|
|
4
|
+
* 공통 경로(`data-go-kr-call` + SpecRegistry) 로 커버 가능한 호출은 굳이 전용 태스크를
|
|
5
|
+
* 만들지 말 것 — 이 폴더는 **공통으로 표현하기 어려운 도메인 특화 로직** 이 필요한
|
|
6
|
+
* 태스크만 들어가는 자리이다.
|
|
7
|
+
*
|
|
8
|
+
* 향후 추가 예시:
|
|
9
|
+
* - apt.ts : data-go-kr-building-ledger-apt (집합건축물/아파트 전용)
|
|
10
|
+
* - recap.ts : data-go-kr-building-ledger-recap (총괄표제부 전용 변형)
|
|
11
|
+
*/
|
|
12
|
+
import './general';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* 건축물대장 도메인 전용 태스크 그룹.
|
|
5
|
+
*
|
|
6
|
+
* 공통 경로(`data-go-kr-call` + SpecRegistry) 로 커버 가능한 호출은 굳이 전용 태스크를
|
|
7
|
+
* 만들지 말 것 — 이 폴더는 **공통으로 표현하기 어려운 도메인 특화 로직** 이 필요한
|
|
8
|
+
* 태스크만 들어가는 자리이다.
|
|
9
|
+
*
|
|
10
|
+
* 향후 추가 예시:
|
|
11
|
+
* - apt.ts : data-go-kr-building-ledger-apt (집합건축물/아파트 전용)
|
|
12
|
+
* - recap.ts : data-go-kr-building-ledger-recap (총괄표제부 전용 변형)
|
|
13
|
+
*/
|
|
14
|
+
require("./general");
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/engine/task/building-ledger/index.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;GAUG;AACH,qBAAkB","sourcesContent":["/**\n * 건축물대장 도메인 전용 태스크 그룹.\n *\n * 공통 경로(`data-go-kr-call` + SpecRegistry) 로 커버 가능한 호출은 굳이 전용 태스크를\n * 만들지 말 것 — 이 폴더는 **공통으로 표현하기 어려운 도메인 특화 로직** 이 필요한\n * 태스크만 들어가는 자리이다.\n *\n * 향후 추가 예시:\n * - apt.ts : data-go-kr-building-ledger-apt (집합건축물/아파트 전용)\n * - recap.ts : data-go-kr-building-ledger-recap (총괄표제부 전용 변형)\n */\nimport './general'\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Context } from '@things-factory/integration-base';
|
|
2
|
+
import { DataGoKrResponse } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* 범용 공공데이터포털 호출 태스크.
|
|
5
|
+
*
|
|
6
|
+
* 하나의 태스크가 등록된 레지스트리의 **모든 오퍼레이션** 을 커버한다. TaskRegistry 가
|
|
7
|
+
* 수백 개 태스크로 폭발하는 것을 방지하는 핵심 설계.
|
|
8
|
+
*
|
|
9
|
+
* 입력:
|
|
10
|
+
* - `operationRef` : `"<serviceId>.<operationId>"` 형식 (예: `"1613000/BldRgstService_v2.getBrTitleInfo"`)
|
|
11
|
+
* - `params` : 오퍼레이션 파라미터 객체. 스펙 등록된 오퍼레이션이면 자동 검증·기본값·zero-pad 적용
|
|
12
|
+
*
|
|
13
|
+
* 레지스트리에 없는 오퍼레이션도 호출 가능 (스펙 없음 → 검증 스킵). 새 data.go.kr 서비스가
|
|
14
|
+
* 등장해도 스펙 추가 전까지 범용 호출로 즉시 사용 가능하다는 장점.
|
|
15
|
+
*/
|
|
16
|
+
declare function DataGoKrCall(step: any, context: Context): Promise<{
|
|
17
|
+
data: DataGoKrResponse<any>;
|
|
18
|
+
}>;
|
|
19
|
+
declare namespace DataGoKrCall {
|
|
20
|
+
var parameterSpec: ({
|
|
21
|
+
type: string;
|
|
22
|
+
name: string;
|
|
23
|
+
label: string;
|
|
24
|
+
placeholder: string;
|
|
25
|
+
} | {
|
|
26
|
+
type: string;
|
|
27
|
+
name: string;
|
|
28
|
+
label: string;
|
|
29
|
+
placeholder?: undefined;
|
|
30
|
+
})[];
|
|
31
|
+
var help: string;
|
|
32
|
+
}
|
|
33
|
+
export default DataGoKrCall;
|