From 0151087f320c1897ae9cc8c215ae068550890e26 Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Fri, 22 Sep 2023 19:01:04 +0530 Subject: [PATCH 01/19] feat: OOO Nickname Update Job --- src/config/config.ts | 2 +- src/constants.ts | 4 +++ src/handlers/scheduledEventHandler.ts | 46 +++++++++++++++++++++++++++ src/worker.ts | 13 ++++++-- wrangler.toml | 18 +++++++---- 5 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 src/constants.ts diff --git a/src/config/config.ts b/src/config/config.ts index 48446f4..f1d7c10 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -9,7 +9,7 @@ export const handleConfig = (env: env) => { baseUrl = 'https://staging-api.realdevsquad.com'; } } else { - baseUrl = 'https://staging-api.realdevsquad.com'; + baseUrl = 'https://93f5-49-204-135-151.ngrok.io'; } return { baseUrl }; }; diff --git a/src/constants.ts b/src/constants.ts new file mode 100644 index 0000000..3b231ab --- /dev/null +++ b/src/constants.ts @@ -0,0 +1,4 @@ +const KEY_NAME = 'DISCORD_NICKNAME_CHANGED'; +const NAMESPACE_NAME = 'CRON_JOBS_TIMESTAMPS'; + +export { KEY_NAME, NAMESPACE_NAME }; diff --git a/src/handlers/scheduledEventHandler.ts b/src/handlers/scheduledEventHandler.ts index 290112e..1b83916 100644 --- a/src/handlers/scheduledEventHandler.ts +++ b/src/handlers/scheduledEventHandler.ts @@ -1,8 +1,54 @@ +import { KVNamespace } from '@cloudflare/workers-types'; + import { handleConfig } from '../config/config'; +import { KEY_NAME, NAMESPACE_NAME } from '../constants'; import { env } from '../types/global.types'; +import { generateJwt } from '../utils/generateJwt'; export async function ping(env: env) { const url = handleConfig(env); const response = await fetch(`${url.baseUrl}/healthcheck`); return response; } + +export async function callDiscordNicknameBatchUpdate(env: env) { + const namespace = env[NAMESPACE_NAME] as unknown as KVNamespace; + let lastNicknameUpdate: string | number = 0; + try { + lastNicknameUpdate = (await namespace.get(KEY_NAME)) ?? 0; + } catch (err) { + console.log('Error while fetching the timestamp for last nickname update'); + throw err; + } + + const url = handleConfig(env); + let token; + try { + token = await generateJwt(env); + } catch (err) { + console.log(`Error while generating JWT token: ${err}`); + throw err; + } + const response = await fetch(`${url.baseUrl}/discord-actions/nickname/status`, { + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + lastNicknameUpdate, + }), + }); + if (!response.ok) { + throw new Error("Error while trying to update users' discord nickname"); + } + + try { + await namespace.put(KEY_NAME, Date.now().toString()); + } catch (err) { + console.log('Error while trying to update the last nickname change timestamp'); + } + + const data = await response.json(); + return data; +} diff --git a/src/worker.ts b/src/worker.ts index e90e029..e80ef1a 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -1,4 +1,4 @@ -import { ping } from './handlers/scheduledEventHandler'; +import { callDiscordNicknameBatchUpdate, ping } from './handlers/scheduledEventHandler'; import { env } from './types/global.types'; export default { @@ -6,7 +6,16 @@ export default { // for more details read here: https://community.cloudflare.com/t/waituntil-is-not-a-function-when-using-workers-with-modules/375781/4 // eslint-disable-next-line no-unused-vars async scheduled(req: Request, env: env, ctx: ExecutionContext) { - ctx.waitUntil(ping(env)); + switch (req.cron) { + case '0 */4 * * *': + ctx.waitUntil(ping(env)); + break; + case '0 */6 * * *': + await callDiscordNicknameBatchUpdate(env); + break; + default: + console.log('Unknown Trigger Value!'); + } }, // We need to keep all 3 parameters in this format even if they are not used as as cloudflare workers need them to be present So we are disabling eslint rule of no-unused-vars // for more details read here: https://community.cloudflare.com/t/waituntil-is-not-a-function-when-using-workers-with-modules/375781/4 diff --git a/wrangler.toml b/wrangler.toml index c6455e0..0d6c916 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -1,13 +1,19 @@ name = "cron-jobs" main = "src/worker.ts" compatibility_date = "2023-07-17" -[triggers] -crons = ["0 */4 * * *"] -# # KV Namespace binding - For more information: https://developers.cloudflare.com/workers/runtime-apis/kv -# [[kv_namespaces]] -# binding = "MY_KV_NAMESPACE" -# id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +kv_namespaces = [ + { binding = "CRON_JOBS_TIMESTAMPS", id = "a5431887e6c94dc9b3e36c35a07081b9" } +] + +# [env.production] +# the BINDING_NAME must be CRON_JOBS_TIMESTAMPS to override in the production env +# kv_namespaces = [ +# { binding = "", id = "" } +# ] + +[triggers] +crons = ["0 */4 * * *", "0 */6 * * *"] # # Durable Object binding - For more information: https://developers.cloudflare.com/workers/runtime-apis/durable-objects # [[durable_objects]] From 21ee1df1e12d07cddc5e401fda8ad46bb8fc2054 Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sat, 30 Sep 2023 19:31:15 +0530 Subject: [PATCH 02/19] refactor: baseUrl to staging API URL --- src/config/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/config.ts b/src/config/config.ts index f1d7c10..48446f4 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -9,7 +9,7 @@ export const handleConfig = (env: env) => { baseUrl = 'https://staging-api.realdevsquad.com'; } } else { - baseUrl = 'https://93f5-49-204-135-151.ngrok.io'; + baseUrl = 'https://staging-api.realdevsquad.com'; } return { baseUrl }; }; From f1f132d9b59299bdd4733974a98ad256526f3430 Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sat, 30 Sep 2023 21:17:13 +0530 Subject: [PATCH 03/19] refactor: namespace key name --- src/constants.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index 3b231ab..f682c83 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,4 +1,4 @@ -const KEY_NAME = 'DISCORD_NICKNAME_CHANGED'; +const DISCORD_NICKNAME_CHANGED_TIMESTAMP = 'DISCORD_NICKNAME_CHANGED'; const NAMESPACE_NAME = 'CRON_JOBS_TIMESTAMPS'; -export { KEY_NAME, NAMESPACE_NAME }; +export { DISCORD_NICKNAME_CHANGED_TIMESTAMP, NAMESPACE_NAME }; From fec88f7feb4964ed865b5ae77260657c2ee67cbd Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sun, 1 Oct 2023 07:32:39 +0530 Subject: [PATCH 04/19] feat: nickname batch update response type --- src/types/global.types.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/types/global.types.ts b/src/types/global.types.ts index 89578cd..19cbd3f 100644 --- a/src/types/global.types.ts +++ b/src/types/global.types.ts @@ -1,3 +1,12 @@ export type env = { [key: string]: string; }; + +export type nicknameUpdateResponseType = { + message: string; + data: { + totalUsersStatus: number; + successfulNicknameUpdates: number; + unsuccessfulNicknameUpdates: number; + }; +}; From 47859dea19086cde4984fb5195e0952b2886704e Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sun, 1 Oct 2023 07:34:43 +0530 Subject: [PATCH 05/19] refactor: scheduled handler type, return response --- src/worker.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/worker.ts b/src/worker.ts index e80ef1a..08040a2 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -5,14 +5,13 @@ export default { // We need to keep all 3 parameters in this format even if they are not used as as cloudflare workers need them to be present So we are disabling eslint rule of no-unused-vars // for more details read here: https://community.cloudflare.com/t/waituntil-is-not-a-function-when-using-workers-with-modules/375781/4 // eslint-disable-next-line no-unused-vars - async scheduled(req: Request, env: env, ctx: ExecutionContext) { + async scheduled(req: ScheduledController, env: env, ctx: ExecutionContext) { switch (req.cron) { case '0 */4 * * *': ctx.waitUntil(ping(env)); break; case '0 */6 * * *': - await callDiscordNicknameBatchUpdate(env); - break; + return await callDiscordNicknameBatchUpdate(env); default: console.log('Unknown Trigger Value!'); } From 7b0bf9187bc8d3e046034e9e38f58463901317a7 Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sun, 1 Oct 2023 07:36:36 +0530 Subject: [PATCH 06/19] refactor: key constant, return data --- src/handlers/scheduledEventHandler.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/handlers/scheduledEventHandler.ts b/src/handlers/scheduledEventHandler.ts index 1b83916..c225774 100644 --- a/src/handlers/scheduledEventHandler.ts +++ b/src/handlers/scheduledEventHandler.ts @@ -1,8 +1,8 @@ import { KVNamespace } from '@cloudflare/workers-types'; import { handleConfig } from '../config/config'; -import { KEY_NAME, NAMESPACE_NAME } from '../constants'; -import { env } from '../types/global.types'; +import { DISCORD_NICKNAME_CHANGED_TIMESTAMP, NAMESPACE_NAME } from '../constants'; +import { env, nicknameUpdateResponseType } from '../types/global.types'; import { generateJwt } from '../utils/generateJwt'; export async function ping(env: env) { @@ -15,7 +15,7 @@ export async function callDiscordNicknameBatchUpdate(env: env) { const namespace = env[NAMESPACE_NAME] as unknown as KVNamespace; let lastNicknameUpdate: string | number = 0; try { - lastNicknameUpdate = (await namespace.get(KEY_NAME)) ?? 0; + lastNicknameUpdate = (await namespace.get(DISCORD_NICKNAME_CHANGED_TIMESTAMP)) ?? 0; } catch (err) { console.log('Error while fetching the timestamp for last nickname update'); throw err; @@ -43,12 +43,15 @@ export async function callDiscordNicknameBatchUpdate(env: env) { throw new Error("Error while trying to update users' discord nickname"); } + const data: nicknameUpdateResponseType = await response.json(); + if (data?.data.totalUsersStatus !== 0 && data?.data.successfulNicknameUpdates === 0) { + throw new Error("Error while trying to update users' discord nickname"); + } try { - await namespace.put(KEY_NAME, Date.now().toString()); + await namespace.put(DISCORD_NICKNAME_CHANGED_TIMESTAMP, Date.now().toString()); } catch (err) { console.log('Error while trying to update the last nickname change timestamp'); } - const data = await response.json(); return data; } From 2a012f1f496c35ac05104a26eeb50fb9cc664f2f Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sun, 1 Oct 2023 13:47:57 +0530 Subject: [PATCH 07/19] refactor: production and staging kv namespace template --- wrangler.toml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/wrangler.toml b/wrangler.toml index 0d6c916..6dbc0e9 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -6,6 +6,12 @@ kv_namespaces = [ { binding = "CRON_JOBS_TIMESTAMPS", id = "a5431887e6c94dc9b3e36c35a07081b9" } ] +# [env.staging] +# the BINDING_NAME must be CRON_JOBS_TIMESTAMPS to override in the staging env +# kv_namespaces = [ +# { binding = "", id = "" } +# ] + # [env.production] # the BINDING_NAME must be CRON_JOBS_TIMESTAMPS to override in the production env # kv_namespaces = [ From 40a854bd4fa37c6f37e79caeb24bb659d5f839c0 Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sun, 1 Oct 2023 23:00:51 +0530 Subject: [PATCH 08/19] refactor: throw err for null KV namespace --- src/handlers/scheduledEventHandler.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/handlers/scheduledEventHandler.ts b/src/handlers/scheduledEventHandler.ts index c225774..88dd2d0 100644 --- a/src/handlers/scheduledEventHandler.ts +++ b/src/handlers/scheduledEventHandler.ts @@ -13,9 +13,12 @@ export async function ping(env: env) { export async function callDiscordNicknameBatchUpdate(env: env) { const namespace = env[NAMESPACE_NAME] as unknown as KVNamespace; - let lastNicknameUpdate: string | number = 0; + let lastNicknameUpdate: string | number | null = 0; try { - lastNicknameUpdate = (await namespace.get(DISCORD_NICKNAME_CHANGED_TIMESTAMP)) ?? 0; + lastNicknameUpdate = await namespace.get(DISCORD_NICKNAME_CHANGED_TIMESTAMP); + if (lastNicknameUpdate === null) { + throw new Error('Error while fetching KV "DISCORD_NICKNAME_CHANGED_TIMESTAMP"'); + } } catch (err) { console.log('Error while fetching the timestamp for last nickname update'); throw err; From 2ddb96beeafaf918e532c05bcf17a466c2d3d9e2 Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sat, 7 Oct 2023 19:43:13 +0530 Subject: [PATCH 09/19] refactor: remove DISCORD_NICKNAME_CHANGED constant --- src/constants.ts | 3 +-- src/handlers/scheduledEventHandler.ts | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index f682c83..c87b29d 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,4 +1,3 @@ -const DISCORD_NICKNAME_CHANGED_TIMESTAMP = 'DISCORD_NICKNAME_CHANGED'; const NAMESPACE_NAME = 'CRON_JOBS_TIMESTAMPS'; -export { DISCORD_NICKNAME_CHANGED_TIMESTAMP, NAMESPACE_NAME }; +export { NAMESPACE_NAME }; diff --git a/src/handlers/scheduledEventHandler.ts b/src/handlers/scheduledEventHandler.ts index 88dd2d0..9f2eb80 100644 --- a/src/handlers/scheduledEventHandler.ts +++ b/src/handlers/scheduledEventHandler.ts @@ -1,7 +1,7 @@ import { KVNamespace } from '@cloudflare/workers-types'; import { handleConfig } from '../config/config'; -import { DISCORD_NICKNAME_CHANGED_TIMESTAMP, NAMESPACE_NAME } from '../constants'; +import { NAMESPACE_NAME } from '../constants'; import { env, nicknameUpdateResponseType } from '../types/global.types'; import { generateJwt } from '../utils/generateJwt'; @@ -15,9 +15,9 @@ export async function callDiscordNicknameBatchUpdate(env: env) { const namespace = env[NAMESPACE_NAME] as unknown as KVNamespace; let lastNicknameUpdate: string | number | null = 0; try { - lastNicknameUpdate = await namespace.get(DISCORD_NICKNAME_CHANGED_TIMESTAMP); + lastNicknameUpdate = await namespace.get('DISCORD_NICKNAME_CHANGED'); if (lastNicknameUpdate === null) { - throw new Error('Error while fetching KV "DISCORD_NICKNAME_CHANGED_TIMESTAMP"'); + throw new Error('Error while fetching KV "DISCORD_NICKNAME_CHANGED" timestamp'); } } catch (err) { console.log('Error while fetching the timestamp for last nickname update'); @@ -51,7 +51,7 @@ export async function callDiscordNicknameBatchUpdate(env: env) { throw new Error("Error while trying to update users' discord nickname"); } try { - await namespace.put(DISCORD_NICKNAME_CHANGED_TIMESTAMP, Date.now().toString()); + await namespace.put('DISCORD_NICKNAME_CHANGED', Date.now().toString()); } catch (err) { console.log('Error while trying to update the last nickname change timestamp'); } From b856cbf0a995e055c165f5cfe48f7683193d5f25 Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sat, 14 Oct 2023 14:36:29 +0530 Subject: [PATCH 10/19] refactor: rename CRON_JOBS_TIMESTAMP to CronJobsTimestamp --- src/constants.ts | 2 +- wrangler.toml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index c87b29d..9ab5017 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,3 +1,3 @@ -const NAMESPACE_NAME = 'CRON_JOBS_TIMESTAMPS'; +const NAMESPACE_NAME = 'CronJobsTimestamp'; export { NAMESPACE_NAME }; diff --git a/wrangler.toml b/wrangler.toml index 6dbc0e9..75d9df8 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -3,17 +3,17 @@ main = "src/worker.ts" compatibility_date = "2023-07-17" kv_namespaces = [ - { binding = "CRON_JOBS_TIMESTAMPS", id = "a5431887e6c94dc9b3e36c35a07081b9" } + { binding = "CronJobsTimestamp", id = "7dcf94601bec415db4b13d5d1faf0fc3" } ] # [env.staging] -# the BINDING_NAME must be CRON_JOBS_TIMESTAMPS to override in the staging env +# the BINDING_NAME must be CronJobsTimestamp to override in the staging env # kv_namespaces = [ # { binding = "", id = "" } # ] # [env.production] -# the BINDING_NAME must be CRON_JOBS_TIMESTAMPS to override in the production env +# the BINDING_NAME must be CronJobsTimestamp to override in the production env # kv_namespaces = [ # { binding = "", id = "" } # ] From bb2f61fee5de1fbdda76f6f0eff5f409e8565675 Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sat, 14 Oct 2023 14:37:40 +0530 Subject: [PATCH 11/19] refactor: add console errors --- src/handlers/scheduledEventHandler.ts | 6 +++--- src/worker.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/handlers/scheduledEventHandler.ts b/src/handlers/scheduledEventHandler.ts index 9f2eb80..3671a2f 100644 --- a/src/handlers/scheduledEventHandler.ts +++ b/src/handlers/scheduledEventHandler.ts @@ -20,7 +20,7 @@ export async function callDiscordNicknameBatchUpdate(env: env) { throw new Error('Error while fetching KV "DISCORD_NICKNAME_CHANGED" timestamp'); } } catch (err) { - console.log('Error while fetching the timestamp for last nickname update'); + console.error(err, 'Error while fetching the timestamp for last nickname update'); throw err; } @@ -29,7 +29,7 @@ export async function callDiscordNicknameBatchUpdate(env: env) { try { token = await generateJwt(env); } catch (err) { - console.log(`Error while generating JWT token: ${err}`); + console.error(`Error while generating JWT token: ${err}`); throw err; } const response = await fetch(`${url.baseUrl}/discord-actions/nickname/status`, { @@ -53,7 +53,7 @@ export async function callDiscordNicknameBatchUpdate(env: env) { try { await namespace.put('DISCORD_NICKNAME_CHANGED', Date.now().toString()); } catch (err) { - console.log('Error while trying to update the last nickname change timestamp'); + console.error('Error while trying to update the last nickname change timestamp'); } return data; diff --git a/src/worker.ts b/src/worker.ts index 08040a2..7d43d70 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -13,7 +13,7 @@ export default { case '0 */6 * * *': return await callDiscordNicknameBatchUpdate(env); default: - console.log('Unknown Trigger Value!'); + console.error('Unknown Trigger Value!'); } }, // We need to keep all 3 parameters in this format even if they are not used as as cloudflare workers need them to be present So we are disabling eslint rule of no-unused-vars From 575a8fd48cbd989e60f4783ff51c5685422630c8 Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sat, 14 Oct 2023 14:38:42 +0530 Subject: [PATCH 12/19] refactor: type name to PascalCase --- src/handlers/scheduledEventHandler.ts | 4 ++-- src/types/global.types.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/handlers/scheduledEventHandler.ts b/src/handlers/scheduledEventHandler.ts index 3671a2f..5fd4232 100644 --- a/src/handlers/scheduledEventHandler.ts +++ b/src/handlers/scheduledEventHandler.ts @@ -2,7 +2,7 @@ import { KVNamespace } from '@cloudflare/workers-types'; import { handleConfig } from '../config/config'; import { NAMESPACE_NAME } from '../constants'; -import { env, nicknameUpdateResponseType } from '../types/global.types'; +import { env, NicknameUpdateResponseType } from '../types/global.types'; import { generateJwt } from '../utils/generateJwt'; export async function ping(env: env) { @@ -46,7 +46,7 @@ export async function callDiscordNicknameBatchUpdate(env: env) { throw new Error("Error while trying to update users' discord nickname"); } - const data: nicknameUpdateResponseType = await response.json(); + const data: NicknameUpdateResponseType = await response.json(); if (data?.data.totalUsersStatus !== 0 && data?.data.successfulNicknameUpdates === 0) { throw new Error("Error while trying to update users' discord nickname"); } diff --git a/src/types/global.types.ts b/src/types/global.types.ts index 19cbd3f..69dcd12 100644 --- a/src/types/global.types.ts +++ b/src/types/global.types.ts @@ -2,7 +2,7 @@ export type env = { [key: string]: string; }; -export type nicknameUpdateResponseType = { +export type NicknameUpdateResponseType = { message: string; data: { totalUsersStatus: number; From c055577746b3040d81e70d1b662bbf08c6e4672d Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sat, 14 Oct 2023 14:39:54 +0530 Subject: [PATCH 13/19] refactor: remove number from union type --- src/handlers/scheduledEventHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/handlers/scheduledEventHandler.ts b/src/handlers/scheduledEventHandler.ts index 5fd4232..d60f562 100644 --- a/src/handlers/scheduledEventHandler.ts +++ b/src/handlers/scheduledEventHandler.ts @@ -13,7 +13,7 @@ export async function ping(env: env) { export async function callDiscordNicknameBatchUpdate(env: env) { const namespace = env[NAMESPACE_NAME] as unknown as KVNamespace; - let lastNicknameUpdate: string | number | null = 0; + let lastNicknameUpdate: string | null = '0'; try { lastNicknameUpdate = await namespace.get('DISCORD_NICKNAME_CHANGED'); if (lastNicknameUpdate === null) { From 2c6a49ff0c74ba5f6387e6e79773cb687a058433 Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sat, 14 Oct 2023 15:40:22 +0530 Subject: [PATCH 14/19] refactor: log response after nickname update job --- src/handlers/scheduledEventHandler.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/handlers/scheduledEventHandler.ts b/src/handlers/scheduledEventHandler.ts index d60f562..e45f950 100644 --- a/src/handlers/scheduledEventHandler.ts +++ b/src/handlers/scheduledEventHandler.ts @@ -50,6 +50,9 @@ export async function callDiscordNicknameBatchUpdate(env: env) { if (data?.data.totalUsersStatus !== 0 && data?.data.successfulNicknameUpdates === 0) { throw new Error("Error while trying to update users' discord nickname"); } + + console.log(data); + try { await namespace.put('DISCORD_NICKNAME_CHANGED', Date.now().toString()); } catch (err) { From c9740789a02394a7de3f0262a9af963e87f9669b Mon Sep 17 00:00:00 2001 From: Bharati Subramanian Date: Sat, 14 Oct 2023 23:26:09 +0530 Subject: [PATCH 15/19] refactor: check for no value in KV store --- src/handlers/scheduledEventHandler.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/handlers/scheduledEventHandler.ts b/src/handlers/scheduledEventHandler.ts index e45f950..6fb7f50 100644 --- a/src/handlers/scheduledEventHandler.ts +++ b/src/handlers/scheduledEventHandler.ts @@ -19,6 +19,9 @@ export async function callDiscordNicknameBatchUpdate(env: env) { if (lastNicknameUpdate === null) { throw new Error('Error while fetching KV "DISCORD_NICKNAME_CHANGED" timestamp'); } + if (!lastNicknameUpdate) { + lastNicknameUpdate = '0'; + } } catch (err) { console.error(err, 'Error while fetching the timestamp for last nickname update'); throw err; From 47259cc75896e9caeb4f8f611d231da10dc2253d Mon Sep 17 00:00:00 2001 From: Prakash Date: Sat, 4 Nov 2023 01:24:16 +0530 Subject: [PATCH 16/19] define constants for cron string --- src/worker.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/worker.ts b/src/worker.ts index 7d43d70..1317e02 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -1,16 +1,19 @@ import { callDiscordNicknameBatchUpdate, ping } from './handlers/scheduledEventHandler'; import { env } from './types/global.types'; +const EVERY_4_HOURS = '0 */4 * * *'; +const EVERY_6_HOURS = '0 */6 * * *'; + export default { // We need to keep all 3 parameters in this format even if they are not used as as cloudflare workers need them to be present So we are disabling eslint rule of no-unused-vars // for more details read here: https://community.cloudflare.com/t/waituntil-is-not-a-function-when-using-workers-with-modules/375781/4 // eslint-disable-next-line no-unused-vars async scheduled(req: ScheduledController, env: env, ctx: ExecutionContext) { switch (req.cron) { - case '0 */4 * * *': + case EVERY_4_HOURS: ctx.waitUntil(ping(env)); break; - case '0 */6 * * *': + case EVERY_6_HOURS: return await callDiscordNicknameBatchUpdate(env); default: console.error('Unknown Trigger Value!'); From 3515c2e4659473ed05fd6dc301ef140e89e342a8 Mon Sep 17 00:00:00 2001 From: Prakash Date: Sat, 4 Nov 2023 01:33:06 +0530 Subject: [PATCH 17/19] change DISCORD_NICKNAME_CHANGED to DISCORD_NICKNAME_UPDATED_TIME --- src/handlers/scheduledEventHandler.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/handlers/scheduledEventHandler.ts b/src/handlers/scheduledEventHandler.ts index 6fb7f50..476c8f2 100644 --- a/src/handlers/scheduledEventHandler.ts +++ b/src/handlers/scheduledEventHandler.ts @@ -15,9 +15,9 @@ export async function callDiscordNicknameBatchUpdate(env: env) { const namespace = env[NAMESPACE_NAME] as unknown as KVNamespace; let lastNicknameUpdate: string | null = '0'; try { - lastNicknameUpdate = await namespace.get('DISCORD_NICKNAME_CHANGED'); + lastNicknameUpdate = await namespace.get('DISCORD_NICKNAME_UPDATED_TIME'); if (lastNicknameUpdate === null) { - throw new Error('Error while fetching KV "DISCORD_NICKNAME_CHANGED" timestamp'); + throw new Error('Error while fetching KV "DISCORD_NICKNAME_UPDATED_TIME" timestamp'); } if (!lastNicknameUpdate) { lastNicknameUpdate = '0'; @@ -57,7 +57,7 @@ export async function callDiscordNicknameBatchUpdate(env: env) { console.log(data); try { - await namespace.put('DISCORD_NICKNAME_CHANGED', Date.now().toString()); + await namespace.put('DISCORD_NICKNAME_UPDATED_TIME', Date.now().toString()); } catch (err) { console.error('Error while trying to update the last nickname change timestamp'); } From f054f7d5b68060630352f6242fb07a9b50b80e90 Mon Sep 17 00:00:00 2001 From: Prakash Date: Sat, 4 Nov 2023 01:38:34 +0530 Subject: [PATCH 18/19] remove disabled eslint rule --- src/worker.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/worker.ts b/src/worker.ts index 1317e02..219fd47 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -5,9 +5,6 @@ const EVERY_4_HOURS = '0 */4 * * *'; const EVERY_6_HOURS = '0 */6 * * *'; export default { - // We need to keep all 3 parameters in this format even if they are not used as as cloudflare workers need them to be present So we are disabling eslint rule of no-unused-vars - // for more details read here: https://community.cloudflare.com/t/waituntil-is-not-a-function-when-using-workers-with-modules/375781/4 - // eslint-disable-next-line no-unused-vars async scheduled(req: ScheduledController, env: env, ctx: ExecutionContext) { switch (req.cron) { case EVERY_4_HOURS: From 799b8d0e66d1cc6f2a312027743a911917b82bd7 Mon Sep 17 00:00:00 2001 From: Bharati Subramanian <51514137+bharati-21@users.noreply.github.com> Date: Wed, 15 Nov 2023 18:14:42 +0530 Subject: [PATCH 19/19] docs: add prod KV namespace ID --- wrangler.toml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/wrangler.toml b/wrangler.toml index 75d9df8..dd66e15 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -12,11 +12,10 @@ kv_namespaces = [ # { binding = "", id = "" } # ] -# [env.production] -# the BINDING_NAME must be CronJobsTimestamp to override in the production env -# kv_namespaces = [ -# { binding = "", id = "" } -# ] +[env.production] +kv_namespaces = [ + { binding = "CronJobsTimestamp", id = "3a10f726c95d4afea9dee5fd00f029b9" } +] [triggers] crons = ["0 */4 * * *", "0 */6 * * *"]