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);
相关推荐
Jonathan Star9 小时前
沉浸式雨天海岸:用A-Frame打造WebXR互动场景
前端·javascript
工业甲酰苯胺10 小时前
实现 json path 来评估函数式解析器的损耗
java·前端·json
老前端的功夫10 小时前
Web应用的永生之术:PWA落地与实践深度指南
java·开发语言·前端·javascript·css·node.js
LilySesy10 小时前
ABAP+WHERE字段长度不一致报错解决
java·前端·javascript·bug·sap·abap·alv
Wang's Blog11 小时前
前端FAQ: Vue 3 与 Vue 2 相⽐有哪些重要的改进?
前端·javascript·vue.js
再希11 小时前
React+Tailwind CSS+Shadcn UI
前端·react.js·ui
用户479492835691512 小时前
JavaScript 的 NaN !== NaN 之谜:从 CPU 指令到 IEEE 754 标准的完整解密
前端·javascript
群联云防护小杜12 小时前
国产化环境下 Web 应用如何满足等保 2.0?从 Nginx 配置到 AI 防护实战
运维·前端·nginx
醉方休12 小时前
Web3.js 全面解析
前端·javascript·electron
前端开发爱好者13 小时前
前端新玩具:Vike 发布!
前端·javascript