Files
OurUmbraco/OurUmbraco/Repository/Projects.cs
T

389 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Web;
using System.Xml;
using System.Xml.XPath;
using OurUmbraco.Wiki.BusinessLogic;
using umbraco.cms.businesslogic.web;
using umbraco.presentation.nodeFactory;
namespace OurUmbraco.Repository
{
public class Packages
{
protected const int _projectsRoot = 1113;
protected const string _projectAlias = "Project";
protected const string _projectGroupAlias = "ProjectGroup";
//used by the repo webservice
public static SubmitStatus SubmitPackageAsProject(string authorGuid, string packageGuid, byte[] packageFile, byte[] packageDoc, byte[] packageThumbnail, string name, string description)
{
try
{
if (packageFile.Length == 0)
return SubmitStatus.Error;
umbraco.cms.businesslogic.member.Member mem = new umbraco.cms.businesslogic.member.Member(new Guid(authorGuid));
Package packageNode = Packages.GetPackageByGuid( new Guid(packageGuid));
if (mem != null)
{
//existing package...
if (packageNode != null)
{
return SubmitStatus.Exists;
}
else
{
Document d = Document.MakeNew(name, DocumentType.GetByAlias(_projectAlias), new umbraco.BusinessLogic.User(0), _projectsRoot);
d.getProperty("version").Value = "1.0";
d.getProperty("description").Value = description;
d.getProperty("stable").Value = false;
d.getProperty("demoUrl").Value = "";
d.getProperty("sourceUrl").Value = "";
d.getProperty("websiteUrl").Value = "";
d.getProperty("licenseUrl").Value = "";
d.getProperty("licenseName").Value = "";
d.getProperty("vendorUrl").Value = "";
d.getProperty("owner").Value = mem.Id;
d.getProperty("packageGuid").Value = packageGuid;
WikiFile wf = WikiFile.Create(name,"zip", d.UniqueId, mem.UniqueId, packageFile, "package", new List<UmbracoVersion>(){UmbracoVersion.DefaultVersion()});
d.getProperty("file").Value = wf.Id;
//Create Documentation
if (packageDoc.Length > 0)
{
WikiFile doc = WikiFile.Create("documentation", "pdf", d.UniqueId, mem.UniqueId, packageDoc, "docs", new List<UmbracoVersion>() { UmbracoVersion.DefaultVersion() });
d.getProperty("documentation").Value = doc.Id;
}
d.XmlGenerate(new XmlDocument());
d.Save();
d.Publish(new umbraco.BusinessLogic.User(0));
umbraco.library.UpdateDocumentCache(d.Id);
return SubmitStatus.Complete;
}
}
else
{
return SubmitStatus.NoAccess;
}
}
catch (Exception ex)
{
umbraco.BusinessLogic.Log.Add(umbraco.BusinessLogic.LogTypes.Debug, -1, ex.ToString());
return SubmitStatus.Error;
}
}
public static Package GetPackageById(int id)
{
return convertToPackageFromNode(new Node(id));
}
public static Package GetPackageByGuid(Guid guid)
{
XPathNodeIterator xpn = umbraco.library.GetXmlNodeByXPath("descendant::node[data [@alias = 'packageGuid'] = '" + guid.ToString() + "']");
if (xpn.MoveNext())
{
if(xpn.Current is IHasXmlNode)
{
XmlNode node = ((IHasXmlNode)xpn.Current).GetNode();
return convertToPackageFromXmlNode(node);
}
}
return null;
}
public static List<Package> GetAllPackages()
{
string xpath = "/descendant::node [@nodeTypeAlias = '" + _projectAlias + "']";
List<Package> ps = new List<Package>();
XPathNodeIterator xni = queryRepo(xpath);
while(xni.MoveNext()){
if(xni.Current is IHasXmlNode)
{
XmlNode node = ((IHasXmlNode)xni.Current).GetNode();
ps.Add(convertToPackageFromXmlNode(node));
}
}
ps.Sort();
return ps;
}
public static List<Package> GetPackagesByTag(string tag)
{
return new List<Package>();
}
public static List<Package> GetPackagesByCategory(int category)
{
string xpath = "/node [@id = " + category.ToString() + "]/descendant::node [@nodeTypeAlias = '" + _projectAlias + "']";
XPathNodeIterator xni = queryRepo(xpath);
return iteratorToPackageList(xni);
}
public static List<Package> GetPackagesByProperty(string propertyAlias, string value) {
string xpath = "//" + _projectAlias + "[" + propertyAlias + " = '" + value + "']";
XPathNodeIterator xni = queryRepo(xpath);
return iteratorToPackageList(xni);
}
public XPathNodeIterator GetProjects()
{
const string xpath = "//" + _projectAlias;
return queryRepo(xpath);
}
public static List<Category> GetPackagesByPropertyCategorized(string propertyAlias, string value) {
string xpath = "/descendant::node [@nodeTypeAlias = '" + _projectGroupAlias + "']";
XPathNodeIterator xni = queryRepo(xpath);
List<Category> ps = new List<Category>();
while (xni.MoveNext()) {
if (xni.Current is IHasXmlNode) {
XmlNode node = ((IHasXmlNode)xni.Current).GetNode();
Category c = convertToCategoryFromXmlNode(node, false);
string pXpath = "./descendant::node [@nodeTypeAlias = '" + _projectAlias + "' and data [@alias = '" + propertyAlias + "'] = '" + value + "']";
XPathNodeIterator pI = xni.Current.Select(pXpath);
while (pI.MoveNext()) {
if (pI.Current is IHasXmlNode) {
XmlNode pNode = ((IHasXmlNode)pI.Current).GetNode();
Package p = convertToPackageFromXmlNode(pNode);
if(p != null)
c.Packages.Add(p);
}
}
if (c != null && c.Packages.Count > 0)
ps.Add(c);
}
}
ps.Sort();
return ps;
}
public static List<Package> GetPackagesByCategory(string categoryName)
{
string xpath = "/node [@nodeName = " + categoryName + "]/descendant::node [@nodeTypeAlias = '" + _projectAlias + "']";
XPathNodeIterator xni = queryRepo(xpath);
return iteratorToPackageList(xni);
}
public static List<Category> GetSubCategories(string categoryName, bool includePackages)
{
string xpath = "/node [@nodeName = " + categoryName + "]/descendant::node [@nodeTypeAlias = '" + _projectGroupAlias + "']";
XPathNodeIterator xni = queryRepo(xpath);
return iteratorToCategoryList(xni, includePackages);
}
public static List<Category> GetSubCategories(int id, bool includePackages)
{
string xpath = "/node [@id = " + id.ToString() + "]/descendant::node [@nodeTypeAlias = '" + _projectGroupAlias + "']";
XPathNodeIterator xni = queryRepo(xpath);
return iteratorToCategoryList(xni, includePackages);
}
public static List<Category> Categories(bool includePackages, bool hideHQCategories)
{
string xpath = "/" + _projectGroupAlias;
if(hideHQCategories)
xpath += " [hqOnly != '1']";
XPathNodeIterator xpn = queryRepo(xpath);
return iteratorToCategoryList(xpn, includePackages);
}
public static List<Package> Search(string term)
{
return new List<Package>();
}
//general method for fetching repository specific data...
private static XPathNodeIterator queryRepo(string xpath)
{
return umbraco.library.GetXmlNodeByXPath("descendant-or-self::*[@isDoc and @id = " + _projectsRoot.ToString() + "]" + xpath);
}
private static List<Package> iteratorToPackageList(XPathNodeIterator xni)
{
List<Package> ps = new List<Package>();
while (xni.MoveNext())
{
if (xni.Current is IHasXmlNode)
{
XmlNode node = ((IHasXmlNode)xni.Current).GetNode();
Package p = convertToPackageFromXmlNode(node);
if (p != null)
ps.Add(p);
}
}
ps.Sort();
return ps;
}
private static List<Category> iteratorToCategoryList(XPathNodeIterator xni, bool includePackages)
{
List<Category> ps = new List<Category>();
while (xni.MoveNext())
{
if (xni.Current is IHasXmlNode)
{
XmlNode node = ((IHasXmlNode)xni.Current).GetNode();
Category c = convertToCategoryFromXmlNode(node, includePackages);
if (c != null)
ps.Add(c);
}
}
ps.Sort();
return ps;
}
private static Package convertToPackageFromXmlNode(XmlNode node)
{
return convertToPackageFromNode(new Node(node));
}
private static Package convertToPackageFromNode(Node packageNode)
{
if (packageNode != null && packageNode.NodeTypeAlias == _projectAlias)
{
Package retVal = new Package();
retVal.Text = packageNode.Name;
retVal.RepoGuid = new Guid(safeProperty(packageNode,"packageGuid"));
retVal.Description = safeProperty(packageNode,"description");
retVal.Protected = false;
retVal.Icon = "";
retVal.Thumbnail = safeProperty(packageNode, "defaultScreenshotPath");
retVal.Demo = "";
retVal.IsModule = false;
if (safeProperty(packageNode, "isModule") == "1")
retVal.IsModule = true;
if (umbraco.library.NiceUrl(packageNode.Id) != "")
{
retVal.Url = umbraco.library.NiceUrl(packageNode.Id);
retVal.Accepted = true;
}
retVal.HasUpgrade = false;
return retVal;
}
return null;
}
private static Category convertToCategoryFromXmlNode(XmlNode node, bool includePackages)
{
return convertToCategoryFromNode(new Node(node), includePackages);
}
private static Category convertToCategoryFromNode(Node categoryNode, bool includePackages)
{
if (categoryNode != null && categoryNode.NodeTypeAlias == _projectGroupAlias)
{
Category retVal = new Category();
retVal.Text = categoryNode.Name;
retVal.Id = categoryNode.Id;
retVal.Description = safeProperty(categoryNode,"description");
retVal.Url = umbraco.library.NiceUrl(categoryNode.Id);
if(includePackages){
foreach(Node p in categoryNode.Children){
Package pack = convertToPackageFromNode(p);
if(pack != null)
retVal.Packages.Add(pack);
}
}
return retVal;
}
return null;
}
private static string safeProperty(umbraco.presentation.nodeFactory.Node n, string alias)
{
if (n.GetProperty(alias) != null && !string.IsNullOrEmpty(n.GetProperty(alias).Value))
return n.GetProperty(alias).Value;
else
return string.Empty;
}
internal static WikiFile PackageFileByGuid(Guid pack)
{
XPathNodeIterator xpn = umbraco.library.GetXmlNodeByXPath("descendant::* [@isDoc and translate(packageGuid,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = translate('" + pack.ToString() + "','ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')]");
if (xpn.MoveNext())
{
var xmlNode = xpn.Current as IHasXmlNode;
if (xmlNode != null)
{
//This will get the latest marked file id
Node node = new Node(xmlNode.GetNode());
string fileId = safeProperty(node, "file");
int _id;
if (int.TryParse(fileId, out _id))
{
string cookieName = "ProjectFileDownload" + fileId;
//we clear the cookie on the server just to be sure the download is accounted for
if (HttpContext.Current.Request.Cookies[cookieName] != null)
{
HttpCookie myCookie = new HttpCookie(cookieName);
myCookie.Expires = DateTime.Now.AddDays(-1d);
HttpContext.Current.Response.Cookies.Add(myCookie);
}
WikiFile wf = new WikiFile(_id);
wf.UpdateDownloadCounter(true,true);
return wf;
}
}
}
return null;
}
}
}