File

src/app/features/attendance/attendance-init.service.ts

Description

Registers a default attendance-status ConfigurableEnum if none exists in the database. Waits until the first sync completes to avoid overwriting an existing enum that hasn't been synced yet.

Index

Methods

Methods

registerDefaultAttendanceStatusEnum
registerDefaultAttendanceStatusEnum()
Returns : void
import { inject, Injectable } from "@angular/core";
import { filter, first } from "rxjs";
import { SyncStateSubject } from "#src/app/core/session/session-type";
import { SyncState } from "#src/app/core/session/session-states/sync-state.enum";
import { EntityMapperService } from "#src/app/core/entity/entity-mapper/entity-mapper.service";
import { ConfigurableEnum } from "#src/app/core/basic-datatypes/configurable-enum/configurable-enum";
import { ATTENDANCE_STATUS_CONFIG_ID } from "./model/attendance-status";
import { defaultAttendanceStatusTypes } from "#src/app/core/config/default-config/default-attendance-status-types";
import { Logging } from "#src/app/core/logging/logging.service";

/**
 * Registers a default attendance-status ConfigurableEnum if none exists in the database.
 * Waits until the first sync completes to avoid overwriting an existing enum that hasn't been synced yet.
 */
@Injectable()
export class AttendanceInitService {
  private readonly syncState = inject(SyncStateSubject);
  private readonly entityMapper = inject(EntityMapperService);

  registerDefaultAttendanceStatusEnum() {
    this.syncState
      .pipe(
        filter((state) => state === SyncState.COMPLETED),
        first(),
      )
      .subscribe(() => this.createDefaultEnumIfMissing());
  }

  private async createDefaultEnumIfMissing() {
    let existing: ConfigurableEnum | undefined;
    try {
      existing = await this.entityMapper.load(
        ConfigurableEnum,
        ATTENDANCE_STATUS_CONFIG_ID,
      );
      if (existing.values.length > 0) {
        return;
      }
    } catch (e: unknown) {
      const error = e as { status?: number; name?: string } | null;
      const isNotFound =
        !!error && (error.status === 404 || error.name === "not_found");
      if (!isNotFound) {
        Logging.debug("Failed to load attendance-status enum", e);
        return;
      }
    }

    if (existing) {
      existing.values = defaultAttendanceStatusTypes;
    } else {
      existing = new ConfigurableEnum(
        ATTENDANCE_STATUS_CONFIG_ID,
        // clone values to avoid mutating default object:
        defaultAttendanceStatusTypes.map((value) => ({
          ...value,
        })),
      );
    }
    try {
      await this.entityMapper.save(existing);
      Logging.debug("Default attendance-status enum created/updated");
    } catch (e) {
      Logging.debug("Could not save default attendance-status enum", e);
    }
  }
}

results matching ""

    No results matching ""