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);
相关推荐
椒盐螺丝钉6 分钟前
TypeScript类型兼容性
运维·前端·typescript
_JinHao9 分钟前
Cesium Viewer对象详解——Cesium基础笔记(快速入门)
前端·javascript·笔记·3d·webgl
正义的大古13 分钟前
OpenLayers地图交互 -- 章节十三:拖拽旋转交互详解
javascript·vue.js·openlayers
r0ad41 分钟前
从痛点到解决方案:为什么我开发了Chrome元素截图插件
前端·chrome
OEC小胖胖1 小时前
连接世界:网络请求 `wx.request`
前端·微信小程序·小程序·微信开放平台
jingling5551 小时前
解决微信小程序真机调试中访问本地接口 localhost:8080 报错
前端·微信小程序·小程序
en-route1 小时前
使用 Flask 构建 Web 应用:静态页面与动态 API 访问
前端·python·flask
IT_陈寒1 小时前
Vite 5年迭代揭秘:3个核心优化让你的项目构建速度提升200%
前端·人工智能·后端
怎么吃不饱捏1 小时前
vue3+vite,引入阿里巴巴svg图标,自定义大小颜色
前端·javascript·vue.js
无敌最俊朗@1 小时前
MQTT 关键特性详解
java·前端·物联网