Source: components/admin/modulos/telegram/grupos/2.telegram.grupos.controller.js

/**
 * @ngdoc controller
 * @name AdminTelegramGruposCtrl
 * @module s4c.controllers.AdminTelegramGruposCtrl
 *
 * @description
 * `AdminTelegramGruposCtrl` Controller da administração dos grupos do telegram
 * 
 * 
 */
(function () {
    'use strict';

    function AdminTelegramGruposCtrl($scope, TelegramService, $q, $mdDialog) {

        $scope.groupNewActive = false;
        $scope.groupViewActive = false;
        $scope.groupEditActive = false;
        $scope.usuarios = {};
        $scope.grupos = {};
        $scope.grupo = {};
        $scope.res = $scope.$root.res;

        /**
         * @method _selectedGroup
         * @param {*} grupo 
         */
        function _selectedGroup(grupo) {
            $scope.grupos = _.map($scope.grupos, function (grupo) {
                grupo.isActive = false;
                return grupo;
            });

            grupo.isActive = true;
        }

        /**
         * @method _userGroupState
         * @param {*} usuario 
         * @param {*} grupo 
         */
        function _userGroupState(usuario, grupo) {
            var _usuarioNoGrupo = _.find(grupo.Usuarios, {
                'id': usuario.id
            });

            if (_usuarioNoGrupo) {
                usuario.isSelected = true;
            } else {
                usuario.isSelected = false;
            }

            return usuario;
        }

        /**
         * @method getGroups
         */
        TelegramService.getGroups().then(function (grupos) {
            grupos = _.map(grupos, function (grupo) {
                return grupo = _.extend(grupo, {
                    _originalState: grupo
                });
            });

            $scope.grupos = _.filter(grupos, grupo => { return grupo.tipo !== 2 });
        });

        TelegramService.getUsers().then(function (usuarios) {
            $scope.usuarios = usuarios;
        });

        /**
         * @method deleteGroup
         * @param {*} id
         */
        $scope.deleteGroup = function deleteGroup(id) {

            var confirm = $mdDialog.confirm()
                .title('Tem certeza que deseja deletar?')
                .content('Esta ação é irreversível.')
                .ariaLabel('Deletar Grupo Telegram')
                .ok('Sim')
                .cancel('Não')
                .targetEvent(event);

            $mdDialog.show(confirm).then(function () {
                TelegramService.deleteGroup(id).then(function () {
                    $scope.groupNewActive = false;
                    $scope.groupViewActive = false;
                    $scope.groupEditActive = false;

                    $scope.grupos = $scope.grupos.filter(function (e) {
                        return e.id !== id;
                    });
                });
            });

        };

        /**
         * @method editGroup
         * @param {*} grupo
         */
        $scope.editGroup = function editGroup(grupo) {
            _selectedGroup(grupo);
            $scope.groupNewActive = false;
            $scope.groupViewActive = true;
            $scope.groupEditActive = true;

            $scope.grupo = grupo;
            $scope.usuarios = _.map($scope.usuarios, function (usuario) {
                return _userGroupState(usuario, grupo);
            });
        };

        /**
         * @method cancelEditGroup
         * 
         */
        $scope.cancelEditGroup = function cancelEditGroup() {
            $scope.groupNewActive = false;
            $scope.groupViewActive = true;
            $scope.groupEditActive = false;

            // Reset the original state
            var grupo = $scope.grupo._originalState;
            var originalState = _.clone(grupo._originalState);
            grupo._originalState = originalState;

            $scope.grupo = grupo;
            $scope.usuarios = _.map($scope.usuarios, function (usuario) {
                return _userGroupState(usuario, grupo);
            });
        };

        /**
         * @method viewGroup
         * @param {*} grupo
         */
        $scope.viewGroup = function viewGroup(grupo) {
            _selectedGroup(grupo);

            $scope.groupNewActive = false;
            $scope.groupViewActive = true;
            $scope.groupEditActive = false;

            $scope.grupo = grupo;
        };

        /**
         * @method newGroup
         */
        $scope.newGroup = function newGroup() {
            $scope.groupViewActive = false;
            $scope.groupEditActive = false;
            $scope.groupNewActive = true;

            $scope.grupo = {
                _originalState: []
            };
        };

        /**
         * @method cancelNewGroup
         */
        $scope.cancelNewGroup = function cancelNewGroup() {
            $scope.groupViewActive = false;
            $scope.groupEditActive = false;
            $scope.groupNewActive = false;

            $scope.grupo = {};
        };

        /**
         * @method saveNewGroup
         * @param {*} grupo
         */
        $scope.saveNewGroup = function saveNewGroup(grupo) {
            grupo.mensageria = 'telegram';

            TelegramService.saveGroup(grupo).then(function (data) {
                console.log(data);
                data._originalState = data;
                $scope.grupos.push(data);
                $scope.viewGroup(grupo);
            });
        };

        /**
         * @method saveGroup
         * @param {*} grupo
         */
        $scope.saveGroup = function saveGroup(grupo) {
            var selectedUsers = $scope.usuarios.filter(function (usuario) {
                return usuario.isSelected;
            });

            var unselectedUsers = $scope.usuarios.filter(function (usuario) {
                return !usuario.isSelected;
            });

            var addedUsers = _.filter(selectedUsers, function (selectedUser) {
                return !_.find(grupo._originalState.Usuarios, { 'id': selectedUser.id });
            });

            var deletedUsers = _.filter(unselectedUsers, function (selectedUser) {
                return _.find(grupo._originalState.Usuarios, { 'id': selectedUser.id });
            });

            // Track removed users
            // Track added users
            // Create a queue to save deleted and added users
            var processGroup = $q.all([
                TelegramService.deleteUsersFromGroup(grupo.id, deletedUsers),
                TelegramService.addUsersToGroup(grupo.id, addedUsers)
            ]);

            // Update the list of users
            processGroup.then(function (result) {
                var deletedUsersReq = result[0],
                    addedUsersReq = result[1];

                // Update currently active group original state
                TelegramService.getUsersFromGroup(grupo.id).then(function (users) {
                    grupo._originalState.Usuarios = users;
                });
            });
        };
    }


    angular.module('s4c.telegram')
        .controller('AdminTelegramGruposCtrl', AdminTelegramGruposCtrl);

    AdminTelegramGruposCtrl.$inject = ['$scope', 'TelegramService', '$q', '$mdDialog'];

}());