src/app/core/demo-data/demo-data.service.ts
General config object to pass all initially register DemoDataGenerators
with DemoDataModule.forRoot()
.
see docs at DemoDataModule
Properties |
import {
ClassProvider,
FactoryProvider,
Injectable,
Injector,
ValueProvider,
} from "@angular/core";
import { DemoDataGenerator } from "./demo-data-generator";
import { EntityMapperService } from "../entity/entity-mapper/entity-mapper.service";
import { DatabaseResolverService } from "../database/database-resolver.service";
/**
* General config object to pass all initially register DemoDataGenerators
* with `DemoDataModule.forRoot()`.
*
* see docs at {@link DemoDataModule}
*/
export class DemoDataServiceConfig {
/**
* Providers for DemoDataGenerator service implementations to be registered for data generation.
*
* This may also include providers for services a DemoDataGenerator depends on.
*/
dataGeneratorProviders: (ValueProvider | ClassProvider | FactoryProvider)[] =
[];
}
/**
* The DemoDataService is the manager for all provided DemoDataGenerator implementations.
* It serves as the central service to trigger the demo data generation into the database.
*
* To add more demo data generators, refer the documentation
* [How to Generate Demo Data]{@link /additional-documentation/how-to-guides/generate-demo-data.html}
*/
@Injectable()
export class DemoDataService {
/** All registered demo data generator services */
readonly dataGenerators: DemoDataGenerator<any>[] = [];
constructor(
private entityMapper: EntityMapperService,
private injector: Injector,
private config: DemoDataServiceConfig,
private dbResolver: DatabaseResolverService,
) {}
private registerAllProvidedDemoDataGenerators() {
for (const provider of this.config.dataGeneratorProviders) {
const service = this.injector.get<any>(provider.provide);
if (service && service instanceof DemoDataGenerator) {
this.dataGenerators.push(service);
}
}
}
/**
* Trigger all registered DemoDataGenerator implementations to generate demo entities
* and add all the generated entities to the Database.
*/
async publishDemoData() {
if (!(await this.dbResolver.getDatabase().isEmpty())) {
return;
}
this.registerAllProvidedDemoDataGenerators();
// completely generate all data (i.e. call every generator) before starting to save the data
// to allow generators to delete unwanted entities of other generators before they are saved
// (e.g. the DropoutChildGenerator should be able to delete Attendance records of the Child after its dropout date)
this.dataGenerators.forEach((generator) => generator.entities);
// save the generated data
for (const generator of this.dataGenerators) {
await this.entityMapper.saveAll(generator.entities);
// Wait for other async tasks in the queue e.g. ConfigService setting up config after it has been saved
await new Promise((resolve) => setTimeout(resolve));
}
}
}