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