Check usage across dev and prod app

This commit is contained in:
Adria Navarro 2025-03-21 09:48:08 +01:00
parent dee8d5f3c4
commit ec02ce76ad
2 changed files with 57 additions and 17 deletions

View File

@ -7,7 +7,7 @@ import path from "path"
import { KEYCLOAK_IMAGE } from "../../../../integrations/tests/utils/images" import { KEYCLOAK_IMAGE } from "../../../../integrations/tests/utils/images"
import { startContainer } from "../../../../integrations/tests/utils" import { startContainer } from "../../../../integrations/tests/utils"
import { OAuth2CredentialsMethod } from "@budibase/types" import { OAuth2CredentialsMethod } from "@budibase/types"
import { cache, context, docIds } from "@budibase/backend-core" import { cache } from "@budibase/backend-core"
import tk from "timekeeper" import tk from "timekeeper"
const config = new TestConfiguration() const config = new TestConfiguration()
@ -140,16 +140,10 @@ describe("oauth2 utils", () => {
) )
const usageLog = await config.doInContext(config.appId, () => const usageLog = await config.doInContext(config.appId, () =>
context sdk.oauth2.getLastUsages([oauthConfig._id])
.getAppDB()
.tryGet(docIds.generateOAuth2LogID(oauthConfig._id))
) )
expect(usageLog).toEqual( expect(usageLog[oauthConfig._id]).toEqual(Date.now())
expect.objectContaining({
lastUsage: Date.now(),
})
)
}) })
it("does not track on failed usages", async () => { it("does not track on failed usages", async () => {
@ -171,12 +165,46 @@ describe("oauth2 utils", () => {
) )
const usageLog = await config.doInContext(config.appId, () => const usageLog = await config.doInContext(config.appId, () =>
context sdk.oauth2.getLastUsages([oauthConfig._id])
.getAppDB()
.tryGet(docIds.generateOAuth2LogID(oauthConfig._id))
) )
expect(usageLog).toBeUndefined() expect(usageLog[oauthConfig._id]).toBeUndefined()
})
it("tracks usages between prod and dev, keeping always the latest", async () => {
const oauthConfig = await config.doInContext(config.appId, () =>
sdk.oauth2.create({
name: generator.guid(),
url: `${keycloakUrl}/realms/myrealm/protocol/openid-connect/token`,
clientId: "my-client",
clientSecret: "my-secret",
method,
})
)
await config.doInContext(config.appId, () =>
getToken(oauthConfig._id)
)
await config.publish()
tk.travel(Date.now() + 100)
await config.doInContext(config.prodAppId, () =>
getToken(oauthConfig._id)
)
await testUtils.queue.processMessages(
cache.docWritethrough.DocWritethroughProcessor.queue
)
for (const appId of [config.appId, config.prodAppId]) {
const usageLog = await config.doInContext(appId, () =>
sdk.oauth2.getLastUsages([oauthConfig._id])
)
expect(usageLog).toEqual({
[oauthConfig._id]: Date.now(),
})
}
}) })
}) })
} }

View File

@ -99,15 +99,27 @@ export async function validateConfig(config: {
} }
export async function getLastUsages(ids: string[]) { export async function getLastUsages(ids: string[]) {
const docs = await context const devDocs = await context
.getAppDB() .getAppDB()
.getMultiple<OAuth2LogDocument>(ids.map(docIds.generateOAuth2LogID), { .getMultiple<OAuth2LogDocument>(ids.map(docIds.generateOAuth2LogID), {
allowMissing: true, allowMissing: true,
}) })
const prodDocs = await context
.getProdAppDB()
.getMultiple<OAuth2LogDocument>(ids.map(docIds.generateOAuth2LogID), {
allowMissing: true,
})
const result = ids.reduce<Record<string, number>>((acc, id) => { const result = ids.reduce<Record<string, number>>((acc, id) => {
const doc = docs.find(d => d._id === docIds.generateOAuth2LogID(id)) const devDoc = devDocs.find(d => d._id === docIds.generateOAuth2LogID(id))
if (doc) { if (devDoc) {
acc[id] = doc.lastUsage acc[id] = devDoc.lastUsage
}
const prodDoc = prodDocs.find(d => d._id === docIds.generateOAuth2LogID(id))
if (prodDoc && (!acc[id] || acc[id] < prodDoc.lastUsage)) {
acc[id] = prodDoc.lastUsage
} }
return acc return acc
}, {}) }, {})