Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions Sources/App/Models/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -273,8 +273,13 @@ extension QueryBuilder where Model == Package {
}

func filter(by urls: some Collection<URL>) -> Self {
// TODO: make case-insensitive and canonicalise incoming URLs
filter(\.$url ~~ urls.map(\.absoluteString))
let urls = urls
.compactMap(\.normalized)
.map { $0.absoluteString.lowercased() }
// Fluent cannot chain `lowercased()` onto `\.$url but the following is essentially
// filter(\.$url.lowercased() ~~ urls)
// by dropping down to SQLKit
return filter(.sql(embed: "LOWER(\(ident: Model.schemaOrAlias).\(ident: Model.path(for: \.$url)[0].description)) IN \(SQLBind.group(urls))"))
}
}

Expand Down
19 changes: 16 additions & 3 deletions Tests/AppTests/PackageTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -137,11 +137,24 @@ final class PackageTests: AppTestCase {
}

func test_filter_by_urls() async throws {
for url in ["https://foo.com/1", "https://foo.com/2", "https://foo.com/a", "https://foo.com/A"] {
for url in ["https://foo.com/1.git", "https://foo.com/2.git", "https://foo.com/a.git", "https://foo.com/A.git"] {
try await Package(url: url.url).save(on: app.db)
}
let res = try await Package.query(on: app.db).filter(by: ["https://foo.com/2", "https://foo.com/a"]).all()
XCTAssertEqual(res.map(\.url), ["https://foo.com/2", "https://foo.com/a"])
do { // single match
let res = try await Package.query(on: app.db).filter(by: ["https://foo.com/2.git"]).all()
XCTAssertEqual(res.map(\.url), ["https://foo.com/2.git"])
}
do { // case insensitive match
let res = try await Package.query(on: app.db).filter(by: ["https://foo.com/2.git", "https://foo.com/a.git"]).all()
XCTAssertEqual(
res.map(\.url),
["https://foo.com/2.git", "https://foo.com/a.git", "https://foo.com/A.git"]
)
}
do { // input URLs are normalised
let res = try await Package.query(on: app.db).filter(by: ["http://foo.com/2"]).all()
XCTAssertEqual(res.map(\.url), ["https://foo.com/2.git"])
}
}

func test_repository() async throws {
Expand Down
Loading