예제 #1
0
파일: IndexModule.cs 프로젝트: 06b/Dalian
        /// <summary>
        /// Gets the meta data.
        /// </summary>
        /// <param name="Url">The URL.</param>
        public static SitesMeta GetMetaData(string Url)
        {
            SitesMeta meta = new SitesMeta();

            var webGet   = new HtmlWeb();
            var document = new HtmlDocument();

            try
            {
                document = webGet.Load(Url);
            }
            catch (Exception ex)
            {
                if (ex.Message == "The underlying connection was closed: The connection was closed unexpectedly.")
                {
                    //Sometimes the default UserAgent errors out - possibly due to if the site is using some sort of UserAgent Sniffing

                    // Windows ME
                    webGet.UserAgent = "Opera/9.80 (Windows ME; U; Edition Campaign 21; en) Presto/2.6 Version/10.63";
                    document         = webGet.Load(Url);
                }
            }

            // Handle sites that might not exist anymore
            if (document.DocumentNode.FirstChild != null)
            {
                //Get the Title of the website
                meta.MetaTitle = document.DocumentNode.SelectSingleNode("//title").InnerText;

                //Get MetaTags of the website
                var metaTags = document.DocumentNode.SelectNodes("//meta");

                if (metaTags != null)
                {
                    foreach (var tag in metaTags)
                    {
                        //Check if Meta Description exists
                        if (tag.Attributes["name"] != null && tag.Attributes["content"] != null && tag.Attributes["name"].Value == "description")
                        {
                            meta.MetaDescription = tag.Attributes["content"].Value;
                        }

                        //Check if Meta Keywords exist
                        if (tag.Attributes["name"] != null && tag.Attributes["content"] != null && tag.Attributes["name"].Value == "keywords")
                        {
                            meta.MetaKeywords = tag.Attributes["content"].Value;
                        }
                    }
                }
            }

            return(meta);
        }
