@mcp-consultant-tools/rest-api 32.0.0 → 34.0.0-beta.2
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/build/cli.js +0 -0
- package/build/context-factory.d.ts.map +1 -1
- package/build/context-factory.js +5 -0
- package/build/context-factory.js.map +1 -1
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +5 -107
- package/build/index.js.map +1 -1
- package/build/models/api-types.d.ts +9 -1
- package/build/models/api-types.d.ts.map +1 -1
- package/build/services/rest-api-service.d.ts +15 -0
- package/build/services/rest-api-service.d.ts.map +1 -1
- package/build/services/rest-api-service.js +59 -1
- package/build/services/rest-api-service.js.map +1 -1
- package/build/tool-examples.js +1 -1
- package/build/tools/rest-tools.js +1 -1
- package/build/tools/rest-tools.js.map +1 -1
- package/package.json +2 -2
- package/build/RestApiService.d.ts +0 -226
- package/build/RestApiService.d.ts.map +0 -1
- package/build/RestApiService.js +0 -585
- package/build/RestApiService.js.map +0 -1
package/build/RestApiService.js
DELETED
|
@@ -1,585 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* REST API Service
|
|
3
|
-
*
|
|
4
|
-
* Provides HTTP request functionality with multiple authentication methods:
|
|
5
|
-
* - Static Bearer Token
|
|
6
|
-
* - Basic Authentication
|
|
7
|
-
* - API Key (custom header)
|
|
8
|
-
* - OAuth2 Client Credentials Flow (JWT generation)
|
|
9
|
-
*/
|
|
10
|
-
import https from "https";
|
|
11
|
-
export class RestApiService {
|
|
12
|
-
config;
|
|
13
|
-
cachedToken = null;
|
|
14
|
-
httpsAgent;
|
|
15
|
-
cachedOpenApi = null;
|
|
16
|
-
openApiFetchPromise = null;
|
|
17
|
-
/** OpenAPI cache TTL in milliseconds (default: 5 minutes) */
|
|
18
|
-
static OPENAPI_CACHE_TTL = 5 * 60 * 1000;
|
|
19
|
-
constructor(config) {
|
|
20
|
-
this.config = {
|
|
21
|
-
responseSizeLimit: 10000,
|
|
22
|
-
enableSslVerify: true,
|
|
23
|
-
timeout: 30000,
|
|
24
|
-
...config,
|
|
25
|
-
};
|
|
26
|
-
// Normalize base URL (remove trailing slashes)
|
|
27
|
-
this.config.baseUrl = this.config.baseUrl.replace(/\/+$/, "");
|
|
28
|
-
// Create HTTPS agent if SSL verification is disabled
|
|
29
|
-
if (!this.config.enableSslVerify) {
|
|
30
|
-
this.httpsAgent = new https.Agent({ rejectUnauthorized: false });
|
|
31
|
-
}
|
|
32
|
-
// Validate mutually exclusive auth methods
|
|
33
|
-
const authMethods = [
|
|
34
|
-
this.config.bearerToken ? "bearer" : null,
|
|
35
|
-
this.config.basicAuth ? "basic" : null,
|
|
36
|
-
this.config.oauth2 ? "oauth2" : null,
|
|
37
|
-
this.config.apiKey ? "apikey" : null,
|
|
38
|
-
].filter(Boolean);
|
|
39
|
-
if (authMethods.length > 1) {
|
|
40
|
-
console.error(`Warning: Multiple auth methods configured (${authMethods.join(", ")}). Only one should be used.`);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Get the current authentication method name
|
|
45
|
-
*/
|
|
46
|
-
getAuthMethod() {
|
|
47
|
-
if (this.config.oauth2)
|
|
48
|
-
return "oauth2";
|
|
49
|
-
if (this.config.bearerToken)
|
|
50
|
-
return "bearer";
|
|
51
|
-
if (this.config.basicAuth)
|
|
52
|
-
return "basic";
|
|
53
|
-
if (this.config.apiKey)
|
|
54
|
-
return "apikey";
|
|
55
|
-
return "none";
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Get OAuth2 access token using client credentials flow
|
|
59
|
-
* Caches token and refreshes when expired
|
|
60
|
-
*/
|
|
61
|
-
async getOAuth2Token() {
|
|
62
|
-
const oauth2 = this.config.oauth2;
|
|
63
|
-
if (!oauth2) {
|
|
64
|
-
throw new Error("OAuth2 configuration not provided");
|
|
65
|
-
}
|
|
66
|
-
// Check if we have a valid cached token (with 5 minute buffer)
|
|
67
|
-
const now = Date.now();
|
|
68
|
-
if (this.cachedToken && this.cachedToken.expiresAt > now + 5 * 60 * 1000) {
|
|
69
|
-
return this.cachedToken.accessToken;
|
|
70
|
-
}
|
|
71
|
-
console.error("Acquiring new OAuth2 token...");
|
|
72
|
-
// Build token request body
|
|
73
|
-
const params = new URLSearchParams();
|
|
74
|
-
params.append("grant_type", oauth2.grantType || "client_credentials");
|
|
75
|
-
params.append("client_id", oauth2.clientId);
|
|
76
|
-
params.append("client_secret", oauth2.clientSecret);
|
|
77
|
-
params.append("scope", oauth2.scope);
|
|
78
|
-
// Add any additional parameters
|
|
79
|
-
if (oauth2.additionalParams) {
|
|
80
|
-
for (const [key, value] of Object.entries(oauth2.additionalParams)) {
|
|
81
|
-
params.append(key, value);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
const response = await fetch(oauth2.tokenUrl, {
|
|
85
|
-
method: "POST",
|
|
86
|
-
headers: {
|
|
87
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
88
|
-
},
|
|
89
|
-
body: params.toString(),
|
|
90
|
-
});
|
|
91
|
-
if (!response.ok) {
|
|
92
|
-
const errorText = await response.text();
|
|
93
|
-
throw new Error(`OAuth2 token request failed: ${response.status} ${response.statusText} - ${errorText}`);
|
|
94
|
-
}
|
|
95
|
-
const tokenResponse = await response.json();
|
|
96
|
-
if (!tokenResponse.access_token) {
|
|
97
|
-
throw new Error("OAuth2 response missing access_token");
|
|
98
|
-
}
|
|
99
|
-
// Cache the token
|
|
100
|
-
// Default to 1 hour expiry if not provided
|
|
101
|
-
const expiresIn = tokenResponse.expires_in || 3600;
|
|
102
|
-
this.cachedToken = {
|
|
103
|
-
accessToken: tokenResponse.access_token,
|
|
104
|
-
expiresAt: now + expiresIn * 1000,
|
|
105
|
-
};
|
|
106
|
-
console.error(`OAuth2 token acquired, expires in ${Math.round(expiresIn / 60)} minutes`);
|
|
107
|
-
return this.cachedToken.accessToken;
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Get the Authorization header value based on configured auth method
|
|
111
|
-
*/
|
|
112
|
-
async getAuthHeader() {
|
|
113
|
-
if (this.config.oauth2) {
|
|
114
|
-
const token = await this.getOAuth2Token();
|
|
115
|
-
return { name: "Authorization", value: `Bearer ${token}` };
|
|
116
|
-
}
|
|
117
|
-
if (this.config.bearerToken) {
|
|
118
|
-
return { name: "Authorization", value: `Bearer ${this.config.bearerToken}` };
|
|
119
|
-
}
|
|
120
|
-
if (this.config.basicAuth) {
|
|
121
|
-
const { username, password } = this.config.basicAuth;
|
|
122
|
-
const base64Credentials = Buffer.from(`${username}:${password}`).toString("base64");
|
|
123
|
-
return { name: "Authorization", value: `Basic ${base64Credentials}` };
|
|
124
|
-
}
|
|
125
|
-
if (this.config.apiKey) {
|
|
126
|
-
return { name: this.config.apiKey.headerName, value: this.config.apiKey.value };
|
|
127
|
-
}
|
|
128
|
-
return null;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Sanitize headers for display (redact sensitive values)
|
|
132
|
-
*/
|
|
133
|
-
sanitizeHeaders(headers, isFromRequest = false) {
|
|
134
|
-
const sanitized = {};
|
|
135
|
-
const safeHeaders = new Set([
|
|
136
|
-
"accept",
|
|
137
|
-
"accept-language",
|
|
138
|
-
"content-type",
|
|
139
|
-
"user-agent",
|
|
140
|
-
"cache-control",
|
|
141
|
-
"if-match",
|
|
142
|
-
"if-none-match",
|
|
143
|
-
"if-modified-since",
|
|
144
|
-
"if-unmodified-since",
|
|
145
|
-
]);
|
|
146
|
-
for (const [key, value] of Object.entries(headers)) {
|
|
147
|
-
const lowerKey = key.toLowerCase();
|
|
148
|
-
// Always include request-provided headers as-is
|
|
149
|
-
if (isFromRequest) {
|
|
150
|
-
sanitized[key] = value;
|
|
151
|
-
continue;
|
|
152
|
-
}
|
|
153
|
-
// Redact auth headers
|
|
154
|
-
if (lowerKey === "authorization") {
|
|
155
|
-
sanitized[key] = "[REDACTED]";
|
|
156
|
-
continue;
|
|
157
|
-
}
|
|
158
|
-
// Redact API key header
|
|
159
|
-
if (this.config.apiKey &&
|
|
160
|
-
lowerKey === this.config.apiKey.headerName.toLowerCase()) {
|
|
161
|
-
sanitized[key] = "[REDACTED]";
|
|
162
|
-
continue;
|
|
163
|
-
}
|
|
164
|
-
// Show safe headers, redact others
|
|
165
|
-
if (safeHeaders.has(lowerKey)) {
|
|
166
|
-
sanitized[key] = value;
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
sanitized[key] = "[REDACTED]";
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
return sanitized;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Execute an HTTP request
|
|
176
|
-
*/
|
|
177
|
-
async request(options) {
|
|
178
|
-
const { method, endpoint, body, headers: requestHeaders, host } = options;
|
|
179
|
-
// Normalize endpoint (ensure leading slash, remove trailing)
|
|
180
|
-
const normalizedEndpoint = `/${endpoint.replace(/^\/+|\/+$/g, "")}`;
|
|
181
|
-
// Build full URL
|
|
182
|
-
const baseUrl = host ? host.replace(/\/+$/, "") : this.config.baseUrl;
|
|
183
|
-
const fullUrl = `${baseUrl}${normalizedEndpoint}`;
|
|
184
|
-
// Build headers
|
|
185
|
-
const headers = {
|
|
186
|
-
...this.config.customHeaders,
|
|
187
|
-
...requestHeaders,
|
|
188
|
-
};
|
|
189
|
-
// Add content-type for JSON body
|
|
190
|
-
if (body && !headers["Content-Type"] && !headers["content-type"]) {
|
|
191
|
-
headers["Content-Type"] = "application/json";
|
|
192
|
-
}
|
|
193
|
-
// Add auth header
|
|
194
|
-
const authHeader = await this.getAuthHeader();
|
|
195
|
-
if (authHeader) {
|
|
196
|
-
headers[authHeader.name] = authHeader.value;
|
|
197
|
-
}
|
|
198
|
-
// Prepare fetch options
|
|
199
|
-
const fetchOptions = {
|
|
200
|
-
method,
|
|
201
|
-
headers,
|
|
202
|
-
};
|
|
203
|
-
// Add body for methods that support it
|
|
204
|
-
if (["POST", "PUT", "PATCH"].includes(method) && body) {
|
|
205
|
-
fetchOptions.body =
|
|
206
|
-
typeof body === "string" ? body : JSON.stringify(body);
|
|
207
|
-
}
|
|
208
|
-
// Add timeout via AbortController
|
|
209
|
-
const controller = new AbortController();
|
|
210
|
-
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout || 30000);
|
|
211
|
-
fetchOptions.signal = controller.signal;
|
|
212
|
-
const startTime = Date.now();
|
|
213
|
-
try {
|
|
214
|
-
const response = await fetch(fullUrl, fetchOptions);
|
|
215
|
-
clearTimeout(timeoutId);
|
|
216
|
-
const endTime = Date.now();
|
|
217
|
-
// Get response body
|
|
218
|
-
const responseText = await response.text();
|
|
219
|
-
let responseBody;
|
|
220
|
-
try {
|
|
221
|
-
responseBody = JSON.parse(responseText);
|
|
222
|
-
}
|
|
223
|
-
catch {
|
|
224
|
-
responseBody = responseText;
|
|
225
|
-
}
|
|
226
|
-
// Get response headers
|
|
227
|
-
const responseHeaders = {};
|
|
228
|
-
response.headers.forEach((value, key) => {
|
|
229
|
-
responseHeaders[key] = value;
|
|
230
|
-
});
|
|
231
|
-
// Check response size
|
|
232
|
-
const bodySize = Buffer.from(responseText).length;
|
|
233
|
-
const sizeLimit = this.config.responseSizeLimit || 10000;
|
|
234
|
-
const validation = {
|
|
235
|
-
isError: response.status >= 400,
|
|
236
|
-
messages: response.status >= 400
|
|
237
|
-
? [`Request failed with status ${response.status}`]
|
|
238
|
-
: ["Request completed successfully"],
|
|
239
|
-
};
|
|
240
|
-
if (bodySize > sizeLimit) {
|
|
241
|
-
responseBody =
|
|
242
|
-
typeof responseBody === "string"
|
|
243
|
-
? responseBody.slice(0, sizeLimit)
|
|
244
|
-
: JSON.stringify(responseBody).slice(0, sizeLimit);
|
|
245
|
-
validation.messages.push(`Response truncated: ${sizeLimit} of ${bodySize} bytes returned due to size limit`);
|
|
246
|
-
validation.truncated = {
|
|
247
|
-
originalSize: bodySize,
|
|
248
|
-
returnedSize: sizeLimit,
|
|
249
|
-
truncationPoint: sizeLimit,
|
|
250
|
-
sizeLimit,
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
return {
|
|
254
|
-
request: {
|
|
255
|
-
url: fullUrl,
|
|
256
|
-
method,
|
|
257
|
-
headers: {
|
|
258
|
-
...this.sanitizeHeaders(headers, false),
|
|
259
|
-
...this.sanitizeHeaders(requestHeaders || {}, true),
|
|
260
|
-
},
|
|
261
|
-
body,
|
|
262
|
-
authMethod: this.getAuthMethod(),
|
|
263
|
-
},
|
|
264
|
-
response: {
|
|
265
|
-
statusCode: response.status,
|
|
266
|
-
statusText: response.statusText,
|
|
267
|
-
timing: `${endTime - startTime}ms`,
|
|
268
|
-
headers: this.sanitizeHeaders(responseHeaders, false),
|
|
269
|
-
body: responseBody,
|
|
270
|
-
},
|
|
271
|
-
validation,
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
catch (error) {
|
|
275
|
-
clearTimeout(timeoutId);
|
|
276
|
-
// Handle abort/timeout
|
|
277
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
278
|
-
throw new Error(`Request timeout after ${this.config.timeout}ms`);
|
|
279
|
-
}
|
|
280
|
-
throw error;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Force refresh the OAuth2 token (clears cache)
|
|
285
|
-
*/
|
|
286
|
-
clearTokenCache() {
|
|
287
|
-
this.cachedToken = null;
|
|
288
|
-
console.error("OAuth2 token cache cleared");
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Get configuration summary (safe to display)
|
|
292
|
-
*/
|
|
293
|
-
getConfigSummary() {
|
|
294
|
-
return {
|
|
295
|
-
baseUrl: this.config.baseUrl,
|
|
296
|
-
authMethod: this.getAuthMethod(),
|
|
297
|
-
sslVerification: this.config.enableSslVerify !== false,
|
|
298
|
-
responseSizeLimit: this.config.responseSizeLimit || 10000,
|
|
299
|
-
customHeaderCount: Object.keys(this.config.customHeaders || {}).length,
|
|
300
|
-
...(this.config.oauth2 && { oauth2TokenUrl: this.config.oauth2.tokenUrl }),
|
|
301
|
-
...(this.config.openApiUrl && { openApiUrl: this.config.openApiUrl }),
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Check if OpenAPI URL is configured
|
|
306
|
-
*/
|
|
307
|
-
hasOpenApiConfig() {
|
|
308
|
-
return !!this.config.openApiUrl;
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Fetch and parse OpenAPI spec from configured URL
|
|
312
|
-
* Results are cached for OPENAPI_CACHE_TTL
|
|
313
|
-
*/
|
|
314
|
-
async fetchOpenApiSpec() {
|
|
315
|
-
if (!this.config.openApiUrl) {
|
|
316
|
-
throw new Error("OpenAPI URL not configured");
|
|
317
|
-
}
|
|
318
|
-
// Check cache validity
|
|
319
|
-
const now = Date.now();
|
|
320
|
-
if (this.cachedOpenApi &&
|
|
321
|
-
now - this.cachedOpenApi.fetchedAt < RestApiService.OPENAPI_CACHE_TTL) {
|
|
322
|
-
return this.cachedOpenApi;
|
|
323
|
-
}
|
|
324
|
-
// Avoid concurrent fetches - reuse in-flight promise
|
|
325
|
-
if (this.openApiFetchPromise) {
|
|
326
|
-
return this.openApiFetchPromise;
|
|
327
|
-
}
|
|
328
|
-
this.openApiFetchPromise = this.doFetchOpenApiSpec();
|
|
329
|
-
try {
|
|
330
|
-
const result = await this.openApiFetchPromise;
|
|
331
|
-
return result;
|
|
332
|
-
}
|
|
333
|
-
finally {
|
|
334
|
-
this.openApiFetchPromise = null;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
/**
|
|
338
|
-
* Actually fetch and parse the OpenAPI spec
|
|
339
|
-
*/
|
|
340
|
-
async doFetchOpenApiSpec() {
|
|
341
|
-
const url = this.config.openApiUrl;
|
|
342
|
-
console.error(`Fetching OpenAPI spec from ${url}...`);
|
|
343
|
-
const fetchOptions = {};
|
|
344
|
-
// Add timeout
|
|
345
|
-
const controller = new AbortController();
|
|
346
|
-
const timeoutId = setTimeout(() => controller.abort(), 30000);
|
|
347
|
-
fetchOptions.signal = controller.signal;
|
|
348
|
-
try {
|
|
349
|
-
const response = await fetch(url, fetchOptions);
|
|
350
|
-
clearTimeout(timeoutId);
|
|
351
|
-
if (!response.ok) {
|
|
352
|
-
throw new Error(`Failed to fetch OpenAPI spec: ${response.status} ${response.statusText}`);
|
|
353
|
-
}
|
|
354
|
-
const spec = (await response.json());
|
|
355
|
-
const parsed = this.parseOpenApiSpec(spec);
|
|
356
|
-
this.cachedOpenApi = {
|
|
357
|
-
...parsed,
|
|
358
|
-
fetchedAt: Date.now(),
|
|
359
|
-
source: `OpenAPI spec from ${url}`,
|
|
360
|
-
};
|
|
361
|
-
console.error(`OpenAPI spec loaded: ${parsed.endpoints.length} endpoints, ${Object.keys(parsed.schemas).length} schemas`);
|
|
362
|
-
return this.cachedOpenApi;
|
|
363
|
-
}
|
|
364
|
-
catch (error) {
|
|
365
|
-
clearTimeout(timeoutId);
|
|
366
|
-
if (error instanceof Error && error.name === "AbortError") {
|
|
367
|
-
throw new Error("OpenAPI fetch timeout after 30 seconds");
|
|
368
|
-
}
|
|
369
|
-
throw error;
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
/**
|
|
373
|
-
* Parse OpenAPI 3.x spec into our internal format
|
|
374
|
-
*/
|
|
375
|
-
parseOpenApiSpec(spec) {
|
|
376
|
-
const endpoints = [];
|
|
377
|
-
const schemas = {};
|
|
378
|
-
// Parse paths into endpoints
|
|
379
|
-
if (spec.paths) {
|
|
380
|
-
// Group methods by path
|
|
381
|
-
const pathMethods = {};
|
|
382
|
-
for (const [path, pathItem] of Object.entries(spec.paths)) {
|
|
383
|
-
if (!pathItem)
|
|
384
|
-
continue;
|
|
385
|
-
const methods = [];
|
|
386
|
-
if (pathItem.get)
|
|
387
|
-
methods.push("GET");
|
|
388
|
-
if (pathItem.post)
|
|
389
|
-
methods.push("POST");
|
|
390
|
-
if (pathItem.put)
|
|
391
|
-
methods.push("PUT");
|
|
392
|
-
if (pathItem.delete)
|
|
393
|
-
methods.push("DELETE");
|
|
394
|
-
if (pathItem.patch)
|
|
395
|
-
methods.push("PATCH");
|
|
396
|
-
if (methods.length > 0) {
|
|
397
|
-
// For DAB-style paths, group /entity and /entity/{id} together
|
|
398
|
-
const basePath = path.replace(/\/\{[^}]+\}$/, "");
|
|
399
|
-
if (!pathMethods[basePath]) {
|
|
400
|
-
pathMethods[basePath] = [];
|
|
401
|
-
}
|
|
402
|
-
for (const method of methods) {
|
|
403
|
-
if (!pathMethods[basePath].includes(method)) {
|
|
404
|
-
pathMethods[basePath].push(method);
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
// Convert grouped paths to endpoints
|
|
410
|
-
for (const [path, methods] of Object.entries(pathMethods)) {
|
|
411
|
-
// Extract entity name from path (e.g., "/contacts" -> "contact")
|
|
412
|
-
const pathSegments = path.split("/").filter(Boolean);
|
|
413
|
-
const lastSegment = pathSegments[pathSegments.length - 1] || "";
|
|
414
|
-
const entityName = lastSegment.endsWith("s")
|
|
415
|
-
? lastSegment.slice(0, -1)
|
|
416
|
-
: lastSegment;
|
|
417
|
-
// Get description from one of the operations
|
|
418
|
-
let description;
|
|
419
|
-
const fullPath = spec.paths[path];
|
|
420
|
-
if (fullPath) {
|
|
421
|
-
description =
|
|
422
|
-
fullPath.get?.summary ||
|
|
423
|
-
fullPath.post?.summary ||
|
|
424
|
-
fullPath.get?.description ||
|
|
425
|
-
fullPath.post?.description;
|
|
426
|
-
}
|
|
427
|
-
endpoints.push({
|
|
428
|
-
path,
|
|
429
|
-
methods: methods.sort(),
|
|
430
|
-
entityName: entityName || undefined,
|
|
431
|
-
description,
|
|
432
|
-
});
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
// Parse schemas
|
|
436
|
-
if (spec.components?.schemas) {
|
|
437
|
-
for (const [schemaName, schemaObj] of Object.entries(spec.components.schemas)) {
|
|
438
|
-
if (!schemaObj || typeof schemaObj !== "object")
|
|
439
|
-
continue;
|
|
440
|
-
// Skip input/output wrapper schemas (DAB pattern)
|
|
441
|
-
if (schemaName.endsWith("_input") || schemaName.endsWith("_output")) {
|
|
442
|
-
continue;
|
|
443
|
-
}
|
|
444
|
-
const fields = [];
|
|
445
|
-
let primaryKey = "id";
|
|
446
|
-
if (schemaObj.properties) {
|
|
447
|
-
const required = new Set(schemaObj.required || []);
|
|
448
|
-
for (const [propName, propObj] of Object.entries(schemaObj.properties)) {
|
|
449
|
-
if (!propObj || typeof propObj !== "object")
|
|
450
|
-
continue;
|
|
451
|
-
// Detect primary key (common patterns)
|
|
452
|
-
if (propName === "id" ||
|
|
453
|
-
propName.endsWith("id") ||
|
|
454
|
-
propName.endsWith("Id")) {
|
|
455
|
-
primaryKey = propName;
|
|
456
|
-
}
|
|
457
|
-
const field = {
|
|
458
|
-
name: propName,
|
|
459
|
-
type: this.mapOpenApiType(propObj),
|
|
460
|
-
required: required.has(propName),
|
|
461
|
-
nullable: propObj.nullable === true,
|
|
462
|
-
};
|
|
463
|
-
if (propObj.maxLength) {
|
|
464
|
-
field.maxLength = propObj.maxLength;
|
|
465
|
-
}
|
|
466
|
-
if (propObj.description) {
|
|
467
|
-
field.description = propObj.description;
|
|
468
|
-
}
|
|
469
|
-
if (propObj.enum) {
|
|
470
|
-
field.enumValues = propObj.enum;
|
|
471
|
-
}
|
|
472
|
-
fields.push(field);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
// Derive plural name and endpoint from schema name
|
|
476
|
-
const pluralName = schemaName.endsWith("s") ? schemaName : `${schemaName}s`;
|
|
477
|
-
const endpoint = `/${pluralName.toLowerCase()}`;
|
|
478
|
-
schemas[schemaName.toLowerCase()] = {
|
|
479
|
-
entityName: schemaName,
|
|
480
|
-
pluralName,
|
|
481
|
-
endpoint,
|
|
482
|
-
primaryKey,
|
|
483
|
-
fields,
|
|
484
|
-
};
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
return { endpoints, schemas };
|
|
488
|
-
}
|
|
489
|
-
/**
|
|
490
|
-
* Map OpenAPI type to simplified type string
|
|
491
|
-
*/
|
|
492
|
-
mapOpenApiType(propObj) {
|
|
493
|
-
if (propObj.$ref) {
|
|
494
|
-
// Extract type name from $ref (e.g., "#/components/schemas/User" -> "User")
|
|
495
|
-
const refParts = propObj.$ref.split("/");
|
|
496
|
-
return refParts[refParts.length - 1];
|
|
497
|
-
}
|
|
498
|
-
const type = propObj.type || "any";
|
|
499
|
-
const format = propObj.format;
|
|
500
|
-
if (type === "string") {
|
|
501
|
-
if (format === "uuid")
|
|
502
|
-
return "Guid";
|
|
503
|
-
if (format === "date-time")
|
|
504
|
-
return "datetime";
|
|
505
|
-
if (format === "date")
|
|
506
|
-
return "date";
|
|
507
|
-
return "string";
|
|
508
|
-
}
|
|
509
|
-
if (type === "integer") {
|
|
510
|
-
if (format === "int64")
|
|
511
|
-
return "long";
|
|
512
|
-
return "int";
|
|
513
|
-
}
|
|
514
|
-
if (type === "number") {
|
|
515
|
-
if (format === "decimal")
|
|
516
|
-
return "decimal";
|
|
517
|
-
if (format === "double")
|
|
518
|
-
return "double";
|
|
519
|
-
if (format === "float")
|
|
520
|
-
return "float";
|
|
521
|
-
return "number";
|
|
522
|
-
}
|
|
523
|
-
if (type === "boolean")
|
|
524
|
-
return "boolean";
|
|
525
|
-
if (type === "array")
|
|
526
|
-
return "array";
|
|
527
|
-
if (type === "object")
|
|
528
|
-
return "object";
|
|
529
|
-
return type;
|
|
530
|
-
}
|
|
531
|
-
/**
|
|
532
|
-
* Clear OpenAPI cache (forces re-fetch on next call)
|
|
533
|
-
*/
|
|
534
|
-
clearOpenApiCache() {
|
|
535
|
-
this.cachedOpenApi = null;
|
|
536
|
-
console.error("OpenAPI cache cleared");
|
|
537
|
-
}
|
|
538
|
-
/**
|
|
539
|
-
* List all available API endpoints from OpenAPI spec
|
|
540
|
-
* @param filter Optional filter to match endpoint paths (case-insensitive contains match)
|
|
541
|
-
*/
|
|
542
|
-
async listEndpointsAsync(filter) {
|
|
543
|
-
if (!this.config.openApiUrl) {
|
|
544
|
-
return {
|
|
545
|
-
baseUrl: this.config.baseUrl,
|
|
546
|
-
endpointCount: 0,
|
|
547
|
-
endpoints: [],
|
|
548
|
-
source: "No OpenAPI URL configured. Set REST_OPENAPI_URL environment variable.",
|
|
549
|
-
};
|
|
550
|
-
}
|
|
551
|
-
const openApiData = await this.fetchOpenApiSpec();
|
|
552
|
-
const endpoints = filter
|
|
553
|
-
? openApiData.endpoints.filter((ep) => ep.path.toLowerCase().includes(filter.toLowerCase()) ||
|
|
554
|
-
ep.entityName?.toLowerCase().includes(filter.toLowerCase()) ||
|
|
555
|
-
ep.description?.toLowerCase().includes(filter.toLowerCase()))
|
|
556
|
-
: openApiData.endpoints;
|
|
557
|
-
return {
|
|
558
|
-
baseUrl: this.config.baseUrl,
|
|
559
|
-
endpointCount: endpoints.length,
|
|
560
|
-
endpoints,
|
|
561
|
-
source: openApiData.source,
|
|
562
|
-
};
|
|
563
|
-
}
|
|
564
|
-
/**
|
|
565
|
-
* Get schema for a specific entity from OpenAPI spec
|
|
566
|
-
* @param entity Entity name (singular or plural)
|
|
567
|
-
*/
|
|
568
|
-
async getSchemaAsync(entity) {
|
|
569
|
-
if (!this.config.openApiUrl) {
|
|
570
|
-
return null;
|
|
571
|
-
}
|
|
572
|
-
const openApiData = await this.fetchOpenApiSpec();
|
|
573
|
-
const normalizedEntity = entity.toLowerCase();
|
|
574
|
-
// Try direct match
|
|
575
|
-
for (const [key, schema] of Object.entries(openApiData.schemas)) {
|
|
576
|
-
if (key.toLowerCase() === normalizedEntity ||
|
|
577
|
-
schema.entityName.toLowerCase() === normalizedEntity ||
|
|
578
|
-
schema.pluralName.toLowerCase() === normalizedEntity) {
|
|
579
|
-
return schema;
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
return null;
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
//# sourceMappingURL=RestApiService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RestApiService.js","sourceRoot":"","sources":["../src/RestApiService.ts"],"names":[],"mappings":"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"}
|