diff --git a/Project-Unite/Controllers/SkinsController.cs b/Project-Unite/Controllers/SkinsController.cs new file mode 100644 index 0000000..0b6b732 --- /dev/null +++ b/Project-Unite/Controllers/SkinsController.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Web; +using System.Web.Mvc; +using Microsoft.AspNet.Identity; +using Project_Unite.Models; + +namespace Project_Unite.Controllers +{ + public class SkinsController : Controller + { + // GET: Skins + public ActionResult Index() + { + return View(new ApplicationDbContext().Skins); + } + + public ActionResult ViewSkin(string id) + { + var db = new ApplicationDbContext(); + var skn = db.Skins.FirstOrDefault(x => x.Name == id); + if (skn == null) + return new HttpStatusCodeResult(404); + return View(skn); + } + + [Authorize] + public ActionResult PostSkin() + { + var model = new CreateSkinViewModel(); + return View(model); + } + + [Authorize] + [HttpPost] + [ValidateAntiForgeryToken] + public ActionResult PostSkin(CreateSkinViewModel model) + { + if(!ModelState.IsValid) + { + return View(model); + } + var db = new ApplicationDbContext(); + var skin = new Skin(); + skin.Id = Guid.NewGuid().ToString(); + skin.Name = model.Title; + skin.ShortDescription = model.ShortDescription; + skin.PostedAt = DateTime.Now; + skin.FullDescription = model.LongDescription; + skin.UserId = User.Identity.GetUserId(); + skin.VersionId = ""; + skin.DownloadUrl = Path.Combine("~/Uploads", model.SkinFile.FileName); + model.SkinFile.SaveAs(Path.Combine(Server.MapPath("~/Uploads"), model.SkinFile.FileName)); + db.Skins.Add(skin); + db.SaveChanges(); + return RedirectToAction("ViewSkin", new { id = skin.Name }); + } + } +} \ No newline at end of file diff --git a/Project-Unite/Models/IdentityModels.cs b/Project-Unite/Models/IdentityModels.cs index cb832da..cb4a712 100644 --- a/Project-Unite/Models/IdentityModels.cs +++ b/Project-Unite/Models/IdentityModels.cs @@ -194,6 +194,7 @@ public static ApplicationDbContext Create() return new ApplicationDbContext(); } + public DbSet Skins { get; set; } public DbSet Configs { get; set; } public DbSet ShiftoriumUpgrades { get; set; } public DbSet Notifications { get; set; } @@ -212,6 +213,7 @@ public static ApplicationDbContext Create() public DbSet ForumPollVotes { get; set; } public DbSet ForumPosts { get; set; } public DbSet Stories { get; set; } + public DbSet Views { get; set; } } public class UserPost diff --git a/Project-Unite/Models/Skin.cs b/Project-Unite/Models/Skin.cs new file mode 100644 index 0000000..5144ccd --- /dev/null +++ b/Project-Unite/Models/Skin.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Web; + +namespace Project_Unite.Models +{ + public class Skin + { + public string Id { get; set; } + public string UserId { get; set; } + public string Name { get; set; } + public string ShortDescription { get; set; } + public string FullDescription { get; set; } + public string VersionId { get; set; } + public string DownloadUrl { get; set; } + public string ScreenshotUrl { get; set; } + public DateTime PostedAt { get; set; } + + public Like[] Likes + { + get + { + return new ApplicationDbContext().Likes.Where(x => x.Topic == this.Id).Where(x => x.IsDislike == false).ToArray(); + } + } + + public Like[] Dislikes + { + get + { + return new ApplicationDbContext().Likes.Where(x => x.Topic == this.Id).Where(x => x.IsDislike == true).ToArray(); + } + } + + public View[] Views + { + get + { + return new ApplicationDbContext().Views.Where(x => x.ContentId == this.Id).ToArray(); + } + } + } + + public class View + { + public string Id { get; set; } + public string ContentId { get; set; } + public string UserId { get; set; } + } + + public class CreateSkinViewModel + { + [Required] + [MaxLength(128, ErrorMessage = "Your title may not contain more than 128 characters.")] + [MinLength(5, ErrorMessage = "You need to supply a valuable title.")] + public string Title { get; set; } + + [Required] + [MaxLength(500, ErrorMessage ="Your short description may not contain more than 500 characters.")] + public string ShortDescription { get; set; } + + [Required] + [DataType(DataType.Html)] + public string LongDescription { get; set; } + + [Required] + [DataType(DataType.Upload)] + public HttpPostedFileBase SkinFile { get; set; } + } +} \ No newline at end of file diff --git a/Project-Unite/Project-Unite.csproj b/Project-Unite/Project-Unite.csproj index 9b0f4d9..a891dc7 100644 --- a/Project-Unite/Project-Unite.csproj +++ b/Project-Unite/Project-Unite.csproj @@ -242,6 +242,7 @@ + Global.asax @@ -420,6 +421,7 @@ + @@ -520,6 +522,8 @@ + + diff --git a/Project-Unite/Views/Skins/Index.cshtml b/Project-Unite/Views/Skins/Index.cshtml new file mode 100644 index 0000000..4ef209e --- /dev/null +++ b/Project-Unite/Views/Skins/Index.cshtml @@ -0,0 +1,47 @@ +@model IEnumerable +@{ + ViewBag.Title = "Skin Repository"; +} + +

ShiftOS Skin Repository

+ +

ShiftOS skins allow you to shift the operating system to look like anything you want. You can make it look like other operating systems, you can give the UI a different feel, or you could just change the titlebar font. The sky and your disk space is the limit.

+ +

You can either create your own skin, or you can select from the many skins in the Skin Reposiory made by the community.

+ + + + + + + + + + + @foreach(var skin in Model) + { + + + + + + + } +
SkinPopularityDownload
+ @Html.ActionLink(skin.Name, "ViewSkin", "Skins", new { id = skin.Name }, null)
+

By @Html.UserLink(skin.UserId) on @skin.PostedAt

+
+ @* First we'll do the likes... *@ + @skin.Likes.Length + @* Now the dislikes. *@ + @skin.Dislikes.Length + @*Now the views.*@ + @skin.Views.Length + + Download this skin +
\ No newline at end of file diff --git a/Project-Unite/Views/Skins/ViewSkin.cshtml b/Project-Unite/Views/Skins/ViewSkin.cshtml new file mode 100644 index 0000000..8b3b7c9 --- /dev/null +++ b/Project-Unite/Views/Skins/ViewSkin.cshtml @@ -0,0 +1,23 @@ +@model Project_Unite.Models.Skin +@{ + ViewBag.Title = Model.Name + " - Skin Repository"; +} + +

@Model.Name

+ +

...a skin by @Html.UserLink(Model.UserId) on @Model.PostedAt

+ +
+
+ Screenshot of @Model.Name. Click to show full-size image. + + + +

@Model.ShortDescription

+ +

@Html.Markdown(Model.FullDescription)

+
+
+