Skip to content

Commit dcf0029

Browse files
Merge pull request #3329 from SwiftPackageIndex/more-ELF-to-async
More elf to async
2 parents 346b8ea + 98f1730 commit dcf0029

26 files changed

+240
-275
lines changed

Sources/App/Commands/DeleteBuilds.swift

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import Vapor
1616

1717

18-
struct DeleteBuildsCommand: Command {
18+
struct DeleteBuildsCommand: AsyncCommand {
1919
struct Signature: CommandSignature {
2020
@Option(name: "version-id", short: "v")
2121
var versionId: UUID?
@@ -27,25 +27,21 @@ struct DeleteBuildsCommand: Command {
2727

2828
var help: String { "Delete build records" }
2929

30-
func run(using context: CommandContext, signature: Signature) throws {
30+
func run(using context: CommandContext, signature: Signature) async throws {
3131

3232
switch (signature.versionId, signature.packageId) {
3333
case let (versionId?, .none):
3434
context.console.info("Deleting builds for version id \(versionId) ...")
35-
let count = try Build.delete(on: context.application.db,
36-
versionId: versionId).wait()
35+
let count = try await Build.delete(on: context.application.db, versionId: versionId)
3736
context.console.info("Deleted \(pluralizedCount: count, singular: "record")")
3837

3938
case let (.none, packageId?):
4039
context.console.info("Deleting builds for package id \(packageId) ...")
4140
let count: Int
4241
if let kind = signature.latest {
43-
count = try Build.delete(on: context.application.db,
44-
packageId: packageId,
45-
versionKind: kind).wait()
42+
count = try await Build.delete(on: context.application.db, packageId: packageId, versionKind: kind)
4643
} else {
47-
count = try Build.delete(on: context.application.db,
48-
packageId: packageId).wait()
44+
count = try await Build.delete(on: context.application.db, packageId: packageId)
4945
}
5046
context.console.info("Deleted \(pluralizedCount: count, singular: "record")")
5147

Sources/App/Controllers/API/API+SearchController.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,6 @@ extension API {
6868
searchFilters: [],
6969
results: [])
7070
}
71-
return try await Search.fetch(database,
72-
terms,
73-
page: query.page,
74-
pageSize: query.pageSize).get()
71+
return try await Search.fetch(database, terms, page: query.page, pageSize: query.pageSize)
7572
}
7673
}

Sources/App/Controllers/AuthorController.swift

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,37 +19,33 @@ import Vapor
1919

2020
enum AuthorController {
2121

22-
static func query(on database: Database, owner: String) -> EventLoopFuture<[Joined3<Package, Repository, Version>]> {
23-
Joined3<Package, Repository, Version>
22+
static func query(on database: Database, owner: String) async throws -> [Joined3<Package, Repository, Version>] {
23+
let packages = try await Joined3<Package, Repository, Version>
2424
.query(on: database, version: .defaultBranch)
2525
.filter(Repository.self, \.$owner, .custom("ilike"), owner)
2626
.sort(Version.self, \.$packageName)
2727
.all()
28-
.flatMapThrowing {
29-
if $0.isEmpty {
30-
throw Abort(.notFound)
31-
}
32-
return $0
33-
}
28+
29+
if packages.isEmpty { throw Abort(.notFound) }
30+
31+
return packages
3432
}
3533

3634
@Sendable
37-
static func show(req: Request) throws -> EventLoopFuture<HTML> {
35+
static func show(req: Request) async throws -> HTML {
3836
guard let owner = req.parameters.get("owner") else {
39-
return req.eventLoop.future(error: Abort(.notFound))
37+
throw Abort(.notFound)
4038
}
4139

42-
return Self.query(on: req.db, owner: owner)
43-
.map {
44-
AuthorShow.Model(
45-
owner: $0.first?.repository.owner ?? owner,
46-
ownerName: $0.first?.repository.ownerDisplayName ?? owner,
47-
packages: $0.compactMap(PackageInfo.init(package:))
48-
)
49-
}
50-
.map {
51-
AuthorShow.View(path: req.url.path, model: $0).document()
52-
}
40+
let packages = try await Self.query(on: req.db, owner: owner)
41+
42+
let model = AuthorShow.Model(
43+
owner: packages.first?.repository.owner ?? owner,
44+
ownerName: packages.first?.repository.ownerDisplayName ?? owner,
45+
packages: packages.compactMap(PackageInfo.init(package:))
46+
)
47+
48+
return AuthorShow.View(path: req.url.path, model: model).document()
5349
}
5450

5551
}

Sources/App/Controllers/BuildController.swift

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,15 @@ import Vapor
1919

2020
enum BuildController {
2121
@Sendable
22-
static func show(req: Request) throws -> EventLoopFuture<HTML> {
22+
static func show(req: Request) async throws -> HTML {
2323
guard let id = req.parameters.get("id"),
2424
let buildId = UUID.init(uuidString: id)
25-
else { return req.eventLoop.future(error: Abort(.notFound)) }
25+
else { throw Abort(.notFound) }
2626

27-
return BuildResult.query(on: req.db, buildId: buildId)
28-
.flatMap { result in
29-
Build.fetchLogs(client: req.client, logUrl: result.build.logUrl)
30-
.map { (result, $0) }
31-
}
32-
.map { BuildShow.Model.init(result: $0, logs: $1) }
33-
.unwrap(or: Abort(.notFound))
34-
.map {
35-
BuildShow.View(path: req.url.path, model: $0).document()
36-
}
27+
let result = try await BuildResult.query(on: req.db, buildId: buildId)
28+
let logs = try await Build.fetchLogs(client: req.client, logUrl: result.build.logUrl)
29+
guard let model = BuildShow.Model(result: result, logs: logs) else { throw Abort(.notFound) }
30+
return BuildShow.View(path: req.url.path, model: model).document()
3731
}
3832

3933
}

Sources/App/Controllers/KeywordController.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ import Vapor
1919

2020
enum KeywordController {
2121

22-
static func query(on database: Database, keyword: String, page: Int, pageSize: Int) -> EventLoopFuture<Page<Joined3<Package, Repository, Version>>> {
23-
Joined3<Package, Repository, Version>
22+
static func query(on database: Database, keyword: String, page: Int, pageSize: Int) async throws -> Page<Joined3<Package, Repository, Version>> {
23+
try await Joined3<Package, Repository, Version>
2424
.query(on: database, version: .defaultBranch)
2525
.filter(Repository.self, \.$keywords, .custom("@>"), [keyword])
2626
.sort(\.$score, .descending)
@@ -53,7 +53,7 @@ enum KeywordController {
5353
throw Abort(.notFound)
5454
}
5555
let query = try req.query.decode(Query.self)
56-
let page = try await Self.query(on: req.db, keyword: keyword, page: query.page, pageSize: query.pageSize).get()
56+
let page = try await Self.query(on: req.db, keyword: keyword, page: query.page, pageSize: query.pageSize)
5757

5858
guard !page.results.isEmpty else {
5959
throw Abort(.notFound)

Sources/App/Controllers/PackageController+routes.swift

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ enum PackageController {
301301
}
302302

303303
let pkg = try await Joined<Package, Repository>
304-
.query(on: req.db, owner: owner, repository: repository).get()
304+
.query(on: req.db, owner: owner, repository: repository)
305305

306306
// For repositories that have no README file at all.
307307
guard let readmeHtmlUrl = pkg.repository?.readmeHtmlUrl else {
@@ -328,18 +328,15 @@ enum PackageController {
328328
}
329329

330330
@Sendable
331-
static func releases(req: Request) throws -> EventLoopFuture<Node<HTML.BodyContext>> {
331+
static func releases(req: Request) async throws -> Node<HTML.BodyContext> {
332332
guard
333333
let owner = req.parameters.get("owner"),
334334
let repository = req.parameters.get("repository")
335-
else {
336-
return req.eventLoop.future(error: Abort(.notFound))
337-
}
335+
else { throw Abort(.notFound) }
338336

339-
return Joined<Package, Repository>
340-
.query(on: req.db, owner: owner, repository: repository)
341-
.map { PackageReleases.Model.init(package: $0) }
342-
.map { PackageReleases.View(model: $0).document() }
337+
let pkg = try await Joined<Package, Repository>.query(on: req.db, owner: owner, repository: repository)
338+
let model = PackageReleases.Model(package: pkg)
339+
return PackageReleases.View(model: model).document()
343340
}
344341

345342
@Sendable

Sources/App/Core/Extensions/HTML+ResponseEncodable.swift

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,13 @@ extension Renderable {
2424
encodeResponse(status: .ok)
2525
}
2626

27-
public func encodeResponse(for request: Request) -> EventLoopFuture<Response> {
28-
request.eventLoop.future(encodeResponse(status: .ok))
29-
}
30-
3127
public func encodeResponse(status: HTTPResponseStatus) -> Response {
3228
let res = Response(status: status, body: .init(string: self.render()))
3329
res.headers.add(name: "Content-Type", value: "text/html; charset=utf-8")
3430
return res
3531
}
3632
}
3733

38-
extension Plot.HTML: Renderable, Vapor.ResponseEncodable, Vapor.AsyncResponseEncodable {
39-
}
34+
extension Plot.HTML: Renderable, Vapor.AsyncResponseEncodable { }
4035

41-
extension Plot.Node: Renderable, Vapor.ResponseEncodable, Vapor.AsyncResponseEncodable {
42-
}
36+
extension Plot.Node: Renderable, Vapor.AsyncResponseEncodable { }

Sources/App/Core/Extensions/QueryBuilder+paginate.swift

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,15 @@ extension QueryBuilder {
2828
/// - page: requested page, first page is 1
2929
/// - pageSize: number of elements per page
3030
/// - Returns: a `QueryBuilder`
31-
func page(_ page: Int, size pageSize: Int) -> EventLoopFuture<Page<Model>> {
31+
func page(_ page: Int, size pageSize: Int) async throws -> Page<Model> {
3232
// page is one-based, clamp it to ensure we get a >=0 offset
3333
let page = page.clamped(to: 1...)
3434
let offset = (page - 1) * pageSize
3535
let limit = pageSize + 1 // fetch one more so we can determine `hasMoreResults`
36-
return self
37-
.offset(offset)
36+
let results = try await self.offset(offset)
3837
.limit(limit)
3938
.all()
40-
.map { results in
41-
.init(results: Array(results.prefix(pageSize)),
42-
hasMoreResults: results.count > pageSize)
43-
}
39+
return .init(results: Array(results.prefix(pageSize)),
40+
hasMoreResults: results.count > pageSize)
4441
}
4542
}

Sources/App/Core/Query+Support/Joined+Package.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ extension Joined where M == Package, R == Repository {
2626
method: .left)
2727
}
2828

29-
static func query(on database: Database, owner: String, repository: String) -> EventLoopFuture<Self> {
30-
query(on: database)
29+
static func query(on database: Database, owner: String, repository: String) async throws -> Self {
30+
try await query(on: database)
3131
.filter(Repository.self, \.$owner, .custom("ilike"), owner)
3232
.filter(Repository.self, \.$name, .custom("ilike"), repository)
3333
.first()

Sources/App/Core/Query+Support/Joined4+BuildResult.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ extension BuildResult {
3434
)
3535
}
3636

37-
static func query(on database: Database, buildId: Build.Id) -> EventLoopFuture<Self> {
38-
query(on: database)
37+
static func query(on database: Database, buildId: Build.Id) async throws -> Self {
38+
try await query(on: database)
3939
.filter(\.$id == buildId)
4040
.first()
4141
.unwrap(or: Abort(.notFound))

0 commit comments

Comments
 (0)