@things-factory/integration-data-go-kr 10.0.0-beta.62 → 10.0.0-beta.63

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.
Files changed (94) hide show
  1. package/README.md +37 -16
  2. package/ROADMAP.md +25 -14
  3. package/dist-server/engine/connector/data-go-kr-client.d.ts +1 -1
  4. package/dist-server/engine/connector/data-go-kr-client.js +25 -2
  5. package/dist-server/engine/connector/data-go-kr-client.js.map +1 -1
  6. package/dist-server/engine/connector/data-go-kr-connector.d.ts +5 -11
  7. package/dist-server/engine/connector/data-go-kr-connector.js +3 -9
  8. package/dist-server/engine/connector/data-go-kr-connector.js.map +1 -1
  9. package/dist-server/engine/spec/building-ledger/hub.d.ts +12 -0
  10. package/dist-server/engine/spec/{building-ledger.js → building-ledger/hub.js} +13 -10
  11. package/dist-server/engine/spec/building-ledger/hub.js.map +1 -0
  12. package/dist-server/engine/spec/building-ledger/index.d.ts +7 -0
  13. package/dist-server/engine/spec/building-ledger/index.js +12 -0
  14. package/dist-server/engine/spec/building-ledger/index.js.map +1 -0
  15. package/dist-server/engine/spec/index.d.ts +2 -1
  16. package/dist-server/engine/spec/index.js +22 -5
  17. package/dist-server/engine/spec/index.js.map +1 -1
  18. package/dist-server/engine/spec/types.d.ts +3 -3
  19. package/dist-server/engine/spec/types.js +1 -1
  20. package/dist-server/engine/spec/types.js.map +1 -1
  21. package/dist-server/engine/spec/weather/asos.d.ts +2 -0
  22. package/dist-server/engine/spec/weather/asos.js +33 -0
  23. package/dist-server/engine/spec/weather/asos.js.map +1 -0
  24. package/dist-server/engine/spec/weather/aws.d.ts +2 -0
  25. package/dist-server/engine/spec/weather/aws.js +28 -0
  26. package/dist-server/engine/spec/weather/aws.js.map +1 -0
  27. package/dist-server/engine/spec/weather/index.d.ts +14 -0
  28. package/dist-server/engine/spec/weather/index.js +23 -0
  29. package/dist-server/engine/spec/weather/index.js.map +1 -0
  30. package/dist-server/engine/spec/weather/mid-term-forecast.d.ts +2 -0
  31. package/dist-server/engine/spec/weather/mid-term-forecast.js +56 -0
  32. package/dist-server/engine/spec/weather/mid-term-forecast.js.map +1 -0
  33. package/dist-server/engine/spec/weather/short-term-forecast.d.ts +2 -0
  34. package/dist-server/engine/spec/weather/short-term-forecast.js +71 -0
  35. package/dist-server/engine/spec/weather/short-term-forecast.js.map +1 -0
  36. package/dist-server/engine/spec/weather/warning.d.ts +2 -0
  37. package/dist-server/engine/spec/weather/warning.js +34 -0
  38. package/dist-server/engine/spec/weather/warning.js.map +1 -0
  39. package/dist-server/engine/task/building-ledger/general.js +1 -1
  40. package/dist-server/engine/task/building-ledger/general.js.map +1 -1
  41. package/dist-server/engine/task/call.d.ts +10 -3
  42. package/dist-server/engine/task/call.js +20 -4
  43. package/dist-server/engine/task/call.js.map +1 -1
  44. package/dist-server/engine/task/index.d.ts +1 -0
  45. package/dist-server/engine/task/index.js +1 -0
  46. package/dist-server/engine/task/index.js.map +1 -1
  47. package/dist-server/engine/task/weather/grid-converter.d.ts +24 -0
  48. package/dist-server/engine/task/weather/grid-converter.js +69 -0
  49. package/dist-server/engine/task/weather/grid-converter.js.map +1 -0
  50. package/dist-server/engine/task/weather/index.d.ts +13 -0
  51. package/dist-server/engine/task/weather/index.js +18 -0
  52. package/dist-server/engine/task/weather/index.js.map +1 -0
  53. package/dist-server/engine/task/weather/short-term-forecast.d.ts +38 -0
  54. package/dist-server/engine/task/weather/short-term-forecast.js +99 -0
  55. package/dist-server/engine/task/weather/short-term-forecast.js.map +1 -0
  56. package/dist-server/index.d.ts +2 -0
  57. package/dist-server/index.js +4 -1
  58. package/dist-server/index.js.map +1 -1
  59. package/dist-server/tsconfig.tsbuildinfo +1 -1
  60. package/helps/integration/connector/data-go-kr-connector.md +6 -7
  61. package/helps/integration/services/building-ledger.md +6 -5
  62. package/helps/integration/services/weather.md +82 -0
  63. package/helps/integration/task/building-ledger.md +25 -1
  64. package/helps/integration/task/data-go-kr-call.md +31 -4
  65. package/helps/integration/task/weather-short-term-forecast.md +96 -0
  66. package/logs/.5e5d741d8b7784a2fbad65eedc0fd46946aaf6f2-audit.json +15 -0
  67. package/logs/connections-2026-04-25-09.log +0 -0
  68. package/package.json +2 -2
  69. package/server/engine/connector/data-go-kr-client.ts +26 -2
  70. package/server/engine/connector/data-go-kr-connector.ts +8 -11
  71. package/server/engine/spec/{building-ledger.ts → building-ledger/hub.ts} +12 -9
  72. package/server/engine/spec/building-ledger/index.ts +7 -0
  73. package/server/engine/spec/index.ts +24 -3
  74. package/server/engine/spec/types.ts +3 -3
  75. package/server/engine/spec/weather/asos.ts +32 -0
  76. package/server/engine/spec/weather/aws.ts +27 -0
  77. package/server/engine/spec/weather/index.ts +14 -0
  78. package/server/engine/spec/weather/mid-term-forecast.ts +56 -0
  79. package/server/engine/spec/weather/short-term-forecast.ts +73 -0
  80. package/server/engine/spec/weather/warning.ts +33 -0
  81. package/server/engine/task/building-ledger/general.ts +2 -2
  82. package/server/engine/task/call.ts +24 -4
  83. package/server/engine/task/index.ts +1 -0
  84. package/server/engine/task/weather/grid-converter.ts +79 -0
  85. package/server/engine/task/weather/index.ts +14 -0
  86. package/server/engine/task/weather/short-term-forecast.ts +110 -0
  87. package/server/index.ts +2 -0
  88. package/translations/en.json +9 -2
  89. package/translations/ja.json +9 -2
  90. package/translations/ko.json +9 -2
  91. package/translations/ms.json +9 -2
  92. package/translations/zh.json +9 -2
  93. package/dist-server/engine/spec/building-ledger.d.ts +0 -9
  94. package/dist-server/engine/spec/building-ledger.js.map +0 -1
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ /**
3
+ * KMA(기상청) 5km 격자좌표 ↔ 위경도 변환.
4
+ *
5
+ * 동네예보·초단기 시리즈는 위경도가 아닌 KMA 자체 격자(nx, ny) 로 호출하므로,
6
+ * 일반적으로 알고 있는 위경도 좌표를 격자로 바꿔주는 헬퍼가 필요하다.
7
+ *
8
+ * 변환식 출처: 기상청 공식 동네예보 격자 변환 문서 (Lambert Conformal Conic).
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.latLonToGrid = latLonToGrid;
12
+ exports.gridToLatLon = gridToLatLon;
13
+ const RE = 6371.00877; /* 지구 반경 (km) */
14
+ const GRID = 5.0; /* 격자 간격 (km) */
15
+ const SLAT1 = 30.0; /* 표준 위도 1 (degree) */
16
+ const SLAT2 = 60.0; /* 표준 위도 2 (degree) */
17
+ const OLON = 126.0; /* 기준점 경도 (degree) */
18
+ const OLAT = 38.0; /* 기준점 위도 (degree) */
19
+ const XO = 43; /* 기준점 X좌표 (격자 단위) */
20
+ const YO = 136; /* 기준점 Y좌표 (격자 단위) */
21
+ const DEGRAD = Math.PI / 180.0;
22
+ const RADDEG = 180.0 / Math.PI;
23
+ const re = RE / GRID;
24
+ const slat1 = SLAT1 * DEGRAD;
25
+ const slat2 = SLAT2 * DEGRAD;
26
+ const olon = OLON * DEGRAD;
27
+ const olat = OLAT * DEGRAD;
28
+ const sn = Math.log(Math.cos(slat1) / Math.cos(slat2)) /
29
+ Math.log(Math.tan(Math.PI * 0.25 + slat2 * 0.5) / Math.tan(Math.PI * 0.25 + slat1 * 0.5));
30
+ const sf = (Math.pow(Math.tan(Math.PI * 0.25 + slat1 * 0.5), sn) * Math.cos(slat1)) / sn;
31
+ const ro = (re * sf) / Math.pow(Math.tan(Math.PI * 0.25 + olat * 0.5), sn);
32
+ /** 위경도 → KMA 5km 격자좌표 (nx, ny). */
33
+ function latLonToGrid(input) {
34
+ const ra = (re * sf) / Math.pow(Math.tan(Math.PI * 0.25 + input.latitude * DEGRAD * 0.5), sn);
35
+ let theta = input.longitude * DEGRAD - olon;
36
+ if (theta > Math.PI)
37
+ theta -= 2.0 * Math.PI;
38
+ if (theta < -Math.PI)
39
+ theta += 2.0 * Math.PI;
40
+ theta *= sn;
41
+ const x = ra * Math.sin(theta) + XO;
42
+ const y = ro - ra * Math.cos(theta) + YO;
43
+ return { nx: Math.floor(x + 1.5), ny: Math.floor(y + 1.5) };
44
+ }
45
+ /** KMA 5km 격자좌표 → 위경도 (격자 중심점). */
46
+ function gridToLatLon(input) {
47
+ const xn = input.nx - XO;
48
+ const yn = ro - (input.ny - YO);
49
+ let ra = Math.sqrt(xn * xn + yn * yn);
50
+ if (sn < 0.0)
51
+ ra = -ra;
52
+ let alat = Math.pow((re * sf) / ra, 1.0 / sn);
53
+ alat = 2.0 * Math.atan(alat) - Math.PI * 0.5;
54
+ let theta;
55
+ if (Math.abs(xn) <= 0.0) {
56
+ theta = 0.0;
57
+ }
58
+ else if (Math.abs(yn) <= 0.0) {
59
+ theta = Math.PI * 0.5;
60
+ if (xn < 0.0)
61
+ theta = -theta;
62
+ }
63
+ else {
64
+ theta = Math.atan2(xn, yn);
65
+ }
66
+ const alon = theta / sn + olon;
67
+ return { latitude: alat * RADDEG, longitude: alon * RADDEG };
68
+ }
69
+ //# sourceMappingURL=grid-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid-converter.js","sourceRoot":"","sources":["../../../../server/engine/task/weather/grid-converter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * KMA(기상청) 5km 격자좌표 ↔ 위경도 변환.\n *\n * 동네예보·초단기 시리즈는 위경도가 아닌 KMA 자체 격자(nx, ny) 로 호출하므로,\n * 일반적으로 알고 있는 위경도 좌표를 격자로 바꿔주는 헬퍼가 필요하다.\n *\n * 변환식 출처: 기상청 공식 동네예보 격자 변환 문서 (Lambert Conformal Conic).\n */\n\nconst RE = 6371.00877 /* 지구 반경 (km) */\nconst GRID = 5.0 /* 격자 간격 (km) */\nconst SLAT1 = 30.0 /* 표준 위도 1 (degree) */\nconst SLAT2 = 60.0 /* 표준 위도 2 (degree) */\nconst OLON = 126.0 /* 기준점 경도 (degree) */\nconst OLAT = 38.0 /* 기준점 위도 (degree) */\nconst XO = 43 /* 기준점 X좌표 (격자 단위) */\nconst YO = 136 /* 기준점 Y좌표 (격자 단위) */\n\nconst DEGRAD = Math.PI / 180.0\nconst RADDEG = 180.0 / Math.PI\n\nconst re = RE / GRID\nconst slat1 = SLAT1 * DEGRAD\nconst slat2 = SLAT2 * DEGRAD\nconst olon = OLON * DEGRAD\nconst olat = OLAT * DEGRAD\n\nconst sn =\n Math.log(Math.cos(slat1) / Math.cos(slat2)) /\n Math.log(Math.tan(Math.PI * 0.25 + slat2 * 0.5) / Math.tan(Math.PI * 0.25 + slat1 * 0.5))\nconst sf = (Math.pow(Math.tan(Math.PI * 0.25 + slat1 * 0.5), sn) * Math.cos(slat1)) / sn\nconst ro = (re * sf) / Math.pow(Math.tan(Math.PI * 0.25 + olat * 0.5), sn)\n\nexport interface LatLon {\n /** 위도 (degree). */\n latitude: number\n /** 경도 (degree). */\n longitude: number\n}\n\nexport interface KmaGrid {\n /** 격자 X. */\n nx: number\n /** 격자 Y. */\n ny: number\n}\n\n/** 위경도 → KMA 5km 격자좌표 (nx, ny). */\nexport function latLonToGrid(input: LatLon): KmaGrid {\n const ra = (re * sf) / Math.pow(Math.tan(Math.PI * 0.25 + input.latitude * DEGRAD * 0.5), sn)\n let theta = input.longitude * DEGRAD - olon\n if (theta > Math.PI) theta -= 2.0 * Math.PI\n if (theta < -Math.PI) theta += 2.0 * Math.PI\n theta *= sn\n const x = ra * Math.sin(theta) + XO\n const y = ro - ra * Math.cos(theta) + YO\n return { nx: Math.floor(x + 1.5), ny: Math.floor(y + 1.5) }\n}\n\n/** KMA 5km 격자좌표 → 위경도 (격자 중심점). */\nexport function gridToLatLon(input: KmaGrid): LatLon {\n const xn = input.nx - XO\n const yn = ro - (input.ny - YO)\n let ra = Math.sqrt(xn * xn + yn * yn)\n if (sn < 0.0) ra = -ra\n let alat = Math.pow((re * sf) / ra, 1.0 / sn)\n alat = 2.0 * Math.atan(alat) - Math.PI * 0.5\n let theta: number\n if (Math.abs(xn) <= 0.0) {\n theta = 0.0\n } else if (Math.abs(yn) <= 0.0) {\n theta = Math.PI * 0.5\n if (xn < 0.0) theta = -theta\n } else {\n theta = Math.atan2(xn, yn)\n }\n const alon = theta / sn + olon\n return { latitude: alat * RADDEG, longitude: alon * RADDEG }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 기상청(KMA) 도메인 전용 태스크 그룹.
3
+ *
4
+ * 새 KMA 전용 태스크(예: AWS 자동수집, 특보 알림 등) 추가 시:
5
+ * - 본 폴더에 `<variant>.ts` 파일 추가 → TaskRegistry 등록
6
+ * - 본 index 에 `import './<variant>'` 한 줄 추가
7
+ *
8
+ * 단순 조회는 범용 `data-go-kr-call` + 스펙 레지스트리로 충분하므로,
9
+ * 이 폴더에는 입력 폼·헬퍼·도메인 가공이 가치 있는 태스크만 배치.
10
+ */
11
+ import './short-term-forecast';
12
+ export { latLonToGrid, gridToLatLon } from './grid-converter';
13
+ export type { LatLon, KmaGrid } from './grid-converter';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gridToLatLon = exports.latLonToGrid = void 0;
4
+ /**
5
+ * 기상청(KMA) 도메인 전용 태스크 그룹.
6
+ *
7
+ * 새 KMA 전용 태스크(예: AWS 자동수집, 특보 알림 등) 추가 시:
8
+ * - 본 폴더에 `<variant>.ts` 파일 추가 → TaskRegistry 등록
9
+ * - 본 index 에 `import './<variant>'` 한 줄 추가
10
+ *
11
+ * 단순 조회는 범용 `data-go-kr-call` + 스펙 레지스트리로 충분하므로,
12
+ * 이 폴더에는 입력 폼·헬퍼·도메인 가공이 가치 있는 태스크만 배치.
13
+ */
14
+ require("./short-term-forecast");
15
+ var grid_converter_1 = require("./grid-converter");
16
+ Object.defineProperty(exports, "latLonToGrid", { enumerable: true, get: function () { return grid_converter_1.latLonToGrid; } });
17
+ Object.defineProperty(exports, "gridToLatLon", { enumerable: true, get: function () { return grid_converter_1.gridToLatLon; } });
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/engine/task/weather/index.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;GASG;AACH,iCAA8B;AAE9B,mDAA6D;AAApD,8GAAA,YAAY,OAAA;AAAE,8GAAA,YAAY,OAAA","sourcesContent":["/**\n * 기상청(KMA) 도메인 전용 태스크 그룹.\n *\n * 새 KMA 전용 태스크(예: AWS 자동수집, 특보 알림 등) 추가 시:\n * - 본 폴더에 `<variant>.ts` 파일 추가 → TaskRegistry 등록\n * - 본 index 에 `import './<variant>'` 한 줄 추가\n *\n * 단순 조회는 범용 `data-go-kr-call` + 스펙 레지스트리로 충분하므로,\n * 이 폴더에는 입력 폼·헬퍼·도메인 가공이 가치 있는 태스크만 배치.\n */\nimport './short-term-forecast'\n\nexport { latLonToGrid, gridToLatLon } from './grid-converter'\nexport type { LatLon, KmaGrid } from './grid-converter'\n"]}
@@ -0,0 +1,38 @@
1
+ import { Context } from '@things-factory/integration-base';
2
+ /**
3
+ * 기상청 단기예보 (`getVilageFcst`) 조회 태스크.
4
+ *
5
+ * 입력 폼이 명시된 전용 태스크. 위경도 입력 시 KMA 격자로 자동 변환.
6
+ *
7
+ * 입력 (둘 중 하나):
8
+ * - `nx`, `ny` : KMA 5km 격자좌표
9
+ * - `latitude`, `longitude`: 위경도 (자동으로 nx/ny 로 변환)
10
+ *
11
+ * 추가:
12
+ * - `baseDate` : 발표일자 YYYYMMDD (필수)
13
+ * - `baseTime` : 발표시각 HHMM (필수, 0200/0500/0800/1100/1400/1700/2000/2300)
14
+ * - `numOfRows` : 페이지당 결과수 (기본 1000 — 3일치 카테고리×시점 합계 약 800+)
15
+ *
16
+ * 다른 단기예보 오퍼레이션(getUltraSrtFcst, getUltraSrtNcst) 은 동일 서비스 안에 있으므로
17
+ * 범용 `data-go-kr-call` 로 호출 권장.
18
+ */
19
+ declare function ShortTermForecastTask(step: any, context: Context): Promise<{
20
+ data: {
21
+ items: any[];
22
+ };
23
+ }>;
24
+ declare namespace ShortTermForecastTask {
25
+ var parameterSpec: ({
26
+ type: string;
27
+ name: string;
28
+ label: string;
29
+ placeholder: string;
30
+ } | {
31
+ type: string;
32
+ name: string;
33
+ label: string;
34
+ placeholder?: undefined;
35
+ })[];
36
+ var help: string;
37
+ }
38
+ export default ShortTermForecastTask;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const integration_base_1 = require("@things-factory/integration-base");
4
+ const short_term_forecast_1 = require("../../spec/weather/short-term-forecast");
5
+ const grid_converter_1 = require("./grid-converter");
6
+ /**
7
+ * 기상청 단기예보 (`getVilageFcst`) 조회 태스크.
8
+ *
9
+ * 입력 폼이 명시된 전용 태스크. 위경도 입력 시 KMA 격자로 자동 변환.
10
+ *
11
+ * 입력 (둘 중 하나):
12
+ * - `nx`, `ny` : KMA 5km 격자좌표
13
+ * - `latitude`, `longitude`: 위경도 (자동으로 nx/ny 로 변환)
14
+ *
15
+ * 추가:
16
+ * - `baseDate` : 발표일자 YYYYMMDD (필수)
17
+ * - `baseTime` : 발표시각 HHMM (필수, 0200/0500/0800/1100/1400/1700/2000/2300)
18
+ * - `numOfRows` : 페이지당 결과수 (기본 1000 — 3일치 카테고리×시점 합계 약 800+)
19
+ *
20
+ * 다른 단기예보 오퍼레이션(getUltraSrtFcst, getUltraSrtNcst) 은 동일 서비스 안에 있으므로
21
+ * 범용 `data-go-kr-call` 로 호출 권장.
22
+ */
23
+ async function ShortTermForecastTask(step, context) {
24
+ const { connection: connectionName, params } = step;
25
+ const { domain, user, data, variables, lng, logger } = context;
26
+ const instance = await integration_base_1.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
27
+ if (!instance?.client) {
28
+ throw new Error(`data-go-kr connection '${connectionName}' is not established.`);
29
+ }
30
+ const scope = { domain, user, lng, data, variables, console };
31
+ const evalString = (value) => {
32
+ if (value === undefined || value === null || value === '')
33
+ return undefined;
34
+ try {
35
+ return (0, integration_base_1.evaluateTemplate)(String(value), scope);
36
+ }
37
+ catch (err) {
38
+ throw new Error(`weather-short-term-forecast: failed to evaluate parameter: ${err.message}`);
39
+ }
40
+ };
41
+ const evalNumber = (value) => {
42
+ const s = evalString(value);
43
+ if (s === undefined)
44
+ return undefined;
45
+ const n = Number(s);
46
+ return Number.isFinite(n) ? n : undefined;
47
+ };
48
+ const baseDate = evalString(params.baseDate);
49
+ const baseTime = evalString(params.baseTime);
50
+ if (!baseDate)
51
+ throw new Error('weather-short-term-forecast: baseDate is required');
52
+ if (!baseTime)
53
+ throw new Error('weather-short-term-forecast: baseTime is required');
54
+ const explicitNx = evalNumber(params.nx);
55
+ const explicitNy = evalNumber(params.ny);
56
+ const lat = evalNumber(params.latitude);
57
+ const lon = evalNumber(params.longitude);
58
+ let nx;
59
+ let ny;
60
+ if (explicitNx !== undefined && explicitNy !== undefined) {
61
+ nx = explicitNx;
62
+ ny = explicitNy;
63
+ }
64
+ else if (lat !== undefined && lon !== undefined) {
65
+ const grid = (0, grid_converter_1.latLonToGrid)({ latitude: lat, longitude: lon });
66
+ nx = grid.nx;
67
+ ny = grid.ny;
68
+ logger?.info?.(`[data-go-kr] latLonToGrid lat=${lat} lon=${lon} → nx=${nx} ny=${ny}`);
69
+ }
70
+ else {
71
+ throw new Error('weather-short-term-forecast: provide either (nx, ny) or (latitude, longitude). 둘 다 비어있음.');
72
+ }
73
+ const servicePath = `${short_term_forecast_1.KmaShortTermForecastService.serviceId}/getVilageFcst`;
74
+ const queryParams = {
75
+ base_date: baseDate,
76
+ base_time: baseTime,
77
+ nx,
78
+ ny,
79
+ numOfRows: evalNumber(params.numOfRows) ?? 1000,
80
+ pageNo: evalNumber(params.pageNo) ?? 1
81
+ };
82
+ logger?.info?.(`[data-go-kr] ${servicePath} params=${JSON.stringify(queryParams)}`);
83
+ const items = await instance.client.getItems(servicePath, queryParams);
84
+ return { data: { items } };
85
+ }
86
+ ShortTermForecastTask.parameterSpec = [
87
+ { type: 'string', name: 'baseDate', label: 'label.base-date', placeholder: '예) 20260425' },
88
+ { type: 'string', name: 'baseTime', label: 'label.base-time', placeholder: '예) 1100' },
89
+ { type: 'string', name: 'nx', label: 'label.nx', placeholder: '예) 60' },
90
+ { type: 'string', name: 'ny', label: 'label.ny', placeholder: '예) 127' },
91
+ { type: 'string', name: 'latitude', label: 'label.latitude', placeholder: '위경도 입력 시 nx/ny 자동 계산' },
92
+ { type: 'string', name: 'longitude', label: 'label.longitude' },
93
+ { type: 'string', name: 'numOfRows', label: 'label.num-of-rows', placeholder: '기본 1000' },
94
+ { type: 'string', name: 'pageNo', label: 'label.page-no', placeholder: '기본 1' }
95
+ ];
96
+ ShortTermForecastTask.help = 'integration/task/weather-short-term-forecast';
97
+ integration_base_1.TaskRegistry.registerTaskHandler('data-go-kr-weather-short-term-forecast', ShortTermForecastTask);
98
+ exports.default = ShortTermForecastTask;
99
+ //# sourceMappingURL=short-term-forecast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"short-term-forecast.js","sourceRoot":"","sources":["../../../../server/engine/task/weather/short-term-forecast.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 { KmaShortTermForecastService } from '../../spec/weather/short-term-forecast'\nimport { latLonToGrid } from './grid-converter'\n\n/**\n * 기상청 단기예보 (`getVilageFcst`) 조회 태스크.\n *\n * 입력 폼이 명시된 전용 태스크. 위경도 입력 시 KMA 격자로 자동 변환.\n *\n * 입력 (둘 중 하나):\n * - `nx`, `ny` : KMA 5km 격자좌표\n * - `latitude`, `longitude`: 위경도 (자동으로 nx/ny 로 변환)\n *\n * 추가:\n * - `baseDate` : 발표일자 YYYYMMDD (필수)\n * - `baseTime` : 발표시각 HHMM (필수, 0200/0500/0800/1100/1400/1700/2000/2300)\n * - `numOfRows` : 페이지당 결과수 (기본 1000 — 3일치 카테고리×시점 합계 약 800+)\n *\n * 다른 단기예보 오퍼레이션(getUltraSrtFcst, getUltraSrtNcst) 은 동일 서비스 안에 있으므로\n * 범용 `data-go-kr-call` 로 호출 권장.\n */\nasync function ShortTermForecastTask(step, context: Context): Promise<{ data: { items: any[] } }> {\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(`weather-short-term-forecast: failed to evaluate parameter: ${(err as Error).message}`)\n }\n }\n const evalNumber = (value: any): number | undefined => {\n const s = evalString(value as string | undefined)\n if (s === undefined) return undefined\n const n = Number(s)\n return Number.isFinite(n) ? n : undefined\n }\n\n const baseDate = evalString(params.baseDate)\n const baseTime = evalString(params.baseTime)\n if (!baseDate) throw new Error('weather-short-term-forecast: baseDate is required')\n if (!baseTime) throw new Error('weather-short-term-forecast: baseTime is required')\n\n const explicitNx = evalNumber(params.nx)\n const explicitNy = evalNumber(params.ny)\n const lat = evalNumber(params.latitude)\n const lon = evalNumber(params.longitude)\n\n let nx: number\n let ny: number\n if (explicitNx !== undefined && explicitNy !== undefined) {\n nx = explicitNx\n ny = explicitNy\n } else if (lat !== undefined && lon !== undefined) {\n const grid = latLonToGrid({ latitude: lat, longitude: lon })\n nx = grid.nx\n ny = grid.ny\n logger?.info?.(`[data-go-kr] latLonToGrid lat=${lat} lon=${lon} → nx=${nx} ny=${ny}`)\n } else {\n throw new Error(\n 'weather-short-term-forecast: provide either (nx, ny) or (latitude, longitude). 둘 다 비어있음.'\n )\n }\n\n const servicePath = `${KmaShortTermForecastService.serviceId}/getVilageFcst`\n const queryParams = {\n base_date: baseDate,\n base_time: baseTime,\n nx,\n ny,\n numOfRows: evalNumber(params.numOfRows) ?? 1000,\n pageNo: evalNumber(params.pageNo) ?? 1\n }\n\n logger?.info?.(`[data-go-kr] ${servicePath} params=${JSON.stringify(queryParams)}`)\n\n const items = await instance.client.getItems<any>(servicePath, queryParams)\n\n return { data: { items } }\n}\n\nShortTermForecastTask.parameterSpec = [\n { type: 'string', name: 'baseDate', label: 'label.base-date', placeholder: '예) 20260425' },\n { type: 'string', name: 'baseTime', label: 'label.base-time', placeholder: '예) 1100' },\n { type: 'string', name: 'nx', label: 'label.nx', placeholder: '예) 60' },\n { type: 'string', name: 'ny', label: 'label.ny', placeholder: '예) 127' },\n { type: 'string', name: 'latitude', label: 'label.latitude', placeholder: '위경도 입력 시 nx/ny 자동 계산' },\n { type: 'string', name: 'longitude', label: 'label.longitude' },\n { type: 'string', name: 'numOfRows', label: 'label.num-of-rows', placeholder: '기본 1000' },\n { type: 'string', name: 'pageNo', label: 'label.page-no', placeholder: '기본 1' }\n]\n\nShortTermForecastTask.help = 'integration/task/weather-short-term-forecast'\n\nTaskRegistry.registerTaskHandler('data-go-kr-weather-short-term-forecast', ShortTermForecastTask)\n\nexport default ShortTermForecastTask\n"]}
@@ -2,3 +2,5 @@ import './engine';
2
2
  export * from './engine/types';
