Skip to content

Commit 2f7389c

Browse files
committed
feat: filter & find
1 parent 276088e commit 2f7389c

File tree

2 files changed

+90
-2
lines changed

2 files changed

+90
-2
lines changed

packages/indexeddb/src/lib/IndexedDBProvider.ts

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
// // @ts-nocheck
22
import {
33
CommonIdentifiers,
4+
isFilterByHookPayload,
5+
isFilterByValuePayload,
6+
isFindByHookPayload,
7+
isFindByValuePayload,
48
isMapByHookPayload,
59
isMapByPathPayload,
610
JoshProvider,
@@ -12,7 +16,7 @@ import {
1216
} from '@joshdb/provider';
1317
import { deleteProperty, getProperty, hasProperty, PROPERTY_NOT_FOUND, setProperty } from 'property-helpers';
1418
import DbHandler from './DbHandler';
15-
import { handleSubCallFail } from './helpers';
19+
import { handleSubCallFail, isPrimitive } from './helpers';
1620

1721
export class IndexedDBProvider<StoredValue = unknown> extends JoshProvider<StoredValue> {
1822
public declare options: IndexedDBProvider.Options;
@@ -370,13 +374,93 @@ export class IndexedDBProvider<StoredValue = unknown> extends JoshProvider<Store
370374
public async [Method.Filter](payload: Payload.Filter.ByValue<StoredValue>): Promise<Payload.Filter.ByValue<StoredValue>>;
371375
public async [Method.Filter](payload: Payload.Filter<StoredValue>): Promise<Payload.Filter<StoredValue>> {
372376
await this.check();
377+
payload.data = {};
378+
379+
if (isFilterByHookPayload(payload)) {
380+
const { hook } = payload;
381+
382+
for (const [key, value] of Object.entries(await this.db.getAll())) if (await hook(value, key)) payload.data[key] = value;
383+
}
384+
385+
if (isFilterByValuePayload(payload)) {
386+
const { path, value } = payload;
387+
388+
for (const [key, storedValue] of Object.entries(await this.db.getAll())) {
389+
const data = getProperty(storedValue, path, false);
390+
391+
if (data === PROPERTY_NOT_FOUND) {
392+
payload.errors.push(this.error({ identifier: CommonIdentifiers.MissingData, method: Method.Filter }, { key, path }));
393+
394+
return payload;
395+
}
396+
397+
if (!isPrimitive(data)) {
398+
payload.errors.push(this.error({ identifier: CommonIdentifiers.InvalidDataType, method: Method.Filter }, { key, path, type: 'primitive' }));
399+
400+
return payload;
401+
}
402+
403+
if (data === value) payload.data[key] = storedValue;
404+
}
405+
}
406+
373407
return payload;
374408
}
375409

376410
public async [Method.Find](payload: Payload.Find.ByHook<StoredValue>): Promise<Payload.Find.ByHook<StoredValue>>;
377411
public async [Method.Find](payload: Payload.Find.ByValue<StoredValue>): Promise<Payload.Find.ByValue<StoredValue>>;
378412
public async [Method.Find](payload: Payload.Find<StoredValue>): Promise<Payload.Find<StoredValue>> {
379413
await this.check();
414+
payload.data = [null, null];
415+
416+
if (isFindByHookPayload(payload)) {
417+
const { hook } = payload;
418+
419+
for (const [key, value] of Object.entries(await this.db.getAll())) {
420+
const result = await hook(value, key);
421+
422+
if (!result) continue;
423+
424+
payload.data = [key, value];
425+
426+
break;
427+
}
428+
}
429+
430+
if (isFindByValuePayload(payload)) {
431+
const { path, value } = payload;
432+
433+
if (!isPrimitive(value)) {
434+
payload.errors.push(this.error({ identifier: CommonIdentifiers.InvalidDataType, method: Method.Find }, { path, type: 'primitive' }));
435+
436+
return payload;
437+
}
438+
439+
for (const [key, storedValue] of Object.entries(await this.db.getAll())) {
440+
if (payload.data[0] !== null && payload.data[1] !== null) break;
441+
442+
const data = getProperty(storedValue, path, false);
443+
444+
if (data === PROPERTY_NOT_FOUND) {
445+
payload.errors.push(this.error({ identifier: CommonIdentifiers.MissingData, method: Method.Find }, { key, path }));
446+
447+
return payload;
448+
}
449+
450+
if (!isPrimitive(data)) {
451+
payload.errors.push(this.error({ identifier: CommonIdentifiers.InvalidDataType, method: Method.Find }, { key, path, type: 'primitive' }));
452+
453+
return payload;
454+
}
455+
456+
if (data !== value) continue;
457+
458+
payload.data = [key, storedValue];
459+
460+
break;
461+
}
462+
}
463+
380464
return payload;
381465
}
382466

packages/indexeddb/src/lib/helpers.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,8 @@ const handleSubCallFail = (res: Payload, payload: Payload) => {
1212
return false;
1313
};
1414

15-
export { handleSubCallFail };
15+
const isPrimitive = (val: any) => {
16+
return (typeof val !== 'object' && typeof val !== 'function') || val === null;
17+
};
18+
19+
export { handleSubCallFail, isPrimitive };

0 commit comments

Comments
 (0)