92 lines
3.2 KiB
TypeScript
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;
|
|
}
|
|
}
|