From 440523c704c8275cc001f79f238237dd314fde21 Mon Sep 17 00:00:00 2001 From: KrisbelGV Date: Sun, 10 May 2026 07:53:16 -0400 Subject: [PATCH] Defer scratch failure cleanup to end of successful requests --- src/controllers/aNewView.js | 5 +++++ src/controllers/findAStudio.js | 5 +++++ src/controllers/isItIndex.js | 5 +++++ src/controllers/search.js | 5 +++++ src/controllers/userData.js | 5 +++++ src/middleware/doorman.js | 2 ++ src/services/proxyService.js | 8 +------- 7 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/controllers/aNewView.js b/src/controllers/aNewView.js index a456df3..331b8e6 100644 --- a/src/controllers/aNewView.js +++ b/src/controllers/aNewView.js @@ -1,6 +1,7 @@ const {InputError} = require('../middleware/validator'); const catchAsync = require('../utils/catchAsync'); const createAbortController = require('../utils/createAbortController'); +const { clearScratchFailure } = require('../utils/upstash'); const { getFollowingProjects } = require('../services/filterService'); exports.getProjectsFromFollowing = catchAsync(async function getProjectsFromFollowing(req, res, next) { @@ -14,6 +15,10 @@ exports.getProjectsFromFollowing = catchAsync(async function getProjectsFromFoll {results:"No search results"} : {results:found}; + if (res.locals.scratchWasDown) { + await clearScratchFailure().catch(() => {}); + } + return res.status(200).json({ ...found, aborted: signal.aborted diff --git a/src/controllers/findAStudio.js b/src/controllers/findAStudio.js index 94e32fd..46695d0 100644 --- a/src/controllers/findAStudio.js +++ b/src/controllers/findAStudio.js @@ -1,6 +1,7 @@ const {InputError} = require('../middleware/validator'); const catchAsync = require('../utils/catchAsync'); const createAbortController = require('../utils/createAbortController'); +const { clearScratchFailure } = require('../utils/upstash'); const { getProjectDataFromId, getTagsFromProject, @@ -22,6 +23,10 @@ exports.getStudioForAProject = catchAsync(async function getStudioForAProject(re {results: 'No search results'} : {results: studiosFound}; + if (res.locals.scratchWasDown) { + await clearScratchFailure().catch(() => {}); + } + return res.status(200).json({ ...studiosFound, aborted: signal.aborted diff --git a/src/controllers/isItIndex.js b/src/controllers/isItIndex.js index ce220d1..9be9d8e 100644 --- a/src/controllers/isItIndex.js +++ b/src/controllers/isItIndex.js @@ -1,5 +1,6 @@ const catchAsync = require('../utils/catchAsync'); const createAbortController = require('../utils/createAbortController'); +const { clearScratchFailure } = require('../utils/upstash'); const { getProjectDataFromId, searchProjectsGeneralFromId @@ -22,6 +23,10 @@ exports.getProjectDataFromIndex = catchAsync(async function getProjectDataFromIn {results:projectData, message:"No index"} : {results:found, message:"Index"}; + if (res.locals.scratchWasDown) { + await clearScratchFailure().catch(() => {}); + } + return res.status(200).json({ ...found, aborted: signal.aborted diff --git a/src/controllers/search.js b/src/controllers/search.js index d1c1ad4..d3d810b 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -1,6 +1,7 @@ const {InputError} = require('../middleware/validator'); const catchAsync = require('../utils/catchAsync'); const createAbortController = require('../utils/createAbortController'); +const { clearScratchFailure } = require('../utils/upstash'); const { validateFollowing, searchProjectsByProfiles, @@ -27,6 +28,10 @@ exports.getSearchResults = catchAsync(async function getSearchResults(req, res, {results: 'No search results'} : {results: projectsFound}; + if (res.locals.scratchWasDown) { + await clearScratchFailure().catch(() => {}); + } + return res.status(200).json({ ...projectsFound, aborted: signal.aborted diff --git a/src/controllers/userData.js b/src/controllers/userData.js index 487f780..cd44700 100644 --- a/src/controllers/userData.js +++ b/src/controllers/userData.js @@ -1,6 +1,7 @@ const {InputError} = require('../middleware/validator'); const catchAsync = require('../utils/catchAsync'); const createAbortController = require('../utils/createAbortController'); +const { clearScratchFailure } = require('../utils/upstash'); const { filterUserData, countNumberFollowers, @@ -20,5 +21,9 @@ exports.getUserData = catchAsync(async function getUserData(req, res, next) { userData.stats = await calculateStats(userName, signal); userData.aborted = signal.aborted; + if (res.locals.scratchWasDown) { + await clearScratchFailure().catch(() => {}); + } + return res.status(200).json(userData); }); \ No newline at end of file diff --git a/src/middleware/doorman.js b/src/middleware/doorman.js index 48509cd..dba2641 100644 --- a/src/middleware/doorman.js +++ b/src/middleware/doorman.js @@ -93,6 +93,8 @@ exports.dailyRateGuard = catchAsync(async function dailyRateGuard(req, res, next err.status = 502; throw err; } + + res.locals.scratchWasDown = scratchStatus.status === 'retry_allowed'; const rateLimit = await checkDailyRateLimit(ip); diff --git a/src/services/proxyService.js b/src/services/proxyService.js index dd29e4a..c7e0175 100644 --- a/src/services/proxyService.js +++ b/src/services/proxyService.js @@ -1,8 +1,5 @@ const createError = require('http-errors'); -const { - registerScratchFailure, - clearScratchFailure -} = require('../utils/upstash'); +const { registerScratchFailure } = require('../utils/upstash'); class ExternalApiError extends Error { constructor(status, message) { @@ -56,9 +53,6 @@ const requestExternalData = async (url) => { const protectedRequest = async (url) => { try { const result = await requestExternalData(url); - - await clearScratchFailure().catch(() => {}); - return result; } catch (error) { if (error.status >= 500 || error.status === 429) {