import {Injectable} from '@angular/core'; import {AngularFireDatabase, SnapshotAction} from '@angular/fire/compat/database'; import {FactionInBody} from '../../shared/faction-in-body'; import {Faction} from '../administration/factions/faction'; import {Body} from '../administration/bodies/body'; import {map} from 'rxjs/operators'; import {Observable} from 'rxjs'; @Injectable({ providedIn: 'root' }) export class FactionInBodyService { public readonly bodies: Observable[]>; public readonly factions: Observable[]>; public readonly factionsInBodies: Observable[]>; constructor(private database: AngularFireDatabase) { const factionsInBodiesRef = this.database.list('factionsInBodies'); const factionsRef = this.database.list('factions'); const bodiesRef = this.database.list('bodies'); this.factionsInBodies = factionsInBodiesRef.snapshotChanges().pipe( map(results => { return results.sort(FactionInBodyService.sortDescending); }) ); this.factions = factionsRef.snapshotChanges(); this.bodies = bodiesRef.snapshotChanges(); } public addFactionInBody(bodyJSON: string, factionJSON: string, size: string): void { const factionsInBodiesRef = this.database.list('factionsInBodies'); const body: { key: string, name: string } = JSON.parse(bodyJSON); const faction: { key: string, name: string } = JSON.parse(factionJSON); factionsInBodiesRef.push({ body: body.name, bodyKey: body.key, faction: faction.name, factionKey: faction.key, size: +size }); } public deleteFactionInBody(key: string | null): void { const factionsInBodiesRef = this.database.list('factionsInBodies'); if (key != null) { factionsInBodiesRef.remove(key); } } public deleteFactionsInBody(bodyKey: string): void { const factionsInBodiesRef = this.database.list('factionsInBodies'); const affectedEntries = factionsInBodiesRef.query.orderByChild('bodyKey').equalTo(bodyKey); affectedEntries.once('value', snapshot => { const promises: Promise[] = []; snapshot.forEach((child) => { promises.push(child.ref.remove()); }); Promise.all(promises); }); } public deleteFactions(factionKey: string): void { const factionsInBodiesRef = this.database.list('factionsInBodies'); const affectedEntries = factionsInBodiesRef.query.orderByChild('factionKey').equalTo(factionKey); affectedEntries.once('value', snapshot => { const promises: Promise[] = []; snapshot.forEach((child) => { promises.push(child.ref.remove()); }); Promise.all(promises); }); } private static sortDescending(factionA: SnapshotAction, factionB: SnapshotAction): number { const factionAValue = factionA.payload.val(); const factionBValue = factionB.payload.val(); if (factionAValue == null || factionBValue == null) { return 0; } if (factionAValue.size < factionBValue.size) { return 1; } if (factionAValue.size > factionBValue.size) { return -1; } return 0; } }