Files
cloud-mail/mail-worker/src/service/role-service.js
2026-02-07 20:02:01 +08:00

225 lines
6.2 KiB
JavaScript

import role from '../entity/role';
import orm from '../entity/orm';
import { eq, asc, inArray, and } from 'drizzle-orm';
import BizError from '../error/biz-error';
import rolePerm from '../entity/role-perm';
import perm from '../entity/perm';
import { permConst, roleConst } from '../const/entity-const';
import userService from './user-service';
import user from '../entity/user';
import verifyUtils from '../utils/verify-utils';
import { t } from '../i18n/i18n.js';
import emailUtils from '../utils/email-utils';
const roleService = {
async add(c, params, userId) {
let { name, permIds, banEmail, availDomain } = params;
if (!name) {
throw new BizError(t('emptyRoleName'));
}
let roleRow = await orm(c).select().from(role).where(eq(role.name, name)).get();
const notEmailIndex = banEmail.findIndex(item => (!verifyUtils.isEmail(item) && !verifyUtils.isDomain(item)) && item !== "*");
if (notEmailIndex > -1) {
throw new BizError(t('notEmail'));
}
banEmail = banEmail.join(',');
availDomain = availDomain.join(',');
roleRow = await orm(c).insert(role).values({...params, banEmail, availDomain, userId}).returning().get();
if (permIds.length === 0) {
return;
}
const rolePermList = permIds.map(permId => ({ permId, roleId: roleRow.roleId }));
await orm(c).insert(rolePerm).values(rolePermList).run();
},
async roleList(c) {
const roleList = await orm(c).select().from(role).orderBy(asc(role.sort)).all();
const permList = await orm(c).select({ permId: perm.permId, roleId: rolePerm.roleId }).from(rolePerm)
.leftJoin(perm, eq(perm.permId, rolePerm.permId))
.where(eq(perm.type, permConst.type.BUTTON)).all();
roleList.forEach(role => {
role.banEmail = role.banEmail.split(",").filter(item => item !== "");
role.availDomain = role.availDomain.split(",").filter(item => item !== "");
role.permIds = permList.filter(perm => perm.roleId === role.roleId).map(perm => perm.permId);
});
return roleList;
},
async setRole(c, params) {
let { name, permIds, roleId, banEmail, availDomain } = params;
if (!name) {
throw new BizError(t('emptyRoleName'));
}
delete params.isDefault
const notEmailIndex = banEmail.findIndex(item => (!verifyUtils.isEmail(item) && !verifyUtils.isDomain(item)) && item !== "*")
if (notEmailIndex > -1) {
throw new BizError(t('notEmail'));
}
banEmail = banEmail.join(',')
availDomain = availDomain.join(',')
await orm(c).update(role).set({...params, banEmail, availDomain}).where(eq(role.roleId, roleId)).run();
await orm(c).delete(rolePerm).where(eq(rolePerm.roleId, roleId)).run();
if (permIds.length > 0) {
const rolePermList = permIds.map(permId => ({ permId, roleId: roleId }));
await orm(c).insert(rolePerm).values(rolePermList).run();
}
},
async delete(c, params) {
const { roleId } = params;
const roleRow = await orm(c).select().from(role).where(eq(role.roleId, roleId)).get();
if (!roleRow) {
throw new BizError(t('notExist'));
}
if (roleRow.isDefault) {
throw new BizError(t('delDefRole'));
}
const defRoleRow = await orm(c).select().from(role).where(eq(role.isDefault, roleConst.isDefault.OPEN)).get();
await userService.updateAllUserType(c, defRoleRow.roleId, roleId);
await orm(c).delete(rolePerm).where(eq(rolePerm.roleId, roleId)).run();
await orm(c).delete(role).where(eq(role.roleId, roleId)).run();
},
roleSelectUse(c) {
return orm(c).select({ name: role.name, roleId: role.roleId, isDefault: role.isDefault }).from(role).orderBy(asc(role.sort)).all();
},
async selectDefaultRole(c) {
return await orm(c).select().from(role).where(eq(role.isDefault, roleConst.isDefault.OPEN)).get();
},
async setDefault(c, params) {
const roleRow = await orm(c).select().from(role).where(eq(role.roleId, params.roleId)).get();
if (!roleRow) {
throw new BizError(t('roleNotExist'));
}
await orm(c).update(role).set({ isDefault: 0 }).run();
await orm(c).update(role).set({ isDefault: 1 }).where(eq(role.roleId, params.roleId)).run();
},
selectById(c, roleId) {
return orm(c).select().from(role).where(eq(role.roleId, roleId)).get();
},
selectByIdsHasPermKey(c, types, permKey) {
return orm(c).select({ roleId: role.roleId, sendType: role.sendType, sendCount: role.sendCount }).from(perm)
.leftJoin(rolePerm, eq(perm.permId, rolePerm.permId))
.leftJoin(role, eq(role.roleId, rolePerm.roleId))
.where(and(eq(perm.permKey, permKey), inArray(role.roleId, types))).all();
},
selectByIdsAndSendType(c, permKey, sendType) {
return orm(c).select({ roleId: role.roleId }).from(perm)
.leftJoin(rolePerm, eq(perm.permId, rolePerm.permId))
.leftJoin(role, eq(role.roleId, rolePerm.roleId))
.where(and(eq(perm.permKey, permKey), eq(role.sendType, sendType))).all();
},
selectByUserId(c, userId) {
return orm(c).select(role).from(user).leftJoin(role, eq(role.roleId, user.type)).where(eq(user.userId, userId)).get();
},
hasAvailDomainPerm(availDomain, email) {
availDomain = availDomain.split(',').filter(item => item !== '');
if (availDomain.length === 0) {
return true
}
const availIndex = availDomain.findIndex(item => {
const domain = emailUtils.getDomain(email.toLowerCase());
const availDomainItem = item.toLowerCase();
console.log(domain,availDomainItem)
return domain === availDomainItem
})
return availIndex > -1
},
selectByName(c, roleName) {
return orm(c).select().from(role).where(eq(role.name, roleName)).get();
},
selectByUserIds(c, userIds) {
if (!userIds && userIds.length === 0) {
return [];
}
return orm(c).select({ ...role, userId: user.userId }).from(user).leftJoin(role, eq(role.roleId, user.type)).where(inArray(user.userId, userIds)).all();
},
isBanEmail(banEmail, fromEmail) {
banEmail = banEmail.split(',').filter(item => item !== '');
if (banEmail.includes('*')) {
return true;
}
for (const item of banEmail) {
if (verifyUtils.isDomain(item)) {
const banDomain = item.toLowerCase();
const receiveDomain = emailUtils.getDomain(fromEmail.toLowerCase());
if (banDomain === receiveDomain) {
return true;
}
} else {
if (item.toLowerCase() === fromEmail.toLowerCase()) {
return true;
}
}
}
return false;
}
};
export default roleService;