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