public static void ClearSourceContents(int sourceId)
        {
            using (Models.ICContext context = new Models.ICContext())
            {
                string cmdText = @"
            Delete P
            From UserSourceContentLink P
            Join SourceContent Q on P.SourceContentId=Q.SourceContentId
            Where Q.SourceId=" + sourceId;
                context.Database.ExecuteSqlCommand(cmdText);

                cmdText = @"
            Delete P
            From UserSourceContentFavorLink P
            Join SourceContent Q on P.SourceContentId=Q.SourceContentId
            Where Q.SourceId=" + sourceId;
                context.Database.ExecuteSqlCommand(cmdText);

                cmdText = @"
            Delete Q
            From SourceContent Q
            Where Q.SourceId=" + sourceId;
                context.Database.ExecuteSqlCommand(cmdText);
            }
        }
 public static UserProfile GetUser(string userName)
 {
     using (ICContext db = new ICContext())
     {
         return db.UserProfiles.FirstOrDefault(u => u.UserName.ToLower() == userName.ToLower());
     }
 }
        public static void ClearAllSourceContents(int interval)
        {
            using (Models.ICContext context = new Models.ICContext())
            {
                string endTime = DateTime.Now.AddDays(-interval).ToString("yyyy-MM-dd HH:mm:ss");
                string cmdText = @"
            Delete P
            From UserSourceContentLink P
            Join SourceContent Q on P.SourceContentId=Q.SourceContentId
            Where Q.AddTime<'" + endTime + "'";
                context.Database.ExecuteSqlCommand(cmdText);

                cmdText = @"
            Delete P
            From UserSourceContentFavorLink P
            Join SourceContent Q on P.SourceContentId=Q.SourceContentId
            Where Q.AddTime<'" + endTime + "'";
                context.Database.ExecuteSqlCommand(cmdText);

                cmdText = @"
            Delete P
            From SourceContent P
            Where P.AddTime<'" + endTime + "'";
                context.Database.ExecuteSqlCommand(cmdText);
            }
        }
 public static void RemoveLink(int userId, int sourceContentId)
 {
     using (Models.ICContext context = new Models.ICContext())
     {
         var UserSourceContentLink = context.UserSourceContentLinks.Where(p => p.UserId == userId && p.SourceContentId == sourceContentId).FirstOrDefault();
         if (UserSourceContentLink != null)
         {
             context.UserSourceContentLinks.Remove(UserSourceContentLink);
             context.SaveChanges();
         }
     }
 }
 public static void AddFavorLink(int userId, int sourceContentId)
 {
     using (Models.ICContext context = new Models.ICContext())
     {
         var UserSourceContentFavorLink = context.UserSourceContentFavorLinks.Where(p => p.UserId == userId && p.SourceContentId == sourceContentId).FirstOrDefault();
         if (UserSourceContentFavorLink == null)
         {
             context.UserSourceContentFavorLinks.Add(new Models.UserSourceContentFavorLink
             {
                 UserId = userId,
                 SourceContentId = sourceContentId
             });
             context.SaveChanges();
         }
     }
 }
        /// <summary>
        /// Reload Source regex list
        /// </summary>
        public static void ReloadSourceRegexes()
        {
            allGroupRegexes.Clear();

            using (Models.ICContext context = new Models.ICContext())
            {
                foreach (var regexGroup in context.SourceRegexGroups.Where(p => p.Domain == "All"))
                {
                    var regexes = regexGroup.SourceRegexes.ToList();
                    if (regexes.Count > 0)
                    {
                        allGroupRegexes.Add(new SourceContentRegexGroup(regexGroup.Name, regexGroup.Regex, regexGroup.Decode, regexes));
                    }
                }
            }
        }
 public static IList<Models.SourceContentView> GetUserUnReadContents(int companyId, int userId, string keywords, string province, DateTime beginDate, DateTime endDate, int page, int pageSize, out int count)
 {
     using (Models.ICContext context = new Models.ICContext())
     {
         var query = (from p in context.Sources
                      join q in context.SourceContents
                          on p.SourceId equals q.SourceId
                      join s in context.UserSourceLinks
                         on p.SourceId equals s.SourceId
                      join r in context.UserSourceContentLinks
                          on new { s.UserId, q.SourceContentId } equals new { r.UserId, r.SourceContentId }
                      join f in context.UserSourceContentFavorLinks
                          on new { s.UserId, q.SourceContentId } equals new { f.UserId, f.SourceContentId }
                      into fDefault
                      from fD in fDefault.DefaultIfEmpty()
                      where p.Company == companyId
                         && s.UserId == userId
                         && (string.IsNullOrEmpty(keywords) || q.Content.Contains(keywords))
                         && (string.IsNullOrEmpty(province) || s.SourceName.Contains(province))
                         && q.SourceDate >= beginDate && q.SourceDate <= endDate
                      orderby q.AddDate descending, q.AddHour - (q.AddHour % s.Interval) descending, q.SourceDate descending
                      select new Models.SourceContentView
                      {
                          SourceId = p.SourceId,
                          IsNew = true,
                          IsFavor = fD != null,
                          Source = s.SourceName,
                          SourceContentId = q.SourceContentId,
                          SourceDate = q.SourceDate,
                          AddTime = q.AddTime,
                          AddDate = q.AddDate,
                          AddHours = q.AddHour - (q.AddHour % s.Interval),
                          Content = q.Content,
                          ContentType = q.ContentType,
                          Url = q.Url
                      });
         count = query.Count();
         return query.Skip(page > 0 ? page * pageSize - pageSize : 0).Take(pageSize).ToList();
     }
 }
 public static IList<Models.SourceContent> GetSourceContents(int sourceId)
 {
     using (Models.ICContext context = new Models.ICContext())
     {
         return context.SourceContents.Where(p => p.SourceId == sourceId).ToList();
     }
 }
 public static IList<Models.SourceContentView> GetAllSourceContents(int companyId, string keywords, string province, DateTime beginDate, DateTime endDate, int page, int pageSize, out int count)
 {
     using (Models.ICContext context = new Models.ICContext())
     {
         var query = (from p in context.Sources
                      join q in context.SourceContents
                          on p.SourceId equals q.SourceId
                      where p.Company == companyId
                         && (string.IsNullOrEmpty(keywords) || q.Content.Contains(keywords))
                         && (string.IsNullOrEmpty(province) || p.SourceName.Contains(province))
                         && q.SourceDate >= beginDate && q.SourceDate <= endDate
                      orderby q.AddTime descending, q.SourceDate descending
                      select new Models.SourceContentView
                      {
                          SourceId = p.SourceId,
                          IsNew = false,
                          IsFavor = false,
                          SourceContentId = q.SourceContentId,
                          SourceDate = q.SourceDate,
                          AddTime = q.AddTime,
                          AddDate = q.AddDate,
                          AddHours = q.AddHour,
                          Content = q.Content,
                          ContentType = q.ContentType,
                          Source = p.SourceName,
                          Url = q.Url
                      });
         count = query.Count();
         return query.Skip(page > 0 ? page * pageSize - pageSize : 0).Take(pageSize).ToList();
     }
 }
 public static List<Models.SourceView> GetSourceList(int userId, string search, int page, int pageSize, out int count)
 {
     using (Models.ICContext context = new Models.ICContext())
     {
         var query = (from p in context.Sources
                 join q in context.UserSourceLinks
                 on p.SourceId equals q.SourceId
                 where q.UserId == userId &&
                 (String.IsNullOrEmpty(search) || q.SourceName.Contains(search))
                 orderby q.SourceName
                 select new Models.SourceView
                 {
                     SourceId = p.SourceId,
                     SourceName = q.SourceName,
                     Url = p.Url,
                     CreateTime = q.CreateTime,
                     Interval = q.Interval
                 });
         count = query.Count();
         return query.Skip(page > 0 ? page * pageSize - pageSize : 0).Take(pageSize).ToList();
     }
 }
 public UserController()
 {
     this.context = new ICContext();
 }
 /// <summary>
 /// Get watched sources
 /// </summary>
 private IList<Models.Source> GetWatchedSources()
 {
     using (Models.ICContext context = new Models.ICContext())
     {
         return (from p in context.Sources.Where(p => p.Interval > 0).ToList()
                              //join q in this.WatchedSources
                              //on p.SourceId equals q.SourceId into watchedSourcesDefault
                              //from r in watchedSourcesDefault.DefaultIfEmpty()
                              //where r == null
                              select p).ToList();
     }
 }
        public static void AddSource(int company, int userId, Models.SourceView userSource)
        {
            if (string.IsNullOrEmpty(userSource.SourceName) || string.IsNullOrEmpty(userSource.Url))
            {
                throw new ArgumentException("任务名称和任务地址不能为空!");
            }

            if (!(userSource.Url.StartsWith("http://") || userSource.Url.StartsWith("https://")))
            {
                userSource.Url = "http://" + userSource.Url;
            }

            using (Models.ICContext context = new Models.ICContext())
            {
                if (userSource.SourceId > 0)
                {
                    var sourceInDB = context.UserSourceLinks.Where(p => p.UserId == userId && p.SourceId == userSource.SourceId).FirstOrDefault();
                    if (sourceInDB != null)
                    {
                        sourceInDB.SourceName = userSource.SourceName;
                        sourceInDB.Interval = userSource.Interval;
                        context.SaveChanges();
                    }
                }
                else
                {
                    var sourceInDB = context.Sources.Where(p => p.Url == userSource.Url).FirstOrDefault();
                    Models.UserSourceLink userSourceLinkInDB = null;
                    if (sourceInDB == null)
                    {
                        Models.Source source = new Models.Source()
                        {
                            SourceName = userSource.SourceName,
                            Url = userSource.Url,
                            Domain = GetDomain(userSource.Url),
                            Interval = userSource.Interval,
                            CreateTime = DateTime.Now,
                            Company = company,
                            SourceType = 1
                        };

                        source.SourceUrls.Add(new Models.SourceUrl {
                             Url = userSource.Url,
                             Enabled = true
                        });

                        source.UserSourceLinks.Add(new Models.UserSourceLink()
                        {
                            Source = sourceInDB,
                            SourceName = userSource.SourceName,
                            Interval = userSource.Interval,
                            UserId = userId,
                            CreateTime = DateTime.Now,
                            UpdateTime = DateTime.Now
                        });

                        context.Sources.Add(source);
                        context.SaveChanges();

                        // collect system info
                        SourceContentManager.ReloadSourceRegexes();
                        SourceContentManager.Collect(source, DateTime.Now, SourceContentType.System);
                    }
                    else
                    {
                        userSourceLinkInDB = sourceInDB.UserSourceLinks.Where(p => p.UserId == userId).FirstOrDefault();
                        if (userSourceLinkInDB == null)
                        {
                            userSourceLinkInDB = new Models.UserSourceLink()
                            {
                                SourceName = userSource.SourceName,
                                Interval = userSource.Interval,
                                Source = sourceInDB,
                                UserId = userId,
                                CreateTime = DateTime.Now,
                                UpdateTime = DateTime.Now
                            };
                            sourceInDB.UserSourceLinks.Add(userSourceLinkInDB);
                            context.SaveChanges();

                            var queryDate = DateTime.Now.Date.AddMonths(-1);
                            var sourceCotents = context.SourceContents.Where(p => p.SourceId == sourceInDB.SourceId && p.SourceDate >= queryDate).ToList();
                            if (sourceCotents.Count > 0)
                            {
                                foreach (var sourceContent in sourceCotents)
                                {
                                    sourceContent.UserSourceContentLinks.Add(new Models.UserSourceContentLink
                                    {
                                        UserId = userId
                                    });
                                }
                            }

                            context.SaveChanges();
                        }
                    }
                }
            }
        }
        public static void RemoveSource(int userId, int sourceId)
        {
            using (Models.ICContext context = new Models.ICContext())
            {
                context.Database.ExecuteSqlCommand(@"
            Delete From P
            From UserSourceContentLink P
             join SourceContent Q on P.SourceContentId=Q.SourceContentId
             join UserSourceLink R on Q.SourceId=R.SourceId
            Where P.UserId = {0} and R.SourceId = {1}", userId, sourceId);

                context.Database.ExecuteSqlCommand(@"
            Delete From P
            From UserSourceContentFavorLink P
             join SourceContent Q on P.SourceContentId=Q.SourceContentId
             join UserSourceLink R on Q.SourceId=R.SourceId
            Where P.UserId = {0} and R.SourceId = {1}", userId, sourceId);

                context.Database.ExecuteSqlCommand(@"
            Delete From UserSourceLink
            Where UserId = {0} and SourceId = {1}", userId, sourceId); ;
            }
        }
 public static List<Models.SourceView> GetSourceList(int userId)
 {
     using (Models.ICContext context = new Models.ICContext())
     {
         var query = (from p in context.Sources
                      join q in context.UserSourceLinks
                      on p.SourceId equals q.SourceId
                      where q.UserId == userId
                      orderby q.SourceName
                      select new Models.SourceView
                      {
                          SourceId = p.SourceId,
                          SourceName = q.SourceName,
                          Url = p.Url,
                          CreateTime = q.CreateTime,
                          Interval = q.Interval
                      });
         return query.ToList();
     }
 }
 public static List<Models.Source> GetSourceList()
 {
     using (Models.ICContext context = new Models.ICContext())
     {
         return context.Sources.OrderBy(p => p.SourceName).ToList();
     }
 }
        /// <summary>
        /// Get source content
        /// </summary>
        /// <param name="source">watched source</param>
        /// <param name="collectTime">collect time</param>
        public static void Collect(Models.Source source, DateTime collectTime, SourceContentType sourceContentType)
        {
            using (Models.ICContext context = new Models.ICContext())
            {
                var userSourceLinks = context.UserSourceLinks.Where(p => p.SourceId == source.SourceId).ToList();
                if (userSourceLinks.Count == 0)
                {
                    return;
                }

                var sourceUrls = context.SourceUrls.Where(p => p.SourceId == source.SourceId && p.Enabled).ToList();
                foreach (var sourceUrl in sourceUrls)
                {
                    string response = Utility.RequestHelper.GetResponse(sourceUrl.Url);

                    var regexGroups = context.SourceRegexGroups.Where(p => p.Domain == source.Domain).ToList();
                    if (regexGroups != null && regexGroups.Count > 0)
                    {
                        List<SourceContentRegexGroup> groupRegexes = new List<SourceContentRegexGroup>();
                        foreach (var regexGroup in regexGroups)
                        {
                            var regexes = regexGroup.SourceRegexes.ToList();
                            if (regexes.Count > 0)
                            {
                                groupRegexes.Add(new SourceContentRegexGroup(regexGroup.Name, regexGroup.Regex, regexGroup.Decode, regexes));
                            }
                        }

                        Collect(source, userSourceLinks, collectTime, sourceContentType, context, response, groupRegexes);
                    }
                    else
                    {
                        Collect(source, userSourceLinks, collectTime, sourceContentType, context, response, allGroupRegexes);
                    }
                }
            }
        }
 public static Models.Source GetSource(int id)
 {
     using (Models.ICContext context = new Models.ICContext())
     {
         return context.Sources.Find(id);
     }
 }