- Deleted migration file that removed cached profile fields from the users table, centralizing profile data retrieval from WHMCS. - Updated CsrfMiddleware to include new public authentication endpoints for password reset, setting password, and WHMCS account linking. - Enhanced error handling in password and WHMCS linking workflows to provide clearer feedback on missing mappings and improve user experience. - Adjusted user creation and update methods in UsersFacade to handle cases where WHMCS mappings are not yet available, ensuring smoother account setup.
125 lines
3.8 KiB
TypeScript
125 lines
3.8 KiB
TypeScript
import { Injectable, Inject } from "@nestjs/common";
|
|
import { PrismaService } from "@bff/infra/database/prisma.service";
|
|
import { Logger } from "nestjs-pino";
|
|
|
|
export interface VoiceOptionsSettings {
|
|
voiceMailEnabled: boolean;
|
|
callWaitingEnabled: boolean;
|
|
internationalRoamingEnabled: boolean;
|
|
networkType: string;
|
|
}
|
|
|
|
@Injectable()
|
|
export class SimVoiceOptionsService {
|
|
constructor(
|
|
private readonly prisma: PrismaService,
|
|
@Inject(Logger) private readonly logger: Logger
|
|
) {}
|
|
|
|
/**
|
|
* Get voice options for a SIM account
|
|
* Returns null if no settings found
|
|
*/
|
|
async getVoiceOptions(account: string): Promise<VoiceOptionsSettings | null> {
|
|
try {
|
|
const options = await this.prisma.simVoiceOptions.findUnique({
|
|
where: { account },
|
|
});
|
|
|
|
if (!options) {
|
|
this.logger.debug(`No voice options found in database for account ${account}`);
|
|
return null;
|
|
}
|
|
|
|
return {
|
|
voiceMailEnabled: options.voiceMailEnabled,
|
|
callWaitingEnabled: options.callWaitingEnabled,
|
|
internationalRoamingEnabled: options.internationalRoamingEnabled,
|
|
networkType: options.networkType,
|
|
};
|
|
} catch (error) {
|
|
this.logger.error(`Failed to get voice options for account ${account}`, { error });
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Save or update voice options for a SIM account
|
|
*/
|
|
async saveVoiceOptions(account: string, settings: Partial<VoiceOptionsSettings>): Promise<void> {
|
|
try {
|
|
await this.prisma.simVoiceOptions.upsert({
|
|
where: { account },
|
|
create: {
|
|
account,
|
|
voiceMailEnabled: settings.voiceMailEnabled ?? false,
|
|
callWaitingEnabled: settings.callWaitingEnabled ?? false,
|
|
internationalRoamingEnabled: settings.internationalRoamingEnabled ?? false,
|
|
networkType: settings.networkType ?? "4G",
|
|
},
|
|
update: {
|
|
...(settings.voiceMailEnabled !== undefined && {
|
|
voiceMailEnabled: settings.voiceMailEnabled,
|
|
}),
|
|
...(settings.callWaitingEnabled !== undefined && {
|
|
callWaitingEnabled: settings.callWaitingEnabled,
|
|
}),
|
|
...(settings.internationalRoamingEnabled !== undefined && {
|
|
internationalRoamingEnabled: settings.internationalRoamingEnabled,
|
|
}),
|
|
...(settings.networkType !== undefined && {
|
|
networkType: settings.networkType,
|
|
}),
|
|
},
|
|
});
|
|
|
|
this.logger.log(`Saved voice options for account ${account}`, { settings });
|
|
} catch (error) {
|
|
this.logger.error(`Failed to save voice options for account ${account}`, {
|
|
error,
|
|
settings,
|
|
});
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Initialize voice options for a new SIM account
|
|
*/
|
|
async initializeVoiceOptions(
|
|
account: string,
|
|
settings: {
|
|
voiceMailEnabled?: boolean;
|
|
callWaitingEnabled?: boolean;
|
|
internationalRoamingEnabled?: boolean;
|
|
networkType?: string;
|
|
} = {}
|
|
): Promise<void> {
|
|
await this.saveVoiceOptions(account, {
|
|
voiceMailEnabled: settings.voiceMailEnabled ?? true,
|
|
callWaitingEnabled: settings.callWaitingEnabled ?? true,
|
|
internationalRoamingEnabled: settings.internationalRoamingEnabled ?? true,
|
|
networkType: settings.networkType ?? "5G",
|
|
});
|
|
|
|
this.logger.log(`Initialized voice options for new SIM account ${account}`);
|
|
}
|
|
|
|
/**
|
|
* Delete voice options for a SIM account (e.g., when SIM is cancelled)
|
|
*/
|
|
async deleteVoiceOptions(account: string): Promise<void> {
|
|
try {
|
|
await this.prisma.simVoiceOptions.delete({
|
|
where: { account },
|
|
});
|
|
|
|
this.logger.log(`Deleted voice options for account ${account}`);
|
|
} catch (error) {
|
|
// Silently ignore if record doesn't exist
|
|
this.logger.debug(`Could not delete voice options for account ${account}`, { error });
|
|
}
|
|
}
|
|
}
|
|
|