1
0
mirror of https://git.teknik.io/Teknikode/Teknik.git synced 2023-08-02 14:16:22 +02:00

Created initial Vault viewing page to handle multiple formats.

This commit is contained in:
Uncled1023 2017-02-12 23:56:30 -08:00
parent 192a5c4aa2
commit 6a620e18f1
16 changed files with 260 additions and 20 deletions

View File

@ -17,6 +17,10 @@ namespace Teknik.Areas.Paste.Models
public virtual User User { get; set; }
public int? VaultId { get; set; }
public virtual Vault.Models.Vault Vault { get; set; }
public DateTime DatePosted { get; set; }
[CaseSensitive]

View File

@ -20,18 +20,16 @@
</div>
<hr />
<div class="row">
<div class="col-sm-1 col-sm-offset-1 text-center">
<a class="btn btn-default" href="@Url.SubRouteUrl("paste", "Paste.Simple", new { url = Model.Url })">Simple</a>
</div>
<div class="col-sm-1 text-center">
<a class="btn btn-default" href="@Url.SubRouteUrl("paste", "Paste.Raw", new { url = Model.Url })">Raw</a>
</div>
<div class="col-sm-1 text-center">
<a class="btn btn-default" href="@Url.SubRouteUrl("paste", "Paste.Download", new { url = Model.Url })">Download</a>
<div class="col-sm-12 pull-left">
<div class="btn-group" role="group">
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("paste", "Paste.Simple", new { url = Model.Url })">Simple</a>
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("paste", "Paste.Raw", new { url = Model.Url })">Raw</a>
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("paste", "Paste.Download", new { url = Model.Url })">Download</a>
</div>
</div>
</div>
<br />
<div class="row">
<div class="col-sm-10 col-sm-offset-1">@Html.Raw(Model.Content)</div>
<div class="col-sm-12">@Html.Raw(Model.Content)</div>
</div>
</div>

View File

@ -15,6 +15,10 @@ namespace Teknik.Areas.Upload.Models
public virtual User User { get; set; }
public int? VaultId { get; set; }
public virtual Vault.Models.Vault Vault { get; set; }
public DateTime DateUploaded { get; set; }
[CaseSensitive]

View File

@ -41,6 +41,10 @@ namespace Teknik.Areas.Users.Models
public virtual ICollection<Paste.Models.Paste> Pastes { get; set; }
public virtual ICollection<Shortener.Models.ShortenedUrl> ShortenedUrls { get; set; }
public virtual ICollection<Vault.Models.Vault> Vaults { get; set; }
public User()
{
Username = string.Empty;

View File

@ -472,6 +472,18 @@ namespace Teknik.Areas.Users.Utility
db.SaveChanges();
}
// Update vaults
List<Vault.Models.Vault> vaults = db.Vaults.Where(u => u.User.Username == user.Username).ToList();
if (vaults != null)
{
foreach (Vault.Models.Vault vault in vaults)
{
vault.UserId = null;
db.Entry(vault).State = EntityState.Modified;
}
db.SaveChanges();
}
// Delete Blogs
Blog.Models.Blog blog = db.Blogs.Where(u => u.User.Username == user.Username).FirstOrDefault();
if (blog != null)

View File

@ -0,0 +1,5 @@
.paste-content {
height: 100%;
max-height: 500px;
overflow-y: auto;
}

View File

@ -3,16 +3,22 @@ using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Teknik.Areas.Vault.Models;
using Teknik.Areas.Vault.ViewModels;
using Teknik.Attributes;
using Teknik.Controllers;
using Teknik.Models;
using Teknik.Utilities;
namespace Teknik.Areas.Vault.Controllers
{
[TeknikAuthorize]
public class VaultController : DefaultController
{
private TeknikEntities db = new TeknikEntities();
[AllowAnonymous]
public ActionResult Index()
public ActionResult Create()
{
return View();
}
@ -20,7 +26,21 @@ namespace Teknik.Areas.Vault.Controllers
[AllowAnonymous]
public ActionResult ViewVault(string id)
{
return View();
Models.Vault foundVault = db.Vaults.Where(v => v.Url == id).FirstOrDefault();
if (foundVault != null)
{
VaultViewModel model = new VaultViewModel();
model.Url = foundVault.Url;
model.Title = foundVault.Title;
model.Description = foundVault.Description;
model.DateCreated = foundVault.DateCreated;
model.DateEdited = foundVault.DateEdited;
model.Items = foundVault.Items.ToList();
return View(model);
}
return Redirect(Url.SubRouteUrl("error", "Error.Http404"));
}
}
}

