MVC-databaskonstruktion

Log | Files | Refs | README

commit 97e3252cdb4b91cf0a0b987e83e283e98b7b9804
parent 1dabd3bf8bfdd45d5e8eba3c07ce725698d4d54c
Author: William Lindholm <william_lindholm@outlook.com>
Date:   Sun, 15 Oct 2023 14:05:23 +0200

Added inserts for details pages.

Diffstat:
AMVC-databaskonstruktion/Controllers/OperatesInController.cs | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
MMVC-databaskonstruktion/Controllers/OperationsController.cs | 32++++++++++++++++++++++++++++++++
MMVC-databaskonstruktion/Models/AgentsModel.cs | 4++--
MMVC-databaskonstruktion/Models/IncidentsModel.cs | 11+++++++----
AMVC-databaskonstruktion/Models/OperatesInModel.cs | 30++++++++++++++++++++++++++++++
MMVC-databaskonstruktion/Models/OperationsModel.cs | 56++++++++++++++++++++++++++++++++++++++++++++++++--------
MMVC-databaskonstruktion/Utils/DatabaseRepository.cs | 2+-
MMVC-databaskonstruktion/Utils/TableObject.cs | 1+
MMVC-databaskonstruktion/Utils/TableObjectBuilder.cs | 11+++++++++++
MMVC-databaskonstruktion/Views/Operations/Details.cshtml | 8++++++--
MMVC-databaskonstruktion/Views/Shared/_ModalPartial.cshtml | 2+-
MMVC-databaskonstruktion/Views/Shared/_TablePartial.cshtml | 4++--
12 files changed, 192 insertions(+), 20 deletions(-)

