예제 #1
0
        private async Task DeleteSocialAccountInGeneralDb(SocialAccount entity)
        {
            int?siteIdOrNull = CurrentUnitOfWork.GetSiteId();

            if (siteIdOrNull == null)
            {
                throw new InvalidOperationException("site id must have value.");
            }

            int siteId = siteIdOrNull.Value;

            if (entity.SocialUser.Source == SocialUserSource.Facebook)
            {
                await UnitOfWorkManager.RunWithNewTransaction(null, async() =>
                {
                    var accoutns = _siteSocialAccountRepo.FindAll().Where(t => t.SiteId == siteId && t.FacebookPageId == entity.SocialUser.OriginalId).ToList();
                    foreach (var account in accoutns)
                    {
                        await _siteSocialAccountRepo.DeleteAsync(account);
                    }
                });
            }

            if (entity.SocialUser.Source == SocialUserSource.Twitter)
            {
                await UnitOfWorkManager.RunWithNewTransaction(null, async() =>
                {
                    var accoutns = _siteSocialAccountRepo.FindAll().Where(t => t.SiteId == siteId && t.TwitterUserId == entity.SocialUser.OriginalId).ToList();
                    foreach (var account in accoutns)
                    {
                        await _siteSocialAccountRepo.DeleteAsync(account);
                    }
                });
            }
        }
예제 #2
0
        public async Task <SocialUser> GetOrCreateTwitterUser(IUser twitterUser)
        {
            var user = FindByOriginalId(twitterUser.IdStr, SocialUserSource.Twitter);

            if (user == null)
            {
                user = new SocialUser
                {
                    OriginalId   = twitterUser.IdStr,
                    Name         = twitterUser.Name,
                    ScreenName   = twitterUser.ScreenName,
                    Avatar       = twitterUser.ProfileImageUrl,
                    Source       = SocialUserSource.Twitter,
                    Type         = SocialUserType.Customer,
                    OriginalLink = TwitterHelper.GetUserUrl(twitterUser.ScreenName)
                };

                await UnitOfWorkManager.RunWithNewTransaction(CurrentUnitOfWork.GetSiteId(), async() =>
                {
                    await Repository.InsertAsync(user);
                    CurrentUnitOfWork.SaveChanges();
                });
            }

            if (user.IsDeleted)
            {
                user.IsDeleted = false;
                user.Type      = SocialUserType.Customer;
                Update(user);
            }

            return(user);
        }
예제 #3
0
        public bool CheckIfDepartmentEnable()
        {
            int  siteId             = CurrentUnitOfWork.GetSiteId().HasValue ? CurrentUnitOfWork.GetSiteId().Value : -1;
            bool ifDepartmentEnable = false;

            UnitOfWorkManager.RunWithNewTransaction(null, () =>
            {
                ifDepartmentEnable = _configRepository.FindAll().Where(t => t.Id == siteId).First().IfDepartmentEnable;
            });
            return(ifDepartmentEnable);
        }
예제 #4
0
        private async Task <TwitterAuth> FindAndDeleteAsync(string authorizationId)
        {
            var auth = Repository.FindAll().Where(t => t.AuthorizationId == authorizationId).FirstOrDefault();

            if (auth != null)
            {
                await UnitOfWorkManager.RunWithNewTransaction(CurrentUnitOfWork.GetSiteId(), async() =>
                {
                    await Repository.DeleteAsync(auth.Id);
                });
            }

            return(auth);
        }
예제 #5
0
        public async Task <List <SocialUser> > GetOrCreateSocialUsers(string token, List <FbUser> fbSenders)
        {
            var uniqueFbSenders = new List <FbUser>();

            foreach (var fbSender in fbSenders)
            {
                if (!uniqueFbSenders.Any(t => t.id == fbSender.id))
                {
                    uniqueFbSenders.Add(fbSender);
                }
            }

            List <SocialUser> senders = new List <SocialUser>();
            var fbSenderIds           = uniqueFbSenders.Select(t => t.id).ToList();
            var existingUsers         = FindAllWithDeleted().Where(t => t.Source == SocialUserSource.Facebook && fbSenderIds.Contains(t.OriginalId)).ToList();

            senders.AddRange(existingUsers);
            uniqueFbSenders.RemoveAll(t => existingUsers.Any(e => e.OriginalId == t.id));
            foreach (var fbSender in uniqueFbSenders)
            {
                var sender = new SocialUser()
                {
                    OriginalId = fbSender.id,
                    Name       = fbSender.name,
                    Email      = fbSender.email,
                    Source     = SocialUserSource.Facebook,
                };

                await UnitOfWorkManager.RunWithNewTransaction(CurrentUnitOfWork.GetSiteId(), async() =>
                {
                    await InsertAsync(sender);
                    senders.Add(sender);
                });
            }

            foreach (var sender in senders)
            {
                if (sender.IsDeleted)
                {
                    sender.IsDeleted = false;
                    sender.Type      = SocialUserType.Customer;
                    Update(sender);
                }
            }

            return(senders);
        }
