oeffisearch/src/oeffisearch.nim
2020-02-07 14:09:42 +01:00

66 lines
2.1 KiB
Nim

import json, tables, os, httpcore, asynchttpserver, asyncdispatch, uri, strutils
import types, endpoints/[suggestions, journeys, moreJourneys, refreshJourney]
when not defined(release):
echo "running in development mode, for production compile with -d:release"
import fileserver
var endpoints {.threadvar.}: Table[string, proc(data: JsonNode): Future[JsonNode] {.gcsafe.}]
proc handleRequest(req: Request) {.async,gcsafe.} =
var resp = NimHttpResponse(
code: Http404,
msg: $(%* {"status": "error", "msg": "ENDPOINT_NOT_FOUND", "data": {}}),
headers: {"Content-Type": "application/json", "Access-Control-Allow-Origin": "*"}.newHttpHeaders,
)
try:
if endpoints.hasKey($req.reqMethod & req.url.path):
resp.code = Http200
resp.msg = $(%* {
"status": "success",
"msg": "",
"data": (await endpoints[$req.reqMethod & req.url.path](parseJson(decodeUrl(req.url.query))))
})
else:
when not defined(release):
# development server
resp = servePath(req)
except notFoundException:
resp.code = Http404
resp.msg = $(%* {"status": "error", "msg": getCurrentExceptionMsg().split("\n")[0], "data": {}})
except:
resp.code = Http500
resp.msg = $(%* {"status": "error", "msg": getCurrentExceptionMsg().split("\n")[0], "data": {}})
echo repr(getCurrentException())
await req.respond(resp.code, resp.msg, resp.headers)
proc main() =
endpoints = initTable[string, proc(data: JsonNode): Future[JsonNode] {.gcsafe.}]()
endpoints.add($HttpGet & "/suggestions", suggestionsEndpoint)
endpoints.add($HttpGet & "/journeys", journeysEndpoint)
endpoints.add($HttpGet & "/moreJourneys", moreJourneysEndpoint)
endpoints.add($HttpGet & "/refreshJourney", refreshJourneyEndpoint)
if getEnv("CACHE_PATH") == "":
echo "CACHE_PATH not set! Bye...."
quit()
else:
discard existsOrCreateDir(getEnv("CACHE_PATH"))
var port = 8081
if getEnv("PORT") != "":
port = parseInt(getEnv("PORT"))
let server = newAsyncHttpServer()
initFileserver()
echo "starting webserver on port " & $port
waitFor server.serve(Port(port), handleRequest)
main()