fastGPT—nextjs—mongoose—团队管理之部门相关api接口实现

创建部门或者子部门

javascript 复制代码
import type { NextApiRequest, NextApiResponse } from 'next';
import { NextAPI } from '@/service/middleware/entry';
import { MongoOrgModel } from '@fastgpt/service/support/permission/org/orgSchema';

async function handler(req: NextApiRequest, res: NextApiResponse) {
  try {
    const { name, avatar, description, parentId } = req.body;

    const orgTeam = await MongoOrgModel.findOne({ _id: parentId });
    if (!orgTeam) {
      return res.status(400).json({ error: 'Parent organization not found' });
    }

    const newOrgTeam = {
      name,
      avatar,
      description,
      path: `${orgTeam.path}/${orgTeam.pathId}`,
      teamId: orgTeam.teamId
    };

    // 创建子部门
    const createdOrg = await MongoOrgModel.create(newOrgTeam);
    res.status(200).json(createdOrg);
  } catch (error: any) {
    return res.status(500).json({ message: '服务器内部错误' });
  }
}

export default NextAPI(handler);

查询部门

javascript 复制代码
import type { NextApiRequest, NextApiResponse } from 'next';
import { NextAPI } from '@/service/middleware/entry';
import { MongoOrgModel } from '@fastgpt/service/support/permission/org/orgSchema';
import { authCert } from '@fastgpt/service/support/permission/auth/common';
import { Types } from 'mongoose';

async function handler(req: NextApiRequest, res: NextApiResponse) {
  const userInfo = await authCert({ req, authToken: true });
  const orgList = await MongoOrgModel.find({
    teamId: new Types.ObjectId(userInfo.teamId)
  })
    .populate('members')
    .lean();
  return orgList;
}

export default NextAPI(handler);

部门及子部门及所有相关成员删除

javascript 复制代码
import type { NextApiRequest, NextApiResponse } from 'next';
import { NextAPI } from '@/service/middleware/entry';
import { MongoOrgModel } from '@fastgpt/service/support/permission/org/orgSchema';
import { MongoOrgMemberModel } from '@fastgpt/service/support/permission/org/orgMemberSchema';

async function handler(req: NextApiRequest, res: NextApiResponse) {
  try {
    const { orgId } = req.query;
    const org = await MongoOrgModel.findById(orgId);
    if (!org) {
      return res.status(404).json({ message: '部门不存在' });
    }
    // console.log('当前部门详情:', org);
    // 所有子部门
    const escapedPath = org.path.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
    const pathRegex = new RegExp(`^${escapedPath}/`);
    const orgMatchList = await MongoOrgModel.find({
      path: {
        $regex: pathRegex
      }
    });
    // console.log('子部门匹配详情:', orgMatchList);

    const delOrgIds = [...orgMatchList.map((i) => i._id.toString()), orgId];
    // console.log('需要删除的所有部门id:', delOrgIds);

    const session = await MongoOrgModel.startSession();
    session.startTransaction();
    try {
      // 删除部门及子部门所有成员
      await MongoOrgMemberModel.deleteMany({
        orgId: {
          $in: delOrgIds
        }
      }).session(session);
      // console.log('部门及子部门删除所有成员结果:', del);
      // 删除部门及子部门
      await MongoOrgModel.deleteMany({
        _id: {
          $in: delOrgIds
        }
      }).session(session);
      await session.commitTransaction();
      // console.log('部门删除结果', orgdel);
    } catch (error) {
      await session.abortTransaction();
      throw error;
    } finally {
      session.endSession();
    }
    return res.status(200).json({ success: true });
  } catch (error: any) {
    // console.error('删除失败:', error);
    return res.status(500).json({ message: '服务器内部错误' });
  }
}

export default NextAPI(handler);

管理成员,包括删除和添加

javascript 复制代码
import type { NextApiRequest, NextApiResponse } from 'next';
import { NextAPI } from '@/service/middleware/entry';
import { MongoOrgModel } from '@fastgpt/service/support/permission/org/orgSchema';

import { MongoOrgMemberModel } from '@fastgpt/service/support/permission/org/orgMemberSchema';

async function handler(req: NextApiRequest, res: NextApiResponse) {
  try {
    const { orgId, members } = req.body;
    // console.log('{ orgId, members }::::', { orgId, members })
    const org = await MongoOrgModel.findById(orgId);
    const orgMembers = await MongoOrgMemberModel.find({ orgId: org?._id }).lean();
    let tmbIds = Object.values(orgMembers.map((m) => m.tmbId.toString()));
    let memberTmbIds = members.map((m: any) => m.tmbId);
    // 分类:新增、删除
    const toDelete = tmbIds.filter((item) => !new Set(memberTmbIds).has(item));
    const toAdd = memberTmbIds.filter((item: any) => !new Set(tmbIds).has(item));
    await MongoOrgMemberModel.deleteMany({
      tmbId: { $in: toDelete }
    });
    const addArr = toAdd.map((a: any) => {
      return {
        teamId: org?.teamId,
        orgId,
        tmbId: a
      };
    });
    await MongoOrgMemberModel.insertMany(addArr);
  } catch (error: any) {
    return res.status(500).json({ message: '服务器内部错误' });
  }
}

export default NextAPI(handler);

移动部门

javascript 复制代码
import type { NextApiRequest, NextApiResponse } from 'next';
import { NextAPI } from '@/service/middleware/entry';
import { MongoOrgModel } from '@fastgpt/service/support/permission/org/orgSchema';

async function handler(req: NextApiRequest, res: NextApiResponse) {
  const { targetOrgId, orgId } = req.body;
  try {
    const targetOrg = await MongoOrgModel.findById(targetOrgId);
    if (!targetOrg) {
      return res.status(404).json({ message: '部门不存在' });
    }
    const path = targetOrg.path + '/' + targetOrg.pathId;

    await MongoOrgModel.findByIdAndUpdate(orgId, { path });
    // console.log(targetOrg, org)
    return res.status(200).json({ success: true });
  } catch (err: any) {
    return res.status(400).json({ message: err.message });
  }
}

export default NextAPI(handler);
相关推荐
AALoveTouch7 分钟前
大麦APP抢票揭秘
javascript
rannn_1118 分钟前
【Javaweb学习|黑马笔记|Day1】初识,入门网页,HTML-CSS|常见的标签和样式|标题排版和样式、正文排版和样式
css·后端·学习·html·javaweb
持久的棒棒君31 分钟前
启动electron桌面项目控制台输出中文时乱码解决
前端·javascript·electron
小离a_a1 小时前
使用原生css实现word目录样式,标题后面的...动态长度并始终在标题后方(生成点线)
前端·css
郭优秀的笔记2 小时前
抽奖程序web程序
前端·css·css3
布兰妮甜2 小时前
CSS Houdini 与 React 19 调度器:打造极致流畅的网页体验
前端·css·react.js·houdini
小小愿望2 小时前
ECharts 实战技巧:揭秘 X 轴末项标签 “莫名加粗” 之谜及破解之道
前端·echarts
小小愿望3 小时前
移动端浏览器中设置 100vh 却出现滚动条?
前端·javascript·css
fail_to_code3 小时前
请不要再只会回答宏任务和微任务了
前端
摸着石头过河的石头3 小时前
taro3.x-4.x路由拦截如何破?
前端·taro