-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAttachDatabaseRoutes.swift
74 lines (64 loc) · 2.22 KB
/
AttachDatabaseRoutes.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import MacroExpress
import Northwind
import Lighter
#if swift(>=5.7)
extension RouteKeeper {
/**
* Add a retrieval functions for all the Codable entities in the database.
*/
func get<T: SQLDatabase>(_ db: T, prefix: String = "/api/") {
for type in T._allRecordTypes {
guard let codableType = type as? any (SQLRecord & Codable).Type else {
console.trace("Skipping non-codable Record:", type)
continue
}
let name = String(describing: type)
#if false // This needs to be constrained on the type to work, possible
if let keyedType = type as? any (SQLKeyedTableRecord & Codable).Type {
registerRecordFind(for: keyedType, in: db, name: name, prefix: prefix)
}
#endif
registerRecordFetch(for: codableType, in: db, name: name, prefix: prefix)
}
}
private func registerRecordFetch<DB, T>(for type: T.Type, in db: DB,
name: String, prefix: String)
where T: SQLRecord & Codable, DB: SQLDatabase
{
console.trace("Register:", "\(prefix)\(name)")
add(route: .init(
id: name + ".fetch", pattern: "\(prefix)\(name)", method: .GET,
middleware: [
{ req, res, next in
let op = SQLRecordFetchOperations<DB, T>(db)
res.send(try op.fetch())
}
]
))
}
private func registerRecordFind<DB, T>(for type: T.Type, in db: DB,
name: String, prefix: String)
where T: SQLKeyedTableRecord & Codable, DB: SQLDatabase,
T.ID == Int
{
console.trace("Register:", "\(prefix)\(name)/:id")
add(route: .init(
id: name + ".find", pattern: "\(prefix)\(name)/:id", method: .GET,
middleware: [
{ req, res, next in
guard let id = req.params[int: "id"] else {
res.statusCode = 400
return res.send("Did not find valid record!")
}
let op = SQLRecordFetchOperations<DB, T>(db)
guard let record = try op.find(id) else {
res.statusCode = 404
return res.send("Did not find record for ID \(id).")
}
res.send(record)
}
]
))
}
}
#endif // Swift 5.7+