import tables, random, os, times, json, asyncfile, asyncdispatch import types, cache_types, utils randomize() proc cacheExists* (id: string ): bool = return existsFile(getEnv("CACHE_PATH") & "/" & $id & ".json") proc getFreeId (): string = result = toAlphaId(int32(rand(high(int32)))) while existsFile(getEnv("CACHE_PATH") & "/" & $result & ".json"): result = toAlphaId(int32(rand(high(int32)))) proc getCacheObject* (reqId: string): CacheObject = if not cacheExists(reqId): raise newException(notFoundException, "REQUEST_NOT_FOUND") return parseFile(getEnv("CACHE_PATH") & "/" & $reqId & ".json").to(CacheObject) proc saveJourneys* (params: JourneysParams, journeysResponse: JourneysResponse): Future[CacheObject] {.async.} = let reqId = getFreeId() let lastUpdated = getTime().toUnix() var journeys = initTable[string, Journey]() var maxId = -1 for journey in journeysResponse.journeys: inc(maxId) journeys.add($maxId, journey) var cacheObj = CacheObject( version: 1, reqId: reqId, minId: 0, maxId: maxId, earlierRef: journeysResponse.earlierRef, laterRef: journeysResponse.laterRef, lastUpdated: lastUpdated, params: params, journeys: journeys ) var file = openAsync(getEnv("CACHE_PATH") & "/" & $reqId & ".json", fmReadWrite) await file.write($(%* cacheObj)) return cacheObj proc updateJourneys* (reqId: string, mode: moreJourneysMode, journeysResponse: JourneysResponse): Future[CacheObject] {.async.} = var cacheObj = getCacheObject(reqId) if mode == earlier: cacheObj.minId -= journeysResponse.journeys.len var cnt = cacheObj.minId for journey in journeysResponse.journeys: cacheObj.journeys.add($cnt, journey) inc(cnt) else: for journey in journeysResponse.journeys: inc(cacheObj.maxId) cacheObj.journeys.add($cacheObj.maxId, journey) cacheObj.lastUpdated = getTime().toUnix() if mode != later: cacheObj.earlierRef = journeysResponse.earlierRef else: cacheObj.laterRef = journeysResponse.laterRef var file = openAsync(getEnv("CACHE_PATH") & "/" & $reqId & ".json", fmReadWrite) await file.write($(%* cacheObj)) return cacheObj proc updateJourney* (reqId: string, journeyId: string, journey: Journey): Future[CacheObject] {.async.} = var cacheObj = getCacheObject(reqId) cacheObj.lastUpdated = getTime().toUnix() cacheObj.journeys.add(journeyId, journey) var file = openAsync(getEnv("CACHE_PATH") & "/" & $reqId & ".json", fmReadWrite) await file.write($(%* cacheObj)) return cacheObj