diff --git a/MVC-databaskonstruktion/Controllers/OperatesInController.cs b/MVC-databaskonstruktion/Controllers/OperatesInController.cs @@ -0,0 +1,51 @@ +using Microsoft.AspNetCore.Mvc; +using MVC_databaskonstruktion.Models; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Relational; +using System.Diagnostics; + +namespace MVC_databaskonstruktion.Controllers +{ + public class OperatesIn : Controller + { + private readonly IConfiguration _configuration; + private OperatesInModel _operatesInModel { get; set; } + + public OperatesIn(IConfiguration configuration) + { + this._configuration = configuration; + _operatesInModel = new OperatesInModel(_configuration); + } + + public IActionResult Delete(string OperationName, DateTime StartDate, string IncidentName, int IncidentNumber, string CodeName) + { + try + { + _operatesInModel.DeleteAgentFromOperation(OperationName, StartDate, IncidentName, IncidentNumber, CodeName); + } + catch (MySqlException e) + { + switch (e.Number) + { + case 1451: + TempData["ErrorMessage"] = "Foreign Key Constraint Failed!"; + break; + case 1452: + TempData["ErrorMessage"] = "Foreign Key Constraint Failed!"; + break; + default: + TempData["ErrorMessage"] = $"Something went wrong: error {e.Number}"; + break; + } + } + + return RedirectToAction("Details", "Operations", new + { + OperationName, + StartDate, + IncidentName, + IncidentNumber + }); + } + } +} diff --git a/MVC-databaskonstruktion/Controllers/OperationsController.cs b/MVC-databaskonstruktion/Controllers/OperationsController.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Mvc; using MVC_databaskonstruktion.Models; using MySql.Data.MySqlClient; +using System.Diagnostics; using System.Numerics; namespace MVC_databaskonstruktion.Controllers @@ -27,6 +28,7 @@ namespace MVC_databaskonstruktion.Controllers public IActionResult Details(string OperationName, DateTime StartDate, string IncidentName, int IncidentNumber) { ViewBag.AgentsInOperation = _operationsModel.GetAgentsInOperation(OperationName, StartDate, IncidentName, IncidentNumber); + ViewBag.AddAgentModal = _operationsModel.CreateAgentModal(OperationName, StartDate, IncidentName, IncidentNumber); return View("Details"); } @@ -58,6 +60,8 @@ namespace MVC_databaskonstruktion.Controllers public IActionResult Create(string OperationName, DateTime StartDate, DateTime EndDate, bool SuccessRate, string GroupLeader, string Incident) { + Trace.WriteLine("In Model: Successrate read as: " + SuccessRate); + try { _operationsModel.CreateOperation(OperationName, StartDate, EndDate, SuccessRate, GroupLeader, Incident); @@ -83,5 +87,33 @@ namespace MVC_databaskonstruktion.Controllers return RedirectToAction("Index"); } + + public IActionResult AddAgent(string CodeName, string OperationName, DateTime StartDate, string IncidentName, int IncidentNumber) + { + try + { + _operationsModel.AddAgentToOperation(OperationName, StartDate, IncidentName, IncidentNumber, CodeName); + } + catch (MySqlException e) + { + switch (e.Number) + { + case 1062: + TempData["ErrorMessage"] = "Agent already exists!"; + break; + case 1406: + TempData["ErrorMessage"] = "Data too long!"; + break; + case 3819: + TempData["ErrorMessage"] = "Invalid Data!"; + break; + default: + TempData["ErrorMessage"] = $"Something went wrong: {e.Number}"; + break; + } + } + + return RedirectToAction("Details", new { OperationName, StartDate, IncidentName, IncidentNumber }); + } } } diff --git a/MVC-databaskonstruktion/Models/AgentsModel.cs b/MVC-databaskonstruktion/Models/AgentsModel.cs @@ -44,9 +44,9 @@ namespace MVC_databaskonstruktion.Models public void DeleteAgent(string table, string CodeName) { - List<KeyValuePair<string, string>> conditions = new List<KeyValuePair<string, string>> + List<KeyValuePair<string, object>> conditions = new List<KeyValuePair<string, object>> { - new KeyValuePair<string, string>("CodeName", CodeName) + new KeyValuePair<string, object>("CodeName", CodeName) }; _databaseRepository.DeleteRow(table, conditions); diff --git a/MVC-databaskonstruktion/Models/IncidentsModel.cs b/MVC-databaskonstruktion/Models/IncidentsModel.cs @@ -1,5 +1,4 @@ using MVC_databaskonstruktion.Utils; -using System.Runtime.InteropServices; namespace MVC_databaskonstruktion.Models { @@ -28,10 +27,10 @@ namespace MVC_databaskonstruktion.Models public void DeleteIncident(string table, string incidentName, string incidentNumber) { - List<KeyValuePair<string, string>> conditions = new List<KeyValuePair<string, string>> + List<KeyValuePair<string, object>> conditions = new List<KeyValuePair<string, object>> { - new KeyValuePair<string, string>("IncidentName", incidentName), - new KeyValuePair<string, string>("IncidentNumber", incidentNumber) + new KeyValuePair<string, object>("IncidentName", incidentName), + new KeyValuePair<string, object>("IncidentNumber", incidentNumber) }; _databaseRepository.DeleteRow(table, conditions); @@ -41,6 +40,10 @@ namespace MVC_databaskonstruktion.Models { return _tableBuilder .SetDataTable(_databaseRepository.GetTable($"SELECT * FROM Operation WHERE IncidentName = '{IncidentName}' AND IncidentNumber = '{IncidentNumber}';")) + .SetRedirect("Details") + .SetDeleteTable("Operation") + .SetPrimaryKeys(new List<string> { "IncidentName", "IncidentNumber", "OperationName", "StartDate" }) + .SetControllerName("Operations") .Build(); } diff --git a/MVC-databaskonstruktion/Models/OperatesInModel.cs b/MVC-databaskonstruktion/Models/OperatesInModel.cs @@ -0,0 +1,30 @@ +using MVC_databaskonstruktion.Utils; + +namespace MVC_databaskonstruktion.Models +{ + public class OperatesInModel + { + private IConfiguration _configuration { get; set; } + private DatabaseRepository _databaseRepository { get; set; } + + public OperatesInModel(IConfiguration configuration) + { + _configuration = configuration; + _databaseRepository = new DatabaseRepository(_configuration); + } + + public void DeleteAgentFromOperation(string OperationName, DateTime StartDate, string IncidentName, int IncidentNumber, string CodeName) + { + var operatesInData = new List<KeyValuePair<string, object>> + { + new KeyValuePair<string, object>("CodeName", CodeName), + new KeyValuePair<string, object>("OperationName", OperationName), + new KeyValuePair<string, object>("StartDate", StartDate.ToString("yyyy-M-dd")), + new KeyValuePair<string, object>("IncidentName", IncidentName), + new KeyValuePair<string, object>("IncidentNumber", IncidentNumber) + }; + + _databaseRepository.DeleteRow("OperatesIn", operatesInData); + } + } +} diff --git a/MVC-databaskonstruktion/Models/OperationsModel.cs b/MVC-databaskonstruktion/Models/OperationsModel.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Mvc.Rendering; using MVC_databaskonstruktion.Utils; +using System.Diagnostics; namespace MVC_databaskonstruktion.Models { @@ -38,8 +39,9 @@ namespace MVC_databaskonstruktion.Models { return _tableBuilder .SetDataTable(_databaseRepository.GetTable($"SELECT * FROM OperatesIn WHERE OperationName = '{OperationName}' AND StartDate = '{StartDate}' AND IncidentName = '{IncidentName}' AND IncidentNumber = '{IncidentNumber}';")) - .SetControllerName("Agents") + .SetControllerName("Operations") .SetDeleteTable("OperatesIn") + .SetDeletionController("OperatesIn") .SetRedirect("FieldAgentDetails") .SetPrimaryKeys(new List<string> { "CodeName", "OperationName", "StartDate", "IncidentName", "IncidentNumber" }) .Build(); @@ -47,12 +49,12 @@ namespace MVC_databaskonstruktion.Models public void DeleteOperation(string table, string IncidentName, string IncidentNumber, string OperationName, DateTime StartDate) { - List<KeyValuePair<string, string>> conditions = new List<KeyValuePair<string, string>> + List<KeyValuePair<string, object>> conditions = new List<KeyValuePair<string, object>> { - new KeyValuePair<string, string>("IncidentName", IncidentName), - new KeyValuePair<string, string>("IncidentNumber", IncidentNumber), - new KeyValuePair<string, string>("OperationName", OperationName), - new KeyValuePair<string, string>("StartDate", StartDate.ToString("yyyy-M-d")) + new KeyValuePair<string, object>("IncidentName", IncidentName), + new KeyValuePair<string, object>("IncidentNumber", IncidentNumber), + new KeyValuePair<string, object>("OperationName", OperationName), + new KeyValuePair<string, object>("StartDate", StartDate.ToString("yyyy-M-dd")) }; _databaseRepository.DeleteRow(table, conditions); @@ -64,8 +66,8 @@ namespace MVC_databaskonstruktion.Models var groupLeaderSelection = _databaseRepository.GetColumnAsDropdown("SELECT CodeName FROM GroupLeaders"); var successSelection = new List<SelectListItem> { - new SelectListItem { Text = "Success", Value = "1" }, - new SelectListItem { Text = "Fail", Value = "0" } + new SelectListItem { Text = "Success", Value = "True" }, + new SelectListItem { Text = "Fail", Value = "False" } }; var modalBuilder = new ModalBuilder() @@ -84,6 +86,8 @@ namespace MVC_databaskonstruktion.Models public void CreateOperation(string OperationName, DateTime StartDate, DateTime EndDate, bool SuccessRate, string GroupLeader, string Incident) { + Trace.WriteLine("In Model: Successrate read as: " + SuccessRate); + var IncidentName = Incident.Split(", ")[0]; var IncidentNumber = Incident.Split(", ")[1]; @@ -100,5 +104,41 @@ namespace MVC_databaskonstruktion.Models _databaseRepository.CreateRow("Operation", OperationData); } + + public void AddAgentToOperation(string OperationName, DateTime StartDate, string IncidentName, int IncidentNumber, string CodeName) + { + var AgentData = new List<KeyValuePair<string, object>> + { + new KeyValuePair<string, object>("CodeName", CodeName), + new KeyValuePair<string, object>("OperationName", OperationName), + new KeyValuePair<string, object>("StartDate", StartDate.ToString("yyyy-M-d")), + new KeyValuePair<string, object>("IncidentName", IncidentName), + new KeyValuePair<string, object>("IncidentNumber", IncidentNumber) + }; + + foreach(var data in AgentData) + { + Trace.WriteLine(data.Key + " : " + data.Value); + } + + _databaseRepository.CreateRow("OperatesIn", AgentData); + } + + public ModalContext CreateAgentModal(string OperationName, DateTime StartDate, string IncidentName, int IncidentNumber) + { + var fieldAgentsSelection = _databaseRepository.GetColumnAsDropdown("SELECT CodeName FROM FieldAgents"); + + var modalBuilder = new ModalBuilder() + .SetTitle("Add Agent") + .SetIdentifier("AddAgent") + .SetAction("AddAgent", "Operations") + .AddInput("CodeName", "CodeName", "dropdown", "", fieldAgentsSelection) + .AddInput("OperationName", "OperationName", "hidden", OperationName) + .AddInput("StartDate", "StartDate", "hidden", StartDate.ToString("yyyy-M-d")) + .AddInput("IncidentName", "IncidentName", "hidden", IncidentName) + .AddInput("IncidentNumber", "IncidentNumber", "hidden", IncidentNumber.ToString()); + + return modalBuilder.Build(); + } } } \ No newline at end of file diff --git a/MVC-databaskonstruktion/Utils/DatabaseRepository.cs b/MVC-databaskonstruktion/Utils/DatabaseRepository.cs @@ -72,7 +72,7 @@ namespace MVC_databaskonstruktion.Utils cmd.ExecuteNonQuery(); } - public void DeleteRow(string table, List<KeyValuePair<string, string>> primaryKeys) + public void DeleteRow(string table, List<KeyValuePair<string, object>> primaryKeys) { string whereClause = "WHERE "; for (var i = 0; i < primaryKeys.Count; i++) diff --git a/MVC-databaskonstruktion/Utils/TableObject.cs b/MVC-databaskonstruktion/Utils/TableObject.cs @@ -7,6 +7,7 @@ namespace MVC_databaskonstruktion.Utils public DataTable DataSet; public string ControllerName; public string? DeleteTable; + public string? DeletionController; public List<string>? PrimaryKeys; public string? Redirect; } diff --git a/MVC-databaskonstruktion/Utils/TableObjectBuilder.cs b/MVC-databaskonstruktion/Utils/TableObjectBuilder.cs @@ -7,6 +7,7 @@ namespace MVC_databaskonstruktion.Utils private DataTable _dataTable; private string _controllerName; private string? _deleteTable; + private string? _deletionController; private List<string>? _primaryKeys; private string? _redirect; @@ -38,6 +39,12 @@ namespace MVC_databaskonstruktion.Utils return this; } + public TableObjectBuilder SetDeletionController(string controller) + { + _deletionController = controller; + return this; + } + public TableObjectBuilder SetDataTable(DataTable dataTable) { _dataTable = dataTable; @@ -55,11 +62,15 @@ namespace MVC_databaskonstruktion.Utils if (_dataTable == null) throw new NullReferenceException("DataTable is null."); + if (_deletionController == null) + _deletionController = _controllerName; + return new TableObject { DataSet = this._dataTable, ControllerName = this._controllerName, DeleteTable = this._deleteTable, + DeletionController = this._deletionController, PrimaryKeys = this._primaryKeys, Redirect = this._redirect }; diff --git a/MVC-databaskonstruktion/Views/Operations/Details.cshtml b/MVC-databaskonstruktion/Views/Operations/Details.cshtml @@ -7,4 +7,8 @@ <h3>Agents in operation</h3> -<partial name="_TablePartial" model="ViewBag.AgentsInOperation" /> -\ No newline at end of file +<partial name="_TablePartial" model="ViewBag.AgentsInOperation" /> + +<label>Add agent to incident</label> +<br /> +<partial name="_ModalPartial" model="ViewBag.AddAgentModal" /> +\ No newline at end of file diff --git a/MVC-databaskonstruktion/Views/Shared/_ModalPartial.cshtml b/MVC-databaskonstruktion/Views/Shared/_ModalPartial.cshtml @@ -36,7 +36,7 @@ </div> break; case "hidden": - <input type="hidden" id="@input.Id" value="@input.Placeholder"> + <input type="hidden" name="@input.Id" id="@input.Id" value="@input.Placeholder"> break; case "normal": <div class="form-group"> diff --git a/MVC-databaskonstruktion/Views/Shared/_TablePartial.cshtml b/MVC-databaskonstruktion/Views/Shared/_TablePartial.cshtml @@ -7,7 +7,7 @@ var deleteQuery = new RouteValueDictionary(); } -<div class="overflow-scroll w-100"> +<div class="overflow-auto w-100"> <table class="table table-striped table-bordered"> <thead class="table-dark"> <tr> @@ -59,7 +59,7 @@ @if (!string.IsNullOrEmpty(Model.DeleteTable)) { <td class="col-1"> - @Html.ActionLink("Delete", "Delete", Model.ControllerName, deleteQuery, new { @class = "btn btn-block btn-danger m-0 w-100" }) + @Html.ActionLink("Delete", "Delete", Model.DeletionController, deleteQuery, new { @class = "btn btn-block btn-danger m-0 w-100" }) </td> } </tr>