diff --git a/misc/create_schema.sql b/misc/create_schema.sql index e8e7676..41b4378 100644 --- a/misc/create_schema.sql +++ b/misc/create_schema.sql @@ -216,7 +216,7 @@ ENGINE=InnoDB ; CREATE TABLE `role_securable_map` ( - `id` INT(10) UNSIGNED NOT NULL, + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `role_id` INT(10) UNSIGNED NOT NULL, `securable_id` INT(10) UNSIGNED NOT NULL, `created` DATETIME NULL DEFAULT current_timestamp(), diff --git a/src/RoleEditor/MainWindow.xaml.cs b/src/RoleEditor/MainWindow.xaml.cs index 9e720c0..ea7d758 100644 --- a/src/RoleEditor/MainWindow.xaml.cs +++ b/src/RoleEditor/MainWindow.xaml.cs @@ -72,7 +72,7 @@ namespace RoleEditor #region button callbacks - private void buttonParticipantSave_Click(object sender, RoutedEventArgs e) + private async void buttonParticipantSave_Click(object sender, RoutedEventArgs e) { Participant? p = this.listBoxParticipant.SelectedItem as Participant; if (p != null) @@ -81,14 +81,14 @@ namespace RoleEditor p.Street = this.textBoxParticipantStreet.Text.Trim(); p.PostalCode = this.textBoxParticipantPostalCode.Text.Trim(); p.City = this.textBoxParticipantCity.Text.Trim(); - p.Save(_dbManager); + await p.Save(_dbManager); this.listBoxParticipant.ItemsSource = null; this.listBoxParticipant.ItemsSource = _users; this.listBoxParticipant.SelectedItem = p; } } - private void buttonUserSave_Click(object sender, RoutedEventArgs e) + private async void buttonUserSave_Click(object sender, RoutedEventArgs e) { User? u = this.listBoxUser.SelectedItem as User; if(u != null) @@ -107,14 +107,14 @@ namespace RoleEditor u.PasswordHash = hashedInputStringBuilder.ToString(); } u.APIKey = this.textBoxUserAPIKey.Text.Trim(); - u.Save(_dbManager); + await u.Save(_dbManager); this.listBoxUser.ItemsSource = null; this.listBoxUser.ItemsSource = _users; this.listBoxUser.SelectedItem = u; } } - private void buttonAddRole_Click(object sender, RoutedEventArgs e) + private async void buttonAddRole_Click(object sender, RoutedEventArgs e) { Role? r = this.listBoxRoles.SelectedItem as Role; User? u = this.listBoxUser.SelectedItem as User; @@ -138,61 +138,84 @@ namespace RoleEditor ra.RoleId = (int) r.Id; ra.AssignedRole = r; ra.AssignedUser = u; - ra.Save(_dbManager); + await ra.Save(_dbManager); _assignedRoles.Add(ra); } } } - private void buttonRemoveRole_Click(object sender, RoutedEventArgs e) + private async void buttonRemoveRole_Click(object sender, RoutedEventArgs e) { // remove role from user RoleAssignment? ra = this.listBoxUserRoles.SelectedItem as RoleAssignment; if(ra != null) { - ra.Delete(_dbManager); + await ra.Delete(_dbManager); if(_assignedRoles.Contains(ra)) _assignedRoles.Remove(ra); } } - private void buttonAddSecurable_Click(object sender, RoutedEventArgs e) + private async void buttonAddSecurable_Click(object sender, RoutedEventArgs e) { + if ((this.listBoxRoles.SelectedItem is Role r) && (this.listBoxSecurables.SelectedItem is Securable s)) + { + // test if assignment is already present + bool foundMatchingAssignment = false; + foreach (SecurableAssignment sa in _assignedSecurables) + { + if ((sa.SecurableId == s.Id) && (sa.RoleId == r.Id)) + { + foundMatchingAssignment = true; + break; + } + } + if (!foundMatchingAssignment) + { + SecurableAssignment sa = new SecurableAssignment(); + sa.SecurableId = (int)s.Id; + sa.RoleId = (int)r.Id; + sa.AssignedRole = r; + sa.AssignedSecurable = s; + await sa.Save(_dbManager); + _assignedSecurables.Add(sa); + } + } } - private void buttonRemoveSecurable_Click(object sender, RoutedEventArgs e) + private async void buttonRemoveSecurable_Click(object sender, RoutedEventArgs e) { SecurableAssignment? sa = this.listBoxRoleSecurables.SelectedItem as SecurableAssignment; if(sa != null) { - sa.Delete(_dbManager); + await sa.Delete(_dbManager); if (_assignedSecurables.Contains(sa)) _assignedSecurables.Remove(sa); } } - private void buttonSaveSecurable_Click(object sender, RoutedEventArgs e) + private async void buttonSaveSecurable_Click(object sender, RoutedEventArgs e) { Securable? s = this.listBoxSecurables.SelectedItem as Securable; if(s != null) { s.Name = this.textBoxSecurableName.Text.Trim(); - s.Save(_dbManager); + await s.Save(_dbManager); this.listBoxSecurables.ItemsSource = null; this.listBoxSecurables.ItemsSource = _securables; this.listBoxSecurables.SelectedItem = s; } } - private void buttonSaveRole_Click(object sender, RoutedEventArgs e) + private async void buttonSaveRole_Click(object sender, RoutedEventArgs e) { Role? r = this.listBoxRoles.SelectedItem as Role; if(r != null) { r.Name = this.textBoxRoleName.Text.Trim(); r.Description = this.textBoxRoleDescription.Text.Trim(); - r.Save(_dbManager); + await r.Save(_dbManager); this.listBoxRoles.ItemsSource = null; this.listBoxRoles.ItemsSource = _roles; this.listBoxRoles.SelectedItem = r; @@ -236,9 +259,12 @@ namespace RoleEditor foreach (Securable s in this._securables) { if (sa.SecurableId == s.Id) + { sa.AssignedSecurable = s; - _assignedSecurables.Add(sa); + break; + } } + _assignedSecurables.Add(sa); } } } @@ -264,9 +290,12 @@ namespace RoleEditor foreach (Role r in this._roles) { if (ra.RoleId == r.Id) + { ra.AssignedRole = r; - _assignedRoles.Add(ra); + break; + } } + _assignedRoles.Add(ra); } } } @@ -281,9 +310,20 @@ namespace RoleEditor #region menuitem callbacks - private void menuItemDeleteParticipant_Click(object sender, RoutedEventArgs e) + private async void menuItemDeleteParticipant_Click(object sender, RoutedEventArgs e) { - + try + { + if(this.listBoxParticipant.SelectedItem is Participant p) + { + await p.Delete(_dbManager); + this._participants.Remove(p); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); + } } private void menuItemNewParticipant_Click(object sender, RoutedEventArgs e) @@ -305,9 +345,20 @@ namespace RoleEditor } } - private void menuItemDeleteUser_Click(object sender, RoutedEventArgs e) + private async void menuItemDeleteUser_Click(object sender, RoutedEventArgs e) { - + try + { + if (this.listBoxUser.SelectedItem is User u) + { + await u.Delete(_dbManager); + this._users.Remove(u); + } + } + catch(Exception ex) + { + MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); + } } private void menuItemNewRole_Click(object sender, RoutedEventArgs e) @@ -317,9 +368,20 @@ namespace RoleEditor this.listBoxRoles.SelectedItem = r; } - private void menuItemDeleteRole_Click(object sender, RoutedEventArgs e) + private async void menuItemDeleteRole_Click(object sender, RoutedEventArgs e) { - + try + { + if (this.listBoxRoles.SelectedItem is Role r) + { + await r.Delete(_dbManager); + this._roles.Remove(r); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); + } } private void menuItemNewSecurable_Click(object sender, RoutedEventArgs e) @@ -329,9 +391,20 @@ namespace RoleEditor this.listBoxSecurables.SelectedItem = s; } - private void menuItemDeleteSecurable_Click(object sender, RoutedEventArgs e) + private async void menuItemDeleteSecurable_Click(object sender, RoutedEventArgs e) { - + try + { + if (this.listBoxSecurables.SelectedItem is Securable s) + { + await s.Delete(_dbManager); + this._securables.Remove(s); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); + } } #endregion diff --git a/src/brecal.model/DbEntity.cs b/src/brecal.model/DbEntity.cs index dd0b778..e341bf7 100644 --- a/src/brecal.model/DbEntity.cs +++ b/src/brecal.model/DbEntity.cs @@ -45,7 +45,7 @@ namespace brecal.model /// /// Each database entity must be able to save itself to the database /// - public async void Save(IDBManager manager) + public async Task Save(IDBManager manager) { if (this.Created.HasValue) { @@ -60,7 +60,7 @@ namespace brecal.model /// /// Each entity must be able to delete itself /// - public async void Delete(IDBManager manager) + public async Task Delete(IDBManager manager) { await manager.ExecuteNonQuery(this.SetDelete); } diff --git a/src/brecal.model/RoleAssignment.cs b/src/brecal.model/RoleAssignment.cs index 95498e1..26ea20d 100644 --- a/src/brecal.model/RoleAssignment.cs +++ b/src/brecal.model/RoleAssignment.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Data; namespace brecal.model { @@ -105,7 +100,7 @@ namespace brecal.model } else { - return $"{AssignedRole.Name}:{Id}"; + return AssignedRole.Name ?? AssignedRole.Id.ToString(); } } diff --git a/src/brecal.model/SecurableAssignment.cs b/src/brecal.model/SecurableAssignment.cs index fb7db00..ed1abf1 100644 --- a/src/brecal.model/SecurableAssignment.cs +++ b/src/brecal.model/SecurableAssignment.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Data; namespace brecal.model { @@ -73,7 +68,17 @@ namespace brecal.model public override void SetCreate(IDbCommand cmd) { - throw new NotImplementedException(); + cmd.CommandText = "INSERT INTO role_securable_map (securable_id, role_id) VALUES (@SECURABLEID, @ROLEID)"; + + IDbDataParameter userid = cmd.CreateParameter(); + userid.ParameterName = "SECURABLEID"; + userid.Value = this.SecurableId; + cmd.Parameters.Add(userid); + + IDbDataParameter roleid = cmd.CreateParameter(); + roleid.ParameterName = "ROLEID"; + roleid.Value = this.RoleId; + cmd.Parameters.Add(roleid); } public override void SetDelete(IDbCommand cmd) @@ -94,7 +99,7 @@ namespace brecal.model } else { - return $"{AssignedSecurable.Name}:{Id}"; + return AssignedSecurable.Name ?? AssignedSecurable.Id.ToString(); } }