diff options
Diffstat (limited to 'Pages')
-rw-r--r-- | Pages/Error.cshtml | 26 | ||||
-rw-r--r-- | Pages/Error.cshtml.cs | 27 | ||||
-rw-r--r-- | Pages/Index.cshtml | 48 | ||||
-rw-r--r-- | Pages/Index.cshtml.cs | 97 | ||||
-rw-r--r-- | Pages/Privacy.cshtml | 8 | ||||
-rw-r--r-- | Pages/Privacy.cshtml.cs | 19 | ||||
-rw-r--r-- | Pages/Shared/_Layout.cshtml | 51 | ||||
-rw-r--r-- | Pages/Shared/_Layout.cshtml.css | 48 | ||||
-rw-r--r-- | Pages/Shared/_ValidationScriptsPartial.cshtml | 2 | ||||
-rw-r--r-- | Pages/_ViewImports.cshtml | 3 | ||||
-rw-r--r-- | Pages/_ViewStart.cshtml | 3 |
11 files changed, 332 insertions, 0 deletions
diff --git a/Pages/Error.cshtml b/Pages/Error.cshtml new file mode 100644 index 0000000..6f92b95 --- /dev/null +++ b/Pages/Error.cshtml @@ -0,0 +1,26 @@ +@page +@model ErrorModel +@{ + ViewData["Title"] = "Error"; +} + +<h1 class="text-danger">Error.</h1> +<h2 class="text-danger">An error occurred while processing your request.</h2> + +@if (Model.ShowRequestId) +{ + <p> + <strong>Request ID:</strong> <code>@Model.RequestId</code> + </p> +} + +<h3>Development Mode</h3> +<p> + Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred. +</p> +<p> + <strong>The Development environment shouldn't be enabled for deployed applications.</strong> + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong> + and restarting the app. +</p> diff --git a/Pages/Error.cshtml.cs b/Pages/Error.cshtml.cs new file mode 100644 index 0000000..c47665b --- /dev/null +++ b/Pages/Error.cshtml.cs @@ -0,0 +1,27 @@ +using System.Diagnostics; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace download_admin.Pages; + +[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] +[IgnoreAntiforgeryToken] +public class ErrorModel : PageModel +{ + public string? RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + private readonly ILogger<ErrorModel> _logger; + + public ErrorModel(ILogger<ErrorModel> logger) + { + _logger = logger; + } + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } +} + diff --git a/Pages/Index.cshtml b/Pages/Index.cshtml new file mode 100644 index 0000000..9c1f3c2 --- /dev/null +++ b/Pages/Index.cshtml @@ -0,0 +1,48 @@ +@page +@model download_admin.Pages.IndexModel +@using download_admin.Pages +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Download Repsoitory Editor</title> + </head> + <body> + <a href="report">Download Report</a><br> + @if (Model.HasError) + { + <p style="color:red"><b>@Model.ErrorText</b></p> + } + <table> + <tr> + <td style="width:25%;"><b>Key</b></td> + <td style="width:20%;"><b>Mime type</b></td> + <td style="width:20%;"><b>File name</b></td> + <td style="width:15%;"><b>File data</b></td> + <td style="width:20%;"><b>Commands</b></td> + </tr> + @foreach(FileObject obj in Model.Rows) + { + <tr> + <form enctype="multipart/form-data" method="post"> + <td><input type=text name="Key" maxlength=64 value="@obj.Key"></td> + <td><input type=text name="MimeType" maxlength=64 value="@obj.MimeType"></td> + <td><input type=text name="Filename" maxlength=64 value="@obj.FileName"></td> + <td><input type=file name="Data"></td> + <td><input type="submit" name="update" value="Update"><input type="submit" name="delete" value="Delete"></td> + </form> + </tr> + } + <tr> + <form enctype="multipart/form-data" method="post"> + <td><input type=text name="Key" maxlength=64 value=""></td> + <td><input type=text name="MimeType" maxlength=64 value=""></td> + <td><input type=text name="Filename" maxlength=64 value=""></td> + <td><input type=file name="Data"></td> + <td><input type="submit" name="add" value="Add"></td> + </form> + </tr> + </table> + </body> +</html> diff --git a/Pages/Index.cshtml.cs b/Pages/Index.cshtml.cs new file mode 100644 index 0000000..6e9a5ed --- /dev/null +++ b/Pages/Index.cshtml.cs @@ -0,0 +1,97 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Npgsql; +using System.Collections.Generic; +using download_admin; + +namespace download_admin.Pages; + +public class IndexModel : PageModel +{ + private readonly ILogger<IndexModel> _logger; + + public IndexModel(ILogger<IndexModel> logger) + { + _logger = logger; + } + + public void OnGet() + { + LoadData(); + } + + public void OnPost() + { + if (!String.IsNullOrEmpty(Request.Form["add"])) + { + DoAdd(); + } + else if (!String.IsNullOrEmpty(Request.Form["delete"])) + { + DoDelete(); + } + else if (!String.IsNullOrEmpty(Request.Form["update"])) + { + DoUpdate(); + } + + LoadData(); + } + + + public List<FileObject>? Rows {get;private set;} + + public bool HasError {get; private set;} + + public string? ErrorText {get; private set;} + + private void DoAdd() + { + SetError("DoAdd"); + } + + private void DoDelete() + { + SetError("DoDelete"); + } + + private void DoUpdate() + { + SetError("DoUpdate"); + } + + private void LoadData() + { + try + { + Rows = new List<FileObject>(); + + using var conn = new NpgsqlConnection(Config.Settings["ConnectionStrings:download"]); + + conn.Open(); + + using var cmd = new NpgsqlCommand("SELECT key, mime_type, file_name, data FROM file_object ORDER BY key", conn); + using var reader = cmd.ExecuteReader(); + + while(reader.Read()) + { + string key = (string)reader["key"]; + string mime_type = (string)reader["mime_type"]; + string file_name = (string)reader["file_name"]; + byte[] data = (byte[])reader["data"]; + + Rows.Add(new FileObject(key, mime_type, file_name, data)); + } + } + catch(Exception e) + { + SetError(e.Message); + } + } + + private void SetError(string error_text) + { + HasError = true; + ErrorText = error_text; + } +} diff --git a/Pages/Privacy.cshtml b/Pages/Privacy.cshtml new file mode 100644 index 0000000..46ba966 --- /dev/null +++ b/Pages/Privacy.cshtml @@ -0,0 +1,8 @@ +@page +@model PrivacyModel +@{ + ViewData["Title"] = "Privacy Policy"; +} +<h1>@ViewData["Title"]</h1> + +<p>Use this page to detail your site's privacy policy.</p> diff --git a/Pages/Privacy.cshtml.cs b/Pages/Privacy.cshtml.cs new file mode 100644 index 0000000..9afceae --- /dev/null +++ b/Pages/Privacy.cshtml.cs @@ -0,0 +1,19 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace download_admin.Pages; + +public class PrivacyModel : PageModel +{ + private readonly ILogger<PrivacyModel> _logger; + + public PrivacyModel(ILogger<PrivacyModel> logger) + { + _logger = logger; + } + + public void OnGet() + { + } +} + diff --git a/Pages/Shared/_Layout.cshtml b/Pages/Shared/_Layout.cshtml new file mode 100644 index 0000000..86c0cc1 --- /dev/null +++ b/Pages/Shared/_Layout.cshtml @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>@ViewData["Title"] - download_admin</title> + <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" /> + <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" /> + <link rel="stylesheet" href="~/download_admin.styles.css" asp-append-version="true" /> +</head> +<body> + <header> + <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3"> + <div class="container"> + <a class="navbar-brand" asp-area="" asp-page="/Index">download_admin</a> + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent" + aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between"> + <ul class="navbar-nav flex-grow-1"> + <li class="nav-item"> + <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a> + </li> + <li class="nav-item"> + <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a> + </li> + </ul> + </div> + </div> + </nav> + </header> + <div class="container"> + <main role="main" class="pb-3"> + @RenderBody() + </main> + </div> + + <footer class="border-top footer text-muted"> + <div class="container"> + © 2024 - download_admin - <a asp-area="" asp-page="/Privacy">Privacy</a> + </div> + </footer> + + <script src="~/lib/jquery/dist/jquery.min.js"></script> + <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> + <script src="~/js/site.js" asp-append-version="true"></script> + + @await RenderSectionAsync("Scripts", required: false) +</body> +</html>
\ No newline at end of file diff --git a/Pages/Shared/_Layout.cshtml.css b/Pages/Shared/_Layout.cshtml.css new file mode 100644 index 0000000..c187c02 --- /dev/null +++ b/Pages/Shared/_Layout.cshtml.css @@ -0,0 +1,48 @@ +/* Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification +for details on configuring this project to bundle and minify static web assets. */ + +a.navbar-brand { + white-space: normal; + text-align: center; + word-break: break-all; +} + +a { + color: #0077cc; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.nav-pills .nav-link.active, .nav-pills .show > .nav-link { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.border-top { + border-top: 1px solid #e5e5e5; +} +.border-bottom { + border-bottom: 1px solid #e5e5e5; +} + +.box-shadow { + box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); +} + +button.accept-policy { + font-size: 1rem; + line-height: inherit; +} + +.footer { + position: absolute; + bottom: 0; + width: 100%; + white-space: nowrap; + line-height: 60px; +} diff --git a/Pages/Shared/_ValidationScriptsPartial.cshtml b/Pages/Shared/_ValidationScriptsPartial.cshtml new file mode 100644 index 0000000..5a16d80 --- /dev/null +++ b/Pages/Shared/_ValidationScriptsPartial.cshtml @@ -0,0 +1,2 @@ +<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script> +<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script> diff --git a/Pages/_ViewImports.cshtml b/Pages/_ViewImports.cshtml new file mode 100644 index 0000000..cc91b50 --- /dev/null +++ b/Pages/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@using download_admin +@namespace download_admin.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/Pages/_ViewStart.cshtml b/Pages/_ViewStart.cshtml new file mode 100644 index 0000000..a5f1004 --- /dev/null +++ b/Pages/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} |