apps/recallassess/recallassess-api/src/api/admin/package/config/package-config.service.ts
ModuleConfigBase
Properties |
|
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 :
Returns :
Promise<void>
|
| 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.`,
);
}
}
}