diff --git a/Sources/App/Controllers/PackageController+routes.swift b/Sources/App/Controllers/PackageController+routes.swift index 692eedff2..260bbd4a9 100644 --- a/Sources/App/Controllers/PackageController+routes.swift +++ b/Sources/App/Controllers/PackageController+routes.swift @@ -66,7 +66,7 @@ enum PackageController { case img case index case js - case linkableEntities = "linkable-entities.json" + case linkablePaths = "linkable-paths.json" case themeSettings = "theme-settings.json" case tutorials @@ -76,7 +76,7 @@ enum PackageController { return "text/css" case .data, .faviconIco, .faviconSvg, .images, .img, .index: return "application/octet-stream" - case .linkableEntities, .themeSettings: + case .linkablePaths, .themeSettings: return "application/json" case .documentation, .tutorials: return "text/html; charset=utf-8" @@ -155,7 +155,7 @@ enum PackageController { // and https://github.com/SwiftPackageIndex/SwiftPackageIndex-Server/issues/2172 // for details. path = catchAll.joined(separator: "/").lowercased() - case .css, .faviconIco, .faviconSvg, .images, .img, .index, .js, .linkableEntities, .themeSettings: + case .css, .faviconIco, .faviconSvg, .images, .img, .index, .js, .linkablePaths, .themeSettings: path = catchAll.joined(separator: "/") } @@ -178,7 +178,7 @@ enum PackageController { repository: repository ) - case .css, .data, .faviconIco, .faviconSvg, .images, .img, .index, .js, .linkableEntities, .themeSettings: + case .css, .data, .faviconIco, .faviconSvg, .images, .img, .index, .js, .linkablePaths, .themeSettings: return try await awsResponse.encodeResponse( status: .ok, headers: req.headers @@ -294,7 +294,7 @@ enum PackageController { else { throw Abort(.notFound) } let packageResult = try await PackageResult.query(on: req.db, owner: owner, repository: repository) - let urls = await linkableEntityUrls(client: req.client, packageResult: packageResult) + let urls = await linkablePathUrls(client: req.client, packageResult: packageResult) return try await siteMap(packageResult: packageResult, linkableEntityUrls: urls) .encodeResponse(for: req) @@ -325,7 +325,7 @@ enum PackageController { ) } - static func linkableEntityUrls(client: Client, packageResult: PackageResult) async -> [String] { + static func linkablePathUrls(client: Client, packageResult: PackageResult) async -> [String] { guard let canonicalTarget = [packageResult.defaultBranchVersion.model, packageResult.preReleaseVersion?.model, packageResult.releaseVersion?.model].canonicalDocumentationTarget(), @@ -340,21 +340,17 @@ enum PackageController { do { let awsResponse = try await awsResponse(client: client, owner: owner, repository: repository, - reference: reference, fragment: .linkableEntities, path: "") + reference: reference, fragment: .linkablePaths, path: "") guard let body = awsResponse.body else { return [] } - struct LinkableEntity: Decodable { - var path: String - } - let baseUrl = SiteURL.package(.value(owner), .value(repository), .none).absoluteURL() return try JSONDecoder() - .decode([LinkableEntity].self, from: body) - .map { "\(baseUrl)/\(reference)\($0.path)" } + .decode([String].self, from: body) + .map { "\(baseUrl)/\(reference)\($0)" } } catch { // Errors here should *never* break the site map. Instead, they should return no - // linkable entities. The most likely cause of an error here is either a 4xx from - // the `awsResponse` (meaning there is no `linkable-entites.json` on the server), + // linkable paths. The most likely cause of an error here is either a 4xx from + // the `awsResponse` (meaning there is no `linkable-paths.json` on the server), // or a JSON decoding error. Both should result in a blank set of URLs. return [] } @@ -507,7 +503,7 @@ extension PackageController { return path.isEmpty ? URI(string: "\(baseURL)/\(fragment)") : URI(string: "\(baseURL)/\(path)/\(fragment)") - case .linkableEntities: + case .linkablePaths: return URI(string: "\(baseURL)/\(fragment)") } } diff --git a/Sources/App/routes.swift b/Sources/App/routes.swift index 82046ad1c..e97077421 100644 --- a/Sources/App/routes.swift +++ b/Sources/App/routes.swift @@ -101,8 +101,8 @@ func routes(_ app: Application) throws { app.get(":owner", ":repository", ":reference", "js", "**") { try await PackageController.documentation(req: $0, fragment: .js) }.excludeFromOpenAPI() - app.get(":owner", ":repository", ":reference", .fragment(.linkableEntities)) { - try await PackageController.documentation(req: $0, fragment: .linkableEntities) + app.get(":owner", ":repository", ":reference", .fragment(.linkablePaths)) { + try await PackageController.documentation(req: $0, fragment: .linkablePaths) }.excludeFromOpenAPI() app.get(":owner", ":repository", ":reference", .fragment(.themeSettings)) { try await PackageController.documentation(req: $0, fragment: .themeSettings) diff --git a/Tests/AppTests/PackageController+routesTests.swift b/Tests/AppTests/PackageController+routesTests.swift index 4e46d54a5..8f87e1d50 100644 --- a/Tests/AppTests/PackageController+routesTests.swift +++ b/Tests/AppTests/PackageController+routesTests.swift @@ -221,12 +221,12 @@ class PackageController_routesTests: AppTestCase { "http://docs-bucket.s3-website.us-east-2.amazonaws.com/foo/bar/1.2.3/js/path" ) XCTAssertEqual( - try PackageController.awsDocumentationURL(owner: "Foo", repository: "Bar", reference: "1.2.3", fragment: .linkableEntities, path: "").string, - "http://docs-bucket.s3-website.us-east-2.amazonaws.com/foo/bar/1.2.3/linkable-entities.json" + try PackageController.awsDocumentationURL(owner: "Foo", repository: "Bar", reference: "1.2.3", fragment: .linkablePaths, path: "").string, + "http://docs-bucket.s3-website.us-east-2.amazonaws.com/foo/bar/1.2.3/linkable-paths.json" ) XCTAssertEqual( - try PackageController.awsDocumentationURL(owner: "Foo", repository: "Bar", reference: "1.2.3", fragment: .linkableEntities, path: "ignored").string, - "http://docs-bucket.s3-website.us-east-2.amazonaws.com/foo/bar/1.2.3/linkable-entities.json" + try PackageController.awsDocumentationURL(owner: "Foo", repository: "Bar", reference: "1.2.3", fragment: .linkablePaths, path: "ignored").string, + "http://docs-bucket.s3-website.us-east-2.amazonaws.com/foo/bar/1.2.3/linkable-paths.json" ) XCTAssertEqual( try PackageController.awsDocumentationURL(owner: "Foo", repository: "Bar", reference: "1.2.3", fragment: .themeSettings, path: "path").string, @@ -727,10 +727,10 @@ class PackageController_routesTests: AppTestCase { } // MUT - try app.test(.GET, "/owner/package/1.2.3/linkable-entities.json") { + try app.test(.GET, "/owner/package/1.2.3/linkable-paths.json") { XCTAssertEqual($0.status, .ok) XCTAssertEqual($0.content.contentType?.description, "application/json") - XCTAssertEqual($0.body.asString(), "/owner/package/1.2.3/linkable-entities.json") + XCTAssertEqual($0.body.asString(), "/owner/package/1.2.3/linkable-paths.json") } } diff --git a/Tests/AppTests/SitemapTests.swift b/Tests/AppTests/SitemapTests.swift index 61a07f558..0807ec1a8 100644 --- a/Tests/AppTests/SitemapTests.swift +++ b/Tests/AppTests/SitemapTests.swift @@ -87,19 +87,19 @@ class SitemapTests: SnapshotTestCase { .query(on: app.db, owner: "owner", repository: "repo0") Current.siteURL = { "https://spi.com" } Current.fetchDocumentation = { client, url in - guard url.path.hasSuffix("/owner/repo0/default/linkable-entities.json") else { throw Abort(.notFound) } + guard url.path.hasSuffix("/owner/repo0/default/linkable-paths.json") else { throw Abort(.notFound) } return .init(status: .ok, body: .init(string: """ [ - { "path": "/documentation/foo/bar/1" }, - { "path": "/documentation/foo/bar/2" }, + "/documentation/foo/bar/1", + "/documentation/foo/bar/2", ] """) ) } // MUT - let urls = await PackageController.linkableEntityUrls(client: app.client, packageResult: packageResult) + let urls = await PackageController.linkablePathUrls(client: app.client, packageResult: packageResult) XCTAssertEqual(urls, [ "https://spi.com/Owner/Repo0/default/documentation/foo/bar/1",