File

src/app/core/demo-data/demo-data.service.ts

Description

General config object to pass all initially register DemoDataGenerators with DemoDataModule.forRoot().

see docs at DemoDataModule

Index

Properties

Properties

dataGeneratorProviders
Type : (ValueProvider | ClassProvider | FactoryProvider)[]
Default value : []

Providers for DemoDataGenerator service implementations to be registered for data generation.

This may also include providers for services a DemoDataGenerator depends on.

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));
    }
  }
}

results matching ""

    No results matching ""