Skip to content

Commit 8920eb4

Browse files
authored
fix: rewrite dtm spec paths to include /service/dtm prefix at build time (#27)
1 parent ae89781 commit 8920eb4

4 files changed

Lines changed: 34 additions & 9 deletions

File tree

openapi-builds.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"version": "release",
2929
"label": "release (latest)",
3030
"url": "https://cumulocity.com/api/dtm/dist/c8y-dtm-oas.json",
31+
"servicePrefix": "/service/dtm",
3132
"default": true
3233
}
3334
]

test/excute.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ describe('buildExecuteScript', () => {
373373
'installFetchTrap();',
374374
'return await cumulocity.request({',
375375
' method: "GET",',
376-
' path: "/assets?pageSize=5",',
376+
' path: "/service/dtm/assets?pageSize=5",',
377377
'});',
378378
'}',
379379
].join('\n'), generatedRestrictions, [], { Authorization: 'Bearer test' }, ['dtm'])
@@ -395,9 +395,9 @@ describe('buildExecuteScript', () => {
395395
'',
396396
'Blocked operation:',
397397
'Method: GET',
398-
'Path: /assets',
398+
'Path: /service/dtm/assets',
399399
'Matching restrictions:',
400-
'- GET:/assets',
400+
'- GET:/service/dtm/assets',
401401
].join('\n')))
402402
})
403403

@@ -467,10 +467,10 @@ describe('buildExecuteScript', () => {
467467
'installFetchTrap();',
468468
'return await cumulocity.request({',
469469
' method: "GET",',
470-
' path: "/assets?pageSize=5",',
470+
' path: "/service/dtm/assets?pageSize=5",',
471471
'});',
472472
'}',
473-
].join('\n'), generatedRestrictions, [parseSingleAllowRule('GET:/assets')], { Authorization: 'Bearer test' }, ['dtm'])
473+
].join('\n'), generatedRestrictions, [parseSingleAllowRule('GET:/service/dtm/assets')], { Authorization: 'Bearer test' }, ['dtm'])
474474

475475
expect(result.called).toBe(false)
476476
expect(result.result).toEqual(expectedBlockedResult([
@@ -489,9 +489,9 @@ describe('buildExecuteScript', () => {
489489
'',
490490
'Blocked operation:',
491491
'Method: GET',
492-
'Path: /assets',
492+
'Path: /service/dtm/assets',
493493
'Matching restrictions:',
494-
'- GET:/assets',
494+
'- GET:/service/dtm/assets',
495495
].join('\n')))
496496
})
497497

test/restrictions.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ describe('network permission decisions', () => {
448448
op: 'connect',
449449
hostname: 'tenant.example.com',
450450
method: 'GET',
451-
url: 'https://tenant.example.com/assets?pageSize=5',
451+
url: 'https://tenant.example.com/service/dtm/assets?pageSize=5',
452452
}, createOpenApiPartRestrictionRules(['dtm']))).toEqual({
453453
allow: false,
454454
reason: expect.stringContaining('Network connect blocked by MCP restrictions:'),

tsdown.config.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ interface OpenApiSourceEntry {
3636
version: string
3737
label: string
3838
url: string
39+
servicePrefix?: string
3940
default?: boolean
4041
}
4142

@@ -62,8 +63,31 @@ function getSourceConfig(api: OpenApiModuleName, version: string): OpenApiSource
6263
return entry
6364
}
6465

66+
function rewriteSpecPaths(specJson: string, servicePrefix: string): string {
67+
const spec = JSON.parse(specJson) as {
68+
paths?: Record<string, unknown>
69+
servers?: Array<{ url: string, description?: string }>
70+
}
71+
if (spec.paths) {
72+
const rewritten: Record<string, unknown> = {}
73+
for (const [p, item] of Object.entries(spec.paths)) {
74+
rewritten[`${servicePrefix}${p}`] = item
75+
}
76+
spec.paths = rewritten
77+
}
78+
if (spec.servers) {
79+
spec.servers = spec.servers.map((server) => ({
80+
...server,
81+
url: server.url.replace('<TENANT_DOMAIN>', `<TENANT_DOMAIN>${servicePrefix}`),
82+
}))
83+
}
84+
return JSON.stringify(spec)
85+
}
86+
6587
function readSpecJson(api: OpenApiModuleName, version: string): string {
66-
return readFileSync(path.join(rootDir, 'openapi', api, `${version}.json`), 'utf8').trim()
88+
const raw = readFileSync(path.join(rootDir, 'openapi', api, `${version}.json`), 'utf8').trim()
89+
const source = getSourceConfig(api, version)
90+
return source.servicePrefix ? rewriteSpecPaths(raw, source.servicePrefix) : raw
6791
}
6892

6993
function generateEntries(api: OpenApiModuleName, versions: readonly string[]): string {

0 commit comments

Comments
 (0)