Handy extensions for Fluent
Filters can be converted to and from Node, allowing filters to be constructed from JSON and other formats
This allows for easily adding powerful filtering mechanism in resource routes:
/// [GET] @ /users
/// Returns all users, optionally filtered by the request data.
func index(_ req: Request) throws -> ResponseRepresentable {
if let filterString = req.query?["filter"]?.string {
let filterJSON = try JSON(bytes: filterString.data(using: .utf8)?.makeBytes() ?? [])
let filter = try Filter(node: Node(filterJSON))
return try User.makeQuery().filter(filter).all().makeJSON()
}
return try User.all().makeJSON()
}
[GET] /users?filter={"entity":"StalkrCloud.User","method":{"type":"compare","comparison":"equals", "field":"username","value":"admin"}}
[
{
"id": 1,
"username": "admin",
"password": "123456"
}
]
This avoids chaining of the filter method which adds noise to the code
Book.makeQuery().filter(("genre", .equals ,"scifi"),
("target", .equals, "children"),
("language", .equals, "en"))
Book.all(with: ("genre", .equals, "scifi"),
("target", .equals, "children"),
("language", .equals, "en"))
Book.first(with: ("genre", .equals, "scifi"),
("target", .equals, "children"),
("language", .equals, "en"))