0

I wonder what is the best solution to mutualize code between these 2 methods in javascript:

async getAllActiveRooms(ctx: ?ContextType): Promise<RoomType[]> {
    //log getAllActiveRooms
    return this.i.knex('users_rooms')
        .transacting(ctx ? ctx.transaction : null)
        .leftJoin('rooms', 'users_rooms.roomId', 'rooms.id')
        .select('rooms.*')
        .where('active', true);
}
async getActiveRoomsBySessionId(ctx: ?ContextType, sessionId: number): Promise<RoomType[]> {
    //log getAllActiveRooms
    return this.i.knex('users_rooms')
        .transacting(ctx ? ctx.transaction : null)
        .leftJoin('rooms', 'users_rooms.roomId', 'rooms.id')
        .select('rooms.*')
        .where('active', true)
        .andWhere('sessionId',sessionId)
}

Thank you

fstn
  • 149
  • 4
  • 10

1 Answers1

1

You can reuse getAllActiveRooms by changing its return type to knex's QueryBuilder which extends Bluebird's promise interface. You will lose the RoomType[] promise payload type though since it extends Bluebird<any>

From knex's latest type definition (QueryBuilder extends ChainableInterface):

interface QueryBuilder extends QueryInterface, ChainableInterface {
        or: QueryBuilder;
        and: QueryBuilder;

        //TODO: Promise?
        columnInfo(column?: string): Bluebird<ColumnInfo>;

        forUpdate(): QueryBuilder;
        forShare(): QueryBuilder;

        toSQL(): Sql;

        on(event: string, callback: Function): QueryBuilder;
}

interface ChainableInterface extends Bluebird<any> {
        toQuery(): string;
        options(options: any): QueryBuilder;
        stream(callback: (readable: stream.PassThrough) => any): Bluebird<any>;
        stream(options?: { [key: string]: any }): stream.PassThrough;
        stream(options: { [key: string]: any }, callback: (readable: stream.PassThrough) => any): Bluebird<any>;
        pipe(writable: any): stream.PassThrough;
        exec(callback: Function): QueryBuilder;
}

async getAllActiveRooms(ctx: ?ContextType): QueryBuilder {
    //log getAllActiveRooms
    return this.i.knex('users_rooms')
        .transacting(ctx ? ctx.transaction : null)
        .leftJoin('rooms', 'users_rooms.roomId', 'rooms.id')
        .select('rooms.*')
        .where('active', true);
}
async getActiveRoomsBySessionId(ctx: ?ContextType, sessionId: number): Promise<RoomType[]> {
    //log getAllActiveRooms
    return this.getAllActiveRooms(ctx)
        .andWhere('sessionId',sessionId)
}
Naoric
  • 355
  • 2
  • 10