-
-
Notifications
You must be signed in to change notification settings - Fork 50
Merge ForkedFromResult and ForkedFromInfo #3388
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -83,7 +83,7 @@ extension API.PackageController.GetRoute { | |
preReleaseReference: App.Reference?, | ||
fundingLinks: [FundingLink] = [], | ||
swift6Readiness: Swift6Readiness?, | ||
forkedFromResult: API.PackageController.ForkedFromResult? | ||
forkedFromInfo: ForkedFromInfo? | ||
) { | ||
self.packageId = packageId | ||
self.repositoryOwner = repositoryOwner | ||
|
@@ -125,22 +125,7 @@ extension API.PackageController.GetRoute { | |
}() | ||
self.fundingLinks = fundingLinks | ||
self.swift6Readiness = swift6Readiness | ||
if let forkedFromResult { | ||
switch forkedFromResult { | ||
case .fromSPI(let repo, let owner, let ownerName, let packageName): | ||
self.forkedFromInfo = ForkedFromInfo.fromSPI( | ||
packageName: self.title, | ||
originalOwner: owner, | ||
originalOwnerName: ownerName, | ||
originalRepo: repo, | ||
originalPackageName: packageName | ||
) | ||
case .fromGitHub(let url): | ||
self.forkedFromInfo = ForkedFromInfo.fromGitHub(url: url) | ||
} | ||
} else { | ||
self.forkedFromInfo = nil | ||
} | ||
self.forkedFromInfo = forkedFromInfo | ||
} | ||
|
||
init?(result: API.PackageController.PackageResult, | ||
|
@@ -151,7 +136,7 @@ extension API.PackageController.GetRoute { | |
platformBuildInfo: BuildInfo<CompatibilityMatrix.PlatformCompatibility>?, | ||
weightedKeywords: [WeightedKeyword] = [], | ||
swift6Readiness: Swift6Readiness?, | ||
forkedFromResult: API.PackageController.ForkedFromResult?) { | ||
forkedFromInfo: ForkedFromInfo?) { | ||
// we consider certain attributes as essential and return nil (raising .notFound) | ||
let repository = result.repository | ||
guard | ||
|
@@ -197,7 +182,7 @@ extension API.PackageController.GetRoute { | |
preReleaseReference: result.preReleaseVersion?.reference, | ||
fundingLinks: result.repository.fundingLinks, | ||
swift6Readiness: swift6Readiness, | ||
forkedFromResult: forkedFromResult | ||
forkedFromInfo: forkedFromInfo | ||
) | ||
|
||
} | ||
|
@@ -370,32 +355,11 @@ extension API.PackageController.GetRoute.Model { | |
} | ||
|
||
enum ForkedFromInfo: Codable, Equatable { | ||
case fromSPI( | ||
packageName: String, | ||
originalOwner: String, | ||
originalOwnerName: String, | ||
originalRepo: String, | ||
originalPackageName: String | ||
) | ||
case fromSPI(originalOwner: String, | ||
originalOwnerName: String, | ||
originalRepo: String, | ||
originalPackageName: String) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Note that the |
||
case fromGitHub(url: String) | ||
|
||
var url: String { | ||
switch self { | ||
case .fromSPI(_, let originalOwner, _, let originalRepo, _): | ||
return SiteURL.package(.value(originalOwner), .value(originalRepo), nil).relativeURL() | ||
case .fromGitHub(let url): | ||
return url | ||
} | ||
} | ||
|
||
var ownerURL: String? { | ||
switch self { | ||
case .fromSPI(_, let owner, _, _, _): | ||
return SiteURL.author(.value(owner)).relativeURL() | ||
case .fromGitHub: | ||
return nil | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've moved these two view related properties into an extension in the file under |
||
} | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -30,10 +30,6 @@ extension API.PackageController { | |
let packageResult = try await PackageResult.query(on: database, | ||
owner: owner, | ||
repository: repository) | ||
|
||
let forkedFromResult = try? await self.fetchForkedFromResult(on: database, | ||
repository: packageResult.repository) | ||
|
||
async let weightedKeywords = WeightedKeyword.query( | ||
on: database, keywords: packageResult.repository.keywords | ||
) | ||
|
@@ -49,6 +45,7 @@ extension API.PackageController { | |
async let buildInfo = API.PackageController.BuildInfo.query(on: database, | ||
owner: owner, | ||
repository: repository) | ||
async let forkedFromInfo = forkedFromInfo(on: database, fork: packageResult.repository.forkedFrom) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We're potentially running another query, using |
||
|
||
guard | ||
let model = try await Self.Model( | ||
|
@@ -60,7 +57,7 @@ extension API.PackageController { | |
platformBuildInfo: buildInfo.platform, | ||
weightedKeywords: weightedKeywords, | ||
swift6Readiness: buildInfo.swift6Readiness, | ||
forkedFromResult: forkedFromResult | ||
forkedFromInfo: forkedFromInfo | ||
), | ||
let schema = API.PackageSchema(result: packageResult) | ||
else { | ||
|
@@ -69,19 +66,6 @@ extension API.PackageController { | |
|
||
return (model, schema) | ||
} | ||
|
||
static func fetchForkedFromResult(on database: Database, repository: Repository) async throws -> ForkedFromResult? { | ||
if let forkedFrom = repository.forkedFrom { | ||
switch forkedFrom { | ||
case .parentId(let id): | ||
let info = try await ForkedFromResult.query(on: database, packageId: id) | ||
return info | ||
case .parentURL(let url): | ||
return .fromGitHub(url: url) | ||
} | ||
} | ||
return nil | ||
} | ||
} | ||
} | ||
|
||
|
@@ -102,4 +86,34 @@ extension API.PackageController.GetRoute { | |
beta: links[1], | ||
latest: links[2]) | ||
} | ||
|
||
static func forkedFromInfo(on database: Database, fork: Fork?) async -> Model.ForkedFromInfo? { | ||
guard let forkedFrom = fork else { return nil } | ||
switch forkedFrom { | ||
case let .parentId(id): | ||
return await Model.ForkedFromInfo.query(on: database, packageId: id) | ||
case let .parentURL(url): | ||
return .fromGitHub(url: url) | ||
} | ||
} | ||
} | ||
|
||
|
||
extension API.PackageController.GetRoute.Model.ForkedFromInfo { | ||
static func query(on database: Database, packageId: Package.Id) async -> Self? { | ||
let model = try? await Joined3<Package, Repository, Version> | ||
.query(on: database, packageId: packageId, version: .defaultBranch) | ||
.first() | ||
|
||
guard let repoName = model?.repository.name, | ||
let ownerName = model?.repository.ownerName, | ||
let owner = model?.repository.owner else { | ||
return nil | ||
} | ||
|
||
return .fromSPI(originalOwner: owner, | ||
originalOwnerName: ownerName, | ||
originalRepo: repoName, | ||
originalPackageName: model?.version.packageName ?? repoName) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The model
init
now doesn't do any logic withForkedFromInfo
- it just assigns it. That makes the tests simpler, see below.