From 33b4aa5dab423dac4c4f79acfa9483a5149cb85d Mon Sep 17 00:00:00 2001
From: Ole Langbehn <ole.langbehn@inoio.de>
Date: Mon, 4 Sep 2023 11:54:43 +0200
Subject: [PATCH] HOLI-3881 add fake mode for local development without
 credentials

---
 app/main.ts   |  4 +++-
 app/server.ts | 12 ++++++++----
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/app/main.ts b/app/main.ts
index 997360f..8b15cf9 100644
--- a/app/main.ts
+++ b/app/main.ts
@@ -15,7 +15,7 @@ logger.setUpLogger(
 );
 
 const required = <T>(name: string, t?: T, fallback?: T): T => {
-  if (t === undefined && fallback === undefined) {
+  if (!t && fallback === undefined) {
     throw Error(`Environment variable "${name}" is required`);
   } else {
     return t !== undefined ? t : fallback!;
@@ -51,6 +51,8 @@ const serverConfigFromEnv = (): ServerConfig => {
       (environment === "production"
         ? "https://images.holi.social"
         : "https://dev-images.holi.social"),
+    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 5928f15..dc2f622 100644
--- a/app/server.ts
+++ b/app/server.ts
@@ -85,16 +85,16 @@ const createResolvers = (config: ServerConfig) => ({
       // deno-lint-ignore no-explicit-any
       _parent: any,
       parameters: EngagementOpportunitiesParameters,
-    ) => fetchEngagementOpportunities(config)(parameters),
+    ) => config.fake ? Promise.resolve({totalResults: 0, data: []}) : fetchEngagementOpportunities(config)(parameters),
     engagement: (
       // deno-lint-ignore no-explicit-any
       _parent: any,
       parameters: EngagementParameters,
-    ) => fetchEngagement(config)(parameters),
+    ) => config.fake ? Promise.resolve(null) : fetchEngagement(config)(parameters),
     categories: (
       // deno-lint-ignore no-explicit-any
       _parent: any,
-    ) => fetchCategories(config.voltastics),
+    ) => config.fake ? Promise.resolve({data: []}) : fetchCategories(config.voltastics),
     engagements: (
       // deno-lint-ignore no-explicit-any
       _parent: any,
@@ -110,7 +110,7 @@ const createResolvers = (config: ServerConfig) => ({
       // deno-lint-ignore no-explicit-any
       _parent: any,
       parameters: TrackEngagementViewParameters,
-    ) => trackEngagementView(config.voltastics)(parameters),
+    ) => config.fake ? Promise.resolve({id: parameters.id}) : trackEngagementView(config.voltastics)(parameters),
   },
 });
 
@@ -128,6 +128,7 @@ export interface ServerConfig {
   cacheTtlMsVoltastics?: number; // default: 60 seconds
   voltastics: VoltasticsConfig;
   imageProxyBaseUrl: string;
+  fake: boolean; // For local development. If set, the API returns dummy data
 }
 
 export const createGraphQLServer = (config: ServerConfig): GraphQLServer => {
@@ -171,6 +172,9 @@ export const startServer = (config: ServerConfig): Promise<void> => {
           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