From 0f67611d7586f946d1922c1bb7d937f9c9bb4b2e Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Wed, 10 Apr 2019 03:29:05 -0400 Subject: [PATCH] chore(core): groups and departments updates --- package.json | 2 +- src/client/api/index.js | 10 ++++-- .../containers/Modals/CreateAccountModal.jsx | 22 +++++++++---- .../Modals/CreateDepartmentModal.jsx | 2 +- src/controllers/api/v2/departments.js | 9 ++---- src/controllers/api/v2/groups.js | 29 ++++++++++++++--- src/models/department.js | 32 ++++++++++++++++++- src/models/group.js | 26 +++++++++++++++ .../js/angularjs/controllers/singleTicket.js | 2 +- 9 files changed, 110 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 65828b004..9a10d6473 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "trudesk", - "version": "1.0.11-beta", + "version": "1.1.0-beta", "private": true, "engines": { "node": ">=9.10.0" diff --git a/src/client/api/index.js b/src/client/api/index.js index 149986828..d83d6571c 100644 --- a/src/client/api/index.js +++ b/src/client/api/index.js @@ -131,7 +131,7 @@ api.accounts.create = payload => { api.accounts.getWithPage = payload => { const limit = payload && payload.limit ? payload.limit : 25 const page = payload && payload.page ? payload.page : 0 - const type = payload && payload.type ? payload.type : 'customers' + const type = payload && payload.type ? payload.type : 'all' let search = payload && payload.search ? payload.search : '' if (search) search = `&search=${search}` @@ -156,8 +156,12 @@ api.accounts.enableAccount = ({ username }) => { } api.groups = {} -api.groups.get = () => { - return axios.get('/api/v2/groups').then(res => { +api.groups.get = payload => { + const limit = payload && payload.limit ? payload.limit : 25 + const page = payload && payload.page ? payload.page : 0 + const type = payload && payload.type ? `&type=${payload.type}` : '' + + return axios.get(`/api/v2/groups?limit=${limit}&page=${page}${type}`).then(res => { return res.data }) } diff --git a/src/client/containers/Modals/CreateAccountModal.jsx b/src/client/containers/Modals/CreateAccountModal.jsx index 16101b2ac..7f2681b8d 100644 --- a/src/client/containers/Modals/CreateAccountModal.jsx +++ b/src/client/containers/Modals/CreateAccountModal.jsx @@ -19,6 +19,7 @@ import { observer } from 'mobx-react' import { observable } from 'mobx' import { createAccount } from 'actions/accounts' +import { fetchGroups, unloadGroups } from 'actions/groups' import BaseModal from './BaseModal' import Button from 'components/Button' @@ -39,6 +40,8 @@ class CreateAccountModal extends React.Component { selectedRole = '' componentDidMount () { + this.props.fetchGroups() + helpers.UI.inputs() helpers.formvalidator() } @@ -103,9 +106,12 @@ class CreateAccountModal extends React.Component { const roles = this.props.common.roles.map(role => { return { text: role.name, value: role._id } }) - const groups = this.props.common.groups.map(group => { - return { text: group.name, value: group._id } - }) + const groups = this.props.groups + .map(group => { + return { text: group.get('name'), value: group.get('_id') } + }) + .toArray() + return (
@@ -241,14 +247,18 @@ class CreateAccountModal extends React.Component { CreateAccountModal.propTypes = { common: PropTypes.object.isRequired, - createAccount: PropTypes.func.isRequired + groups: PropTypes.object.isRequired, + createAccount: PropTypes.func.isRequired, + fetchGroups: PropTypes.func.isRequired, + unloadGroups: PropTypes.func.isRequired } const mapStateToProps = state => ({ - common: state.common + common: state.common, + groups: state.groupsState.groups }) export default connect( mapStateToProps, - { createAccount } + { createAccount, fetchGroups, unloadGroups } )(CreateAccountModal) diff --git a/src/client/containers/Modals/CreateDepartmentModal.jsx b/src/client/containers/Modals/CreateDepartmentModal.jsx index 78ff3f276..a5d4b5c78 100644 --- a/src/client/containers/Modals/CreateDepartmentModal.jsx +++ b/src/client/containers/Modals/CreateDepartmentModal.jsx @@ -36,7 +36,7 @@ class CreateDepartmentModal extends React.Component { componentDidMount () { this.props.fetchTeams() - this.props.fetchGroups() + this.props.fetchGroups({ type: 'all' }) helpers.UI.inputs() helpers.UI.reRenderInputs() diff --git a/src/controllers/api/v2/departments.js b/src/controllers/api/v2/departments.js index ec3737294..b253f2690 100644 --- a/src/controllers/api/v2/departments.js +++ b/src/controllers/api/v2/departments.js @@ -42,15 +42,10 @@ apiDepartments.create = function (req, res) { } apiDepartments.test = function (req, res) { - Department.getUserDepartments(req.user._id, function (err, departments) { + Department.getDepartmentGroupsOfUser(req.user._id, function (err, groups) { if (err) return apiUtils.sendApiError(res, 500, err.message) - var ticketSchema = require('../../../models/ticket') - ticketSchema.getTicketsByDepartments(departments, {}, function (err, tickets) { - if (err) return apiUtils.sendApiError(res, 500, err.message) - - return apiUtils.sendApiSuccess(res, { departments: departments, tickets: tickets }) - }) + return apiUtils.sendApiSuccess(res, { groups: groups, count: groups.length }) }) } diff --git a/src/controllers/api/v2/groups.js b/src/controllers/api/v2/groups.js index 7849ecf16..b40785696 100644 --- a/src/controllers/api/v2/groups.js +++ b/src/controllers/api/v2/groups.js @@ -14,15 +14,36 @@ var apiUtils = require('../apiUtils') var Group = require('../../../models/group') +var Department = require('../../../models/department') var apiGroups = {} apiGroups.get = function (req, res) { - Group.find({}, function (err, groups) { - if (err) return apiUtils.sendApiError(res, 500, err.message) + var limit = Number(req.query.limit) || 10 + var page = Number(req.query.page) || 0 + var type = req.query.type || 'user' - return apiUtils.sendApiSuccess(res, { groups: groups }) - }) + if (type === 'all') { + Group.getWithObject({ limit: limit, page: page }, function (err, groups) { + if (err) return apiUtils.sendApiError(res, 500, err.message) + + return apiUtils.sendApiSuccess(res, { groups: groups, count: groups.length }) + }) + } else { + if (req.user.role.isAdmin || req.user.role.isAgent) { + Department.getDepartmentGroupsOfUser(req.user._id, function (err, groups) { + if (err) return apiUtils.sendApiError(res, 500, err.message) + + return apiUtils.sendApiSuccess(res, { groups: groups, count: groups.length }) + }) + } else { + Group.getAllGroupsOfUser(req.user._id, function (err, groups) { + if (err) return apiUtils.sendApiError(res, 500, err.message) + + return apiUtils.sendApiSuccess(res, { groups: groups, count: groups.length }) + }) + } + } } module.exports = apiGroups diff --git a/src/models/department.js b/src/models/department.js index a1f4abd45..1cd2afb4d 100644 --- a/src/models/department.js +++ b/src/models/department.js @@ -13,11 +13,13 @@ **/ var _ = require('lodash') +var async = require('async') var mongoose = require('mongoose') // Refs require('./group') var Teams = require('./team') +var Groups = require('./group') var COLLECTION = 'departments' @@ -42,7 +44,7 @@ departmentSchema.statics.getUserDepartments = function (userId, callback) { var self = this Teams.getTeamsOfUser(userId, function (err, teams) { - if (err) return callback({ error: err }) + if (err) return callback(err) return self .model(COLLECTION) @@ -51,4 +53,32 @@ departmentSchema.statics.getUserDepartments = function (userId, callback) { }) } +departmentSchema.statics.getDepartmentGroupsOfUser = function (userId, callback) { + var self = this + + Teams.getTeamsOfUser(userId, function (err, teams) { + if (err) return callback(err) + + return self + .model(COLLECTION) + .find({ teams: { $in: teams } }) + .exec(function (err, departments) { + if (err) return callback(err) + + var hasAllGroups = _.some(departments, { allGroups: true }) + if (hasAllGroups) { + return Groups.getAllGroups(callback) + } + + var groups = _.flattenDeep( + departments.map(function (department) { + return department.groups + }) + ) + + return callback(null, groups) + }) + }) +} + module.exports = mongoose.model(COLLECTION, departmentSchema) diff --git a/src/models/group.js b/src/models/group.js index a357b5766..b44c0ac5f 100644 --- a/src/models/group.js +++ b/src/models/group.js @@ -112,6 +112,32 @@ groupSchema.statics.getGroupByName = function (name, callback) { return q.exec(callback) } +groupSchema.statics.getWithObject = function (obj, callback) { + var limit = obj.limit ? Number(obj.limit) : 100 + var page = obj.page ? Number(obj.page) : 0 + var userId = obj.userId + + if (userId) { + return this.model(COLLECTION) + .find({ members: userId }) + .limit(limit) + .skip(page * limit) + .populate('members', '_id username fullname email role preferences image title') + .populate('sendMailTo', '_id username fullname email role preferences image title') + .sort('name') + .exec(callback) + } + + return this.model(COLLECTION) + .find({}) + .limit(limit) + .skip(page * limit) + .populate('members', '_id username fullname email role preferences image title') + .populate('sendMailTo', '_id username fullname email role preferences image title') + .sort('name') + .exec(callback) +} + groupSchema.statics.getAllGroups = function (callback) { var q = this.model(COLLECTION) .find({}) diff --git a/src/public/js/angularjs/controllers/singleTicket.js b/src/public/js/angularjs/controllers/singleTicket.js index 859cc05be..dd5fed02b 100644 --- a/src/public/js/angularjs/controllers/singleTicket.js +++ b/src/public/js/angularjs/controllers/singleTicket.js @@ -434,7 +434,7 @@ define([ }) var groupHttpGet = $http - .get('/api/v1/groups') + .get('/api/v2/groups') .success(function (data) { _.each(data.groups, function (item) { $scope.groups.push(item)