nakama/backend/services/moderationAdmin.js

91 lines
2.3 KiB
JavaScript
Raw Normal View History

2025-11-10 20:13:22 +00:00
const ModerationAdmin = require('../models/ModerationAdmin');
const User = require('../models/User');
const config = require('../config');
const normalizeUsername = (username = '') => username.replace(/^@/, '').trim().toLowerCase();
const ownerUsernames = new Set(config.moderationOwnerUsernames || []);
const listAdmins = async () => {
const admins = await ModerationAdmin.find().sort({ username: 1 }).lean();
return admins.map((admin) => ({
telegramId: admin.telegramId,
username: admin.username,
firstName: admin.firstName,
lastName: admin.lastName,
addedBy: admin.addedBy,
createdAt: admin.createdAt
}));
};
const isModerationAdmin = async ({ telegramId, username }) => {
const normalized = normalizeUsername(username);
if (ownerUsernames.has(normalized)) {
return true;
}
if (telegramId) {
const byId = await ModerationAdmin.findOne({ telegramId }).lean();
if (byId) {
return true;
}
}
if (normalized) {
const byUsername = await ModerationAdmin.findOne({ username: normalized }).lean();
if (byUsername) {
return true;
}
}
return false;
};
const addAdmin = async ({ username, addedBy }) => {
const normalized = normalizeUsername(username);
if (!normalized) {
throw new Error('Укажите username в формате @username');
}
const user = await User.findOne({ username: normalized }).lean();
if (!user) {
throw new Error(`Пользователь ${normalized} не найден в Nakama`);
}
const existing = await ModerationAdmin.findOne({ username: normalized });
if (existing) {
return existing;
}
const admin = new ModerationAdmin({
telegramId: user.telegramId,
username: normalized,
firstName: user.firstName,
lastName: user.lastName,
addedBy: normalizeUsername(addedBy)
});
await admin.save();
return admin;
};
const removeAdmin = async (username) => {
const normalized = normalizeUsername(username);
if (!normalized) {
throw new Error('Укажите username в формате @username');
}
if (ownerUsernames.has(normalized)) {
throw new Error('Нельзя удалить владельца');
}
await ModerationAdmin.deleteOne({ username: normalized });
};
module.exports = {
listAdmins,
isModerationAdmin,
addAdmin,
removeAdmin,
normalizeUsername
};
2025-11-20 20:50:14 +00:00