tema 675f7d5cfd Remove cached profile fields migration and update CSRF middleware for new public auth endpoints
- 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.
2025-11-21 17:12:34 +09:00

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 });
}
}
}