Beispiel #1
0
        public bool RemoveUser(string _key)
        {
            if (string.IsNullOrWhiteSpace(_key))
            {
                throw new ArgumentException("Key can not be null or white space!", nameof(_key));
            }

            using (var context = new GrabberDbContext())
            {
                var dbUser = context.DbUsers.FirstOrDefault(_dbUser => _dbUser.Key == _key);

                if (dbUser == null)
                {
                    return(false);
                }

                var userGroups = context.DbGroups.Where(_dbGroup => _dbGroup.DbUser.Id == dbUser.Id).ToArray();
                context.DbGroups.RemoveRange(userGroups);

                context.DbUsers.Remove(dbUser);

                context.SaveChanges();

                return(true);
            }
        }
Beispiel #2
0
        public User[] GetUsers()
        {
            using (var context = new GrabberDbContext())
            {
                var users = context.DbUsers.Select(_dbUser => new User(_dbUser.Token, _dbUser.Key,
                                                                       context.DbGroups.Where(_dbGroup => _dbGroup.DbUser.Id == _dbUser.Id).Select(_dbGroup =>
                                                                                                                                                   new Group(_dbGroup.GroupId, _dbGroup.UpdatePeriod, _dbGroup.GroupName)).ToArray()));

                return(users.ToArray());
            }
        }
Beispiel #3
0
        public void AddGroupToUser(string _key, Group _group)
        {
            if (string.IsNullOrWhiteSpace(_key))
            {
                throw new ArgumentException("Key can not be null or white space!", nameof(_key));
            }

            if (_group == null)
            {
                throw new ArgumentNullException(nameof(_group));
            }

            using (var context = new GrabberDbContext())
            {
                var dbUser = context.DbUsers.FirstOrDefault(_dbUser => _dbUser.Key == _key);

                if (dbUser == null)
                {
                    throw new ArgumentException($"User with key {_key} not found!");
                }

                var existedGroup = context.DbGroups.FirstOrDefault(_dbGroup =>
                                                                   _dbGroup.GroupId == _group.GroupId && _dbGroup.DbUser.Id == dbUser.Id);

                if (existedGroup == null)
                {
                    var dbGroup = new DbGroup
                    {
                        GroupId            = _group.GroupId,
                        GroupPrefix        = _group.Prefix,
                        GroupName          = _group.Name,
                        UpdatePeriod       = _group.UpdatePeriod,
                        DbUser             = dbUser,
                        LastUpdateDateTime = DateTime.Now.ToUniversalTime()
                    };

                    context.DbGroups.Add(dbGroup);
                }
                else
                {
                    throw new ArgumentException($"User already has group with id {_group.GroupId}");
                }

                context.SaveChanges();
            }
        }
Beispiel #4
0
        private void UpdateTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            m_updateTimer.Stop();

            try
            {
                using (var context = new GrabberDbContext())
                {
                    foreach (var dbUser in context.DbUsers.ToList())
                    {
                        var dtNow = DateTime.Now.ToUniversalTime();

                        var groupsToUpdate = context.DbGroups.ToList().Where(_dbGroup =>
                                                                             (_dbGroup.LastUpdateDateTime + _dbGroup.UpdatePeriod) < dtNow &&
                                                                             _dbGroup.DbUser.Id == dbUser.Id && !_dbGroup.IsUpdating).ToList();

                        if (groupsToUpdate.Any())
                        {
                            var startDateTime = groupsToUpdate.Select(_group => _group.LastUpdateDateTime).Min();

                            groupsToUpdate.ForEach(_group => _group.IsUpdating = true);

                            m_processor.Add(() => GetPostsFromGroup(dbUser, startDateTime, dtNow, groupsToUpdate));
                        }
                    }

                    context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                Log.Error("Failed to updateTick", ex);
            }

            m_updateTimer.Start();
        }
Beispiel #5
0
        //подумать про проверку токена
        public void AddUser(string _key, string _token)
        {
            using (var context = new GrabberDbContext())
            {
                var existUser = context.DbUsers.FirstOrDefault(_dbUser => _dbUser.Key == _key);

                if (existUser == null)
                {
                    var dbUser = new DbUser
                    {
                        Token = _token,
                        Key   = _key
                    };

                    context.DbUsers.Add(dbUser);

                    context.SaveChanges();
                }
                else
                {
                    throw new ArgumentException("User already exists!");
                }
            }
        }