예제 #6
0
        public IQueryable <Filter> FindFiltersInlucdeConditions(int userId)
        {
            var filters = this.FindAll()
                          .Include(t => t.Conditions.Select(r => r.Field))
                          .Where(t => t.IfPublic || t.CreatedBy == userId).ToList();
            int  siteId             = CurrentUnitOfWork.GetSiteId().HasValue ? CurrentUnitOfWork.GetSiteId().Value : -1;
            bool ifDepartmentEnable = false;

            UnitOfWorkManager.RunWithNewTransaction(null, () =>
            {
                ifDepartmentEnable = _configRepository.FindAll().Where(t => t.Id == siteId).First().IfDepartmentEnable;
            });
            if (!ifDepartmentEnable)
            {
                filters.RemoveAll(t => t.Name.Contains("Department"));
            }
            return(filters.AsQueryable());
        }
        private async Task <ConversationDto> UpdateConversation(int conversationId, Func <Conversation, Conversation> updateFunc)
        {
            int             maxLogId;
            ConversationDto conversationDto;

            using (var uow = UnitOfWorkManager.Begin(TransactionScopeOption.RequiresNew))
            {
                var conversation = _conversationService.CheckIfExists(conversationId);
                maxLogId = conversation.Logs.Select(t => t.Id).DefaultIfEmpty().Max();
                var entity = updateFunc(conversation);

                conversationDto = Mapper.Map <ConversationDto>(entity);
                FillFields(conversationDto);
                uow.Complete();
            }
            await _notificationManager.NotifyUpdateConversation(CurrentUnitOfWork.GetSiteId().GetValueOrDefault(), conversationId, maxLogId);

            return(conversationDto);
        }
        public async Task <ConversationDto> UpdateAsync(int id, ConversationUpdateDto updateDto)
        {
            ConversationDto conversationDto;
            int             oldMaxLogId;

            using (var uow = UnitOfWorkManager.Begin(TransactionScopeOption.RequiresNew))
            {
                Conversation conversation = _conversationService.CheckIfExists(id);
                oldMaxLogId = conversation.Logs.Select(t => t.Id).DefaultIfEmpty().Max();
                Mapper.Map(updateDto, conversation);
                _conversationService.UpdateAndWriteLog(conversation);
                conversationDto = Mapper.Map <ConversationDto>(conversation);
                FillFields(conversationDto);
                uow.Complete();
            }
            await _notificationManager.NotifyUpdateConversation(CurrentUnitOfWork.GetSiteId().GetValueOrDefault(), id, oldMaxLogId);

            return(conversationDto);
        }
예제 #9
0
 private void Audit(int action, string content, IList <AuditLogField> auditFields)
 {
     if (auditFields.Count() > 0)
     {
         var auditLog = new AuditLog
         {
             ApplicationType  = 1,
             ActionType       = action,
             ActionDetail     = content,
             OperatorId       = UserContext.UserId,
             ActionTime       = DateTime.UtcNow,
             ActionDetailData = Newtonsoft.Json.JsonConvert.SerializeObject(auditFields)
         };
         try
         {
             UnitOfWorkManager.RunWithNewTransaction(CurrentUnitOfWork.GetSiteId(), () => { _auditRepository.Insert(auditLog); });
         }
         catch (Exception ex)
         {
             Social.Infrastructure.Logger.Error(ex);
         }
     }
 }
예제 #10
0
        public async Task InsertSocialAccountInGeneralDb(SocialUserSource source, string originalId)
        {
            int?siteIdOrNull = CurrentUnitOfWork.GetSiteId();

            if (siteIdOrNull == null)
            {
                throw new InvalidOperationException("site id must have value.");
            }

            int siteId = siteIdOrNull.Value;

            if (source == SocialUserSource.Facebook)
            {
                await UnitOfWorkManager.RunWithNewTransaction(null, async() =>
                {
                    if (!_siteSocialAccountRepo.FindAll().Any(t => t.SiteId == siteId && t.FacebookPageId == originalId))
                    {
                        await _siteSocialAccountRepo.InsertAsync(new SiteSocialAccount {
                            SiteId = siteId, FacebookPageId = originalId
                        });
                    }
                });
            }

            if (source == SocialUserSource.Twitter)
            {
                await UnitOfWorkManager.RunWithNewTransaction(null, async() =>
                {
                    if (!_siteSocialAccountRepo.FindAll().Any(t => t.SiteId == siteId && t.TwitterUserId == originalId))
                    {
                        await _siteSocialAccountRepo.InsertAsync(new SiteSocialAccount {
                            SiteId = siteId, TwitterUserId = originalId
                        });
                    }
                });
            }
        }