예제 #2
0
파일: IndexModule.cs 프로젝트: 06b/Dalian
        public IndexModule()
        {
            IDatabase db = new Database(ConfigurationManager.ConnectionStrings["db"].Name);

            Get["/"] = _ =>
            {
                //TODO: Maybe create some sort of dashboard? Worse case - just redirect to /sites?
                return(Response.AsRedirect("/sites"));
            };

            /// <summary>
            /// Retrieves all sites.
            /// </summary>
            Get["/sites"] = _ =>
            {
                List <Sites> sites = db.Fetch <Sites>();
                db.Dispose();

                Model = sites;

                return(View["index", Model]);
            };

            /// <summary>
            /// Retrieves a specific site
            /// </summary>
            Get["/sites/{siteId}"] = parameter =>
            {
                string Id = parameter.siteId;

                var site = db.FetchBy <Sites>(sql => sql.Where(x => x.SiteId == Id));

                List <Tags>     AllTags = db.Fetch <Tags>().ToList();
                List <SiteTags> Tags    = db.FetchBy <SiteTags>(sql => sql.Where(x => x.SiteId == Id)).ToList();

                List <Tags> tagList = AllTags.Where(allTags => Tags.Select(tags => tags.TagId).Contains(allTags.TagId)).ToList();

                bool          firstCSV = true;
                StringBuilder tagsCSV  = new StringBuilder();
                foreach (var tag in tagList)
                {
                    if (!firstCSV)
                    {
                        tagsCSV.Append(",");
                    }
                    tagsCSV.Append(tag.TagName);
                    firstCSV = false;
                }

                Model.site = site;
                Model.tags = tagsCSV.ToString();

                db.Dispose();

                return(View["update", Model]);
            };

            Post["/sites/meta"] = parameter =>
            {
                string requestedUrl = string.Empty;
                if (Request.Form.Values.Count > 0)
                {
                    foreach (var i in Request.Form.Values)
                    {
                        if (!string.IsNullOrWhiteSpace(requestedUrl))
                        {
                            break;
                        }
                        requestedUrl = i;
                    }
                }

                if (UriChecker.IsValidURI(requestedUrl))
                {
                    SitesMeta metadata = GetMetaData(requestedUrl);
                    return(Response.AsJson(metadata));
                }
                else
                {
                    return(HttpStatusCode.BadRequest);
                }
            };

            /// <summary>
            /// Update a specific site
            /// </summary>
            Put["/sites/{siteId}"] = parameter =>
            {
                string Id = parameter.siteId;

                Sites snapshot = db.FetchBy <Sites>(sql => sql.Where(x => x.SiteId == Id)).FirstOrDefault();

                Sites site = this.Bind <Sites>();

                // Don't clear out fields existing fields.
                site.Active          = snapshot.Active;
                site.DateTime        = snapshot.DateTime;
                site.MetaTitle       = snapshot.MetaTitle;
                site.MetaDescription = snapshot.MetaDescription;
                site.MetaKeywords    = snapshot.MetaKeywords;

                db.Update(site);
                db.Dispose();

                string        TagsPost = Request.Form.Tags.Value;
                List <string> Tags     = TagsPost.ToLower().Split(',').Select(s => s.Trim()).ToList();

                List <Tags> AllTags = db.Fetch <Tags>();
                db.Dispose();

                List <string> AllTagNames = AllTags.Select(tn => tn.TagName).ToList();

                //Delete all existing Tags for current site before linking up any new tags
                db.Delete <SiteTags>("where SiteId = @0", Id);
                db.Dispose();

                foreach (string tag in Tags)
                {
                    if (!AllTagNames.Contains(tag))
                    {
                        Tags newTag = new Tags();

                        newTag.TagId   = ShortGuid.NewGuid().ToString();
                        newTag.TagName = tag;
                        newTag.Active  = true;

                        db.Insert(newTag);
                        db.Dispose();

                        SiteTags newSiteTag = new SiteTags();
                        newSiteTag.SiteId = site.SiteId;
                        newSiteTag.TagId  = newTag.TagId;

                        db.Insert(newSiteTag);

                        db.Dispose();
                    }
                    else
                    {
                        try
                        {
                            var ExistingTag = db.FetchBy <Tags>(sql => sql.Where(x => x.TagName == tag)).FirstOrDefault();

                            SiteTags newSiteTag = new SiteTags();
                            newSiteTag.SiteId = site.SiteId;
                            newSiteTag.TagId  = ExistingTag.TagId;

                            db.Insert(newSiteTag);

                            db.Dispose();
                        }
                        catch
                        {
                            //Move along
                        }
                    }
                }



                return(Response.AsRedirect("/sites/" + Id));
            };

            /// <summary>
            /// View for adding a new site
            /// </summary>
            Get["/sites/new"] = _ =>
            {
                return(View["sites", Model]);
            };

            Post["/sites/bulk"] = _ =>
            {
                var file = Request.Files.FirstOrDefault();

                if (file != null)
                {
                    var reader    = new NetscapeBookmarksReader();
                    var bookmarks = reader.Read(file.Value);
                    foreach (var b in bookmarks.AllLinks)
                    {
                        //Don't create new bookmark if it already exists
                        if (!CheckIfBookmarkAlreadyExists(b.Url))
                        {
                            Debug.WriteLine("Type {0}, Title: {1}", b.GetType().Name, b.Title);
                        }
                    }
                }

                return(Response.AsRedirect("/sites"));
            };

            /// <summary>
            /// Creates a new site
            /// </summary>
            Post["/sites"] = parameters =>
            {
                Sites site = this.Bind <Sites>();

                //Don't create new bookmark if it already exists
                if (!CheckIfBookmarkAlreadyExists(site.Url))
                {
                    site.SiteId   = ShortGuid.NewGuid().ToString();
                    site.Active   = true;
                    site.DateTime = DateTime.UtcNow;

                    //Get the MetaData if it is a valid URI
                    if (UriChecker.IsValidURI(site.Url))
                    {
                        SitesMeta metadata = GetMetaData(site.Url);

                        site.MetaTitle       = metadata.MetaTitle;
                        site.MetaDescription = metadata.MetaDescription;
                        site.MetaKeywords    = metadata.MetaKeywords;
                    }

                    db.Insert(site);
                    db.Dispose();

                    //Get the tags for the bookmark and split them to a list
                    string        TagsPost = Request.Form.Tags.Value;
                    List <string> Tags     = TagsPost.ToLower().Split(',').Select(s => s.Trim()).ToList();

                    //Get all of the existing tags
                    List <Tags> AllTags = db.Fetch <Tags>();
                    db.Dispose();

                    //Get a list of the TagNames from of all the existing tags
                    List <string> AllTagNames = AllTags.Select(tn => tn.TagName).ToList();

                    //Check if the tag for the current bookmark already exists in the list of tags
                    foreach (string tag in Tags)
                    {
                        //Add a new tag since it doesn't exist
                        if (!AllTagNames.Contains(tag))
                        {
                            Tags newTag = new Tags();

                            newTag.TagId   = ShortGuid.NewGuid().ToString();
                            newTag.TagName = tag;
                            newTag.Active  = true;

                            db.Insert(newTag);

                            //Link the tag with the site
                            SiteTags newSiteTag = new SiteTags();
                            newSiteTag.SiteId = site.SiteId;
                            newSiteTag.TagId  = newTag.TagId;

                            db.Insert(newSiteTag);

                            db.Dispose();
                        }
                        else
                        {
                            //Since the tag already exists, just link the tag with the site
                            var ExistingTag = db.FetchBy <Tags>(sql => sql.Where(x => x.TagName == tag)).FirstOrDefault();

                            SiteTags newSiteTag = new SiteTags();
                            newSiteTag.SiteId = site.SiteId;
                            newSiteTag.TagId  = ExistingTag.TagId;

                            db.Insert(newSiteTag);

                            db.Dispose();
                        }
                    }


                    //Redirect to the new site
                    return(Context.GetRedirect("~/sites/" + site.SiteId));
                }

                //TODO: Probably would be better to redirect to the existing page.
                return(Response.AsRedirect("/sites"));
            };
        }