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()