Beispiel #6
0
        public User GetUser(string _key)
        {
            if (string.IsNullOrWhiteSpace(_key))
            {
                throw new ArgumentException("Key can not be null or white space!", nameof(_key));
            }

            using (var context = new GrabberDbContext())
            {
                var dbUser = context.DbUsers.FirstOrDefault(_user => _user.Key == _key);

                if (dbUser != null)
                {
                    var userGroups =
                        context.DbGroups.Where(_dbGroup => _dbGroup.DbUser.Id == dbUser.Id).Select(_dbGroup =>
                                                                                                   new Group(_dbGroup.GroupId, _dbGroup.UpdatePeriod, _dbGroup.GroupName)).ToArray();
                    var user = new User(dbUser.Token, dbUser.Key, userGroups);

                    return(user);
                }

                return(null);
            }
        }
Beispiel #7
0
        public bool RemoveGroupFromUser(string _key, Group _group)
        {
            if (string.IsNullOrWhiteSpace(_key))
            {
                throw new ArgumentException("Key can not be null or white space!", nameof(_key));
            }

            if (_group == null)
            {
                throw new ArgumentNullException(nameof(_group));
            }

            using (var context = new GrabberDbContext())
            {
                var dbUser = context.DbUsers.FirstOrDefault(_dbUser => _dbUser.Key == _key);

                if (dbUser != null)
                {
                    var dbGroup = context.DbGroups.FirstOrDefault(_dbGroup =>
                                                                  _dbGroup.GroupPrefix == _group.Prefix &&
                                                                  _dbGroup.GroupId == _group.GroupId &&
                                                                  _dbGroup.DbUser.Id == dbUser.Id);

                    if (dbGroup != null)
                    {
                        context.DbGroups.Remove(dbGroup);

                        context.SaveChanges();

                        return(true);
                    }
                }

                return(false);
            }
        }
Beispiel #8
0
        private void GetPostsFromGroup(DbUser _user, DateTime _start, DateTime _end, List <DbGroup> _groups)
        {
            try
            {
                var idsList = _groups.Select(Helpers.ConvertGroupToSourceId).ToArray();

                var sourceIds = string.Join(',', idsList);

                Log.Debug($"GetPostFromGroup with params User Id: {_user.Id} " +
                          $"User key: {_user.Key} from {_start} to {_end} with groups {sourceIds}");

                try
                {
                    var newsFeed = m_vkApi.GetNewsFeed(_user.Token, _start, _end, sourceIds);

                    var posts = m_feedToPostsConverter.Convert(newsFeed,
                                                               _groups.ToDictionary(_key => _key.GroupId, _value => _value.GroupName));

                    Log.Debug($"Getting {posts.Count} posts");

                    using (var context = new GrabberDbContext())
                    {
                        foreach (var group in _groups)
                        {
                            var dbGroup = context.DbGroups.FirstOrDefault(_dbGroup =>
                                                                          _dbGroup.GroupId == group.GroupId && _dbGroup.DbUser.Id == group.DbUser.Id);

                            if (dbGroup != null)
                            {
                                var postsFromGroup = posts.Where(_post => _post.GroupId == group.GroupId).ToList();

                                postsFromGroup.Sort(m_postComparer);

                                var lastUpdatedElem = postsFromGroup.FirstOrDefault(_post => _post.PostId == group.LastUpdatedPostId);

                                if (lastUpdatedElem != null)
                                {
                                    var index = postsFromGroup.IndexOf(lastUpdatedElem);

                                    postsFromGroup.Take(index + 1).ToList().ForEach(_post => posts.Remove(_post));

                                    postsFromGroup = postsFromGroup.Skip(index + 1).Take(postsFromGroup.Count - index + 1).ToList();

                                    Log.Debug("Finded post equals to " +
                                              $"lastUpdatedPost wiht id {group.LastUpdatedPostId}, cutting completed");
                                }

                                if (postsFromGroup.Count > 0)
                                {
                                    dbGroup.LastUpdatedPostId = postsFromGroup.Last().PostId;
                                }

                                dbGroup.LastUpdateDateTime = DateTime.Now.ToUniversalTime();
                                dbGroup.IsUpdating         = false;
                            }
                            else
                            {
                                Log.Error($"Can not find group with id {group.Id}");
                            }
                        }

                        context.SaveChanges();
                    }

                    NewDataGrabbedEventHandler?.Invoke(_user.Key, posts);
                }
                catch (Exception ex)
                {
                    using (var context = new GrabberDbContext())
                    {
                        foreach (var group in _groups)
                        {
                            var dbGroup = context.DbGroups.FirstOrDefault(_dbGroup =>
                                                                          _dbGroup.GroupId == group.GroupId && _dbGroup.DbUser.Id == group.DbUser.Id);

                            if (dbGroup != null)
                            {
                                dbGroup.IsUpdating = false;
                            }
                        }

                        context.SaveChanges();
                    }

                    throw ex;
                }
            }
            catch (Exception ex)
            {
                Log.Error("Error, while get posts from group", ex);
            }
        }