目录

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);
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
Dragon Wu5 分钟前
前端 React 弹窗式 滑动验证码实现
前端·javascript·react.js·typescript·前端框架·reactjs
翠莲6 分钟前
vue中使用swiper坑记录
前端·javascript·vue.js
竣子好逑10 分钟前
uniapp 自定义tabbar
前端·uni-app
前端九哥15 分钟前
🎯Vue 3 少量全局数据共享的最佳实践(无需 Vuex/Pinia)
前端·vue.js
Struggler28116 分钟前
前端如何选取分包策略
前端
Monly2116 分钟前
Uniapp:获取当前定位坐标
前端·javascript·uni-app
程序媛刘刘19 分钟前
uniappx项目上架各手机平台
前端·智能手机·app·uniappx·上架
CrawlerCracker20 分钟前
小程序逆向|六六找房|请求头Authorization
javascript·爬虫·python·小程序·网络爬虫·js
一天两升水42 分钟前
一文搞懂 JavaScript 隐式类型转换
前端·javascript·面试
AnonymousIG44 分钟前
如何用nest生成一份swagger文档
前端