File

apps/recallassess/recallassess-api/src/api/admin/package/config/package-config.service.ts

Extends

ModuleConfigBase

Index

Properties
Methods

Methods

getConfiguration
getConfiguration()
Returns : ModuleConfig
Private Async validatePackageDeletion
validatePackageDeletion(packageId: number)

Validates that a package can be deleted Throws an error if the package has been purchased (has subscriptions)

Parameters :
Name Type Optional
packageId number No
Returns : Promise<void>

Properties

Private prisma
Type : BNestPrismaService
Decorators :
@Inject()
import { ColumnConfig, ColumnType } from "@bish-nest/core/app-config/column-config.class";
import { ModuleConfig } from "@bish-nest/core/app-config/module-config.class";
import { ModuleConfigBase } from "@bish-nest/core/app-config/module-config-base.class";
import { BNestPrismaService } from "@bish-nest/core/services/database/prisma/prisma.service";
import { BadRequestException, Inject, Injectable } from "@nestjs/common";
import { PackageType } from "@prisma/client";
import { PackageAddDto } from "../dto/package-add.dto";
import { PackageDetailDto } from "../dto/package-detail.dto";
import { PackageListDto } from "../dto/package-list.dto";
import { PackageSaveDto } from "../dto/package-save.dto";

@Injectable()
export class PackageConfig extends ModuleConfigBase {
  @Inject() private prisma!: BNestPrismaService;

  getConfiguration(): ModuleConfig {
    const columns: ColumnConfig[] = [
      new ColumnConfig({ name: "id", type: ColumnType.Integer }),
      new ColumnConfig({
        name: "package_type",
        isEnumType: true,
        enumValues: Object.values(PackageType),
      }),
      new ColumnConfig({ name: "name" }),
      new ColumnConfig({ name: "description" }),
      new ColumnConfig({ name: "license_count_start", type: ColumnType.Integer }),
      new ColumnConfig({ name: "license_count_end", type: ColumnType.Integer }),
      new ColumnConfig({ name: "minimum_license_required", type: ColumnType.Integer }),
      new ColumnConfig({ name: "price_per_licence", type: ColumnType.Float }),
      new ColumnConfig({ name: "is_active", type: ColumnType.Boolean }),
      new ColumnConfig({ name: "is_trial_package", type: ColumnType.Boolean }),
      new ColumnConfig({ name: "trial_duration_days", type: ColumnType.Integer }),
      new ColumnConfig({ name: "free_credits", type: ColumnType.Integer }),
      new ColumnConfig({ name: "sort_order", type: ColumnType.Integer }),
      new ColumnConfig({ name: "special_slug" }),
      new ColumnConfig({ name: "features" }),
      new ColumnConfig({ name: "created_at", type: ColumnType.DateTime }),
      new ColumnConfig({ name: "updated_at", type: ColumnType.DateTime }),
    ];

    return new ModuleConfig({
      name: "package",
      columns,
      // Include `id` so keyword search works with the table's ID column.
      // Include `created_at` so keyword search works with the table's "Created At" column.
      keywordSearchCols: ["id", "created_at", "name", "package_type", "license_count_start", "license_count_end"],
      relationObjToIncludeForDetail: {
        userCreatedBy: true,
        userUpdatedBy: true,
      },
      listDto: PackageListDto,
      detailDto: PackageDetailDto,
      addDto: PackageAddDto,
      saveDto: PackageSaveDto,
      deleteValidation: this.validatePackageDeletion.bind(this),
    });
  }

  /**
   * Validates that a package can be deleted
   * Throws an error if the package has been purchased (has subscriptions)
   */
  private async validatePackageDeletion(packageId: number): Promise<void> {
    // Check if there are any subscriptions using this package
    const subscriptionCount = await this.prisma.client.subscription.count({
      where: {
        package_id: packageId,
      },
    });

    if (subscriptionCount > 0) {
      throw new BadRequestException(
        `Cannot delete package. This package has been purchased by ${subscriptionCount} customer(s). Please deactivate the package instead of deleting it.`,
      );
    }
  }
}

results matching ""

    No results matching ""