Skip to content

Commit 83e6795

Browse files
committed
delete from cache by fields
1 parent 3e16887 commit 83e6795

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

src/__tests__/cache.test.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,10 @@ describe('createCachingMethods', () => {
111111
it('adds the right methods', () => {
112112
expect(api.findOneById).toBeDefined()
113113
expect(api.findManyByIds).toBeDefined()
114-
expect(api.findByFields).toBeDefined()
115114
expect(api.deleteFromCacheById).toBeDefined()
115+
116+
expect(api.findByFields).toBeDefined()
117+
expect(api.deleteFromCacheByFields).toBeDefined()
116118
})
117119

118120
it('finds one with ObjectId', async () => {
@@ -249,7 +251,7 @@ describe('createCachingMethods', () => {
249251
expect(value).toBeUndefined()
250252
})
251253

252-
it(`deletes from cache`, async () => {
254+
it(`deletes from cache by ID`, async () => {
253255
for (const doc of [docs.one, docs.two, stringDoc]) {
254256
await api.findOneById(doc._id, { ttl: 1 })
255257

@@ -263,7 +265,7 @@ describe('createCachingMethods', () => {
263265
}
264266
})
265267

266-
it('deletes from DataLoader cache', async () => {
268+
it('deletes from DataLoader cache by ID', async () => {
267269
for (const id of [docs.one._id, docs.two._id, stringDoc._id]) {
268270
await api.findOneById(id)
269271
expect(collection.find).toHaveBeenCalled()
@@ -277,6 +279,19 @@ describe('createCachingMethods', () => {
277279
expect(collection.find).toHaveBeenCalled()
278280
}
279281
})
282+
283+
it(`deletes from cache by fields`, async () => {
284+
const fields = { foo: 'bar' }
285+
await api.findByFields(fields, { ttl: 1 })
286+
287+
const valueBefore = await cache.get(cacheKeyByFields(fields))
288+
expect(valueBefore).toEqual(EJSON.stringify([docs.one, docs.two]))
289+
290+
await api.deleteFromCacheByFields(fields)
291+
292+
const valueAfter = await cache.get(cacheKeyByFields(fields))
293+
expect(valueAfter).toBeUndefined()
294+
})
280295
})
281296

282297
describe('isValidObjectIdString', () => {

src/__tests__/datasource.test.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ describe('MongoDataSource', () => {
1818
const source = new Users(users)
1919
source.initialize()
2020
expect(source.findOneById).toBeDefined()
21+
expect(source.findByFields).toBeDefined()
22+
expect(source.deleteFromCacheById).toBeDefined()
23+
expect(source.deleteFromCacheByFields).toBeDefined()
2124
expect(source.collection).toEqual(users)
2225
})
2326
})

src/cache.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,25 @@ export const createCachingMethods = ({ collection, model, cache }) => {
165165
deleteFromCacheById: async id => {
166166
loader.clear(JSON.stringify({ id }))
167167
await cache.delete(cachePrefix + idToString(id))
168+
},
169+
deleteFromCacheByFields: async fields => {
170+
const cleanedFields = {}
171+
172+
Object.keys(fields)
173+
.sort()
174+
.forEach(key => {
175+
if (typeof key !== 'undefined') {
176+
cleanedFields[key] = Array.isArray(fields[key])
177+
? fields[key]
178+
: [fields[key]]
179+
}
180+
})
181+
182+
const loaderJSON = JSON.stringify(cleanedFields)
183+
184+
const key = cachePrefix + loaderJSON
185+
loader.clear(loaderJSON)
186+
await cache.delete(key)
168187
}
169188
}
170189

0 commit comments

Comments
 (0)