Files
cloud-mail/mail-worker/src/service/role-service.js
2025-05-29 17:38:50 +08:00

133 lines
3.8 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';
const roleService = {
async add(c, params, userId) {
let { name, permIds } = params;
if (!name) {
throw new BizError('身份名不能为空');
}
let roleRow = await orm(c).select().from(role).where(eq(role.name, name)).get();
if (roleRow) {
throw new BizError('身份名已存在');
}
roleRow = await orm(c).insert(role).values({...params, 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.permIds = permList.filter(perm => perm.roleId === role.roleId).map(perm => perm.permId);
});
return roleList;
},
async setRole(c, params) {
let { name, permIds, roleId } = params;
if (!name) {
throw new BizError('名字不能为空');
}
delete params.isDefault
await orm(c).update(role).set({...params}).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('身份不存在');
}
if (roleRow.isDefault) {
throw new BizError('默认身份不能删除');
}
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 }).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('身份不存在');
}
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();
}
};
export default roleService;