diff --git a/.changeset/big-spies-check.md b/.changeset/big-spies-check.md new file mode 100644 index 0000000000..c704c7d00e --- /dev/null +++ b/.changeset/big-spies-check.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs-node': patch +--- + +Fix Techdocs S3 and GCS publisher to include bucketRootPath in requests diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts index 1ca9cf2abf..52d654d159 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.test.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.test.ts @@ -537,13 +537,13 @@ describe('AwsS3Publish', () => { app = express().use(publisher.docsRouter()); const pngResponse = await request(app).get( - `/${rootPath}/${entityTripletPath}/img/with%20spaces.png`, + `/${entityTripletPath}/img/with%20spaces.png`, ); expect(Buffer.from(pngResponse.body).toString('utf8')).toEqual( 'found it', ); const jsResponse = await request(app).get( - `/${rootPath}/${entityTripletPath}/some%20folder/also%20with%20spaces.js`, + `/${entityTripletPath}/some%20folder/also%20with%20spaces.js`, ); expect(jsResponse.text).toEqual('found it too'); }); @@ -558,13 +558,13 @@ describe('AwsS3Publish', () => { app = express().use(publisher.docsRouter()); const pngResponse = await request(app).get( - `/${rootPath}/${entityTripletPath}/img/with%20spaces.png`, + `/${entityTripletPath}/img/with%20spaces.png`, ); expect(Buffer.from(pngResponse.body).toString('utf8')).toEqual( 'found it', ); const jsResponse = await request(app).get( - `/${rootPath}/${entityTripletPath}/some%20folder/also%20with%20spaces.js`, + `/${entityTripletPath}/some%20folder/also%20with%20spaces.js`, ); expect(jsResponse.text).toEqual('found it too'); }); diff --git a/plugins/techdocs-node/src/stages/publish/awsS3.ts b/plugins/techdocs-node/src/stages/publish/awsS3.ts index 12940e0117..67a4157a5b 100644 --- a/plugins/techdocs-node/src/stages/publish/awsS3.ts +++ b/plugins/techdocs-node/src/stages/publish/awsS3.ts @@ -370,19 +370,14 @@ export class AwsS3Publish implements PublisherBase { */ docsRouter(): express.Handler { return async (req, res) => { - // Decode and trim the leading forward slash const decodedUri = decodeURI(req.path.replace(/^\//, '')); - // Root path is removed from the Uri so that legacy casing can be applied - // to the entity triplet without manipulating the root path - const decodedUriNoRoot = path.relative(this.bucketRootPath, decodedUri); - // filePath example - /default/component/documented-component/index.html const filePathNoRoot = this.legacyPathCasing - ? decodedUriNoRoot - : lowerCaseEntityTripletInStoragePath(decodedUriNoRoot); + ? decodedUri + : lowerCaseEntityTripletInStoragePath(decodedUri); - // Re-prepend the root path to the relative file path + // Prepend the root path to the relative file path const filePath = path.posix.join(this.bucketRootPath, filePathNoRoot); // Files with different extensions (CSS, HTML) need to be served with different headers diff --git a/plugins/techdocs-node/src/stages/publish/googleStorage.test.ts b/plugins/techdocs-node/src/stages/publish/googleStorage.test.ts index b347f185c6..896e528644 100644 --- a/plugins/techdocs-node/src/stages/publish/googleStorage.test.ts +++ b/plugins/techdocs-node/src/stages/publish/googleStorage.test.ts @@ -527,13 +527,13 @@ describe('GoogleGCSPublish', () => { app = express().use(publisher.docsRouter()); const pngResponse = await request(app).get( - `/${rootPath}/${entityTripletPath}/img/with%20spaces.png`, + `/${entityTripletPath}/img/with%20spaces.png`, ); expect(Buffer.from(pngResponse.body).toString('utf8')).toEqual( 'found it', ); const jsResponse = await request(app).get( - `/${rootPath}/${entityTripletPath}/some%20folder/also%20with%20spaces.js`, + `/${entityTripletPath}/some%20folder/also%20with%20spaces.js`, ); expect(jsResponse.text).toEqual('found it too'); }); @@ -548,13 +548,13 @@ describe('GoogleGCSPublish', () => { app = express().use(publisher.docsRouter()); const pngResponse = await request(app).get( - `/${rootPath}/${entityTripletPath}/img/with%20spaces.png`, + `/${entityTripletPath}/img/with%20spaces.png`, ); expect(Buffer.from(pngResponse.body).toString('utf8')).toEqual( 'found it', ); const jsResponse = await request(app).get( - `/${rootPath}/${entityTripletPath}/some%20folder/also%20with%20spaces.js`, + `/${entityTripletPath}/some%20folder/also%20with%20spaces.js`, ); expect(jsResponse.text).toEqual('found it too'); }); diff --git a/plugins/techdocs-node/src/stages/publish/googleStorage.ts b/plugins/techdocs-node/src/stages/publish/googleStorage.ts index 987dfc6f09..7e862722a7 100644 --- a/plugins/techdocs-node/src/stages/publish/googleStorage.ts +++ b/plugins/techdocs-node/src/stages/publish/googleStorage.ts @@ -274,18 +274,14 @@ export class GoogleGCSPublish implements PublisherBase { */ docsRouter(): express.Handler { return (req, res) => { - // Decode and trim the leading forward slash const decodedUri = decodeURI(req.path.replace(/^\//, '')); - // Root path is removed from the Uri so that legacy casing can be applied - // to the entity triplet without manipulating the root path - const decodedUriNoRoot = path.relative(this.bucketRootPath, decodedUri); - + // filePath example - /default/component/documented-component/index.html const filePathNoRoot = this.legacyPathCasing - ? decodedUriNoRoot - : lowerCaseEntityTripletInStoragePath(decodedUriNoRoot); + ? decodedUri + : lowerCaseEntityTripletInStoragePath(decodedUri); - // Re-prepend the root path to the relative file path + // Prepend the root path to the relative file path const filePath = path.posix.join(this.bucketRootPath, filePathNoRoot); // Files with different extensions (CSS, HTML) need to be served with different headers