use bulk cache in processOutputBBReferences

This commit is contained in:
Adria Navarro 2023-09-20 10:07:38 +02:00
parent 58d9d3e8e8
commit ed830835a4
2 changed files with 34 additions and 40 deletions

View File

@ -42,26 +42,14 @@ export async function processOutputBBReferences(
return value return value
} }
const result = [] const ids = value.split(",").filter(id => !!id)
const validIds = value.split(",").filter(id => !!id)
switch (subtype) { switch (subtype) {
case FieldSubtype.USER: case FieldSubtype.USER:
for (const id of validIds) { const { users } = await cache.user.getUsers(ids)
try { return users
const user = await cache.user.getUser(id)
if (user) {
result.push(user)
}
} catch {
// If user cannot be found, we just strip it
}
}
break
default: default:
throw utils.unreachable(subtype) throw utils.unreachable(subtype)
} }
return result
} }

View File

@ -142,39 +142,45 @@ describe("bbReferenceProcessor", () => {
describe("processOutputBBReferences", () => { describe("processOutputBBReferences", () => {
describe("subtype user", () => { describe("subtype user", () => {
it("fetches user given a valid string id", async () => { it("fetches user given a valid string id", async () => {
const userId = generator.guid() const user = _.sample(users)!
const userId = user._id!
const userFromCache = structures.users.user() const result = await config.doInTenant(() =>
mockedCacheGetUser.mockResolvedValueOnce(userFromCache) processOutputBBReferences(userId, FieldSubtype.USER)
const result = await processOutputBBReferences(
userId,
FieldSubtype.USER
) )
expect(result).toEqual([userFromCache]) expect(result).toEqual([
expect(mockedCacheGetUser).toBeCalledTimes(1) {
expect(mockedCacheGetUser).toBeCalledWith(userId) ...user,
budibaseAccess: true,
_rev: expect.any(String),
},
])
expect(cacheGetUsersSpy).toBeCalledTimes(1)
expect(cacheGetUsersSpy).toBeCalledWith([userId])
}) })
it("fetches user given a valid string id csv", async () => { it("fetches user given a valid string id csv", async () => {
const userId1 = generator.guid() const [user1, user2] = _.sampleSize(users, 2)
const userId2 = generator.guid() const userId1 = user1._id!
const userId2 = user2._id!
const userFromCache1 = structures.users.user({ _id: userId1 }) const result = await config.doInTenant(() =>
const userFromCache2 = structures.users.user({ _id: userId2 }) processOutputBBReferences(
mockedCacheGetUser.mockResolvedValueOnce(userFromCache1) [userId1, userId2].join(","),
mockedCacheGetUser.mockResolvedValueOnce(userFromCache2) FieldSubtype.USER
)
const result = await processOutputBBReferences(
[userId1, userId2].join(","),
FieldSubtype.USER
) )
expect(result).toEqual([userFromCache1, userFromCache2]) expect(result).toEqual(
expect(mockedCacheGetUser).toBeCalledTimes(2) [user1, user2].map(u => ({
expect(mockedCacheGetUser).toBeCalledWith(userId1) ...u,
expect(mockedCacheGetUser).toBeCalledWith(userId2) budibaseAccess: true,
_rev: expect.any(String),
}))
)
expect(cacheGetUsersSpy).toBeCalledTimes(1)
expect(cacheGetUsersSpy).toBeCalledWith([userId1, userId2])
}) })
}) })
}) })