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))) 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))) 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(); } }; export default roleService;