From 72fc09a95f7d7b5a37ce2fcde4e27e09ae9ca63a Mon Sep 17 00:00:00 2001 From: typicode Date: Sun, 7 Jan 2024 17:43:40 +0100 Subject: [PATCH] feat: autofix, ensure all items have an id field --- src/service.test.ts | 13 ++++++++++++- src/service.ts | 27 ++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/service.test.ts b/src/service.test.ts index 57af341ce..c8c321434 100644 --- a/src/service.test.ts +++ b/src/service.test.ts @@ -6,7 +6,7 @@ import { ParsedUrlQuery } from 'querystring' import { Data, Item, PaginatedItems, Service } from './service.js' -const defaultData = { posts: [] } +const defaultData = { posts: [], comments: [], object: {} } const adapter = new Memory() const db = new Low(adapter, defaultData) const service = new Service(db) @@ -62,6 +62,17 @@ type Test = { error?: Error } +await test('constructor', () => { + const defaultData = { posts: [{ id: '1' }, {}], object: {} } satisfies Data + const db = new Low(adapter, defaultData) + new Service(db) + if (Array.isArray(db.data['posts'])) { + const id = db.data['posts']?.at(1)?.['id'] + assert.ok(id instanceof String, 'id should be a string') + assert.ok(id.length > 0, 'id should not be empty') + } +}) + await test('findById', () => { reset() if (!Array.isArray(db.data?.[POSTS])) diff --git a/src/service.ts b/src/service.ts index f8161a7bb..2e0d597ce 100644 --- a/src/service.ts +++ b/src/service.ts @@ -105,10 +105,35 @@ function deleteDependents(db: Low, name: string, dependents: string[]) { }) } +function randomId(): string { + return randomBytes(2).toString('hex') +} + +function ensureItemsHaveIds(items: Item[]): Item[] { + return items.map((item) => { + if (item['id'] === undefined) { + return { ...item, id: randomId() } + } + return item + }) +} + +// Ensure all items have an id +function ensureAllItemsHaveIds(data: Data): Data { + return Object.entries(data).reduce( + (acc, [key, value]) => ({ + ...acc, + [key]: Array.isArray(value) ? ensureItemsHaveIds(value) : value, + }), + {}, + ) +} + export class Service { #db: Low constructor(db: Low) { + db.data = ensureAllItemsHaveIds(db.data) this.#db = db } @@ -317,7 +342,7 @@ export class Service { const items = this.#get(name) if (items === undefined || !Array.isArray(items)) return - const item = { id: randomBytes(2).toString('hex'), ...data } + const item = { id: randomId(), ...data } items.push(item) await this.#db.write()