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 _logger; public IndexModel(ILogger logger) { _logger = logger; } public void OnGet() { ViewData["Title"] = "Download Repsoitory Editor"; LoadData(); } public void OnPost() { ViewData["Title"] = "Download Repsoitory Editor"; 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? Rows {get;private set;} public bool HasError {get; private set;} public string? ErrorText {get; private set;} private void DoAdd() { try { string? key = Request.Form["key"]; string? mime_type = Request.Form["mime_type"]; string? file_name = Request.Form["file_name"]; IFormFile? file = Request.Form.Files.Count > 0 ? Request.Form.Files[0] : null; if (String.IsNullOrWhiteSpace(key) || String.IsNullOrWhiteSpace(mime_type) || String.IsNullOrEmpty(file_name) || file == null) { SetError("Need key, mime type, file name and file"); return; } using var file_stream = file.OpenReadStream(); byte[] file_data = new byte[file.Length]; file_stream.Read(file_data, 0, (int)file.Length); using var conn = new NpgsqlConnection(Config.Settings["ConnectionStrings:download"]); conn.Open(); using var cmd = new NpgsqlCommand("INSERT INTO file_object (key, mime_type, file_name, data) VALUES (@key, @mime_type, @file_name, @data)", conn); cmd.Parameters.AddWithValue("key", NpgsqlTypes.NpgsqlDbType.Varchar, key); cmd.Parameters.AddWithValue("mime_type", NpgsqlTypes.NpgsqlDbType.Varchar, mime_type); cmd.Parameters.AddWithValue("file_name", NpgsqlTypes.NpgsqlDbType.Varchar, file_name); cmd.Parameters.AddWithValue("data", NpgsqlTypes.NpgsqlDbType.Bytea, file_data); cmd.ExecuteNonQuery(); } catch(Exception e) { SetError(e.Message); } } private void DoDelete() { try { string? key = Request.Form["original_key"]; using var conn = new NpgsqlConnection(Config.Settings["ConnectionStrings:download"]); conn.Open(); using var delete_download = new NpgsqlCommand("DELETE FROM download WHERE key = @original_key", conn); delete_download.Parameters.AddWithValue("original_key", NpgsqlTypes.NpgsqlDbType.Varchar, key); delete_download.ExecuteNonQuery(); using var delete_file = new NpgsqlCommand("DELETE FROM file_object WHERE key = @original_key", conn); delete_file.Parameters.AddWithValue("original_key", NpgsqlTypes.NpgsqlDbType.Varchar, key); delete_file.ExecuteNonQuery(); } catch(Exception e) { SetError(e.Message); } } private void DoUpdate() { try { string? original_key = Request.Form["original_key"]; string? key = Request.Form["key"]; string? mime_type = Request.Form["mime_type"]; string? file_name = Request.Form["file_name"]; IFormFile? file = Request.Form.Files.Count > 0 ? Request.Form.Files[0] : null; if (file != null) { using var file_stream = file.OpenReadStream(); byte[] file_data = new byte[file.Length]; file_stream.Read(file_data, 0, (int)file.Length); using var conn = new NpgsqlConnection(Config.Settings["ConnectionStrings:download"]); conn.Open(); using var cmd = new NpgsqlCommand("UPDATE file_object set key=@key, mime_type=@mime_type, file_name=@file_name, data=@data WHERE key=@original_key", conn); cmd.Parameters.AddWithValue("original_key", NpgsqlTypes.NpgsqlDbType.Varchar, original_key); cmd.Parameters.AddWithValue("key", NpgsqlTypes.NpgsqlDbType.Varchar, key); cmd.Parameters.AddWithValue("mime_type", NpgsqlTypes.NpgsqlDbType.Varchar, mime_type); cmd.Parameters.AddWithValue("file_name", NpgsqlTypes.NpgsqlDbType.Varchar, file_name); cmd.Parameters.AddWithValue("data", NpgsqlTypes.NpgsqlDbType.Bytea, file_data); cmd.ExecuteNonQuery(); } else { using var conn = new NpgsqlConnection(Config.Settings["ConnectionStrings:download"]); conn.Open(); using var cmd = new NpgsqlCommand("UPDATE file_object set key=@key, mime_type=@mime_type, file_name=@file_name WHERE key=@original_key", conn); cmd.Parameters.AddWithValue("original_key", NpgsqlTypes.NpgsqlDbType.Varchar, original_key); cmd.Parameters.AddWithValue("key", NpgsqlTypes.NpgsqlDbType.Varchar, key); cmd.Parameters.AddWithValue("mime_type", NpgsqlTypes.NpgsqlDbType.Varchar, mime_type); cmd.Parameters.AddWithValue("file_name", NpgsqlTypes.NpgsqlDbType.Varchar, file_name); cmd.ExecuteNonQuery(); } } catch(Exception e) { SetError(e.Message); } } private void LoadData() { try { Rows = new List(); 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; } }