Skip to content

Commit 0ec21b3

Browse files
Merge pull request #3388 from SwiftPackageIndex/enum-rework
Merge ForkedFromResult and ForkedFromInfo
2 parents 53e70ed + a6c7883 commit 0ec21b3

7 files changed

+81
-190
lines changed

Sources/App/Controllers/API/API+PackageController+ForkedFromResult.swift

Lines changed: 0 additions & 46 deletions
This file was deleted.

Sources/App/Controllers/API/API+PackageController+GetRoute+Model.swift

Lines changed: 8 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ extension API.PackageController.GetRoute {
8383
preReleaseReference: App.Reference?,
8484
fundingLinks: [FundingLink] = [],
8585
swift6Readiness: Swift6Readiness?,
86-
forkedFromResult: API.PackageController.ForkedFromResult?
86+
forkedFromInfo: ForkedFromInfo?
8787
) {
8888
self.packageId = packageId
8989
self.repositoryOwner = repositoryOwner
@@ -125,22 +125,7 @@ extension API.PackageController.GetRoute {
125125
}()
126126
self.fundingLinks = fundingLinks
127127
self.swift6Readiness = swift6Readiness
128-
if let forkedFromResult {
129-
switch forkedFromResult {
130-
case .fromSPI(let repo, let owner, let ownerName, let packageName):
131-
self.forkedFromInfo = ForkedFromInfo.fromSPI(
132-
packageName: self.title,
133-
originalOwner: owner,
134-
originalOwnerName: ownerName,
135-
originalRepo: repo,
136-
originalPackageName: packageName
137-
)
138-
case .fromGitHub(let url):
139-
self.forkedFromInfo = ForkedFromInfo.fromGitHub(url: url)
140-
}
141-
} else {
142-
self.forkedFromInfo = nil
143-
}
128+
self.forkedFromInfo = forkedFromInfo
144129
}
145130

146131
init?(result: API.PackageController.PackageResult,
@@ -151,7 +136,7 @@ extension API.PackageController.GetRoute {
151136
platformBuildInfo: BuildInfo<CompatibilityMatrix.PlatformCompatibility>?,
152137
weightedKeywords: [WeightedKeyword] = [],
153138
swift6Readiness: Swift6Readiness?,
154-
forkedFromResult: API.PackageController.ForkedFromResult?) {
139+
forkedFromInfo: ForkedFromInfo?) {
155140
// we consider certain attributes as essential and return nil (raising .notFound)
156141
let repository = result.repository
157142
guard
@@ -197,7 +182,7 @@ extension API.PackageController.GetRoute {
197182
preReleaseReference: result.preReleaseVersion?.reference,
198183
fundingLinks: result.repository.fundingLinks,
199184
swift6Readiness: swift6Readiness,
200-
forkedFromResult: forkedFromResult
185+
forkedFromInfo: forkedFromInfo
201186
)
202187

203188
}
@@ -370,32 +355,11 @@ extension API.PackageController.GetRoute.Model {
370355
}
371356

372357
enum ForkedFromInfo: Codable, Equatable {
373-
case fromSPI(
374-
packageName: String,
375-
originalOwner: String,
376-
originalOwnerName: String,
377-
originalRepo: String,
378-
originalPackageName: String
379-
)
358+
case fromSPI(originalOwner: String,
359+
originalOwnerName: String,
360+
originalRepo: String,
361+
originalPackageName: String)
380362
case fromGitHub(url: String)
381-
382-
var url: String {
383-
switch self {
384-
case .fromSPI(_, let originalOwner, _, let originalRepo, _):
385-
return SiteURL.package(.value(originalOwner), .value(originalRepo), nil).relativeURL()
386-
case .fromGitHub(let url):
387-
return url
388-
}
389-
}
390-
391-
var ownerURL: String? {
392-
switch self {
393-
case .fromSPI(_, let owner, _, _, _):
394-
return SiteURL.author(.value(owner)).relativeURL()
395-
case .fromGitHub:
396-
return nil
397-
}
398-
}
399363
}
400364
}
401365

