From a47a5a7d9c433877585ed73c135b932b289e30fa Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 12 Apr 2024 16:56:16 +0800 Subject: [PATCH] mock saving digest in redis --- packages/api/src/jobs/create_digest.ts | 26 ++++++++++++++++-- packages/api/src/routers/digest_router.ts | 24 +++-------------- packages/api/src/server.ts | 2 +- packages/api/src/services/digest.ts | 32 +++++++++++++++++++++++ 4 files changed, 61 insertions(+), 23 deletions(-) create mode 100644 packages/api/src/services/digest.ts diff --git a/packages/api/src/jobs/create_digest.ts b/packages/api/src/jobs/create_digest.ts index bab980480..f57c7eab8 100644 --- a/packages/api/src/jobs/create_digest.ts +++ b/packages/api/src/jobs/create_digest.ts @@ -1,3 +1,4 @@ +import { setDigest } from '../services/digest' import { logger } from '../utils/logger' export const CREATE_DIGEST_JOB = 'create-digest' @@ -13,6 +14,27 @@ export interface CreateDigestJobResponse { export const processCreateDigestJob = async (data: CreateDigestJobData) => { logger.info('processing create digest job', data) - // do something - await Promise.resolve() + // TODO: create digest + const digest = { + url: 'https://example.com', + title: 'Example Digest', + jobState: 'completed', + content: 'This is an example digest', + chapters: [ + { + title: 'Chapter 1', + }, + { + title: 'Chapter 2', + }, + ], + urlsToAudio: ['https://example.com/audio'], + } + + // save digest to redis + await setDigest(data.userId, digest) + + logger.info('digest created', digest) + + return true } diff --git a/packages/api/src/routers/digest_router.ts b/packages/api/src/routers/digest_router.ts index ae478af26..24102de3b 100644 --- a/packages/api/src/routers/digest_router.ts +++ b/packages/api/src/routers/digest_router.ts @@ -3,7 +3,7 @@ import express from 'express' import { TaskState } from '../generated/graphql' import { CREATE_DIGEST_JOB } from '../jobs/create_digest' import { createJobId, getJob, jobStateToTaskState } from '../queue-processor' -import { redisDataSource } from '../redis_data_source' +import { getDigest } from '../services/digest' import { findActiveUser } from '../services/user' import { analytics } from '../utils/analytics' import { getClaimsByToken, getTokenByRequest } from '../utils/auth' @@ -11,19 +11,6 @@ import { corsConfig } from '../utils/corsConfig' import { enqueueCreateDigest } from '../utils/createTask' import { logger } from '../utils/logger' -interface Digest { - url: string - title: string - jobState: string - content: string - chapters: Chapter[] - urlsToAudio: string[] -} - -interface Chapter { - title: string -} - interface Feedback { digestRating: number rankingRating: number @@ -135,18 +122,15 @@ export function digestRouter() { } // if job is done and removed then get the digest from redis - const key = `digest:${userId}` - const digest = await redisDataSource.redisClient?.get(key) + const digest = await getDigest(userId) if (!digest) { - logger.info(`Digest not found: ${key}`) + logger.info(`Digest not found: ${userId}`) return res.sendStatus(404) } - const digestObject = JSON.parse(digest) as Digest - // return digest return res.send({ - ...digestObject, + ...digest, jobId, jobState: TaskState.Succeeded, }) diff --git a/packages/api/src/server.ts b/packages/api/src/server.ts index 196c38f7c..e1603a6cb 100755 --- a/packages/api/src/server.ts +++ b/packages/api/src/server.ts @@ -90,7 +90,7 @@ export const createApp = (): Express => { app.use('/api/notification', notificationRouter()) app.use('/api/integration', integrationRouter()) app.use('/api/tasks', taskRouter()) - app.use('/api/digest', digestRouter) + app.use('/api/digest', digestRouter()) app.use('/svc/pubsub/content', contentServiceRouter()) app.use('/svc/pubsub/links', linkServiceRouter()) app.use('/svc/pubsub/newsletters', newsletterServiceRouter()) diff --git a/packages/api/src/services/digest.ts b/packages/api/src/services/digest.ts new file mode 100644 index 000000000..ceb274d70 --- /dev/null +++ b/packages/api/src/services/digest.ts @@ -0,0 +1,32 @@ +import { redisDataSource } from '../redis_data_source' + +export interface Digest { + url: string + title: string + jobState: string + content: string + chapters: Chapter[] + urlsToAudio: string[] +} + +interface Chapter { + title: string +} + +const digestKey = (userId: string) => `digest:${userId}` + +export const getDigest = async (userId: string): Promise => { + const digest = await redisDataSource.redisClient?.get(digestKey(userId)) + return digest ? (JSON.parse(digest) as Digest) : null +} + +export const setDigest = async (userId: string, digest: Digest) => { + const result = await redisDataSource.redisClient?.set( + digestKey(userId), + JSON.stringify(digest) + ) + + if (result != 'OK') { + throw new Error('Failed to set digest') + } +}