district-politics/projects/speech-statistics/src/app/auth/shared/faction-in-body.service.ts

92 lines
3.2 KiB
TypeScript

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<SnapshotAction<Body>[]>;
public readonly factions: Observable<SnapshotAction<Faction>[]>;
public readonly factionsInBodies: Observable<SnapshotAction<FactionInBody>[]>;
constructor(private database: AngularFireDatabase) {
const factionsInBodiesRef = this.database.list<FactionInBody>('factionsInBodies');
const factionsRef = this.database.list<Faction>('factions');
const bodiesRef = this.database.list<Body>('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<FactionInBody>('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<FactionInBody>('factionsInBodies');
if (key != null) {
factionsInBodiesRef.remove(key);
}
}
public deleteFactionsInBody(bodyKey: string): void {
const factionsInBodiesRef = this.database.list<FactionInBody>('factionsInBodies');
const affectedEntries = factionsInBodiesRef.query.orderByChild('bodyKey').equalTo(bodyKey);
affectedEntries.once('value', snapshot => {
const promises: Promise<any>[] = [];
snapshot.forEach((child) => {
promises.push(child.ref.remove());
});
Promise.all(promises);
});
}
public deleteFactions(factionKey: string): void {
const factionsInBodiesRef = this.database.list<FactionInBody>('factionsInBodies');
const affectedEntries = factionsInBodiesRef.query.orderByChild('factionKey').equalTo(factionKey);
affectedEntries.once('value', snapshot => {
const promises: Promise<any>[] = [];
snapshot.forEach((child) => {
promises.push(child.ref.remove());
});
Promise.all(promises);
});
}
private static sortDescending(factionA: SnapshotAction<FactionInBody>, factionB: SnapshotAction<FactionInBody>): 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;
}
}