using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Web;
|
|
using System.Web.Hosting;
|
|
using System.Xml.Linq;
|
|
using System.Xml.XPath;
|
|
|
|
public static class Storage
|
|
{
|
|
private static string _folder = HostingEnvironment.MapPath("~/posts/");
|
|
|
|
public static List<Post> GetAllPosts()
|
|
{
|
|
if (HttpRuntime.Cache["posts"] == null)
|
|
LoadPosts();
|
|
|
|
if (HttpRuntime.Cache["posts"] != null)
|
|
{
|
|
return (List<Post>)HttpRuntime.Cache["posts"];
|
|
}
|
|
return new List<Post>();
|
|
}
|
|
|
|
public static void Save(Post post)
|
|
{
|
|
string file = Path.Combine(_folder, post.ID + ".xml");
|
|
post.LastModified = DateTime.UtcNow;
|
|
|
|
XDocument doc = new XDocument(
|
|
new XElement("post",
|
|
new XElement("title", post.Title),
|
|
new XElement("slug", post.Slug),
|
|
new XElement("author", post.Author),
|
|
new XElement("pubDate", post.PubDate.ToString("yyyy-MM-dd HH:mm:ss")),
|
|
new XElement("lastModified", post.LastModified.ToString("yyyy-MM-dd HH:mm:ss")),
|
|
new XElement("content", post.Content),
|
|
new XElement("ispublished", post.IsPublished),
|
|
new XElement("categories", string.Empty),
|
|
new XElement("comments", string.Empty)
|
|
));
|
|
|
|
XElement categories = doc.XPathSelectElement("post/categories");
|
|
foreach (string category in post.Categories)
|
|
{
|
|
categories.Add(new XElement("category", category));
|
|
}
|
|
|
|
XElement comments = doc.XPathSelectElement("post/comments");
|
|
foreach (Comment comment in post.Comments)
|
|
{
|
|
comments.Add(
|
|
new XElement("comment",
|
|
new XElement("author", comment.Author),
|
|
new XElement("email", comment.Email),
|
|
new XElement("website", comment.Website),
|
|
new XElement("ip", comment.Ip),
|
|
new XElement("userAgent", comment.UserAgent),
|
|
new XElement("date", comment.PubDate.ToString("yyyy-MM-dd HH:m:ss")),
|
|
new XElement("content", comment.Content),
|
|
new XAttribute("isAdmin", comment.IsAdmin),
|
|
new XAttribute("isApproved", comment.IsApproved),
|
|
new XAttribute("id", comment.ID)
|
|
));
|
|
}
|
|
|
|
if (!File.Exists(file)) // New post
|
|
{
|
|
var posts = GetAllPosts();
|
|
posts.Insert(0, post);
|
|
posts.Sort((p1, p2) => p2.PubDate.CompareTo(p1.PubDate));
|
|
HttpRuntime.Cache.Insert("posts", posts);
|
|
}
|
|
|
|
doc.Save(file);
|
|
}
|
|
|
|
public static void Delete(Post post)
|
|
{
|
|
var posts = GetAllPosts();
|
|
string file = Path.Combine(_folder, post.ID + ".xml");
|
|
File.Delete(file);
|
|
posts.Remove(post);
|
|
}
|
|
|
|
private static void LoadPosts()
|
|
{
|
|
if (!Directory.Exists(_folder))
|
|
Directory.CreateDirectory(_folder);
|
|
|
|
List<Post> list = new List<Post>();
|
|
|
|
foreach (string file in Directory.GetFiles(_folder, "*.xml", SearchOption.TopDirectoryOnly))
|
|
{
|
|
XElement doc = XElement.Load(file);
|
|
|
|
Post post = new Post()
|
|
{
|
|
ID = Path.GetFileNameWithoutExtension(file),
|
|
Title = ReadValue(doc, "title"),
|
|
Author = ReadValue(doc, "author"),
|
|
Content = ReadValue(doc, "content"),
|
|
Slug = ReadValue(doc, "slug").ToLowerInvariant(),
|
|
PubDate = DateTime.Parse(ReadValue(doc, "pubDate")),
|
|
LastModified = DateTime.Parse(ReadValue(doc, "lastModified", DateTime.Now.ToString())),
|
|
IsPublished = bool.Parse(ReadValue(doc, "ispublished", "true")),
|
|
};
|
|
|
|
LoadCategories(post, doc);
|
|
LoadComments(post, doc);
|
|
list.Add(post);
|
|
}
|
|
|
|
if (list.Count > 0)
|
|
{
|
|
list.Sort((p1, p2) => p2.PubDate.CompareTo(p1.PubDate));
|
|
HttpRuntime.Cache.Insert("posts", list);
|
|
}
|
|
}
|
|
|
|
private static void LoadCategories(Post post, XElement doc)
|
|
{
|
|
XElement categories = doc.Element("categories");
|
|
if (categories == null)
|
|
return;
|
|
|
|
List<string> list = new List<string>();
|
|
|
|
foreach (var node in categories.Elements("category"))
|
|
{
|
|
list.Add(node.Value);
|
|
}
|
|
|
|
post.Categories = list.ToArray();
|
|
}
|
|
private static void LoadComments(Post post, XElement doc)
|
|
{
|
|
var comments = doc.Element("comments");
|
|
|
|
if (comments == null)
|
|
return;
|
|
|
|
foreach (var node in comments.Elements("comment"))
|
|
{
|
|
Comment comment = new Comment()
|
|
{
|
|
ID = ReadAttribute(node, "id"),
|
|
Author = ReadValue(node, "author"),
|
|
Email = ReadValue(node, "email"),
|
|
Website = ReadValue(node, "website"),
|
|
Ip = ReadValue(node, "ip"),
|
|
UserAgent = ReadValue(node, "userAgent"),
|
|
IsAdmin = bool.Parse(ReadAttribute(node, "isAdmin", "false")),
|
|
IsApproved = bool.Parse(ReadAttribute(node, "isApproved", "true")),
|
|
Content = ReadValue(node, "content").Replace("\n", "<br />"),
|
|
PubDate = DateTime.Parse(ReadValue(node, "date", "2000-01-01")),
|
|
};
|
|
|
|
post.Comments.Add(comment);
|
|
}
|
|
}
|
|
|
|
private static string ReadValue(XElement doc, XName name, string defaultValue = "")
|
|
{
|
|
if (doc.Element(name) != null)
|
|
return doc.Element(name).Value;
|
|
|
|
return defaultValue;
|
|
}
|
|
|
|
private static string ReadAttribute(XElement element, XName name, string defaultValue = "")
|
|
{
|
|
if (element.Attribute(name) != null)
|
|
return element.Attribute(name).Value;
|
|
|
|
return defaultValue;
|
|
}
|
|
}
|