Пример #1
0
        public IActionResult UpdateArticle(ArticleModel model)
        {
            if (ModelState.IsValid)
            {
                using (var db = new FusekiContext())
                {
                    var article = db.Articles
                                  .Include(aa => aa.Tags)
                                  .First(el => el.Id == model.Id);
                    //allow extended chars in title. But links and finding will strip them.
                    article.Title = model.Title;

                    var normalized = Renderer.Normalize(model.Body);
                    article.Body = normalized;

                    var now = DateTime.Now;
                    article.Updated = now;

                    if (article.Created == DateTime.MinValue)
                    {
                        article.Created = now;
                    }

                    //rectify tags.
                    var empty = new List <string>();
                    var tags  = model.Tags?.Split(",").Select(el => el.Trim()) ?? new string[0];

                    var newTagNames = tags
                                      .Select(el => el.Trim())
                                      .Where(ee => !string.IsNullOrWhiteSpace(ee))
                                      .ToHashSet();

                    var existingTags = article.Tags.Select(el => el.Name).ToHashSet();

                    var todelete = existingTags.Except(newTagNames);
                    var toadd    = newTagNames.Except(existingTags);

                    foreach (var bad in todelete)
                    {
                        var tag = db.Tags.Where(el => el.ArticleId == article.Id && el.Name == bad).First();
                        db.Remove(tag);
                    }

                    foreach (var good in toadd)
                    {
                        var tag = CreateTag(article, good);
                        db.Add(tag);
                    }
                    db.SaveChanges();
                    return(Redirect($"../{model.Title}"));
                }
            }
            else
            {
                return(View());
            }
        }
Пример #2
0
        public IActionResult SetTags(int id, string tagLine = "")
        {
            if (string.IsNullOrEmpty(tagLine))
            {
                tagLine = "";
            }
            var newTags      = Helpers.TagLine2Tags(tagLine);
            var didSomething = false;
            var result       = "";

            using (var db = new FusekiContext())
            {
                var image = db.Images
                            .Include(el => el.ImageTags)
                            .FirstOrDefault(el => el.Id == id);
                var exiTags = image.ImageTags ?? new List <ImageTag>();
                //exiTags = new List<ImageTag>();
                var toDelete = new List <ImageTag>();
                foreach (var tag in newTags)
                {
                    if (exiTags.FirstOrDefault(el => el.Name == tag) == null)
                    {
                        var newImageTag = new ImageTag();
                        newImageTag.Image = image;
                        newImageTag.Name  = tag;
                        db.Add(newImageTag);
                        didSomething = true;
                        result      += $"\ncreated new tag for image: {tag}";
                    }
                }

                foreach (var exiTag in exiTags)
                {
                    if (newTags.FirstOrDefault(el => el == exiTag.Name) == null)
                    {
                        db.Remove(exiTag);
                        didSomething = true;
                        result      += $"\nremoved old tag on image: {exiTag.Name}";
                    }
                }
                if (didSomething)
                {
                    db.SaveChanges();
                }
            }

            var arm = new ActionResultModel();

            arm.NextLink            = "/image/viewall";
            arm.NextLinkDescription = "back to image list";
            arm.SetResult(result);

            return(View("ActionResult", arm));
        }
Пример #3
0
        public IActionResult CreateArticle()
        {
            using (var db = new FusekiContext())
            {
                var article = new Article();
                var rnd     = new System.Random();
                article.Title = $"draft{rnd.Next(1000)}";
                article.Body  = "";
                var a = db.Add(article);

                db.SaveChanges();
                return(Redirect($"article/edit/{a.Entity.Title}"));
            }
        }
Пример #4
0
        public IActionResult Publish()
        {
            var model = new PublicationResultModel();

            var publishResult = Publisher.Publish();

            var publication = new Publication();

            publication.ArticleCount    = publishResult.Count;
            publication.PublicationTime = DateTime.Now;
            using (var db = new FusekiContext())
            {
                db.Add(publication);
                db.SaveChanges();
            }
            model.Publication = publication;
            ViewData["Title"] = $"PublicationResult";
            return(View("PublicationResult", model));
        }
