From 66dc3d44b367167faeaea63e65c040b1cbeb7376 Mon Sep 17 00:00:00 2001 From: Ole Langbehn <ole.langbehn@inoio.de> Date: Mon, 4 Sep 2023 11:54:40 +0200 Subject: [PATCH] HOLI-3881 add fake mode for local development without credentials --- app/main.ts | 20 +++++++++++++++----- app/server.ts | 14 +++++++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/app/main.ts b/app/main.ts index 7e31c80..9e9a751 100644 --- a/app/main.ts +++ b/app/main.ts @@ -1,5 +1,5 @@ import { logger, LogSeverity } from "./logging.ts"; -import { startServer } from "./server.ts"; +import { DEFAULT_CACHE_ENABLED, DEFAULT_CACHE_TTL_MS_BETTERPLACE, DEFAULT_PORT, startServer } from "./server.ts"; const environment = Deno.env.get("ENVIRONMENT") || "development"; @@ -8,13 +8,23 @@ logger.setUpLogger( environment === "development" ? LogSeverity.DEFAULT : LogSeverity.INFO, ); +const required = <T>(name: string, t?: T, fallback?: T): T => { + if (!t && fallback === undefined) { + throw Error(`Environment variable "${name}" is required`); + } else { + return t !== undefined ? t : fallback!; + } +}; + const serverConfigFromEnv = () => { const asNumber = (str?: string) => (str ? Number(str) : undefined); - const asBoolean = (str?: string) => (str ? Boolean(str) : undefined); + const asBoolean = (str?: string) => (str ? /^true$/i.test(str) : undefined); + logger.info(`fake ${Deno.env.get("FAKE")} ${asBoolean(Deno.env.get("FAKE"))}`) return { - port: asNumber(Deno.env.get("PORT")), - cacheEnabled: asBoolean(Deno.env.get("CACHE_ENABLED")), - cacheTtlMsBetterplace: asNumber(Deno.env.get("CACHE_TTL_MS_BETTERPLACE")), + port: required("PORT", asNumber(Deno.env.get("PORT")), DEFAULT_PORT), + cacheEnabled: required("CACHE_ENABLED", asBoolean(Deno.env.get("CACHE_ENABLED")), DEFAULT_CACHE_ENABLED), + cacheTtlMsBetterplace: required("CACHE_TTL_MS_BETTERPLACE", asNumber(Deno.env.get("CACHE_TTL_MS_BETTERPLACE")), DEFAULT_CACHE_TTL_MS_BETTERPLACE), + fake: asBoolean(Deno.env.get("FAKE")) || false, // For local development. If set, the API returns dummy data }; }; diff --git a/app/server.ts b/app/server.ts index 9969597..ebccd3e 100644 --- a/app/server.ts +++ b/app/server.ts @@ -87,21 +87,21 @@ const createResolvers = (_config: ServerConfig) => ({ _parent: any, parameters: ProjectsParameters = {}, context: GraphQLContext, - ) => fetchProjects(parameters, context.language), + ) => _config.fake ? Promise.resolve({totalResults: 0, data: []}) : fetchProjects(parameters, context.language), project: ( // deno-lint-ignore no-explicit-any _parent: any, parameters: ProjectParameters, context: GraphQLContext, - ) => fetchProject(parameters, context.language), + ) => _config.fake ? Promise.resolve({}) : fetchProject(parameters, context.language), }, Project: { categories: (args: Project) => fetchCategories(args.id), news: (args: Project, parameters: NewsParameters = {}) => - fetchNews(args, parameters), + _config.fake ? Promise.resolve([]) : fetchNews(args, parameters), }, Initiative: { - url: (args: Initiative) => fetchInitiativeUrl(args), + url: (args: Initiative) => _config.fake ? Promise.resolve(undefined) : fetchInitiativeUrl(args), }, }); @@ -113,6 +113,7 @@ export interface ServerConfig { port?: number; // default: 8001 cacheEnabled?: boolean; // default: true cacheTtlMsBetterplace?: number; // default: 60 seconds + fake: boolean; // For local development. If set, the API returns dummy data } const getLanguage = (languages = "") => @@ -174,13 +175,16 @@ type GraphQLContext = { export const startServer = (config: ServerConfig): Promise<void> => { const graphQLServer: GraphQLServer = createGraphQLServer(config); return serve(graphQLServer.handleRequest, { - port: config.port || DEFAULT_PORT, + port: config.port, onListen({ port, hostname }) { logger.info( `Server started at http://${ hostname === "0.0.0.0" ? "localhost" : hostname }:${port}/graphql`, ); + if(config.fake) { + logger.info(`Server is serving fake data due to FAKE env var set to true`) + } }, }); }; -- GitLab