main.swift 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /*
  2. * Copyright IBM Corporation 2018
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. import Foundation
  17. import Kitura
  18. import LoggerAPI
  19. import HeliumLogger
  20. import KituraStencil
  21. import Stencil
  22. import TechEmpowerCommon
  23. import KueryPostgresORM
  24. Log.logger = HeliumLogger(.info)
  25. // Stencil stuff
  26. let ext = Extension()
  27. // Stencil does not yet support automatic HTML escaping:
  28. // https://github.com/kylef/Stencil/pull/80
  29. //
  30. ext.registerFilter("htmlencode") { (value: Any?) in
  31. if let value = value as? String {
  32. return value
  33. .replacingOccurrences(of: "&", with: "&")
  34. .replacingOccurrences(of: "<", with: "&lt;")
  35. .replacingOccurrences(of: ">", with: "&gt;")
  36. .replacingOccurrences(of: "'", with: "&apos;")
  37. .replacingOccurrences(of: "\"", with: "&quot;")
  38. }
  39. return value
  40. }
  41. let router = Router()
  42. router.add(templateEngine: StencilTemplateEngine(extension: ext))
  43. setupORM()
  44. //
  45. // TechEmpower test 2: Single database query (full ORM)
  46. //
  47. router.get("/db") {
  48. request, response, next in
  49. response.headers["Server"] = "Kitura"
  50. getRandomRow { (row, err) in
  51. guard let row = row else {
  52. guard let err = err else {
  53. Log.error("Unknown Error")
  54. try? response.status(.badRequest).send("Unknown error").end()
  55. return
  56. }
  57. Log.error("\(err)")
  58. try? response.status(.badRequest).send("Error: \(err)").end()
  59. return
  60. }
  61. try? response.status(.OK).send(json: row.asDictionary()).end()
  62. }
  63. }
  64. //
  65. // TechEmpower test 3: Multiple database queries (full ORM)
  66. // Get param provides number of queries: /queries?queries=N
  67. //
  68. router.get("/queries") {
  69. request, response, next in
  70. response.headers["Server"] = "Kitura"
  71. let queriesParam = request.queryParameters["queries"] ?? "1"
  72. let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec
  73. getRandomRows(count: numQueries) { (rows, err) in
  74. if let rows = rows {
  75. try? response.status(.OK).send(json: rows).end()
  76. } else if let err = err {
  77. try? response.status(.badRequest).send("Error: \(err)").end()
  78. } else {
  79. fatalError("Unexpected: rows and err both nil")
  80. }
  81. }
  82. }
  83. router.get("/queriesParallel") {
  84. request, response, next in
  85. response.headers["Server"] = "Kitura"
  86. let queriesParam = request.queryParameters["queries"] ?? "1"
  87. let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec
  88. getRandomRowsParallel(count: numQueries) { (rows, err) in
  89. if let rows = rows {
  90. try? response.status(.OK).send(json: rows).end()
  91. } else if let err = err {
  92. try? response.status(.badRequest).send("Error: \(err)").end()
  93. } else {
  94. fatalError("Unexpected: rows and err both nil")
  95. }
  96. }
  97. }
  98. //
  99. // TechEmpower test 4: fortunes (full ORM)
  100. //
  101. router.get("/fortunes") {
  102. request, response, next in
  103. response.headers["Server"] = "Kitura"
  104. response.headers["Content-Type"] = "text/html; charset=UTF-8"
  105. Fortune.findAll { (fortunes, err) in
  106. if var fortunes = fortunes {
  107. fortunes.append(Fortune(id: 0, message: "Additional fortune added at request time."))
  108. do {
  109. try response.render("fortunes.stencil", context: ["fortunes": fortunes.sorted()]).end()
  110. } catch {
  111. try? response.status(.internalServerError).send("Error: \(error)").end()
  112. }
  113. } else {
  114. try? response.status(.internalServerError).send("Error: \(err ?? .internalServerError)").end()
  115. }
  116. }
  117. }
  118. //
  119. // TechEmpower test 5: updates (full ORM)
  120. //
  121. router.get("/updates") {
  122. request, response, next in
  123. response.headers["Server"] = "Kitura"
  124. let queriesParam = request.queryParameters["queries"] ?? "1"
  125. let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec
  126. updateRandomRows(count: numQueries) { (rows, err) in
  127. if let rows = rows {
  128. try? response.status(.OK).send(json: rows).end()
  129. } else if let err = err {
  130. try? response.status(.badRequest).send("Error: \(err)").end()
  131. } else {
  132. fatalError("Unexpected: rows and err both nil")
  133. }
  134. }
  135. }
  136. router.get("/updatesParallel") {
  137. request, response, next in
  138. response.headers["Server"] = "Kitura"
  139. let queriesParam = request.queryParameters["queries"] ?? "1"
  140. let numQueries = max(1, min(Int(queriesParam) ?? 1, 500)) // Snap to range of 1-500 as per test spec
  141. updateRandomRowsParallel(count: numQueries) { (rows, err) in
  142. if let rows = rows {
  143. try? response.status(.OK).send(json: rows).end()
  144. } else if let err = err {
  145. try? response.status(.badRequest).send("Error: \(err)").end()
  146. } else {
  147. fatalError("Unexpected: rows and err both nil")
  148. }
  149. }
  150. }
  151. Kitura.addHTTPServer(onPort: 8080, with: router)
  152. Kitura.run()