|
@@ -0,0 +1,102 @@
|
|
|
+import std/algorithm
|
|
|
+import std/json
|
|
|
+import std/random
|
|
|
+import std/strutils
|
|
|
+import std/sequtils
|
|
|
+# framework
|
|
|
+import basolato/controller
|
|
|
+# databse
|
|
|
+import db_connector/db_postgres
|
|
|
+import allographer/query_builder
|
|
|
+import ../../../config/database
|
|
|
+# model
|
|
|
+import ../../models/fortune
|
|
|
+# view
|
|
|
+import ../views/pages/fortune_scf_view
|
|
|
+
|
|
|
+
|
|
|
+const range1_10000 = 1..10000
|
|
|
+let getFirstPrepare = stdRdb.prepare("getFirst", sql""" SELECT * FROM "World" WHERE id = $1 LIMIT 1 """, 1)
|
|
|
+let getFortunePrepare = stdRdb.prepare("getFortunes", sql""" SELECT * FROM "Fortune" ORDER BY message ASC """, 0)
|
|
|
+
|
|
|
+
|
|
|
+proc plaintext*(context:Context, params:Params):Future[Response] {.async.} =
|
|
|
+ let headers = newHttpHeaders()
|
|
|
+ headers.add("Content-Type", "text/plain; charset=UTF-8")
|
|
|
+ return render("Hello, World!", headers)
|
|
|
+
|
|
|
+
|
|
|
+proc json*(context:Context, params:Params):Future[Response] {.async.} =
|
|
|
+ return render(%*{"message":"Hello, World!"})
|
|
|
+
|
|
|
+
|
|
|
+proc db*(context:Context, params:Params):Future[Response] {.async.} =
|
|
|
+ let i = rand(1..10000)
|
|
|
+ let res = stdRdb.getRow(getFirstPrepare, i)
|
|
|
+ return render(%*{"id": res[0].parseInt, "randomNumber": res[1].parseInt})
|
|
|
+
|
|
|
+
|
|
|
+proc query*(context:Context, params:Params):Future[Response] {.async.} =
|
|
|
+ var countNum =
|
|
|
+ try:
|
|
|
+ params.getInt("queries")
|
|
|
+ except:
|
|
|
+ 1
|
|
|
+ if countNum < 1:
|
|
|
+ countNum = 1
|
|
|
+ elif countNum > 500:
|
|
|
+ countNum = 500
|
|
|
+
|
|
|
+ var resp:seq[Row]
|
|
|
+ for i in 1..countNum:
|
|
|
+ let n = rand(range1_10000)
|
|
|
+ resp.add(stdRdb.getRow(getFirstPrepare, n))
|
|
|
+
|
|
|
+ let response = resp.map(
|
|
|
+ proc(x:Row):JsonNode =
|
|
|
+ %*{"id": x[0].parseInt, "randomNumber": x[1].parseInt}
|
|
|
+ )
|
|
|
+ return render(%response)
|
|
|
+
|
|
|
+
|
|
|
+proc fortune*(context:Context, params:Params):Future[Response] {.async.} =
|
|
|
+ let results = stdRdb.getAllRows(getFortunePrepare)
|
|
|
+ var rows = results.map(
|
|
|
+ proc(x:seq[string]):Fortune =
|
|
|
+ return Fortune(id: x[0].parseInt, message: x[1])
|
|
|
+ )
|
|
|
+ rows.add(
|
|
|
+ Fortune(
|
|
|
+ id: 0,
|
|
|
+ message: "Additional fortune added at request time."
|
|
|
+ )
|
|
|
+ )
|
|
|
+ rows = rows.sortedByIt(it.message)
|
|
|
+ return render(fortuneScfView(rows).await)
|
|
|
+
|
|
|
+
|
|
|
+proc update*(context:Context, params:Params):Future[Response] {.async.} =
|
|
|
+ var countNum =
|
|
|
+ try:
|
|
|
+ params.getInt("queries")
|
|
|
+ except:
|
|
|
+ 1
|
|
|
+ if countNum < 1:
|
|
|
+ countNum = 1
|
|
|
+ elif countNum > 500:
|
|
|
+ countNum = 500
|
|
|
+
|
|
|
+ var response = newSeq[JsonNode](countNum)
|
|
|
+ var futures = newSeq[Future[void]](countNum)
|
|
|
+ for i in 1..countNum:
|
|
|
+ let index = rand(range1_10000)
|
|
|
+ let number = rand(range1_10000)
|
|
|
+ response[i-1] = %*{"id": index, "randomNumber": number}
|
|
|
+ futures[i-1] = (
|
|
|
+ proc():Future[void] {.async.} =
|
|
|
+ discard stdRdb.getRow(getFirstPrepare, i)
|
|
|
+ rdb.raw(""" UPDATE "World" SET "randomnumber" = ? WHERE id = ? """, %*[number, index]).exec()
|
|
|
+ )()
|
|
|
+ all(futures).await
|
|
|
+
|
|
|
+ return render(%response)
|