Skip to content

Commit 393fa4c

Browse files
committed
delete from cache by fields
1 parent e36c4c1 commit 393fa4c

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
@@ -163,6 +163,25 @@ export const createCachingMethods = ({ collection, model, cache }) => {
163163
deleteFromCacheById: async id => {
164164
loader.clear(JSON.stringify({ id }))
165165
await cache.delete(cachePrefix + idToString(id))
166+
},
167+
deleteFromCacheByFields: async fields => {
168+
const cleanedFields = {}
169+
170+
Object.keys(fields)
171+
.sort()
172+
.forEach(key => {
173+
if (typeof key !== 'undefined') {
174+
cleanedFields[key] = Array.isArray(fields[key])
175+
? fields[key]
176+
: [fields[key]]
177+
}
178+
})
179+
180+
const loaderJSON = JSON.stringify(cleanedFields)
181+
182+
const key = cachePrefix + loaderJSON
183+
loader.clear(loaderJSON)
184+
await cache.delete(key)
166185
}
167186
}
168187

0 commit comments

Comments
 (0)