diff --git a/server/src/main/java/org/eclipse/openvsx/LocalRegistryService.java b/server/src/main/java/org/eclipse/openvsx/LocalRegistryService.java index 142ed69cb..3721fa15c 100644 --- a/server/src/main/java/org/eclipse/openvsx/LocalRegistryService.java +++ b/server/src/main/java/org/eclipse/openvsx/LocalRegistryService.java @@ -173,7 +173,7 @@ private ExtensionVersion findExtensionVersion(String namespace, String extension @Transactional public ResponseEntity getFile(String namespace, String extensionName, String targetPlatform, String version, String fileName) { var extVersion = findExtensionVersion(namespace, extensionName, targetPlatform, version); - var resource = repositories.findFileByName(extVersion, fileName); + var resource = isType(fileName) ? repositories.findFileByType(extVersion, fileName.toLowerCase()) : repositories.findFileByName(extVersion, fileName); if (resource == null) throw new NotFoundException(); if (resource.getType().equals(DOWNLOAD)) @@ -182,6 +182,11 @@ public ResponseEntity getFile(String namespace, String extensionName, St return storageUtil.getFileResponse(resource); } + public boolean isType (String fileName){ + var expectedTypes = Arrays.asList(FileResource.MANIFEST, FileResource.README, FileResource.LICENSE, FileResource.ICON, FileResource.DOWNLOAD, FileResource.CHANGELOG); + return expectedTypes.stream().anyMatch(fileName::equalsIgnoreCase); + } + @Override public ReviewListJson getReviews(String namespace, String extensionName) { var extension = repositories.findExtension(extensionName, namespace); diff --git a/server/src/test/java/org/eclipse/openvsx/RegistryAPITest.java b/server/src/test/java/org/eclipse/openvsx/RegistryAPITest.java index a007ff656..619dd3301 100644 --- a/server/src/test/java/org/eclipse/openvsx/RegistryAPITest.java +++ b/server/src/test/java/org/eclipse/openvsx/RegistryAPITest.java @@ -464,6 +464,14 @@ public void testUnknownFile() throws Exception { .andExpect(status().isNotFound()); } + @Test + public void testLatestFile() throws Exception { + mockLatest(); + mockMvc.perform(get("/api/{namespace}/{extension}/{version}/file/{fileName}", "foo", "bar", "latest", "DOWNLOAD")) + .andExpect(status().isOk()) + .andExpect(content().string("latest download")); + } + @Test public void testReviews() throws Exception { mockReviews(); @@ -1886,6 +1894,8 @@ private FileResource mockReadme(String targetPlatform) { Mockito.when(entityManager.merge(resource)).thenReturn(resource); Mockito.when(repositories.findFileByName(extVersion, "README")) .thenReturn(resource); + Mockito.when(repositories.findFileByType(extVersion, FileResource.README)) + .thenReturn(resource); return resource; } @@ -1900,6 +1910,8 @@ private FileResource mockChangelog() { Mockito.when(entityManager.merge(resource)).thenReturn(resource); Mockito.when(repositories.findFileByName(extVersion, "CHANGELOG")) .thenReturn(resource); + Mockito.when(repositories.findFileByType(extVersion, FileResource.CHANGELOG)) + .thenReturn(resource); return resource; } @@ -1914,6 +1926,22 @@ private FileResource mockLicense() { Mockito.when(entityManager.merge(resource)).thenReturn(resource); Mockito.when(repositories.findFileByName(extVersion, "LICENSE")) .thenReturn(resource); + Mockito.when(repositories.findFileByType(extVersion, FileResource.LICENSE)) + .thenReturn(resource); + return resource; + } + + private FileResource mockLatest() { + var extVersion = mockExtension(); + var resource = new FileResource(); + resource.setExtension(extVersion); + resource.setName("DOWNLOAD"); + resource.setType(FileResource.DOWNLOAD); + resource.setContent("latest download".getBytes()); + resource.setStorageType(FileResource.STORAGE_DB); + Mockito.when(entityManager.merge(resource)).thenReturn(resource); + Mockito.when(repositories.findFileByType(extVersion, FileResource.DOWNLOAD)) + .thenReturn(resource); return resource; }