- Add i18n module with tForUser/tForLang/t functions and {{param}} interpolation
- Add 3 locale files: en.json, es.json, de.json (201 keys each)
- Add language selection on /start and /language command with flag emojis
- Localize all bot user-facing strings (handlers, keyboards, errors)
- Localize messageRouter keyboard matching via locale keys
- Add DB migrations 008 (language column) and 009 (language_set column)
- Add localization admin tab at /locales for editing translations
- Add userService.getUserLanguage/setUserLanguage methods
- Cache user object on msg.__user to avoid triple DB fetch
- Idempotent migrations with checkColumnExists guards
- Error boundary on i18n locale file loading
- Admin locales route uses AVAILABLE_LANGUAGES import
64 lines
2.4 KiB
JavaScript
64 lines
2.4 KiB
JavaScript
import config from '../../config/config.js';
|
|
import db from '../../config/database.js';
|
|
import bot from "../../context/bot.js";
|
|
import UserService from "../../services/userService.js";
|
|
import userStates from "../../context/userStates.js";
|
|
import logger from '../../utils/logger.js';
|
|
import { editOrSendCallback } from '../../utils/messageUtils.js';
|
|
import { tForUser } from '../../i18n/index.js';
|
|
|
|
export default class UserDeletionHandler {
|
|
static async handleDeleteAccount(callbackQuery) {
|
|
const chatId = callbackQuery.message.chat.id;
|
|
const telegramId = callbackQuery.from.id;
|
|
const user = await UserService.getUserByTelegramId(telegramId);
|
|
const lang = user?.language || 'en';
|
|
const t = tForUser(lang);
|
|
|
|
try {
|
|
const text = `${t('deletion.confirm_title')}\n\n${t('deletion.confirm_body')}`;
|
|
|
|
const keyboard = {
|
|
inline_keyboard: [
|
|
[
|
|
{text: t('deletion.confirm_button'), callback_data: `confirm_delete_account`},
|
|
{text: t('deletion.cancel_button'), callback_data: `back_to_profile`}
|
|
]
|
|
]
|
|
};
|
|
|
|
await bot.editMessageText(
|
|
text,
|
|
{
|
|
chat_id: chatId,
|
|
message_id: callbackQuery.message.message_id,
|
|
reply_markup: keyboard,
|
|
parse_mode: 'HTML'
|
|
}
|
|
);
|
|
} catch (error) {
|
|
logger.error({ err: error }, 'Error in handleDeleteUser');
|
|
await editOrSendCallback(callbackQuery, t('deletion.error_processing'));
|
|
}
|
|
}
|
|
|
|
static async handleConfirmDelete(callbackQuery) {
|
|
const telegramId = callbackQuery.from.id;
|
|
const chatId = callbackQuery.message.chat.id;
|
|
const user = await UserService.getUserByTelegramId(telegramId);
|
|
const lang = user?.language || 'en';
|
|
const t = tForUser(lang);
|
|
|
|
try {
|
|
await UserService.updateUserStatus(telegramId, 1);
|
|
|
|
await bot.editMessageText(
|
|
t('deletion.deleted'),
|
|
{ chat_id: chatId, message_id: callbackQuery.message.message_id, }
|
|
);
|
|
} catch (error) {
|
|
logger.error({ err: error }, 'Error in handleConfirmDelete');
|
|
await editOrSendCallback(callbackQuery, t('deletion.error_deleting'));
|
|
}
|
|
}
|
|
} |