Source: directives/mensageria/mensageria.service.js

(function () {
    'use strict';

    /**
     * @ngdoc directives
     * @name MensageriaService
     * @module s4c.directives.mensageria.MensageriaService
     *
     * @description
     * `MensageriaService` é o serviço de comunicação com o Backend do S4C de
     * uso da Mensageira interna do sistema.
     */
    function MensageriaService($http, $q, API_ENDPOINT, Base) {

        var state = {
            isOpen: false
        };
        var appElement = document.querySelector('[ng-app=s4CApp]');
        var appScope = angular.element(appElement).scope();
        var mainController = appScope.$$childHead;

        var service = {
            getPerfis: getPerfis,
            getPerfisByDepartamento: getPerfisByDepartamento,
            findContatos: findContatos,
            findUsuarios: findUsuarios,
            findUsuarioById: findUsuarioById,
            getHistorico: getHistorico,
            enviarMensagem: enviarMensagem,
            enviarMensagemGrupo: enviarMensagemGrupo,
            enviarMensagemGrupoUsuario: enviarMensagemGrupoUsuario,
            findUltimasConversas: findUltimasConversas,
            findGrupos: findGrupos,
            getHistoricoGrupo: getHistoricoGrupo,
            getHistoricoGrupoUsuario: getHistoricoGrupoUsuario,
            findGruposUsuarios: findGruposUsuarios,
            findParticipantes: findParticipantes,
            atualizarGrupoUsuarios: atualizarGrupoUsuarios,
            adicionarGruposUsuarios: adicionarGruposUsuarios,
            adicionarParticipanteGrupo: adicionarParticipanteGrupo,
            deleteParticipanteGrupo: deleteParticipanteGrupo,
            deleteGrupo: deleteGrupo,
            deletarMensagem: deletarMensagem,
            state: state,
            findById: findById,
            abrirChat: abrirChat,
            pegarUsuariosOnline: pegarUsuariosOnline,
            obterMensagensDoUsuario: obterMensagensDoUsuario,
            obterMensagensDoGrupoUsarios: obterMensagensDoGrupoUsarios,
            findGrupoParticipantes: findGrupoParticipantes,
            atualizarMensagensLidas: atualizarMensagensLidas,
            atualizarMensagensLidasGrupo: atualizarMensagensLidasGrupo,
            findGrupo: findGrupo,
            getAttachedFile: getAttachedFile,
            loadNewMessagesCount: loadNewMessagesCount
        };

        /**
         * @method loadNewMessagesCount
         */
        function loadNewMessagesCount() {
            var deferred = $q.defer();

            $http
                .get(API_ENDPOINT + 'mensagem/novas')
                .then(function (res) {
                    deferred.resolve(res.data);
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method getAttachedFile
         * @param {*} id 
         */
        function getAttachedFile(id) {
            var deferred = $q.defer();

            $http
                .get(API_ENDPOINT + 'filemanager/' + id, { responseType: 'arraybuffer' })
                .then(function (res) {
                    deferred.resolve(res.data);
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method pegarUsuariosOnline
         */
        function pegarUsuariosOnline() {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'usuarios/online')
                .then(function (res) {
                    deferred.resolve(res.data);
                });
            return deferred.promise;
        }

        /**
         * @method enviarMensagem
         * @param {*} id 
         * @param {*} mensagem 
         */
        function enviarMensagem(id, mensagem) {

            var deferred = $q.defer();
            $http.put(API_ENDPOINT + 'mensagem/' + id, {
                mensagem: mensagem
            })
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }


        /**
         * @method enviarMensagemGrupo
         * @param {*} id 
         * @param {*} mensagem 
         */
        function enviarMensagemGrupo(id, mensagem) {
            var deferred = $q.defer();
            $http.put(API_ENDPOINT + 'mensagem/grupousuario/' + id, {
                mensagem: mensagem
            })
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method enviarMensagemGrupoUsuario
         * @param {*} id 
         * @param {*} mensagem 
         */
        function enviarMensagemGrupoUsuario(id, mensagem) {
            var deferred = $q.defer();
            $http.put(API_ENDPOINT + 'mensagem/grupousuario/' + id, {
                mensagem: mensagem
            })
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * 
         * @method getHistorico
         *
         * @param {integer} id do usuário do histórico solicitado.
         *
         * @returns {Promise} Promise que resolve com o histórico de conversas
         * entre o usuário do token enviado junto ao request e o usuário
         * solicitado
         */
        function getHistorico(id) {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'mensagem/' + id + '/30')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method getHistoricoGrupo
         * @param {*} id 
         */
        function getHistoricoGrupo(id) {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'mensagem/grupo_usuario/' + id)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method getHistoricoGrupoUsuario
         * @param {*} id 
         */
        function getHistoricoGrupoUsuario(id) {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'mensagem/grupousuario/' + id + '/30')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }


        /**
         * 
         * 
         * @method findContatos
         *
         * @returns {Promise} Promise que resolve com uma lista de usuários do
         * sistema.
         */
        var self = this;
        self.contatos = undefined;
        self.canLoadContatos = true;
        function findContatos(reUsePromisse) {

            if ((self.contatos || !self.canLoadContatos) && reUsePromisse) {
                return self.deferred.promise;
            }

            self.deferred = $q.defer();
            self.canLoadContatos = false;

            $http.get(API_ENDPOINT + 'mensagem/contatos')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        self.canLoadContatos = true;
                        self.contatos = res.data;
                        self.deferred.resolve(res.data);
                    } else {
                        self.deferred.reject(res);
                    }
                }, function (err) {
                    self.deferred.reject(err);
                });

            return self.deferred.promise;
        }


        /**
         * 
         * 
         * @method findUsuarios
         *
         * @returns {Promise} Promise que resolve com uma lista de usuários/conversas do
         * sistema.
         */
        self.p = $q.defer();
        self.usuarios = undefined;
        self.canLoadUsuarios = true;
        function findUsuarios(reUsePromisse) {

            if ((self.usuarios || !self.canLoadUsuarios) || reUsePromisse) {
                return self.p.promise;
            }

            self.canLoadUsuarios = false;

            $http.get(API_ENDPOINT + 'mensagem/usuarios')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        self.canLoadUsuarios = true;
                        self.usuarios = res.data;
                        self.p.resolve(res.data);
                    } else {
                        p.reject(res);
                    }
                }, function (err) {
                    self.p.reject(err);
                });

            return self.p.promise;
        }


        /**
         * @method findById
         * @param {*} id 
         */
        function findById(id) {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'mensagem/findById/' + id)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * 
         * 
         * @method findUsuariosByName
         *
         * @returns {Promise} Promise que resolve com uma lista de usuários do
         * sistema.
         */
        function findUsuarioById(id) {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'usuarios/' + id)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method getPerfis
         */
        function getPerfis() {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'perfis')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method getPerfisByDepartamento
         * @param {*} id 
         */
        function getPerfisByDepartamento(id) {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'perfis/departamento/' + id)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * 
         * 
         * @method findUltimasConversas
         *
         * @returns {Promise} Promise que resolve com uma lista de conversas do
         * usuário do token da solicitação com a última mensagem de cada uma.
         */
        function findUltimasConversas() {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'mensagem/usuarios/ultimaConversa')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method findGrupos
         */
        function findGrupos() {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'grupo_usuario_mensageria')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method findGrupo
         * @param {*} id 
         */
        function findGrupo(id) {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'grupo_usuario_mensageria/' + id)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method findGrupoParticipantes
         * @param {*} id 
         */
        function findGrupoParticipantes(id) {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'grupo_usuario_mensageria/' + id + '/participantes')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        function findGruposUsuarios() {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'grupo_usuario_mensageria')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method adicionarGruposUsuarios
         * @param {*} grupoUsuario 
         */
        function adicionarGruposUsuarios(grupoUsuario) {
            var deferred = $q.defer();
            $http.post(API_ENDPOINT + 'grupo_usuario_mensageria', grupoUsuario)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method findUltimasConversas
         */
        function findUltimasConversas() {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'mensagem/usuarios/ultimaConversa')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method atualizarMensagensLidas
         * @param {*} idUsuario 
         * @param {*} idDestinario 
         */
        function atualizarMensagensLidas(idUsuario, idDestinario) {
            var deferred = $q.defer();
            if (idDestinario != null) {
                $http.put(API_ENDPOINT + 'mensagem/usuarios/atualizarMensagensLidas/' + idUsuario + '/' + idDestinario)
                    .then(function (res) {
                        if (typeof res.data === 'object') {
                            deferred.resolve(res.data);
                        } else {
                            deferred.reject(res);
                        }
                    }, function (err) {
                        deferred.reject(err);
                    });
            } else {
                $http.put(API_ENDPOINT + 'mensagem/usuarios/atualizarMensagensLidas/' + idUsuario)
                    .then(function (res) {
                        if (typeof res.data === 'object') {
                            deferred.resolve(res.data);
                        } else {
                            deferred.reject(res);
                        }
                    }, function (err) {
                        deferred.reject(err);
                    });
            }
            return deferred.promise;
        }

        /**
         * @method atualizarMensagensLidasGrupo
         * @param {*} idUsuario 
         * @param {*} idGrupo 
         */
        function atualizarMensagensLidasGrupo(idUsuario, idGrupo) {
            var deferred = $q.defer();
            $http.put(API_ENDPOINT + 'mensagem/usuarios/atualizarMensagensLidasGrupo/' + idUsuario + '/' + idGrupo)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });
            return deferred.promise;
        }

        /**
         * @method atualizarGrupoUsuarios
         * @param {*} grupoUsuario 
         */
        function atualizarGrupoUsuarios(grupoUsuario) {
            var deferred = $q.defer();
            $http.put(API_ENDPOINT + 'grupo_usuario_mensageria', grupoUsuario)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method findParticipantes
         * @param {*} idGrupo 
         */
        function findParticipantes(idGrupo) {
            var deferred = $q.defer();
            $http.get(API_ENDPOINT + 'grupo_usuario_mensageria/' + idGrupo + '/participantes')
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method adicionarParticipanteGrupo
         * @param {*} id 
         * @param {*} participante 
         */
        function adicionarParticipanteGrupo(id, participante) {
            var deferred = $q.defer();
            $http.post(API_ENDPOINT + 'grupo_usuario_mensageria/' + id, {
                participante: participante
            })
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method deleteParticipanteGrupo
         * @param {*} id 
         * @param {*} participante 
         * @param {*} nomeParticipante 
         */
        function deleteParticipanteGrupo(id, participante, nomeParticipante) {
            var deferred = $q.defer();
            $http.delete(API_ENDPOINT + 'grupo_usuario_mensageria/' + id + '/' + participante + '/' + nomeParticipante)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method deleteGrupo
         * @param {*} id 
         */
        function deleteGrupo(id) {
            var deferred = $q.defer();
            $http.delete(API_ENDPOINT + 'grupo_usuario_mensageria/' + id)
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method deletarMensagem
         * @param {*} id 
         * @param {*} mensagem 
         */
        function deletarMensagem(id, mensagem) {

            var deferred = $q.defer();
            $http.delete(API_ENDPOINT + 'mensagem/' + id, {
                mensagem: mensagem
            })
                .then(function (res) {
                    if (typeof res.data === 'object') {
                        deferred.resolve(res.data);
                    } else {
                        deferred.reject(res);
                    }
                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

        /**
         * @method abrirChat
         * @param {*} usuario 
         */
        function abrirChat(usuario) {
            mainController.MensageriaManager.abrir();
            mainController.$directives.mensageria.abrirChat(usuario, false);
        }

        /**
         * @method obterMensagensDoUsuario
         * @param {*} id 
         * @param {*} page 
         */
        function obterMensagensDoUsuario(id, page) {
            return Base.obter('mensagem/usuario/' + id + '?page=' + page);
        }

        /**
         * @method obterMensagensDoGrupoUsarios
         * @param {*} id 
         */
        function obterMensagensDoGrupoUsarios(id) {
            return Base.obter('mensagem/grupo_usuario/' + id);
        }

        return service;

    }


    MensageriaService.$inject = ['$http', '$q', 'API_ENDPOINT', 'Base'];

    angular.module('s4c.components.collaboration')
        .service('MensageriaService', MensageriaService);

})();