public Entity.BaseResponse <Entity.UserResponse> Manage([FromBody] Entity.AddUserRequest request)
 {
     Entity.BaseResponse <Entity.UserResponse> response = new Entity.BaseResponse <Entity.UserResponse>(true);
     try
     {
         var status = _service.Manage(request);
         response.IsSuccess = status.Success;
         response.Message   = status.Message;
         response.Data      = status.Data;
     }
     catch (Exception ex)
     {
         return(new Entity.BaseResponse <Entity.UserResponse>(false, ex.Message));
     }
     return(response);
 }
        public Entity.ActionStatus Manage(Entity.AddUserRequest request)
        {
            Entity.ActionStatus actionStatus = new Entity.ActionStatus(true);
            try
            {
                if (request.Id == null || request.Id == Guid.Empty)
                {
                    //var addUserResult = _iotConnectClient.User.Add(Mapper.Configuration.Mapper.Map<IOT.AddUserModel>(request)).Result;
                    var addUserResult = AsyncHelpers.RunSync <IOT.DataResponse <IOT.AddUserResult> >(() =>
                                                                                                     _iotConnectClient.User.Add(Mapper.Configuration.Mapper.Map <IOT.AddUserModel>(request)));

                    if (addUserResult != null && addUserResult.status && addUserResult.data != null)
                    {
                        request.Id = Guid.Parse(addUserResult.data.newId.ToUpper());
                        var dbUser = Mapper.Configuration.Mapper.Map <Entity.AddUserRequest, Model.User>(request);
                        dbUser.Guid        = request.Id;
                        dbUser.CreatedDate = DateTime.Now;
                        dbUser.CompanyGuid = component.helper.SolutionConfiguration.CompanyId;
                        dbUser.GensetGuid  = request.EntityGuid.Value;
                        dbUser.CreatedBy   = component.helper.SolutionConfiguration.CurrentUserId;
                        dbUser.IsActive    = true;
                        dbUser.IsDeleted   = false;


                        var tmpdbUser = _userRepository.FindBy(u => u.Guid == dbUser.Guid).FirstOrDefault();
                        if (tmpdbUser == null)
                        {
                            actionStatus = _userRepository.Insert(dbUser);
                        }
                        else
                        {
                            actionStatus = new Entity.ActionStatus()
                            {
                                Data    = tmpdbUser,
                                Message = "",
                                Success = true
                            };
                        }

                        actionStatus.Data = Mapper.Configuration.Mapper.Map <Model.User, Entity.UserResponse>(actionStatus.Data);
                        if (!actionStatus.Success)
                        {
                            _logger.ErrorLog(new Exception($"User is not added in solution database, Error: {actionStatus.Message}"), this.GetType().Name, MethodBase.GetCurrentMethod().Name);
                            var deleteEntityResult = _iotConnectClient.User.Delete(request.Id.ToString()).Result;
                            if (deleteEntityResult != null && !deleteEntityResult.status)
                            {
                                _logger.ErrorLog(new Exception($"User is not deleted from iotconnect, Error: {actionStatus.Message}"), this.GetType().Name, MethodBase.GetCurrentMethod().Name);
                                actionStatus.Success = false;
                                actionStatus.Message = new UtilityHelper().IOTResultMessage(deleteEntityResult.errorMessages);
                            }
                        }
                    }
                    else
                    {
                        _logger.ErrorLog(new Exception($"User is not added in iotconnect, Error: {actionStatus.Message}"), this.GetType().Name, MethodBase.GetCurrentMethod().Name);
                        actionStatus.Success = false;
                        actionStatus.Message = new UtilityHelper().IOTResultMessage(addUserResult.errorMessages);
                    }
                }
                else
                {
                    var olddbUser = _userRepository.FindBy(x => x.Guid.Equals(request.Id)).FirstOrDefault();
                    if (olddbUser == null)
                    {
                        throw new NotFoundCustomException($"{CommonException.Name.NoRecordsFound} : User");
                    }

                    //var updateEntityResult = _iotConnectClient.User.Update(request.Id.ToString(), Mapper.Configuration.Mapper.Map<IOT.UpdateUserModel>(request)).Result;
                    var updateEntityResult = AsyncHelpers.RunSync <IOT.DataResponse <IOT.UpdateUserResult> >(() =>
                                                                                                             _iotConnectClient.User.Update(request.Id.ToString(), Mapper.Configuration.Mapper.Map <IOT.UpdateUserModel>(request)));

                    if (updateEntityResult != null && updateEntityResult.status && updateEntityResult.data != null)
                    {
                        bool?olddbUserStatus = olddbUser.IsActive;
                        var  dbUser          = Mapper.Configuration.Mapper.Map(request, olddbUser);
                        //Update Status if user is not modifying his own profile
                        if (request.Id != SolutionConfiguration.CurrentUserId && olddbUserStatus != request.IsActive)
                        {
                            var updateStatusEntityResult = AsyncHelpers.RunSync <IOT.DataResponse <IOT.UpdateUserStatusResult> >(() =>
                                                                                                                                 _iotConnectClient.User.UpdateUserStatus(request.Id.ToString(), request.IsActive));
                            if (updateStatusEntityResult != null && updateStatusEntityResult.status && updateStatusEntityResult.data != null && updateStatusEntityResult.errorMessages.Count > 0)
                            {
                                _logger.ErrorLog(new Exception($"User is not updated in iotconnect, Error: {updateStatusEntityResult.errorMessages}"), this.GetType().Name, MethodBase.GetCurrentMethod().Name);
                                actionStatus.Success = false;
                                actionStatus.Message = new UtilityHelper().IOTResultMessage(updateStatusEntityResult.errorMessages);
                                return(actionStatus);
                            }
                        }
                        else
                        {
                            dbUser.IsActive = updateEntityResult.data.isActive;
                        }
                        //
                        dbUser.CreatedBy   = olddbUser.CreatedBy;
                        dbUser.CreatedDate = olddbUser.CreatedDate;
                        dbUser.UpdatedDate = DateTime.Now;
                        dbUser.UpdatedBy   = component.helper.SolutionConfiguration.CurrentUserId;
                        dbUser.CompanyGuid = component.helper.SolutionConfiguration.CompanyId;
                        actionStatus       = _userRepository.Update(dbUser);
                        actionStatus.Data  = Mapper.Configuration.Mapper.Map <Model.User, Entity.UserResponse>(actionStatus.Data);
                        if (!actionStatus.Success)
                        {
                            _logger.ErrorLog(new Exception($"User is not updated in solution database, Error: {actionStatus.Message}"), this.GetType().Name, MethodBase.GetCurrentMethod().Name);
                            actionStatus.Success = false;
                            actionStatus.Message = "Somthing went wrong!";
                        }
                    }
                    else
                    {
                        _logger.ErrorLog(new Exception($"User is not added in iotconnect, Error: {updateEntityResult.message}"), this.GetType().Name, MethodBase.GetCurrentMethod().Name);
                        actionStatus.Success = false;
                        actionStatus.Message = new UtilityHelper().IOTResultMessage(updateEntityResult.errorMessages);
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.ErrorLog(ex, "UserManager.Delete " + ex);
                actionStatus.Success = false;
                actionStatus.Message = ex.Message;
            }
            return(actionStatus);
        }