src/app/core/demo-data/demo-data.service.ts
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
Properties |
|
Methods |
|
constructor(entityMapper: EntityMapperService, injector: Injector, config: DemoDataServiceConfig, dbResolver: DatabaseResolverService)
|
|||||||||||||||
Parameters :
|
Async publishDemoData |
publishDemoData()
|
Trigger all registered DemoDataGenerator implementations to generate demo entities and add all the generated entities to the Database.
Returns :
any
|
Readonly dataGenerators |
Type : DemoDataGenerator<any>[]
|
Default value : []
|
All registered demo data generator services |
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));
}
}
}