Skip to content

Commit 98f1730

Browse files
committed
Convert AuthorController ELF to a/a
1 parent 7f9d0a3 commit 98f1730

File tree

3 files changed

+46
-54
lines changed

3 files changed

+46
-54
lines changed

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/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 { }

Tests/AppTests/AuthorControllerTests.swift

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,70 +19,72 @@ import XCTest
1919

2020
class AuthorControllerTests: AppTestCase {
2121

22-
func test_query() throws {
22+
func test_query() async throws {
2323
// setup
2424
let p = try savePackage(on: app.db, "1")
25-
try Repository(package: p, owner: "owner").save(on: app.db).wait()
26-
try Version(package: p, latest: .defaultBranch).save(on: app.db).wait()
25+
try await Repository(package: p, owner: "owner").save(on: app.db)
26+
try await Version(package: p, latest: .defaultBranch).save(on: app.db)
2727

2828
// MUT
29-
let pkg = try AuthorController.query(on: app.db, owner: "owner").wait()
29+
let pkg = try await AuthorController.query(on: app.db, owner: "owner")
3030

3131
// validate
3232
XCTAssertEqual(pkg.map(\.model.id), [p.id])
3333
}
3434

35-
func test_query_no_version() throws {
35+
func test_query_no_version() async throws {
3636
// setup
3737
let p = try savePackage(on: app.db, "1")
38-
try Repository(package: p, owner: "owner").save(on: app.db).wait()
38+
try await Repository(package: p, owner: "owner").save(on: app.db)
3939

4040
// MUT
41-
XCTAssertThrowsError(
42-
try AuthorController.query(on: app.db, owner: "owner").wait()
43-
) {
41+
do {
42+
_ = try await AuthorController.query(on: app.db, owner: "owner")
43+
XCTFail("Expected Abort.notFound")
44+
} catch let error as Abort {
4445
// validate
45-
let error = $0 as? Abort
46-
XCTAssertEqual(error?.status, .notFound)
46+
XCTAssertEqual(error.status, .notFound)
47+
} catch {
48+
XCTFail("Unexpected error: \(error)")
4749
}
4850
}
4951

50-
func test_query_sort_alphabetically() throws {
52+
func test_query_sort_alphabetically() async throws {
5153
// setup
52-
try (["gamma", "alpha", "beta"]).forEach { packageName in
54+
for packageName in ["gamma", "alpha", "beta"] {
5355
let p = Package(url: "\(packageName)".url)
54-
try p.save(on: app.db).wait()
55-
try Repository(package: p, owner: "owner").save(on: app.db).wait()
56-
try Version(package: p, latest: .defaultBranch, packageName: packageName).save(on: app.db).wait()
56+
try await p.save(on: app.db)
57+
try await Repository(package: p, owner: "owner").save(on: app.db)
58+
try await Version(package: p, latest: .defaultBranch, packageName: packageName).save(on: app.db)
5759
}
5860

5961
// MUT
60-
let pkg = try AuthorController.query(on: app.db, owner: "owner").wait()
62+
let pkg = try await AuthorController.query(on: app.db, owner: "owner")
6163

6264
// validate
6365
XCTAssertEqual(pkg.map(\.model.url), ["alpha", "beta", "gamma"])
6466
}
6567

66-
func test_show_owner() throws {
68+
func test_show_owner() async throws {
6769
// setup
6870
let p = try savePackage(on: app.db, "1")
69-
try Repository(package: p, owner: "owner").save(on: app.db).wait()
70-
try Version(package: p, latest: .defaultBranch).save(on: app.db).wait()
71+
try await Repository(package: p, owner: "owner").save(on: app.db)
72+
try await Version(package: p, latest: .defaultBranch).save(on: app.db)
7173

7274
// MUT
73-
try app.test(.GET, "/owner", afterResponse: { response in
75+
try await app.test(.GET, "/owner", afterResponse: { response async in
7476
XCTAssertEqual(response.status, .ok)
7577
})
7678
}
7779

78-
func test_show_owner_empty() throws {
80+
func test_show_owner_empty() async throws {
7981
// setup
8082
let p = try savePackage(on: app.db, "1")
81-
try Repository(package: p, owner: "owner").save(on: app.db).wait()
82-
try Version(package: p, latest: .defaultBranch).save(on: app.db).wait()
83+
try await Repository(package: p, owner: "owner").save(on: app.db)
84+
try await Version(package: p, latest: .defaultBranch).save(on: app.db)
8385

8486
// MUT
85-
try app.test(.GET, "/fake-owner", afterResponse: { response in
87+
try await app.test(.GET, "/fake-owner", afterResponse: { response async in
8688
XCTAssertEqual(response.status, .notFound)
8789
})
8890
}

0 commit comments

Comments
 (0)