diff --git a/packages/auth/src/cache/appMetadata.js b/packages/auth/src/cache/appMetadata.js index e3758b349a..598a4b7b74 100644 --- a/packages/auth/src/cache/appMetadata.js +++ b/packages/auth/src/cache/appMetadata.js @@ -2,6 +2,9 @@ const redis = require("../redis/authRedis") const { getCouch } = require("../db") const { DocumentTypes } = require("../db/constants") +const AppState = { + INVALID: "invalid", +} const EXPIRY_SECONDS = 3600 /** @@ -27,8 +30,25 @@ exports.getAppMetadata = async (appId, CouchDB = null) => { // try cache let metadata = await client.get(appId) if (!metadata) { - metadata = await populateFromDB(appId, CouchDB) - client.store(appId, metadata, EXPIRY_SECONDS) + let expiry = EXPIRY_SECONDS + try { + metadata = await populateFromDB(appId, CouchDB) + } catch (err) { + // app DB left around, but no metadata, it is invalid + if (err && err.status === 404) { + metadata = { state: AppState.INVALID } + // don't expire the reference to an invalid app, it'll only be + // updated if a metadata doc actually gets stored (app is remade/reverted) + expiry = undefined + } else { + throw err + } + } + client.store(appId, metadata, expiry) + } + // we've stored in the cache an object to tell us that it is currently invalid + if (!metadata || metadata.state === AppState.INVALID) { + throw { status: 404, message: "No app metadata found" } } return metadata }