Пример #5
0
        public IActionResult RestoreImages()
        {
            var images = System.IO.Directory.GetFiles(PublishConfiguration.ImageSource).Select(el => el.Replace(PublishConfiguration.ImageSource, "").Replace("\\", ""));

            using (var db = new FusekiContext())
            {
                foreach (var imagefn in images)
                {
                    var exi = db.Images.FirstOrDefault(el => el.Filename == imagefn);
                    if (exi == null)
                    {
                        var image = new Image();
                        image.Filename = imagefn;
                        db.Add(image);
                    }
                }
                db.SaveChanges();
            }

            return(null);
        }
Пример #6
0
        public IActionResult UploadPost(UploadFileModel file, string tagLine)
        {
            //possibly accept the override filename

            var filename = file.Image.FileName;

            if (string.IsNullOrEmpty(file.Filename))
            {
                file.Filename = file.Filename.ToLower();
            }
            else
            {
                filename = file.Filename;
            }

            filename = CleanFilename(filename);

            if (!ValidateImageExtension(filename))
            {
                var extFromImage = Path.GetExtension(file.Image.FileName);

                if (ValidateImageExtension(extFromImage))
                {
                    filename = filename + extFromImage;
                }
                else
                {
                    throw new Exception("Invalid extension on filename" + filename);
                }
            }

            var targetPath = $"{PublishConfiguration.ImageSource}/{filename}";

            if (System.IO.File.Exists(targetPath))
            {
                throw new System.Exception("Already exists.");
            }

            using (var stream = System.IO.File.Create(targetPath))
            {
                file.Image.CopyTo(stream);
            }

            using (var db = new FusekiContext())
            {
                var image = new Image();
                image.Filename = filename;
                db.Add(image);
                var tags = Helpers.TagLine2Tags(tagLine);
                foreach (var tag in tags)
                {
                    var t = new ImageTag();
                    t.Image = image;
                    t.Name  = tag;
                    db.Add(t);
                }
                db.SaveChanges();
            }

            var arm = new ActionResultModel();

            arm.NextLink            = "/image/upload";
            arm.NextLinkDescription = "Return to image upload";
            arm.SetResult("Uploaded image");
            return(View("ActionResult", arm));
        }
Пример #7
0
        public static void Process(string fp, bool published)
        {
            var lines = System.IO.File.ReadLines(fp);

            if (!lines.Any())
            {
                return;
            }
            if (lines.Count() == 1)
            {
                return;
            }
            var title = lines.Skip(1)?.Take(1).First().Trim();

            if (string.IsNullOrEmpty(title))
            {
                return;
            }

            using (var db = new FusekiContext())
            {
                var exi = db.Articles.FirstOrDefault(el => el.Title == title);
                if (exi != null)
                {
                    return;
                }

                var tagline = lines.Last();
                while (string.IsNullOrEmpty(tagline))
                {
                    lines   = lines.Take(lines.ToList().Count - 1);
                    tagline = lines.Last();
                }

                if (!tagline.StartsWith("tags:"))
                {
                    tagline = "tags:";
                }

                var tags = Helpers.TagLine2Tags(tagline.Split("tags:")[1]);

                lines = lines.Skip(4);
                lines = lines.Take(lines.ToList().Count - 1);

                var now = DateTime.Now;

                var article = new Article();
                article.Title     = title;
                article.Body      = string.Join("\n", lines);
                article.Created   = now;
                article.Updated   = now;
                article.Published = published;

                db.Add(article);
                db.SaveChanges();
                var articleEntity = db.Articles.First(el => el.Title == title);
                foreach (var tagname in tags)
                {
                    var tag = new Tag();
                    tag.Article = articleEntity;
                    tag.Name    = tagname;
                    tag.Updated = now;
                    tag.Created = now;
                    db.Add(tag);
                }
                ;
                db.SaveChanges();
            }
        }