From a01b88e0c913d4411b5637b29f05152428ec9214 Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sun, 16 Apr 2023 12:59:13 +0200 Subject: [PATCH] Loading of participant and user functional --- src/RoleEditor/MainWindow.xaml.cs | 53 +++++++++++++--- src/brecal.model/DbEntity.cs | 33 +++++++++- src/brecal.model/IDBManager.cs | 4 +- src/brecal.model/Participant.cs | 80 ++++++++++--------------- src/brecal.model/Role.cs | 77 ++++++++++++++++++++++-- src/brecal.model/RoleAssignment.cs | 12 +++- src/brecal.model/Securable.cs | 12 +++- src/brecal.model/SecurableAssignment.cs | 12 +++- src/brecal.model/User.cs | 61 +++++++++++++++++-- src/brecal.mysql/DBManager.cs | 4 +- 10 files changed, 268 insertions(+), 80 deletions(-) diff --git a/src/RoleEditor/MainWindow.xaml.cs b/src/RoleEditor/MainWindow.xaml.cs index 2767da5..d2c511a 100644 --- a/src/RoleEditor/MainWindow.xaml.cs +++ b/src/RoleEditor/MainWindow.xaml.cs @@ -33,7 +33,7 @@ namespace RoleEditor private readonly ObservableCollection _users = new ObservableCollection(); private readonly ObservableCollection _assignedRoles = new ObservableCollection(); private readonly ObservableCollection _assignedSecurables = new ObservableCollection(); - private DBManager? _dbManager; + private DBManager _dbManager; #endregion @@ -42,19 +42,29 @@ namespace RoleEditor public MainWindow() { InitializeComponent(); + _dbManager = new(); } - private void Window_Loaded(object sender, RoutedEventArgs e) + private async void Window_Loaded(object sender, RoutedEventArgs e) { // try database connection try - { - _dbManager = new(); - + { // load all participants - + foreach(Participant p in await Participant.LoadAll(_dbManager)) + _participants.Add(p); + this.listBoxParticipant.ItemsSource = _participants; // load all roles + foreach(Role r in await Role.LoadAll(_dbManager)) + _roles.Add(r); + this.listBoxRoles.ItemsSource = _roles; + + // set other item sources + this.listBoxUser.ItemsSource = _users; + this.listBoxSecurables.ItemsSource = _securables; + this.listBoxRoleSecurables.ItemsSource = _assignedSecurables; + this.listBoxUserRoles.ItemsSource = _assignedRoles; } catch (Exception ex) { @@ -111,9 +121,22 @@ namespace RoleEditor #region listbox selection callbacks - private void listBoxParticipant_SelectionChanged(object sender, SelectionChangedEventArgs e) + private async void listBoxParticipant_SelectionChanged(object sender, SelectionChangedEventArgs e) { + Participant? p = this.listBoxParticipant.SelectedItem as Participant; + + this.textBoxParticipantName.Text = (p != null) ? p.Name : string.Empty; + this.textBoxParticipantStreet.Text = (p != null) ? p.Street : string.Empty; + this.textBoxParticipantPostalCode.Text = (p != null) ? p.PostalCode : string.Empty; + this.textBoxParticipantCity.Text = (p != null) ? p.City : string.Empty; + // this.checkboxParticipantActive.Checked = (p != null) ? p. + this.textBoxParticipantCreated.Text = (p != null) ? p.Created.ToString() : string.Empty; + this.textBoxParticipantModified.Text = (p != null) ? p.Modified.ToString() : string.Empty; + // -> load users for this participant selection + this._users.Clear(); + foreach (User u in await User.LoadForParticipant(p, _dbManager)) + _users.Add(u); } private void listBoxRoles_SelectionChanged(object sender, SelectionChangedEventArgs e) @@ -123,6 +146,13 @@ namespace RoleEditor private void listBoxUser_SelectionChanged(object sender, SelectionChangedEventArgs e) { + User? u = this.listBoxUser.SelectedItem as User; + this.textBoxUserFirstName.Text = (u != null) ? u.Firstname : string.Empty; + this.textBoxUserLastName.Text = (u != null) ? u.Lastname : string.Empty; + this.textBoxUserUserName.Text = (u != null) ? u.Username : string.Empty; + this.textBoxUserAPIKey.Text = (u != null) ? u.APIKey : string.Empty; + this.textBoxUserCreated.Text = (u != null) ? u.Created.ToString() : string.Empty; + this.textBoxUserModified.Text = (u != null) ? u.Modified.ToString() : string.Empty; } @@ -147,7 +177,14 @@ namespace RoleEditor private void menuItemNewUser_Click(object sender, RoutedEventArgs e) { - + Participant? p = this.listBoxParticipant.SelectedItem as Participant; + if(p != null) + { + User u = new(); + u.Participant_Id = p.Id; + _users.Add(u); + this.listBoxUser.SelectedItem = u; + } } private void menuItemDeleteUser_Click(object sender, RoutedEventArgs e) diff --git a/src/brecal.model/DbEntity.cs b/src/brecal.model/DbEntity.cs index 4a098b8..1b9b57a 100644 --- a/src/brecal.model/DbEntity.cs +++ b/src/brecal.model/DbEntity.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -23,14 +24,42 @@ namespace brecal.model /// public DateTime? Modified { get; set; } + /// + /// Set query and cmd parameters for an update query + /// + /// CMD created by DB manager + public abstract void SetUpdate(IDbCommand cmd); + + /// + /// set query and cmd parameters for a create query + /// + /// CMD created by DB manager + public abstract void SetCreate(IDbCommand cmd); + + /// + /// set query and cmd parameters for a delete query + /// + /// CMD created by DB manager + public abstract void SetDelete(IDbCommand cmd); + /// /// Each database entity must be able to save itself to the database /// - public abstract void Save(IDBManager manager); + public async void Save(IDBManager manager) + { + if (this.Created.HasValue) + await manager.ExecuteNonQuery(this.SetUpdate); + else + await manager.ExecuteNonQuery(this.SetCreate); + } /// /// Each entity must be able to delete itself /// - public abstract void Delete(IDBManager manager); + public async void Delete(IDBManager manager) + { + await manager.ExecuteNonQuery(this.SetDelete); + } + } } diff --git a/src/brecal.model/IDBManager.cs b/src/brecal.model/IDBManager.cs index 15ff592..bcc2814 100644 --- a/src/brecal.model/IDBManager.cs +++ b/src/brecal.model/IDBManager.cs @@ -12,7 +12,9 @@ namespace brecal.model delegate List LoadFunc(T entity); - Task> Load(Action prepareAction, LoadFunc loadAction); + delegate void QueryFunc(IDbCommand cmd, params object[] args); + + Task> Load(QueryFunc prepareAction, LoadFunc loadAction, params object[] args); Task ExecuteScalar(Action prepareAction); diff --git a/src/brecal.model/Participant.cs b/src/brecal.model/Participant.cs index 0e68936..fa5738a 100644 --- a/src/brecal.model/Participant.cs +++ b/src/brecal.model/Participant.cs @@ -21,61 +21,60 @@ namespace brecal.model public uint Flags { get; set; } - #endregion - - #region abstract method implementation - - // TODO: Diese Funktionen in die Basisklasse verschieben und die SetUpdate SetCreate SetDelete - // abstract machen - - public async override void Save(IDBManager manager) - { - if (this.Created.HasValue) - await manager.ExecuteNonQuery(this.SetUpdate); - else - await manager.ExecuteNonQuery(this.SetCreate); - } - - public async override void Delete(IDBManager manager) - { - await manager.ExecuteNonQuery(this.SetDelete); - } - - #endregion + #endregion #region public static methods public static async Task> LoadAll(IDBManager manager) { List loadResultList = await manager.Load(SetLoadQuery, LoadElems); - List result = new List(); + List result = new(); foreach (Participant p in loadResultList.Cast()) result.Add(p); return result; + } + + public static List LoadElems(IDataReader reader) + { + List result = new List(); + while (reader.Read()) + { + Participant p = new(); + p.Id = (uint)reader.GetInt32(0); + if (!reader.IsDBNull(1)) p.Name = reader.GetString(1); + if (!reader.IsDBNull(2)) p.Street = reader.GetString(2); + if (!reader.IsDBNull(3)) p.PostalCode = reader.GetString(3); + if (!reader.IsDBNull(4)) p.City = reader.GetString(4); + if (!reader.IsDBNull(5)) p.Flags = (uint)reader.GetInt32(5); + if (!reader.IsDBNull(6)) p.Created = reader.GetDateTime(6); + if (!reader.IsDBNull(7)) p.Modified = reader.GetDateTime(7); + result.Add(p); + } + return result; } - #endregion - - #region parameter funcs - - public static void SetLoadQuery(IDbCommand cmd) + public static void SetLoadQuery(IDbCommand cmd, params object[] list) { cmd.CommandText = "SELECT id, name, street, postal_code, city, flags, created, modified FROM participant"; } - public void SetUpdate(IDbCommand cmd) + #endregion + + #region abstract method implementation + + public override void SetUpdate(IDbCommand cmd) { cmd.CommandText = "UPDATE participant set name = @NAME, street = @STREET, postal_code = @POSTAL_CODE, city = @CITY, flags = @FLAGS WHERE id = @ID"; this.SetParameters(cmd); } - public void SetCreate(IDbCommand cmd) + public override void SetCreate(IDbCommand cmd) { cmd.CommandText = "INSERT INTO participant (name, street, postal_code, city, flags) VALUES ( @NAME, @STREET, @POSTAL_CODE, @CITY, @FLAGS)"; this.SetParameters(cmd); } - public void SetDelete(IDbCommand cmd) + public override void SetDelete(IDbCommand cmd) { cmd.CommandText = "DELETE FROM participant WHERE id = @ID"; @@ -83,26 +82,7 @@ namespace brecal.model idParam.ParameterName = "ID"; idParam.Value = this.Id; cmd.Parameters.Add(idParam); - } - - public static List LoadElems(IDataReader reader) - { - List result = new List(); - while(reader.Read()) - { - Participant p = new(); - p.Id = (uint) reader.GetInt32(0); - if(!reader.IsDBNull(1)) p.Name = reader.GetString(1); - if(!reader.IsDBNull(2)) p.Street = reader.GetString(2); - if (!reader.IsDBNull(3)) p.PostalCode = reader.GetString(3); - if (!reader.IsDBNull(4)) p.City = reader.GetString(4); - if(!reader.IsDBNull(5)) p.Flags = (uint) reader.GetInt32(5); - if (!reader.IsDBNull(6)) p.Created = reader.GetDateTime(6); - if(!reader.IsDBNull(7)) p.Modified = reader.GetDateTime(7); - result.Add(p); - } - return result; - } + } #endregion diff --git a/src/brecal.model/Role.cs b/src/brecal.model/Role.cs index 5fa802d..b9c67d2 100644 --- a/src/brecal.model/Role.cs +++ b/src/brecal.model/Role.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -17,16 +18,62 @@ namespace brecal.model #endregion - #region overrides + #region public static methods - public async override void Save(IDBManager manager) + public static async Task> LoadAll(IDBManager manager) { - + List loadResultList = await manager.Load(SetLoadQuery, LoadElems); + List result = new(); + foreach (Role r in loadResultList.Cast()) + result.Add(r); + return result; } - public async override void Delete(IDBManager manager) + public static void SetLoadQuery(IDbCommand cmd, params object[] list) { + cmd.CommandText = "SELECT id, name, description, created, modified FROM role"; + } + public static List LoadElems(IDataReader reader) + { + List result = new List(); + while (reader.Read()) + { + Role r = new(); + r.Id = (uint)reader.GetInt32(0); + if (!reader.IsDBNull(1)) r.Name = reader.GetString(1); + if (!reader.IsDBNull(2)) r.Description = reader.GetString(2); + if (!reader.IsDBNull(3)) r.Created = reader.GetDateTime(3); + if (!reader.IsDBNull(4)) r.Modified = reader.GetDateTime(4); + result.Add(r); + } + return result; + } + + #endregion + + #region overrides + + public override void SetUpdate(IDbCommand cmd) + { + cmd.CommandText = "UPDATE role set name = @NAME, description = @DESC WHERE id = @ID"; + this.SetParameters(cmd); + } + + public override void SetCreate(IDbCommand cmd) + { + cmd.CommandText = "INSERT INTO role (name, description) VALUES ( @NAME, @DESC)"; + this.SetParameters(cmd); + } + + public override void SetDelete(IDbCommand cmd) + { + cmd.CommandText = "DELETE FROM role WHERE id = @ID"; + + IDataParameter idParam = cmd.CreateParameter(); + idParam.ParameterName = "ID"; + idParam.Value = this.Id; + cmd.Parameters.Add(idParam); } public override string ToString() @@ -36,5 +83,27 @@ namespace brecal.model #endregion + #region private methods + + private void SetParameters(IDbCommand cmd) + { + IDbDataParameter name = cmd.CreateParameter(); + name.ParameterName = "NAME"; + name.Value = this.Name; + cmd.Parameters.Add(name); + + IDbDataParameter desc = cmd.CreateParameter(); + desc.ParameterName = "DESC"; + desc.Value = this.Description; + cmd.Parameters.Add(desc); + + IDataParameter idParam = cmd.CreateParameter(); + idParam.ParameterName = "ID"; + idParam.Value = this.Id; + cmd.Parameters.Add(idParam); + } + + #endregion + } } diff --git a/src/brecal.model/RoleAssignment.cs b/src/brecal.model/RoleAssignment.cs index 58ebd60..489df60 100644 --- a/src/brecal.model/RoleAssignment.cs +++ b/src/brecal.model/RoleAssignment.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -17,14 +18,19 @@ namespace brecal.model #endregion - public async override void Save(IDBManager manager) + public override void SetUpdate(IDbCommand cmd) { - + throw new NotImplementedException(); } - public async override void Delete(IDBManager manager) + public override void SetCreate(IDbCommand cmd) { + throw new NotImplementedException(); + } + public override void SetDelete(IDbCommand cmd) + { + throw new NotImplementedException(); } } diff --git a/src/brecal.model/Securable.cs b/src/brecal.model/Securable.cs index cfb50b8..f0e6f06 100644 --- a/src/brecal.model/Securable.cs +++ b/src/brecal.model/Securable.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -17,14 +18,19 @@ namespace brecal.model #region overrides - public async override void Save(IDBManager manager) + public override void SetUpdate(IDbCommand cmd) { - + throw new NotImplementedException(); } - public async override void Delete(IDBManager manager) + public override void SetCreate(IDbCommand cmd) { + throw new NotImplementedException(); + } + public override void SetDelete(IDbCommand cmd) + { + throw new NotImplementedException(); } public override string ToString() diff --git a/src/brecal.model/SecurableAssignment.cs b/src/brecal.model/SecurableAssignment.cs index d19a620..5ae9eae 100644 --- a/src/brecal.model/SecurableAssignment.cs +++ b/src/brecal.model/SecurableAssignment.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -16,14 +17,19 @@ namespace brecal.model #endregion - public async override void Save(IDBManager manager) + public override void SetUpdate(IDbCommand cmd) { - + throw new NotImplementedException(); } - public async override void Delete(IDBManager manager) + public override void SetCreate(IDbCommand cmd) { + throw new NotImplementedException(); + } + public override void SetDelete(IDbCommand cmd) + { + throw new NotImplementedException(); } } diff --git a/src/brecal.model/User.cs b/src/brecal.model/User.cs index 9eed56f..38759c8 100644 --- a/src/brecal.model/User.cs +++ b/src/brecal.model/User.cs @@ -1,4 +1,6 @@ -namespace brecal.model +using System.Data; + +namespace brecal.model { public class User : DbEntity { @@ -14,18 +16,67 @@ public string? APIKey { get; set; } + public uint? Participant_Id { get; set; } + + #endregion + + #region public static methods + + public static async Task> LoadForParticipant(Participant? p, IDBManager manager) + { + List loadResultList = await manager.Load(SetLoadQuery, LoadElems, args: p); + List result = new(); + foreach (User u in loadResultList.Cast()) + result.Add(u); + return result; + } + + public static void SetLoadQuery(IDbCommand cmd, params object[] args) + { + cmd.CommandText = "SELECT id, first_name, last_name, user_name, api_key, created, modified FROM user WHERE participant_id = @PID"; + if (args.Length != 1 || !(args[0] is Participant)) + throw new ArgumentException("loader needs single partipant as argument"); + IDataParameter pid = cmd.CreateParameter(); + pid.ParameterName = "PID"; + pid.Value = ((Participant)args[0]).Id; + cmd.Parameters.Add(pid); + } + + public static List LoadElems(IDataReader reader) + { + List result = new List(); + while (reader.Read()) + { + User u = new(); + u.Id = (uint)reader.GetInt32(0); + if (!reader.IsDBNull(1)) u.Firstname = reader.GetString(1); + if (!reader.IsDBNull(2)) u.Lastname = reader.GetString(2); + if (!reader.IsDBNull(3)) u.Username = reader.GetString(3); + if (!reader.IsDBNull(4)) u.APIKey = reader.GetString(4); + if (!reader.IsDBNull(5)) u.Created = reader.GetDateTime(5); + if (!reader.IsDBNull(6)) u.Modified = reader.GetDateTime(6); + result.Add(u); + } + return result; + } + #endregion #region overrides - public async override void Save(IDBManager manager) + public override void SetUpdate(IDbCommand cmd) { - + throw new NotImplementedException(); } - public async override void Delete(IDBManager manager) + public override void SetCreate(IDbCommand cmd) { + throw new NotImplementedException(); + } + public override void SetDelete(IDbCommand cmd) + { + throw new NotImplementedException(); } public override string ToString() @@ -33,6 +84,8 @@ return this.Username ?? $"{base.Id} - {this.GetType().Name}"; } + + #endregion } diff --git a/src/brecal.mysql/DBManager.cs b/src/brecal.mysql/DBManager.cs index 27c1f69..b26c1c2 100644 --- a/src/brecal.mysql/DBManager.cs +++ b/src/brecal.mysql/DBManager.cs @@ -11,13 +11,13 @@ namespace brecal.mysql // TODO: remove this and use certificates instead private static readonly string _connectionString = "Server=localhost;User ID=ds;Password=HalloWach23;Database=bremen_calling"; - public async Task> Load(Action prepareAction, LoadFunc loadAction) + public async Task> Load(QueryFunc prepareAction, LoadFunc loadAction, params object[] args) { await using MySqlConnection connection = new MySqlConnection(_connectionString); await connection.OpenAsync(); using MySqlCommand cmd = new(); cmd.Connection = connection; - prepareAction(cmd); + prepareAction(cmd, args); MySqlDataReader reader = await cmd.ExecuteReaderAsync(); List result = loadAction(reader); reader.Close();