import { Service, ServiceOptions } from './Service'; import { FilterQuery } from './FilterQuery'; import { FindOptions } from './FindOptions'; import { DataSerializer } from '../data/DataSerializer'; import { Constructor, SerializableChangelog, SerializableMember, SerializableObject } from '../data/decorators'; /** * DataService driver for storing and querying data objects * of a specific data type using a certain implementation. */ @SerializableObject() export abstract class DataServiceDriver extends Service { @SerializableMember({ serializer: (dataType) => (dataType ? dataType.name : undefined), deserializer: (dataTypeString) => (dataTypeString ? DataSerializer.findTypeByName(dataTypeString) : undefined), }) dataType: Constructor; @SerializableMember() protected options: DataServiceOptions; constructor(dataType: Constructor, options: DataServiceOptions = {}) { super(); this.options = options; this.options.serialize = this.options.serialize || ((obj) => DataSerializer.serialize(obj)); this.options.deserialize = this.options.deserialize || ((obj) => DataSerializer.deserialize(obj)); this.options.keepChangelog = this.options.keepChangelog === undefined ? true : this.options.keepChangelog; if (dataType) { this.uid = dataType.name; this.dataType = dataType; } } abstract findByUID(id: I): Promise; abstract findOne(query?: FilterQuery, options?: FindOptions): Promise; abstract findAll(query?: FilterQuery, options?: FindOptions): Promise<(T | (T & SerializableChangelog))[]>; abstract count(query?: FilterQuery): Promise; abstract insert(id: I, object: T | (T & SerializableChangelog)): Promise; abstract delete(id: I): Promise; abstract deleteAll(query?: FilterQuery): Promise; } export interface DataServiceOptions extends ServiceOptions { serialize?: (obj: T) => any; deserialize?: (obj: any) => T; /** * Keep a changelog of objects returned by the data service */ keepChangelog?: boolean; }