68 lines
2.2 KiB
Nim
68 lines
2.2 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[$HttpGet & "/suggestions"] = suggestionsEndpoint
|
|
endpoints[$HttpGet & "/journeys"] = journeysEndpoint
|
|
endpoints[$HttpGet & "/moreJourneys"] = moreJourneysEndpoint
|
|
endpoints[$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()
|
|
|
|
when not defined(release):
|
|
initFileserver()
|
|
|
|
echo "starting webserver on port " & $port
|
|
waitFor server.serve(Port(port), handleRequest)
|
|
|
|
main()
|