Sources/App/Controllers/API/API+PackageController+GetRoute.swift

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,6 @@ extension API.PackageController {
3030
let packageResult = try await PackageResult.query(on: database,
3131
owner: owner,
3232
repository: repository)
33-
34-
let forkedFromResult = try? await self.fetchForkedFromResult(on: database,
35-
repository: packageResult.repository)
36-
3733
async let weightedKeywords = WeightedKeyword.query(
3834
on: database, keywords: packageResult.repository.keywords
3935
)
@@ -49,6 +45,7 @@ extension API.PackageController {
4945
async let buildInfo = API.PackageController.BuildInfo.query(on: database,
5046
owner: owner,
5147
repository: repository)
48+
async let forkedFromInfo = forkedFromInfo(on: database, fork: packageResult.repository.forkedFrom)
5249

5350
guard
5451
let model = try await Self.Model(
@@ -60,7 +57,7 @@ extension API.PackageController {
6057
platformBuildInfo: buildInfo.platform,
6158
weightedKeywords: weightedKeywords,
6259
swift6Readiness: buildInfo.swift6Readiness,
63-
forkedFromResult: forkedFromResult
60+
forkedFromInfo: forkedFromInfo
6461
),
6562
let schema = API.PackageSchema(result: packageResult)
6663
else {
@@ -69,19 +66,6 @@ extension API.PackageController {
6966

7067
return (model, schema)
7168
}
72-
73-
static func fetchForkedFromResult(on database: Database, repository: Repository) async throws -> ForkedFromResult? {
74-
if let forkedFrom = repository.forkedFrom {
75-
switch forkedFrom {
76-
case .parentId(let id):
77-
let info = try await ForkedFromResult.query(on: database, packageId: id)
78-
return info
79-
case .parentURL(let url):
80-
return .fromGitHub(url: url)
81-
}
82-
}
83-
return nil
84-
}
8569
}
8670
}
8771

@@ -102,4 +86,34 @@ extension API.PackageController.GetRoute {
10286
beta: links[1],
10387
latest: links[2])
10488
}
89+
90+
static func forkedFromInfo(on database: Database, fork: Fork?) async -> Model.ForkedFromInfo? {
91+
guard let forkedFrom = fork else { return nil }
92+
switch forkedFrom {
93+
case let .parentId(id):
94+
return await Model.ForkedFromInfo.query(on: database, packageId: id)
95+
case let .parentURL(url):
96+
return .fromGitHub(url: url)
97+
}
98+
}
99+
}
100+
101+
102+
extension API.PackageController.GetRoute.Model.ForkedFromInfo {
103+
static func query(on database: Database, packageId: Package.Id) async -> Self? {
104+
let model = try? await Joined3<Package, Repository, Version>
105+
.query(on: database, packageId: packageId, version: .defaultBranch)
106+
.first()
107+
108+
guard let repoName = model?.repository.name,
109+
let ownerName = model?.repository.ownerName,
110+
let owner = model?.repository.owner else {
111+
return nil
112+
}
113+
114+
return .fromSPI(originalOwner: owner,
115+
originalOwnerName: ownerName,
116+
originalRepo: repoName,
117+
originalPackageName: model?.version.packageName ?? repoName)
118+
}
105119
}

Sources/App/Controllers/API/Types+WithExample.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ extension API.PackageController.GetRoute.Model: WithExample {
248248
releaseReference: .tag(1, 2, 3, "1.2.3"),
249249
preReleaseReference: nil,
250250
swift6Readiness: nil,
251-
forkedFromResult: nil)
251+
forkedFromInfo: nil)
252252
}
253253
}
254254

Sources/App/Views/PackageController/GetRoute.Model+ext.swift

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ extension API.PackageController.GetRoute.Model {
198198
repoURLNode,
199199
.text(".")
200200
)
201-
case .fromSPI(_, _, let ownerName, _, let originalPackageName):
201+
case .fromSPI(_, let ownerName, _, let originalPackageName):
202202
let repoURLNode: Node<HTML.BodyContext> = .a(
203203
.href(forkedFromInfo.url),
204204
.text("\(originalPackageName)")
@@ -711,3 +711,24 @@ extension API.PackageController.GetRoute.Model.Swift6Readiness {
711711
return lines.joined(separator: "\n")
712712
}
713713
}
714+
715+
716+
extension API.PackageController.GetRoute.Model.ForkedFromInfo {
717+
var url: String {
718+
switch self {
719+
case .fromSPI(let originalOwner, _, let originalRepo, _):
720+
return SiteURL.package(.value(originalOwner), .value(originalRepo), nil).relativeURL()
721+
case .fromGitHub(let url):
722+
return url
723+
}
724+
}
725+
726+
var ownerURL: String? {
727+
switch self {
728+
case .fromSPI(let owner, _, _, _):
729+
return SiteURL.author(.value(owner)).relativeURL()
730+
case .fromGitHub:
731+
return nil
732+
}
733+
}
734+
}

0 commit comments

Comments
 (0)