Extending Adding Overriding Functionality - Agrejus/pouchdb-entity-fabric GitHub Wiki

Perhaps one of the most powerful features of a DbSet is the ability to extend/add/override existing functionality. For example, if we want to take further action when a document is added to a DbSet via the add method, we can override it.

import { DataContext } from 'pouchdb-entity-fabric';

export enum DocumentTypes {
    MyFirstDocument = "MyFirstDocument"
}

interface IMyFirstEntity extends IDbRecord<DocumentTypes> {
    propertyOne: string;
    propertyTwo: string;
}

export class PouchDbDataContext extends DataContext<DocumentTypes> {
    myFirstDbSet = this.dbset().default<IMyFirstEntity>(DocumentTypes.MyFirstDocument)
        .extend((Instance, props) => {
            return new class extends Instance {
                constructor() {
                    super(props)
                }

                add(...entities: OmittedEntity<IMyFirstEntity>[]) {
                    // Extra Functionality
                    return super.add(...entities);
                }
            }
        })
        .create();
}

New functionality can also be added

import { DataContext } from 'pouchdb-entity-fabric';

export enum DocumentTypes {
    MyFirstDocument = "MyFirstDocument"
}

interface IMyFirstEntity extends IDbRecord<DocumentTypes> {
    propertyOne: string;
    propertyTwo: string;
}

export class PouchDbDataContext extends DataContext<DocumentTypes> {
    myFirstDbSet = this.dbset().default<IMyFirstEntity>(DocumentTypes.MyFirstDocument)
        .extend((Instance, props) => {
            return new class extends Instance {
                constructor() {
                    super(props)
                }

                someNewFunction() {
                    // do something
                }
            }
        })
        .create();
}

const context = new PouchDbDataContext();
context.myFirstDbSet.someNewFunction()