From 092bc98554327b7e5ff555d913508a68ced7f47f Mon Sep 17 00:00:00 2001
From: Ole Langbehn <ole.langbehn@inoio.de>
Date: Wed, 6 Sep 2023 18:17:13 +0200
Subject: [PATCH] type safety \o/

---
 app/main.ts   |  3 ---
 app/server.ts | 54 ++++++++++++++++++++++++++++++++++++++-------------
 2 files changed, 40 insertions(+), 17 deletions(-)

diff --git a/app/main.ts b/app/main.ts
index 1b2e104..3eba0c1 100644
--- a/app/main.ts
+++ b/app/main.ts
@@ -24,9 +24,6 @@ const required = <T>(name: string, t?: T, fallback?: T): T => {
 const serverConfigFromEnv = () => {
   const asNumber = (str?: string) => (str ? Number(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: required("PORT", asNumber(Deno.env.get("PORT")), DEFAULT_PORT),
     cacheEnabled: required(
diff --git a/app/server.ts b/app/server.ts
index e842819..75207fb 100644
--- a/app/server.ts
+++ b/app/server.ts
@@ -1,10 +1,12 @@
 import {
   BetterPlaceLanguage,
   Initiative,
+  News,
   NewsParameters,
   Project,
   ProjectParameters,
   ProjectsParameters,
+  ProjectsResponse,
 } from "./types.ts";
 import {
   DEFAULT_LANGUAGE,
@@ -80,6 +82,31 @@ const typeDefs = `
     }
 `;
 
+const fakeProject: Project = {
+  id: 10,
+  title: "fake",
+  categories: [],
+  city: undefined,
+  country: undefined,
+  initiative: {
+    id: 0,
+    name: "fake",
+    city: undefined,
+    country: undefined,
+    picture: [],
+  },
+  donationsCount: 0,
+  progressPercentage: 0,
+  openAmountInCents: 0,
+  picture: [],
+  summary: undefined,
+  description: undefined,
+  donationUrl: "",
+  newsUrl: "",
+  news: [],
+  newsCount: 0,
+};
+
 const createResolvers = (_config: ServerConfig) => ({
   Query: {
     projects: (
@@ -87,7 +114,7 @@ const createResolvers = (_config: ServerConfig) => ({
       _parent: any,
       parameters: ProjectsParameters = {},
       context: GraphQLContext,
-    ) =>
+    ): Promise<ProjectsResponse> =>
       _config.fake
         ? Promise.resolve({ totalResults: 0, data: [] })
         : fetchProjects(parameters, context.language),
@@ -96,18 +123,19 @@ const createResolvers = (_config: ServerConfig) => ({
       _parent: any,
       parameters: ProjectParameters,
       context: GraphQLContext,
-    ) =>
+    ): Promise<Project> =>
       _config.fake
-        ? Promise.resolve({})
+        ? Promise.resolve(fakeProject)
         : fetchProject(parameters, context.language),
   },
   Project: {
-    categories: (args: Project) => fetchCategories(args.id),
-    news: (args: Project, parameters: NewsParameters = {}) =>
+    categories: (args: Project): Promise<string[]> =>
+      _config.fake ? Promise.resolve([]) : fetchCategories(args.id),
+    news: (args: Project, parameters: NewsParameters = {}): Promise<News[]> =>
       _config.fake ? Promise.resolve([]) : fetchNews(args, parameters),
   },
   Initiative: {
-    url: (args: Initiative) =>
+    url: (args: Initiative): Promise<string | undefined> =>
       _config.fake ? Promise.resolve(undefined) : fetchInitiativeUrl(args),
   },
 });
@@ -117,9 +145,9 @@ export const DEFAULT_CACHE_ENABLED = true;
 export const DEFAULT_CACHE_TTL_MS_BETTERPLACE = 60_000;
 
 export interface ServerConfig {
-  port?: number; // default: 8001
-  cacheEnabled?: boolean; // default: true
-  cacheTtlMsBetterplace?: number; // default: 60 seconds
+  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
 }
 
@@ -131,7 +159,7 @@ const getLanguage = (languages = "") =>
   DEFAULT_LANGUAGE;
 
 export const createGraphQLServer = (config: ServerConfig): GraphQLServer => {
-  const plugins = config.cacheEnabled || DEFAULT_CACHE_ENABLED
+  const plugins = config.cacheEnabled
     ? [
       useResponseCache({
         // global cache per language, shared by all users
@@ -140,10 +168,8 @@ export const createGraphQLServer = (config: ServerConfig): GraphQLServer => {
             request.headers.get("accept-language") || DEFAULT_LANGUAGE,
           ),
         ttlPerSchemaCoordinate: {
-          "Query.projects": config.cacheTtlMsBetterplace ||
-            DEFAULT_CACHE_TTL_MS_BETTERPLACE,
-          "Query.project": config.cacheTtlMsBetterplace ||
-            DEFAULT_CACHE_TTL_MS_BETTERPLACE,
+          "Query.projects": config.cacheTtlMsBetterplace,
+          "Query.project": config.cacheTtlMsBetterplace,
         },
       }),
     ]
-- 
GitLab