Routes.swift 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import Vapor
  2. import TfbCommon
  3. import Foundation
  4. final class Routes: RouteCollection {
  5. func build(_ builder: RouteBuilder) throws {
  6. builder.get("json") { req in
  7. return try JSON(node: Message("Hello, World!"))
  8. }
  9. builder.get("plaintext") { req in
  10. return "Hello, world!"
  11. }
  12. // response to requests to /info domain
  13. // with a description of the request
  14. builder.get("info") { req in
  15. return req.description
  16. }
  17. builder.get("description") { req in return req.description }
  18. // Test type 2: Single database query
  19. builder.get("db") { _ in
  20. let worldId = WorldMeta.randomId()
  21. return try World.find(worldId)?.makeJSON() ?? JSON(node: .null)
  22. }
  23. // Test type 3: Multiple database queries
  24. builder.get("queries") { req in
  25. let queries = queriesParam(for: req)
  26. let ids = (1...queries).map({ _ in WorldMeta.randomId() })
  27. let worlds = try ids.flatMap { try World.find($0)?.makeJSON() }
  28. return JSON(worlds)
  29. }
  30. // Test type 4: Fortunes
  31. let posixLocale = Locale(identifier: "en_US_POSIX")
  32. builder.get("fortunes") { _ in
  33. var fortunes = try Fortune.all()
  34. let additional = Fortune(id: 0, message: "Additional fortune added at request time.")
  35. fortunes.insert(additional, at: 0)
  36. fortunes.sort(by: { lhs, rhs -> Bool in
  37. return lhs.message.compare(rhs.message, locale: posixLocale) == .orderedAscending
  38. })
  39. let nodes = try fortunes.map { try $0.makeJSONNode() }
  40. return try drop.view.make("fortune", ["fortunes": Node(nodes)])
  41. }
  42. // Test type 5: Database updates
  43. builder.get("updates") { req in
  44. let queries = queriesParam(for: req)
  45. let ids = (1...queries).map({ _ in WorldMeta.randomId() })
  46. var worlds = try ids.flatMap { try World.find($0) }
  47. worlds.forEach { $0.randomNumber = WorldMeta.randomRandomNumber() }
  48. worlds = try worlds.flatMap { world in
  49. let modifiedWorld = world
  50. try modifiedWorld.save()
  51. return modifiedWorld
  52. }
  53. let updatedWorlds = try worlds.flatMap { try $0.makeJSON() }
  54. return JSON(updatedWorlds)
  55. }
  56. }
  57. }
  58. /// Since Routes doesn't depend on anything
  59. /// to be initialized, we can conform it to EmptyInitializable
  60. ///
  61. /// This will allow it to be passed by type.
  62. extension Routes: EmptyInitializable { }