Files
dsc-api/src/modules/tickets/strategies/group.strategy.ts
T
2025-04-19 09:46:10 +03:30

40 lines
1.6 KiB
TypeScript
Executable File

import { Injectable, InternalServerErrorException, Logger } from "@nestjs/common";
import { UserGroup } from "../../users/entities/user-group.entity";
import { User } from "../../users/entities/user.entity";
import { UsersService } from "../../users/providers/users.service";
import { IReferralStrategy } from "../interfaces/referral-strategy";
@Injectable()
export class GroupStrategy implements IReferralStrategy {
private readonly logger = new Logger(GroupStrategy.name);
constructor(private readonly usersService: UsersService) {}
async assignAdmin(group: UserGroup): Promise<User> {
try {
const { users: admins } = await this.usersService.getUsersByGroup(group.id);
if (!admins.length) {
this.logger.warn(`No admins found in Group: ${group.name}, falling back to super admin`);
//fall back
const superAdmin = await this.usersService.getSuperAdmin();
if (!superAdmin) throw new InternalServerErrorException("No super admin found as fallback");
return superAdmin;
}
// return the one with the fewest tickets
return admins.reduce((prev, curr) => ((prev.tickets?.length || 0) < (curr.tickets?.length || 0) ? prev : curr));
//
} catch (error: unknown) {
this.logger.error(`Error assigning admin for group ${group.name}: ${error instanceof Error ? error.message : "Unknown error"}`);
// If any error occurs, try to get a super admin as last resort
const superAdmin = await this.usersService.getSuperAdmin();
if (!superAdmin) throw new InternalServerErrorException("No super admin found as fallback");
return superAdmin;
}
}
}