3
3
  export * from './engine/spec';
4
4
  export { DataGoKrClient } from './engine/connector/data-go-kr-client';
5
+ export { latLonToGrid, gridToLatLon } from './engine/task/weather';
6
+ export type { LatLon, KmaGrid } from './engine/task/weather';
@@ -1,10 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DataGoKrClient = void 0;
3
+ exports.gridToLatLon = exports.latLonToGrid = exports.DataGoKrClient = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  require("./engine");
6
6
  tslib_1.__exportStar(require("./engine/types"), exports);
7
7
  tslib_1.__exportStar(require("./engine/spec"), exports);
8
8
  var data_go_kr_client_1 = require("./engine/connector/data-go-kr-client");
9
9
  Object.defineProperty(exports, "DataGoKrClient", { enumerable: true, get: function () { return data_go_kr_client_1.DataGoKrClient; } });
10
+ var weather_1 = require("./engine/task/weather");
11
+ Object.defineProperty(exports, "latLonToGrid", { enumerable: true, get: function () { return weather_1.latLonToGrid; } });
12
+ Object.defineProperty(exports, "gridToLatLon", { enumerable: true, get: function () { return weather_1.gridToLatLon; } });
10
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;AAAA,oBAAiB;AAEjB,yDAA8B;AAC9B,wDAA6B;AAC7B,0EAAqE;AAA5D,mHAAA,cAAc,OAAA","sourcesContent":["import './engine'\n\nexport * from './engine/types'\nexport * from './engine/spec'\nexport { DataGoKrClient } from './engine/connector/data-go-kr-client'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;AAAA,oBAAiB;AAEjB,yDAA8B;AAC9B,wDAA6B;AAC7B,0EAAqE;AAA5D,mHAAA,cAAc,OAAA;AACvB,iDAAkE;AAAzD,uGAAA,YAAY,OAAA;AAAE,uGAAA,YAAY,OAAA","sourcesContent":["import './engine'\n\nexport * from './engine/types'\nexport * from './engine/spec'\nexport { DataGoKrClient } from './engine/connector/data-go-kr-client'\nexport { latLonToGrid, gridToLatLon } from './engine/task/weather'\nexport type { LatLon, KmaGrid } from './engine/task/weather'\n"]}