diff --git a/apps/api/src/config/constants.ts b/apps/api/src/config/constants.ts new file mode 100644 index 0000000..714d63f --- /dev/null +++ b/apps/api/src/config/constants.ts @@ -0,0 +1 @@ +export const DEFAULT_CACHE_TTL = 15 * 60; diff --git a/apps/api/src/config/schema/env.ts b/apps/api/src/config/schema/env.ts index c8a80de..3def57c 100644 --- a/apps/api/src/config/schema/env.ts +++ b/apps/api/src/config/schema/env.ts @@ -1,10 +1,11 @@ +import { DEFAULT_CACHE_TTL } from '../constants'; import { z } from 'zod'; const envSchema = z.object({ CACHE_TTL: z .string() .transform((val) => Number.parseInt(val, 10)) - .default('900'), + .default(DEFAULT_CACHE_TTL.toString()), PORT: z .string() .transform((val) => Number.parseInt(val, 10)) diff --git a/apps/api/src/proxy/lib/config.ts b/apps/api/src/proxy/lib/config.ts new file mode 100644 index 0000000..8289031 --- /dev/null +++ b/apps/api/src/proxy/lib/config.ts @@ -0,0 +1,3 @@ +export const queryTTL: Record = { + GetSystemUser: 6 * 60 * 60, +}; diff --git a/apps/api/src/proxy/proxy.controller.ts b/apps/api/src/proxy/proxy.controller.ts index fa8232b..e58dd21 100644 --- a/apps/api/src/proxy/proxy.controller.ts +++ b/apps/api/src/proxy/proxy.controller.ts @@ -1,13 +1,20 @@ +import { queryTTL } from './lib/config'; import type { GQLRequest } from './types'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; import { All, Controller, Inject, Req, Res } from '@nestjs/common'; -import { Cache } from 'cache-manager'; +import type { Cache } from 'cache-manager'; import { FastifyReply, FastifyRequest } from 'fastify'; import { env } from 'src/config/env'; +type RedisStore = Omit & { + set: (key: string, value: unknown, { ttl }: { ttl: number }) => Promise; +}; + @Controller('proxy') export class ProxyController { - constructor(@Inject(CACHE_MANAGER) private readonly cacheManager: Cache) {} + constructor( + @Inject(CACHE_MANAGER) private readonly cacheManager: RedisStore, + ) {} @All('/graphql') public async graphql(@Req() req: FastifyRequest, @Res() reply: FastifyReply) { const { operationName, query, variables } = req.body as GQLRequest; @@ -15,22 +22,19 @@ export class ProxyController { const key = `${operationName} ${JSON.stringify(variables)}`; const cached = await this.cacheManager.get(key); - if (cached) { - return reply.send(cached); - } + if (cached) return reply.send(cached); const response = await fetch(env.URL_CRM_GRAPHQL_DIRECT, { body: JSON.stringify({ operationName, query, variables }), - headers: { - Authorization: req.headers.authorization, - 'Content-Type': 'application/json', - Cookie: req.headers.cookie, - }, + headers: req.headers as HeadersInit, method: req.method, }); const data = await response.json(); - if (data) await this.cacheManager.set(key, data); + if (data) { + const ttl = queryTTL[operationName] || env.CACHE_TTL; + await this.cacheManager.set(key, data, { ttl }); + } return reply.send(data); }