summaryrefslogtreecommitdiff
path: root/Pages
diff options
context:
space:
mode:
Diffstat (limited to 'Pages')
-rw-r--r--Pages/Error.cshtml26
-rw-r--r--Pages/Error.cshtml.cs27
-rw-r--r--Pages/Index.cshtml48
-rw-r--r--Pages/Index.cshtml.cs97
-rw-r--r--Pages/Privacy.cshtml8
-rw-r--r--Pages/Privacy.cshtml.cs19
-rw-r--r--Pages/Shared/_Layout.cshtml51
-rw-r--r--Pages/Shared/_Layout.cshtml.css48
-rw-r--r--Pages/Shared/_ValidationScriptsPartial.cshtml2
-rw-r--r--Pages/_ViewImports.cshtml3
-rw-r--r--Pages/_ViewStart.cshtml3
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">
+ &copy; 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";
+}