예제 #11
0
        public async Task <SocialUser> GetOrCreateFacebookUser(string token, string fbUserId)
        {
            var user = FindByOriginalId(fbUserId, SocialUserSource.Facebook);

            if (user == null)
            {
                FbUser fbUser = await _fbClient.GetUserInfo(token, fbUserId);

                user = FindByOriginalId(fbUserId, SocialUserSource.Facebook);
                if (user == null)
                {
                    user = new SocialUser
                    {
                        OriginalId   = fbUser.id,
                        Name         = fbUser.name,
                        Email        = fbUser.email,
                        OriginalLink = fbUser.link,
                        Avatar       = fbUser.pic,
                        Source       = SocialUserSource.Facebook
                    };

                    await UnitOfWorkManager.RunWithNewTransaction(CurrentUnitOfWork.GetSiteId(), async() =>
                    {
                        await InsertAsync(user);
                    });
                }
            }

            if (user.IsDeleted)
            {
                user.IsDeleted = false;
                user.Type      = SocialUserType.Customer;
                Update(user);
            }

            return(user);
        }
        private void FillFiledsForDtoList(IList <ConversationDto> conversationDtos)
        {
            var  allMessages        = _messageService.FindAllByConversationIds(conversationDtos.Select(t => t.Id).ToArray()).ToList();
            int  siteId             = CurrentUnitOfWork.GetSiteId().HasValue ? CurrentUnitOfWork.GetSiteId().Value : -1;
            bool?ifDepartmentEnable = true;

            UnitOfWorkManager.RunWithNewTransaction(null, () =>
            {
                ifDepartmentEnable = _configRepository.FindAll().Where(t => t.Id == siteId).FirstOrDefault()?.IfDepartmentEnable;
            });
            if (ifDepartmentEnable.GetValueOrDefault() == false)
            {
                foreach (var conversationDto in conversationDtos)
                {
                    conversationDto.DepartmentId   = null;
                    conversationDto.DepartmentName = null;
                }
            }
            foreach (var conversationDto in conversationDtos)
            {
                var messages = allMessages.Where(t => t.ConversationId == conversationDto.Id).ToList();
                FillFields(conversationDto, messages);
            }
        }
예제 #13
0
        private void FillAgentStatusOptions(IList <ConversationField> fields)
        {
            if (!fields.Any())
            {
                return;
            }

            var agentsFieldNames = new List <string> {
                "Agent Assignee Status"
            };
            var agentFields = fields.Where(t => t.IfSystem == true && t.DataType == FieldDataType.Option && agentsFieldNames.Contains(t.Name));

            if (agentFields.Any())
            {
                AgentStatus[] statuses = new AgentStatus[] {
                    AgentStatus.Online, AgentStatus.Offline
                };
                int siteId = CurrentUnitOfWork.GetSiteId().HasValue ? CurrentUnitOfWork.GetSiteId().Value : -1;
                CustomAwayStatus[] customAwayStatuses = _statusrRepo.FindAll().Where(t => t.SiteId == siteId && t.IfDeleted == false).ToArray();

                bool ifCustomAwayEnable = false;
                UnitOfWorkManager.RunWithNewTransaction(null, () =>
                {
                    ifCustomAwayEnable = _configRepository.FindAll().Where(t => t.Id == siteId).First().IfCustomAwayEnable;
                });

                foreach (var agentField in agentFields)
                {
                    agentField.Options = statuses.Select(t => new ConversationFieldOption
                    {
                        Id      = (int)t,
                        Name    = t.GetName(),
                        SiteId  = agentField.SiteId,
                        FieldId = agentField.Id,
                        Value   = ((int)t).ToString()
                    }).ToList();
                    if (ifCustomAwayEnable)
                    {
                        foreach (var customAwayStatus in customAwayStatuses)
                        {
                            agentField.Options.Add(new ConversationFieldOption
                            {
                                Id      = customAwayStatus.Id,
                                Name    = customAwayStatus.Name,
                                SiteId  = agentField.SiteId,
                                FieldId = agentField.Id,
                                Value   = customAwayStatus.Id.ToString()
                            });
                        }
                    }
                    else
                    {
                        agentField.Options.Add(new ConversationFieldOption
                        {
                            Id      = (int)AgentStatus.Away,
                            Name    = AgentStatus.Away.GetName(),
                            SiteId  = agentField.SiteId,
                            FieldId = agentField.Id,
                            Value   = ((int)AgentStatus.Away).ToString()
                        });
                    }
                }
            }
        }