import {Inject, Injectable} from "@extollo/di" import {Collection, Iterable} from "@extollo/util" import {FirebaseUnit, RTDBRef} from "./units/FirebaseUnit" import * as firebase from "firebase-admin" import {Application} from "@extollo/lib"; export interface FirebaseResourceItem { seqID: number } @Injectable() export class FirebaseResource extends Iterable { protected refName!: RTDBRef ref(): firebase.database.Reference { return Application.getApplication().make(FirebaseUnit).ref(this.refName) } async getNextID(): Promise { return new Promise((res, rej) => { this.ref().orderByChild('seqID') .on('value', snapshot => { res(this.resolveObject(snapshot.val()).reverse()?.[0]?.seqID || 1) }, rej) }) } async at(i: number): Promise { return new Promise((res, rej) => { this.ref().orderByChild('seqID') .startAt(i).endAt(i) .on('value', snapshot => res(this.resolveObject(snapshot.val())[0]), rej) }) } async range(start: number, end: number): Promise> { return new Promise>((res, rej) => { this.ref().orderByChild('seqID') .startAt(start).endAt(end) .on('value', snapshot => { res(new Collection(this.resolveObject(snapshot.val()))) }, rej) }) } async count(): Promise { return new Promise((res, rej) => { this.ref().orderByChild('seqID') .on('value', snapshot => { res(this.resolveObject(snapshot.val()).length) }, rej) }) } protected resolveObject(snapshot: any | null | undefined) { if ( !snapshot ) snapshot = {} const returns: T[] = [] for ( const key in snapshot ) { if ( !snapshot.hasOwnProperty(key) ) continue snapshot[key].firebaseID = key returns.push(snapshot[key]) } return returns } clone(): Iterable { const inst = new FirebaseResource() inst.refName = this.refName return inst } }