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);
相关推荐
UpUpUp……8 分钟前
HTML简单语法标签(后续实操:云备份项目)
笔记·html
apcipot_rain8 分钟前
【应用密码学】实验五 公钥密码2——ECC
前端·数据库·python
油丶酸萝卜别吃9 分钟前
OpenLayers 精确经过三个点的曲线绘制
javascript
ShallowLin14 分钟前
vue3学习——组合式 API:生命周期钩子
前端·javascript·vue.js
Nejosi_念旧35 分钟前
Vue API 、element-plus自动导入插件
前端·javascript·vue.js
互联网搬砖老肖36 分钟前
Web 架构之攻击应急方案
前端·架构
pixle01 小时前
Vue3 Echarts 3D饼图(3D环形图)实现讲解附带源码
前端·3d·echarts
麻芝汤圆2 小时前
MapReduce 入门实战:WordCount 程序
大数据·前端·javascript·ajax·spark·mapreduce
juruiyuan1113 小时前
FFmpeg3.4 libavcodec协议框架增加新的decode协议
前端
Peter 谭4 小时前
React Hooks 实现原理深度解析:从基础到源码级理解
前端·javascript·react.js·前端框架·ecmascript