View File

@ -10,6 +10,7 @@ namespace Teknik.Areas.Vault.Models
public int VaultId { get; set; }
public int? UserId { get; set; }
public virtual Users.Models.User User { get; set; }
public string Url { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public DateTime DateCreated { get; set; }

View File

@ -10,7 +10,7 @@ namespace Teknik.Areas.Vault.Models
public int VaultItemId { get; set; }
public int VaultId { get; set; }
public virtual Vault Vault { get; set; }
public string Name { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public DateTime DateAdded { get; set; }
}

View File

@ -20,14 +20,27 @@ namespace Teknik.Areas.Vault
{
Config config = Config.Load();
context.MapSubdomainRoute(
"Vault.Index",
"Vault.Create",
new List<string>() { "vault", "v" }, // Subdomains
new List<string>() { config.Host }, // domains
"",
new { controller = "Vault", action = "Index" },
new { controller = "Vault", action = "Create" },
new[] { typeof(Controllers.VaultController).Namespace }
);
context.MapSubdomainRoute(
"Vault.ViewVault",
new List<string>() { "vault", "v" }, // Subdomains
new List<string>() { config.Host }, // domains
"{id}",
new { controller = "Vault", action = "ViewVault" },
new[] { typeof(Controllers.VaultController).Namespace }
);
// Register style bundles
BundleTable.Bundles.Add(new CdnStyleBundle("~/Content/vault", config.CdnHost).Include(
"~/Areas/Vault/Content/Vault.css"));
// Register Script Bundle
BundleTable.Bundles.Add(new CdnScriptBundle("~/bundles/vault", config.CdnHost).Include(
"~/Areas/Vault/Scripts/Vault.js"));

View File

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Teknik.Areas.Vault.Models;
using Teknik.ViewModels;
namespace Teknik.Areas.Vault.ViewModels
{
public class CreateVaultViewModel : ViewModelBase
{
public string Title { get; set; }
public string Description { get; set; }
public List<VaultItem> Items { get; set; }
public CreateVaultViewModel()
{
Title = string.Empty;
Description = string.Empty;
Items = new List<VaultItem>();
}
}
}

View File

@ -9,14 +9,22 @@ namespace Teknik.Areas.Vault.ViewModels
{
public class VaultViewModel : ViewModelBase
{
public int VaultId { get; set; }
public string Url { get; set; }
public int? UserId { get; set; }
public Users.Models.User User { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateEdited { get; set; }
public List<UploadItem> Uploads { get; set; }
public List<PasteItem> Pastes { get; set; }
public List<VaultItem> Items { get; set; }
public VaultViewModel()
{
Title = string.Empty;
Description = string.Empty;
DateCreated = DateTime.Now;
DateEdited = DateTime.Now;
Items = new List<VaultItem>();
}
}
}

View File

@ -0,0 +1,3 @@
@model Teknik.Areas.Vault.ViewModels.CreateVaultViewModel

View File

@ -1,7 +1,126 @@
@model Teknik.Areas.Vault.ViewModels.VaultViewModel
@using Teknik.Areas.Vault.Models;
@using Teknik.Utilities
@using Teknik.Pygments
@Styles.Render("~/Content/vault")
<div class="container">
<p>Coming Soon!</p>
<div class="row text-center">
<div class="col-sm-12 text-center">
<h2><b>@((string.IsNullOrEmpty(Model.Title)) ? "Untitled" : Model.Title)</b> <small>Created on <time datetime="@Model.DateCreated.ToString("s")">@Model.DateCreated.ToString("dddd, MMMM d, yyyy") at @Model.DateCreated.ToString("h:mm:ss tt")</time></small></h2>
</div>
</div>
<br />
@foreach (VaultItem item in Model.Items)
{
Type itemType = item.GetType();
if (itemType == typeof(PasteItem))
{
PasteItem paste = (PasteItem)item;
// Transform content into HTML
if (!Highlighter.Lexers.ToList().Exists(l => l.Aliases.Contains(paste.Paste.Syntax)))
{
paste.Paste.Syntax = "text";
}
Highlighter highlighter = new Highlighter();
// Add a space in front of the content due to bug with pygment (No idea why yet)
paste.Paste.Content = highlighter.HighlightToHtml(" " + paste.Paste.Content, paste.Paste.Syntax, Model.Config.PasteConfig.SyntaxVisualStyle, generateInlineStyles: true, fragment: true);
<div class="panel panel-default">
<div class="panel-heading text-left">
<h4><b><a href="@Url.SubRouteUrl("p", "Paste.View", new { file = paste.Paste.Url })" target="_blank">@((string.IsNullOrEmpty(paste.Title)) ? "Paste" : paste.Title)</a></b> <small>Pasted on <time datetime="@paste.Paste.DatePosted.ToString("s")">@paste.Paste.DatePosted.ToString("dddd, MMMM d, yyyy") at @paste.Paste.DatePosted.ToString("h:mm:ss tt")</time> - Format: <b id="syntaxLanguage">@paste.Paste.Syntax</b></small></h4>
</div>
<div class="panel-body">
<div class="row">
<div class="col-sm-12 pull-left">
<div class="btn-group" role="group">
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("p", "Paste.Simple", new { url = paste.Paste.Url })">Simple</a>
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("p", "Paste.Raw", new { url = paste.Paste.Url })">Raw</a>
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("p", "Paste.Download", new { url = paste.Paste.Url })">Download</a>
</div>
</div>
</div>
<br />
<div class="row paste-item">
<div class="col-sm-12 paste-content">@Html.Raw(paste.Paste.Content)</div>
</div>
</div>
@if (!string.IsNullOrEmpty(paste.Description))
{
<div class="panel-footer">
<p>@paste.Description</p>
</div>
}
</div>
}
else if (itemType == typeof(UploadItem))
{
UploadItem upload = (UploadItem)item;
<div class="panel panel-default">
<div class="panel-heading">
<div class="row">
<div class="col-sm-12 text-left">
<h4><b><a href="@Url.SubRouteUrl("u", "Upload.Download", new { file = upload.Upload.Url })" target="_blank">@((string.IsNullOrEmpty(upload.Title)) ? "Upload" : upload.Title)</a></b> <small>Uploaded on <time datetime="@upload.Upload.DateUploaded.ToString("s")">@upload.Upload.DateUploaded.ToString("dddd, MMMM d, yyyy") at @upload.Upload.DateUploaded.ToString("h:mm:ss tt")</time></small></h4>
</div>
</div>
</div>
<div class="panel-body">
@if (upload.Upload.ContentType.StartsWith("image"))
{
<a href="@Url.SubRouteUrl("u", "Upload.Download", new { file = upload.Upload.Url })" target="_blank">
<img src="@Url.SubRouteUrl("u", "Upload.Download", new { file = upload.Upload.Url })" class="img-thumbnail center-block" />
</a>
}
else if (upload.Upload.ContentType.StartsWith("audio"))
{
<div class="text-center">
<audio preload="none" controls>
<source src="@Url.SubRouteUrl("u", "Upload.Download", new { file = upload.Upload.Url })" type="@upload.Upload.ContentType" />
</audio>
</div>
}
else if (upload.Upload.ContentType.StartsWith("video"))
{
<div class="text-center">
<video preload="none" controls>
<source src="@Url.SubRouteUrl("u", "Upload.Download", new { file = upload.Upload.Url })" type="@upload.Upload.ContentType" />
</video>
</div>
}
else
{
<div class="row">
<div class="col-sm-4 text-center">
<label for="size">Size</label>
<p id="size">@StringHelper.GetBytesReadable(upload.Upload.ContentLength)</p>
</div>
<div class="col-sm-4 text-center">
<label for="type">Type</label>
<p id="type">@upload.Upload.ContentType</p>
</div>
<div class="col-sm-4 text-center">
<label for="dateUploaded">Date Uploaded</label>
<p id="dateUploaded"><time datetime="@upload.Upload.DateUploaded.ToString("s")">@upload.Upload.DateUploaded.ToString("MMMM dd, yyyy")</time></p>
</div>
</div>
}
</div>
@if (!string.IsNullOrEmpty(upload.Description))
{
<div class="panel-footer">
<p>@upload.Description</p>
</div>
}
</div>
}
else
{
// Nothing to see here folks. :)
}
}
</div>

View File

@ -13,6 +13,7 @@ using Teknik.Areas.Shortener.Models;
using Teknik.Attributes;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Linq;
using Teknik.Areas.Vault.Models;
namespace Teknik.Models
{
@ -52,6 +53,8 @@ namespace Teknik.Models
public DbSet<Takedown> Takedowns { get; set; }
// Url Shortener
public DbSet<ShortenedUrl> ShortenedUrls { get; set; }
// Vaults
public DbSet<Vault> Vaults { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
@ -101,6 +104,16 @@ namespace Teknik.Models
.WithOptional(u => u.User)
.WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
.HasMany<ShortenedUrl>(u => u.ShortenedUrls)
.WithOptional(u => u.User)
.WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
.HasMany<Vault>(u => u.Vaults)
.WithOptional(u => u.User)
.WillCascadeOnDelete(false);
// Upload Mappings
modelBuilder.Entity<Upload>()
.HasOptional(u => u.User);
@ -109,6 +122,14 @@ namespace Teknik.Models
modelBuilder.Entity<Paste>()
.HasOptional(u => u.User);
// Shortened URL Mappings
modelBuilder.Entity<ShortenedUrl>()
.HasOptional(u => u.User);
// Vault Mappings
modelBuilder.Entity<Vault>()
.HasOptional(u => u.User);
// Users
modelBuilder.Entity<User>().ToTable("Users");
modelBuilder.Entity<Group>().ToTable("Groups");
@ -133,6 +154,10 @@ namespace Teknik.Models
modelBuilder.Entity<Upload>().ToTable("Uploads");
// Pastes
modelBuilder.Entity<Paste>().ToTable("Pastes");
// Shortened Urls
modelBuilder.Entity<ShortenedUrl>().ToTable("ShortenedUrls");
// Vaults
modelBuilder.Entity<Vault>().ToTable("Vaults");
// Podcasts
modelBuilder.Entity<Podcast>().ToTable("Podcasts");
modelBuilder.Entity<PodcastFile>().ToTable("PodcastFiles");
@ -140,8 +165,6 @@ namespace Teknik.Models
// Transparency
modelBuilder.Entity<Transaction>().ToTable("Transactions");
modelBuilder.Entity<Takedown>().ToTable("Takedowns");
// Shortened Urls
modelBuilder.Entity<ShortenedUrl>().ToTable("ShortenedUrls");
// Custom Attributes
modelBuilder.Conventions.Add(new AttributeToColumnAnnotationConvention<CaseSensitiveAttribute, bool>(

View File

@ -242,6 +242,7 @@
<Compile Include="Areas\User\Models\TrustedDevice.cs" />
<Compile Include="Areas\User\ViewModels\AuthTokenViewModel.cs" />
<Compile Include="Areas\User\ViewModels\TwoFactorViewModel.cs" />
<Compile Include="Areas\Vault\ViewModels\CreateVaultViewModel.cs" />
<Compile Include="Attributes\TeknikAuthorizeAttribute.cs" />
<Compile Include="Filters\CORSActionFilter.cs" />
<Compile Include="Models\TransferTypes.cs" />
@ -339,6 +340,7 @@
<Content Include="Areas\User\Scripts\User.js" />
<Content Include="Areas\Shortener\Scripts\Shortener.js" />
<Content Include="Areas\Upload\Scripts\Download.js" />
<Content Include="Areas\Vault\Content\Vault.css" />
<Content Include="Content\audioplayer.css" />
<Content Include="Content\Bootstra.386\bootstrap-theme.css" />
<Content Include="Content\Bootstra.386\bootstrap.css" />
@ -572,6 +574,7 @@
<Content Include="Areas\User\Views\User\AuthToken.cshtml" />
<Content Include="Areas\Error\Views\Error\Http401.cshtml" />
<Content Include="Areas\Transparency\Views\_ViewStart.cshtml" />
<Content Include="Areas\Vault\Views\Vault\Create.cshtml" />
<None Include="Properties\PublishProfiles\Teknik Dev.pubxml" />
<None Include="Properties\PublishProfiles\Teknik Production.pubxml" />
<None Include="Scripts\jquery-2.1.4.intellisense.js" />