'use strict'; const { CrudService } = require('naf-framework-mongoose-free/lib/service'); const { BusinessError, ErrorCode } = require('naf-core').Error; const _ = require('lodash'); const assert = require('assert'); const { ObjectId } = require('mongoose').Types; // 学员 class StudentService extends CrudService { constructor(ctx) { super(ctx, 'student'); this.model = this.ctx.model.User.Student; this.rssService = this.ctx.service.relation.relationStudentSchool; } /** * 邀请方式创建学员信息时, 无法区分,创建的学员信息是否已经存在.所以只能创建. * 但是在绑定时,可以先查询 user_id 是否已经挂在了 某学员身上,如果已经挂在某学员身上 * 则 * 1.将该 学员信息 与 学校的关系 删除; * 2.将该 学员信息 删除; */ async afterCreate(body, data) { if (!_.get(body, 'school_id')) return data; const { _id: student_id } = data; const obj = { school_id: _.get(body, 'school_id'), student_id }; await this.rssService.create(obj); return data; } /** * 修改前的执行函数,检查该用户是否已经有绑定的学员信息. * 且传来要修改的内容是否有user_id且这两个不相等 * @param {Object} filter 查询条件 * @param {Object} update 修改内容 */ async beforeUpdate(filter, update) { const user_id = _.get(update, 'user_id'); // 要修改的数据没有user_id,不更改绑定信息,不需要处理 if (!user_id) return { filter, update }; const { id } = filter; const data = await this.model.findOne({ _id: { $ne: ObjectId(id) }, user_id }); if (!data) return { filter, update }; // 不允许操作,因为目前设计的是:一个学员信息对应一个学生.而不是一个学校. // 所以学员信息只允许1个用户有1个数据 // 且还需要 更新关系 并 删除掉这条数据,因为这条数据属于重复的数据,之前已经存在了绑定的学员数据 await this.model.updateOne({ student_id: id }, { student_id: data._id }); await this.model.deleteOne({ _id: ObjectId(id) }); throw new BusinessError(ErrorCode.DATA_EXISTED, '该用户已存在学员数据,不可以重复绑定'); } } module.exports = StudentService;