"use strict";
import {GenericService} from "./GenericService";
export {};
import {XMPPService} from "../connection/XMPPService";
import {RESTService} from "../connection/RESTService";
import {ErrorManager} from "../common/ErrorManager";
import {isDefined, isStarted, logEntryExit} from "../common/Utils";
import {Logger} from "../common/Logger";
import {Contact} from "../common/models/Contact";
import {EventEmitter} from "events";
import {S2SService} from "./S2SService";
import {Core} from "../Core";
const LOG_ID = "GROUPS/SVCE - ";
const API_ID = "API_CALL - ";
@logEntryExit(LOG_ID)
@isStarted([])
/**
* @module
* @name GroupsService
* @version SDKVERSION
* @public
* @description
* This service manages groups which allow to create his own lists of contacts.
*
* The main methods proposed in that module allow to:
* - Get all groups of the user
* - Create a new group
* - Delete an existing group
* - Add a contact in a group
* - Remove a contact from a group
*/
class GroupsService extends GenericService{
private _groups: any;
static getClassName(){ return 'GroupsService'; }
getClassName(){ return GroupsService.getClassName(); }
static getAccessorName(){ return 'groups'; }
getAccessorName(){ return GroupsService.getAccessorName(); }
constructor(_core:Core, _eventEmitter : EventEmitter, _logger : Logger, _startConfig: {
start_up:boolean,
optional:boolean
}) {
super(_logger, LOG_ID, _eventEmitter);
this.setLogLevels(this);
this._startConfig = _startConfig;
this._xmpp = null;
this._rest = null;
this._s2s = null;
this._options = {};
this._useXMPP = false;
this._useS2S = false;
this._groups = null;
this._eventEmitter = _eventEmitter;
this._logger = _logger;
this._core = _core;
this._eventEmitter.on("evt_internal_hdle_groupcreated", this._onGroupCreated.bind(this));
this._eventEmitter.on("evt_internal_hdle_groupdeleted", this._onGroupDeleted.bind(this));
this._eventEmitter.on("evt_internal_hdle_groupupdated", this._onGroupUpdated.bind(this));
this._eventEmitter.on("evt_internal_hdle_useraddedingroup", this._onUserAddedInGroup.bind(this));
this._eventEmitter.on("evt_internal_hdle_userremovedfromgroup", this._onUserRemovedFromGroup.bind(this));
}
start(_options) { // , _xmpp : XMPPService, _s2s : S2SService, _rest : RESTService
let that = this;
that.initStartDate();
return new Promise(function(resolve, reject) {
try {
that._xmpp = that._core._xmpp;
that._rest = that._core._rest;
that._options = _options;
that._s2s = that._core._s2s;
that._useXMPP = that._options.useXMPP;
that._useS2S = that._options.useS2S;
that._groups = [];
/*
that._eventEmitter.removeListener("evt_internal_groupcreated", that._onGroupCreated);
that._eventEmitter.removeListener("evt_internal_groupdeleted", that._onGroupDeleted);
that._eventEmitter.removeListener("evt_internal_groupupdated", that._onGroupUpdated);
that._eventEmitter.removeListener("evt_internal_useraddedingroup", that._onUserAddedInGroup);
that._eventEmitter.removeListener("evt_internal_userremovedfromgroup", that._onUserRemovedFromGroup);
that._eventEmitter.on("evt_internal_groupcreated", that._onGroupCreated.bind(that));
that._eventEmitter.on("evt_internal_groupdeleted", that._onGroupDeleted.bind(that));
that._eventEmitter.on("evt_internal_groupupdated", that._onGroupUpdated.bind(that));
that._eventEmitter.on("evt_internal_useraddedingroup", that._onUserAddedInGroup.bind(that));
that._eventEmitter.on("evt_internal_userremovedfromgroup", that._onUserRemovedFromGroup.bind(that));
*/
that.setStarted ();
resolve(undefined);
} catch (err) {
return reject();
}
});
}
stop() {
let that = this;
return new Promise(function(resolve, reject) {
try {
that._xmpp = null;
that._rest = null;
that._groups = null;
/*
that._eventEmitter.removeListener("evt_internal_groupcreated", that._onGroupCreated);
that._eventEmitter.removeListener("evt_internal_groupdeleted", that._onGroupDeleted);
that._eventEmitter.removeListener("evt_internal_groupupdated", that._onGroupUpdated);
that._eventEmitter.removeListener("evt_internal_useraddedingroup", that._onUserAddedInGroup);
that._eventEmitter.removeListener("evt_internal_userremovedfromgroup", that._onUserRemovedFromGroup);
*/
that.setStopped ();
resolve(undefined);
} catch (err) {
return reject(err);
}
});
}
async init (useRestAtStartup : boolean) {
let that = this;
if (useRestAtStartup) {
await that.getGroups().then((result) => {
that.setInitialized();
}).catch(() => {
that.setInitialized();
});
} else {
that.setInitialized();
}
}
//region Groups MANAGEMENT
/**
* @public
* @nodered true
* @method createGroup
* @instance
* @param {string} name The name of the group to create
* @param {string} comment The comment of the group to create
* @param {boolean} isFavorite If true, the group is flagged as favorite
* @description
* Create a new group
* @async
* @category Groups MANAGEMENT
* @return {Promise} The result
* @fulfil {Group} - Created group object or an error object depending on the result
* @category async
*/
async createGroup(name : string, comment : string, isFavorite : boolean) {
let that = this;
that._logger.log(that.INFOAPI, LOG_ID + API_ID + "(createGroup) is name defined : ", isDefined(name));
return new Promise(function(resolve, reject) {
if (typeof isFavorite === "undefined") {
isFavorite = false;
}
if (!name) {
that._logger.log(that.WARN, LOG_ID + "(createGroup) bad or empty 'name' parameter");
that._logger.log(that.INTERNALERROR, LOG_ID + "(createGroup) bad or empty 'name' parameter : ", name);
return reject(ErrorManager.getErrorManager().BAD_REQUEST);
}
that._rest.createGroup(name, comment, isFavorite).then(group => {
that._logger.log(that.DEBUG, LOG_ID + "(createGroup) creation successfull");
that._groups.push(group);
resolve(group);
}, err => {
that._logger.log(that.ERROR, LOG_ID + "(createGroup) error");
return reject(err);
});
});
}
/**
* @public
* @nodered true
* @method deleteGroup
* @instance
* @param {Object} group The group to delete
* @description
* Delete an owned group
* @async
* @category Groups MANAGEMENT
* @return {Promise} The result
* @fulfil {Group} - Deleted group object or an error object depending on the result
* @category async
*/
async deleteGroup(group:any) {
let that = this;
that._logger.log(that.INFOAPI, LOG_ID + API_ID + "(deleteGroup) is name defined : ", isDefined(group));
return new Promise(function(resolve, reject) {
if (!group) {
that._logger.log(that.WARN, LOG_ID + "(deleteGroup) bad or empty 'group' parameter.");
that._logger.log(that.INTERNALERROR, LOG_ID + "(deleteGroup) bad or empty 'group' parameter : ", group);
return reject(ErrorManager.getErrorManager().BAD_REQUEST);
}
that._rest.deleteGroup(group.id).then(function() {
let foundIndex = that._groups.findIndex(el => {
return el.id === group.id;
});
if (foundIndex > -1) {
let groupDeleted = that._groups.splice(foundIndex, 1);
that._logger.log(that.INFO, LOG_ID + "(deleteGroup) delete " + groupDeleted.length + " group successfully");
resolve(groupDeleted[0]);
} else {
resolve(null);
}
}).catch(function(err) {
that._logger.log(that.ERROR, LOG_ID + "(deleteGroup) error");
return reject(err);
});
});
}
/**
* @public
* @nodered true
* @method deleteAllGroups
* @instance
* @async
* @category Groups MANAGEMENT
* @description
* Delete all existing owned groups
* Return a promise
* @return {Object} Nothing or an error object depending on the result
*/
async deleteAllGroups() {
let that = this;
that._logger.log(that.INFOAPI, LOG_ID + API_ID + "(deleteAllGroups) .");
return new Promise((resolve, reject) => {
const promiseQueue = [];
const groups = that.getAll();
if (!Array.isArray(groups) || (groups && groups.length === 0)) {
return resolve({
code: 0,
label: 'OK'
});
}
groups.forEach(group => {
promiseQueue.push(that.deleteGroup(group).catch (()=> {}));
});
Promise.all(promiseQueue)
.then(() => {
that._logger.log(that.INFO, LOG_ID + "[deleteAllGroups] :: All groups deleted successfully");
return resolve({
code: 0,
label: 'OK'
});
})
.catch(err => {
that._logger.log(that.ERROR, LOG_ID + "[deleteAllGroups] :: Error when deleting all groups");
return reject(err);
});
});
}
/**
* @public
* @nodered true
* @method updateGroupName
* @instance
* @async
* @category Groups MANAGEMENT
* @param {Object} group The group to update
* @param {string} name The new name of the group
* @description
* Update the name of a group
* @return {Promise} The result
* @fulfil {Group} - Updated group object or an error object depending on the result
* @category async
*/
async updateGroupName(group : any, name : string) {
let that = this;
that._logger.log(that.INFOAPI, LOG_ID + API_ID + "(updateGroupName) is name defined : ", isDefined(group));
return new Promise(function(resolve, reject) {
if (!group || !name) {
if (!group) {
that._logger.log(that.WARN, LOG_ID + "(updateGroupName) bad or empty 'group' parameter");
that._logger.log(that.INTERNALERROR, LOG_ID + "(updateGroupName) bad or empty 'group' parameter : ", group);
}
if (!name) {
that._logger.log(that.WARN, LOG_ID + "(updateGroupName) bad or empty 'name' parameter.");
that._logger.log(that.INTERNALERROR, LOG_ID + "(updateGroupName) bad or empty 'name' parameter : ", name);
}
return reject(ErrorManager.getErrorManager().BAD_REQUEST);
} else if (group.name === name) {
that._logger.log(that.DEBUG, LOG_ID + "(updateGroupName) name of group is already defined, nothing is done");
resolve(group);
} else {
that._rest.updateGroupName(group.id, name).then((group : any) => {
let foundIndex = that._groups.findIndex(el => {
return el.id === group.id;
});
if (foundIndex > -1) {
that._groups[foundIndex].name = group.name;
that._logger.log(that.INTERNAL, LOG_ID + "(updateGroupName) update name to " + group.name + " of group with id " + group.id + " successfully");
resolve(that._groups[foundIndex]);
} else {
resolve(null);
}
}).catch(function(err) {
that._logger.log(that.ERROR, LOG_ID + "(updateGroupName) error");
return reject(err);
});
}
});
}
/**
* @public
* @nodered true
* @method updateGroupComment
* @instance
* @async
* @category Groups MANAGEMENT
* @param {Object} group The group to update
* @param {string} comment The new comment of the group
* @description
* Update the comment of a group
* @return {Promise} The result
* @fulfil {Group} - Updated group object or an error object depending on the result
* @category async
*/
async updateGroupComment(group : any, comment : string) {
let that = this;
that._logger.log(that.INFOAPI, LOG_ID + API_ID + "(updateGroupComment) is name defined : ", isDefined(group));
return new Promise(function(resolve, reject) {
if (!group || !comment) {
if (!group) {
that._logger.log(that.WARN, LOG_ID + "(updateGroupComment) bad or empty 'group' parameter");
that._logger.log(that.INTERNALERROR, LOG_ID + "(updateGroupComment) bad or empty 'group' parameter : ", group);
}
if (!comment) {
that._logger.log(that.WARN, LOG_ID + "(updateGroupComment) bad or empty 'comment' parameter.");
that._logger.log(that.INTERNALERROR, LOG_ID + "(updateGroupComment) bad or empty 'comment' parameter : ", comment);
}
return reject(ErrorManager.getErrorManager().BAD_REQUEST);
} else if (group.comment === comment) {
that._logger.log(that.DEBUG, LOG_ID + "(updateGroupComment) name of group is already defined, nothing is done");
resolve(group);
} else {
that._rest.updateGroupComment(group.id, comment).then((group : any) => {
let foundIndex = that._groups.findIndex(el => {
return el.id === group.id;
});
if (foundIndex > -1) {
that._groups[foundIndex].comment = group.comment;
that._logger.log(that.INTERNAL, LOG_ID + "(updateGroupComment) update comment to " + group.comment + " of group with id " + group.id + " successfully");
resolve(that._groups[foundIndex]);
} else {
resolve(null);
}
}).catch(function(err) {
that._logger.log(that.ERROR, LOG_ID + "(updateGroupComment) error");
return reject(err);
});
}
});
}
/**
* @private
* @category Groups MANAGEMENT
* @description
* Internal method
*/
getGroups() {
let that = this;
return new Promise(function(resolve, reject) {
that._rest.getGroups().then((listOfGroups : []) => {
let promises = [];
listOfGroups.forEach((group : any) => {
promises.push(new Promise(function(res, rej) {
that._rest.getGroup(group.id).then(groupWithUsersInformation => {
res(groupWithUsersInformation);
}, err => {
return rej(err);
});
}));
});
Promise.all(promises).then(groups => {
that._groups = groups;
that._logger.log(that.INFO, LOG_ID + "(getGroups) get successfully");
resolve(that._groups);
}, err => {
return reject(err);
});
}, err => {
that._logger.log(that.ERROR, LOG_ID + "(getGroups) Error.");
that._logger.log(that.INTERNALERROR, LOG_ID + "(getGroups) Error : ", err);
return reject(err);
});
});
}
/**
* @public
* @nodered true
* @method setGroupAsFavorite
* @since 1.67.0
* @async
* @category Groups MANAGEMENT
* @instance
* @param {Object} group The group
* @description
* Set a group as a favorite one of the curent loggued in user.
* @return {Promise} The result
* @fulfil {Group} - Updated group or an error object depending on the result
* @category async
*/
async setGroupAsFavorite(group : any) {
let that = this;
that._logger.log(that.INFOAPI, LOG_ID + API_ID + "(setGroupAsFavorite) is name defined : ", isDefined(group));
return new Promise(function (resolve, reject) {
if (!group) {
that._logger.log(that.WARN, LOG_ID + "(setGroupAsFavorite) bad or empty 'group' parameter.");
that._logger.log(that.INTERNALERROR, LOG_ID + "(setGroupAsFavorite) bad or empty 'group' parameter : ", group);
reject(ErrorManager.getErrorManager().BAD_REQUEST);
return;
}
that._logger.log(that.INTERNAL, LOG_ID + "(setGroupAsFavorite) param group : ", group);
that._rest.updateGroupFavorite(group.id, true).then((groupRetrieved: any) => {
that._logger.log(that.DEBUG, LOG_ID + "(setGroupAsFavorite) set favorite group successfull");
that._logger.log(that.INTERNAL, LOG_ID + "(setGroupAsFavorite) set favorite group successfull, group : ", groupRetrieved);
resolve(groupRetrieved);
}, err => {
return reject(err);
});
});
}
/**
* @public
* @nodered true
* @method unsetGroupAsFavorite
* @since 1.67.0
* @category Groups MANAGEMENT
* @async
* @instance
* @param {Object} group The group
* @description
* Remove the favorite state of a group of the curent loggued in user.
* @return {Promise} The result
* @fulfil {Group} - Updated group or an error object depending on the result
* @category async
*/
async unsetGroupAsFavorite(group : any) {
let that = this;
that._logger.log(that.INFOAPI, LOG_ID + API_ID + "(unsetGroupAsFavorite) is name defined : ", isDefined(group));
return new Promise(function (resolve, reject) {
if (!group) {
that._logger.log(that.WARN, LOG_ID + "(unsetGroupAsFavorite) bad or empty 'group' parameter.");
that._logger.log(that.INTERNALERROR, LOG_ID + "(unsetGroupAsFavorite) bad or empty 'group' parameter : ", group);
reject(ErrorManager.getErrorManager().BAD_REQUEST);
return;
}
that._logger.log(that.INTERNAL, LOG_ID + "(unsetGroupAsFavorite) param group : ", group);
that._rest.updateGroupFavorite(group.id, false).then((groupRetrieved: any) => {
that._logger.log(that.DEBUG, LOG_ID + "(unsetGroupAsFavorite) unset favorite group successfull");
that._logger.log(that.INTERNAL, LOG_ID + "(unsetGroupAsFavorite) unset favorite group successfull, group : ", groupRetrieved);
resolve(groupRetrieved);
}, err => {
return reject(err);
});
});
}
/**
* @public
* @nodered true
* @method getAll
* @category Groups MANAGEMENT
* @instance
* @return {Array} The list of existing groups with following fields: id, name, comment, isFavorite, owner, creationDate, array of users in the group
* @description
* Return the list of existing groups
*/
getAll() {
let that = this;
that._logger.log(that.INFOAPI, LOG_ID + API_ID + "(unsetGroupAsFavorite) .");
return this._groups;
}
/**
* @public
* @nodered true
* @method getFavoriteGroups
* @category Groups MANAGEMENT
* @instance
* @return {Array} The list of favorite groups with following fields: id, name, comment, isFavorite, owner, creationDate, array of users in the group
* @description
* Return the list of favorite groups
*/
getFavoriteGroups() {
let that = this;
that._logger.log(that.INFOAPI, LOG_ID + API_ID + "(unsetGroupAsFavorite) .");
return this._groups.filter((group) => {
return group.isFavorite;
});
}
/**
* @public
* @nodered true
* @method getGroupById
* @category Groups MANAGEMENT
* @instance
* @async
* @param {String} id group Id of the group to found
* @return {Promise} The group found if exist or undefined
* @description
* Return a group by its id
*/
getGroupById(id: string, forceServerSearch : boolean = false) : Promise{
let that = this;
that._logger.log(that.INFOAPI, LOG_ID + API_ID + "(unsetGroupAsFavorite) is id defined : ", isDefined(id));
return new Promise((resolve, reject) => {
let that = this;
let groupFound = this._groups.find((group) => {
return (group.id===id);
});
if (groupFound && !forceServerSearch) {
return resolve (groupFound);
} else {
return that._rest.getGroups().then(async (listOfGroups: [any]) => {
let promises = [];
let groupFoundOnServer = false;
for (const group of listOfGroups) {
if (group.id === id) {
await this._rest.getGroup(group.id).then((groupUpdated: any) => {
//that._logger.log(that.INTERNAL, LOG_ID + "(_onGroupUpdated) Group updated", groupUpdated.name);
let foundIndex = that._groups.findIndex(groupItem => groupItem.id===groupUpdated.id);
if (foundIndex > -1) {
that._groups[foundIndex] = groupUpdated;
} else {
that._groups.push(groupUpdated);
}
that._eventEmitter.emit("evt_internal_groupupdated", groupUpdated);
//that._logger.log(that.INFO, LOG_ID + "(getGroupByName) retrieved infos on group found on server successfully.");
that._logger.log(that.DEBUG, LOG_ID + "(getGroupById) retrieved infos on group found on server successfully, groupUpdated : ", groupUpdated);
groupFoundOnServer = true;
return resolve(groupUpdated);
});
}
};
if (!groupFoundOnServer) {
return resolve (null);
}
}, err => {
that._logger.log(that.ERROR, LOG_ID + "(getGroupById) Error.");
that._logger.log(that.INTERNALERROR, LOG_ID + "(getGroupById) Error : ", err);
return reject(err);
});
}
});
}
/**
* @public
* @nodered true
* @method getGroupByName
* @category Groups MANAGEMENT
* @instance
* @async
* @param {String} name Name of the group to found
* @param {boolean} forceServerSearch=false force the update from server.
* @return {Promise} The group found if exist or undefined
* @description
* Return a group by its id
*/
async getGroupByName(name : string, forceServerSearch : boolean = false) : Promise{
let that = this;
that._logger.log(that.INFOAPI, LOG_ID + API_ID + "(getGroupByName) is name defined : ", isDefined(name));
return new Promise((resolve, reject) => {
let that = this;
let groupFound = this._groups.find((group) => {
return (group.name===name);
});
if (groupFound && !forceServerSearch) {
return resolve (groupFound);
} else {
that._rest.getGroups().then(async (listOfGroups: [any]) => {
let promises = [];
let groupFoundOnServer = false;
for (const group of listOfGroups) {
if (group.name === name) {
await this._rest.getGroup(group.id).then((groupUpdated: any) => {
//that._logger.log(that.INTERNAL, LOG_ID + "(_onGroupUpdated) Group updated", groupUpdated.name);
let foundIndex = that._groups.findIndex(groupItem => groupItem.id===groupUpdated.id);
if (foundIndex > -1) {
that._groups[foundIndex] = groupUpdated;
} else {
that._groups.push(groupUpdated);
}
that._eventEmitter.emit("evt_internal_groupupdated", groupUpdated);
//that._logger.log(that.INFO, LOG_ID + "(getGroupByName) retrieved infos on group found on server successfully.");
that._logger.log(that.DEBUG, LOG_ID + "(getGroupByName) retrieved infos on group found on server successfully, groupUpdated : ", groupUpdated);
groupFoundOnServer = true;
resolve(groupUpdated);
});
}
};
if (!groupFoundOnServer) {
return resolve (null);
}
}, err => {
that._logger.log(that.ERROR, LOG_ID + "(getGroupByName) Error.");
that._logger.log(that.INTERNALERROR, LOG_ID + "(getGroupByName) Error : ", err);
return reject(err);
});
}
});
}
//endregion Groups MANAGEMENT
//region Groups USERS
/**
* @public
* @nodered true
* @method addUserInGroup
* @instance
* @async
* @category Groups USERS
* @param {Contact} contact The user to add in group
* @param {Object} group The group
* @description
* Add a contact in a group
* @return {Promise} The result
*
*
* | Champ | Type | Description |
* | --- | --- | --- |
* | data | Object | Group Object. |
* | id | String | Group unique identifier. |
* | name | String | Group name. |
* | comment | String | Group comment. |
* | isFavorite | Boolean | Is group flagged as favorite. |
* | owner | String | Rainbow Id of group owner. |
* | creationDate | Date-Time | Creation date of the group (read only, set automatically during group creation). |
* | users | String\[\] | List of Rainbow users being in the group. |
*
* @fulfil {Group} - Updated group with the new contact added or an error object depending on the result
* @category async
*/
async addUserInGroup(contact : Contact, group : any) {
let that = this;
that._logger.log(that.INFOAPI, LOG_ID + API_ID + "(addUserInGroup) is contact defined : ", isDefined(contact));
return new Promise(async function(resolve, reject) {
if (!contact) {
that._logger.log(that.WARN, LOG_ID + "(addUserInGroup) bad or empty 'contact' parameter.");
that._logger.log(that.INTERNALERROR, LOG_ID + "(addUserInGroup) bad or empty 'contact' parameter : ", contact);
return reject(ErrorManager.getErrorManager().BAD_REQUEST);
} else if (!group) {
that._logger.log(that.WARN, LOG_ID + "(addUserInGroup) bad or empty 'group' parameter.");
that._logger.log(that.INTERNALERROR, LOG_ID + "(addUserInGroup) bad or empty 'group' parameter : ", group);
return reject(ErrorManager.getErrorManager().BAD_REQUEST);
}
that._logger.log(that.INTERNAL, LOG_ID + "(addUserInGroup) contact : ", contact, ", group : ", group);
let contactIndex = group.users.findIndex(user => user.id === contact.id);
if (contactIndex === -1) {
await that._rest.addUserInGroup(contact.id, group.id).then(async (groupUpdated : any) => {
await that._rest.getGroup(groupUpdated.id).then((groupRetrieved : any) => {
let foundIndex = that._groups.findIndex(groupItem => groupItem.id === groupRetrieved.id);
that._groups[foundIndex] = groupRetrieved;
resolve(groupRetrieved);
}, err => {
return reject(err);
});
}, err => {
that._logger.log(that.ERROR, LOG_ID + "(addUserInGroup) error.");
that._logger.log(that.INTERNALERROR, LOG_ID + "(addUserInGroup) error : ", err);
return reject(err);
});
} else {
that._logger.log(that.WARN, LOG_ID + "(addUserInGroup) User is already a member of the group");
return reject(ErrorManager.getErrorManager().BAD_REQUEST);
}
});
}
/**
* @public
* @nodered true
* @method removeUserFromGroup
* @instance
* @async
* @category Groups USERS
* @param {Contact} contact The user to remove from the group
* @param {Object} group The destination group
* @description
* Remove a contact from a group
* @return {Promise} The result
* @fulfil {Group} - Updated group without the removed contact or an error object depending on the result
* @category async
*/
async removeUserFromGroup(contact : Contact, group : any) {
let that = this;
that._logger.log(that.INFOAPI, LOG_ID + API_ID + "(removeUserFromGroup) is contact defined : ", isDefined(contact));
return new Promise(async function(resolve, reject) {
if (!contact) {
that._logger.log(that.WARN, LOG_ID + "(removeUserFromGroup) bad or empty 'contact' parameter.");
that._logger.log(that.INTERNALERROR, LOG_ID + "(removeUserFromGroup) bad or empty 'contact' parameter : ", contact);
return reject(ErrorManager.getErrorManager().BAD_REQUEST);
} else if (!group) {
that._logger.log(that.WARN, LOG_ID + "(removeUserFromGroup) bad or empty 'group' parameter.");
that._logger.log(that.INTERNALERROR, LOG_ID + "(removeUserFromGroup) bad or empty 'group' parameter : ", group);
return reject(ErrorManager.getErrorManager().BAD_REQUEST);
}
that._logger.log(that.INTERNAL, LOG_ID + "(removeUserFromGroup) contact : ", contact, ", group : ", group);
let contactIndex = group.users.findIndex(user => user.id == contact.id);
if (contactIndex > -1) {
await that._rest.removeUserFromGroup(contact.id, group.id).then(async (group : any) => {
await that._rest.getGroup(group.id).then((group :any) => {
let foundIndex = that._groups.findIndex(groupItem => groupItem.id === group.id);
that._groups[foundIndex] = group;
resolve(group);
}, err => {
return reject(err);
});
}, err => {
that._logger.log(that.ERROR, LOG_ID + "(removeUserFromGroup) error");
return reject(err);
});
} else {
that._logger.log(that.WARN, LOG_ID + "(removeUserFromGroup) contact not found in that group");
resolve(group);
}
});
}
//endregion Groups USERS
//region Events
/**
* @private
* @method _onGroupCreated
* @instance
* @param {Object} data Contains the groupId of the created group
* @description
* Method called when a group is created
*/
async _onGroupCreated(data : any) {
let that = this;
await this._rest.getGroup(data.groupId).then((groupCreated : any )=> {
//that._logger.log(that.INTERNAL, LOG_ID + "(_onGroupCreated) Group created : ", groupCreated.name);
let foundIndex = that._groups.findIndex(groupItem => groupItem.id === groupCreated.id);
if (foundIndex > -1) {
that._groups[foundIndex] = groupCreated;
} else {
that._groups.push(groupCreated);
}
that._eventEmitter.emit("evt_internal_groupcreated", groupCreated);
}).catch((err) => {
that._logger.log(that.WARN, LOG_ID + "(_onGroupCreated) Error : ", err);
//that._logger.log(that.INTERNALERROR, LOG_ID + "(_onGroupCreated) Error : ", err);
});
}
/**
* @private
* @method _onGroupDeleted
* @instance
* @param {Object} data Contains the groupId of the deleted group
* @description
* Method called when a group is deleted
*/
async _onGroupDeleted(data : any) {
let that = this;
let foundIndex = that._groups.findIndex(el => {
return el.id === data.groupId;
});
if (foundIndex > -1) {
let groupDeleted = that._groups.splice(foundIndex, 1);
//that._logger.log(that.INTERNAL, LOG_ID + "(_onGroupDeleted) Group deleted : ", groupDeleted[0].name);
that._eventEmitter.emit("evt_internal_groupdeleted", groupDeleted[0]);
} else {
that._eventEmitter.emit("evt_internal_groupdeleted", null);
}
}
/**
* @private
* @method _onGroupUpdated
* @instance
* @param {Object} data Contains the groupId of the updated group
* @description
* Method called when a group is updated (name, comment, isFavorite)
*/
async _onGroupUpdated(data : any) {
let that = this;
await this._rest.getGroup(data.groupId).then((groupUpdated : any) => {
//that._logger.log(that.INTERNAL, LOG_ID + "(_onGroupUpdated) Group updated", groupUpdated.name);
let foundIndex = that._groups.findIndex(groupItem => groupItem.id === groupUpdated.id);
if (foundIndex > -1) {
that._groups[foundIndex] = groupUpdated;
} else {
that._groups.push(groupUpdated);
}
that._eventEmitter.emit("evt_internal_groupupdated", groupUpdated);
}).catch((err) => {
that._logger.log(that.WARN, LOG_ID + "(_onGroupUpdated) Error : ", err);
//that._logger.log(that.INTERNALERROR, LOG_ID + "(_onGroupUpdated) Error : ", err);
});
}
/**
* @private
* @method _onUserAddedInGroup
* @instance
* @param {Object} data Contains the groupId and the userId
* @description
* Method called when a user is added to a group
*/
async _onUserAddedInGroup(data : any) {
let that = this;
await this._rest.getGroup(data.groupId).then((groupUpdated : any ) => {
//that._logger.log(that.INTERNAL, LOG_ID + "(_onUserAddedInGroup) User added in group", groupUpdated.name);
let foundIndex = that._groups.findIndex(groupItem => groupItem.id === groupUpdated.id);
if (foundIndex > -1) {
that._groups[foundIndex] = groupUpdated;
} else {
that._groups.push(groupUpdated);
}
let contactAddedIndex = groupUpdated.users.findIndex(userItem => userItem.id === data.userId);
let contact = groupUpdated.users[contactAddedIndex];
that._eventEmitter.emit("evt_internal_useraddedingroup", groupUpdated, contact);
}).catch((err) => {
that._logger.log(that.WARN, LOG_ID + "(_onUserAddedInGroup) Error : ", err);
//that._logger.log(that.INTERNALERROR, LOG_ID + "(_onUserAddedInGroup) Error : ", err);
});
}
/**
* @private
* @method _onUserRemovedFromGroup
* @instance
* @param {Object} data Contains the groupId and the userId
* @description
* Method called when a user is removed from a group
*/
async _onUserRemovedFromGroup(data : any) {
let that = this;
await this._rest.getGroup(data.groupId).then((groupUpdated : any) => {
//that._logger.log(that.INTERNAL, LOG_ID + "(_onUserRemovedFromGroup) User removed from group", groupUpdated.name);
let foundIndex = that._groups.findIndex(groupItem => groupItem.id === groupUpdated.id);
let contact = null;
if (foundIndex > -1) {
let contactRemovedIndex = that._groups[foundIndex].users.findIndex(userItem => userItem.id === data.userId);
contact = that._groups[foundIndex].users[contactRemovedIndex];
that._groups[foundIndex] = groupUpdated;
} else {
that._groups.push(groupUpdated);
}
that._eventEmitter.emit("evt_internal_userremovedfromgroup", groupUpdated, contact);
}).catch((err) => {
that._logger.log(that.WARN, LOG_ID + "(_onUserRemovedFromGroup) Error : ", err);
//that._logger.log(that.INTERNALERROR, LOG_ID + "(_onUserRemovedFromGroup) Error : ", err);
});
}
//endregion Events
}
module.exports.GroupsService = GroupsService;
export {GroupsService as GroupsService} ;