90 lines
2.3 KiB
JavaScript
90 lines
2.3 KiB
JavaScript
|
|
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
|
||
|
|
};
|
||
|
|
|