//****************************************************************************************************** // ApplicationRole.cs - Gbtc // // Copyright © 2012, Grid Protection Alliance. All Rights Reserved. // // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See // the NOTICE file distributed with this work for additional information regarding copyright ownership. // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may // not use this file except in compliance with the License. You may obtain a copy of the License at: // // http://www.opensource.org/licenses/MIT // // Unless agreed to in writing, the subject software distributed under the License is distributed on an // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the // License for the specific language governing permissions and limitations. // // Code Modification History: // ---------------------------------------------------------------------------------------------------- // 04/13/2011 - Aniket Salver // Generated original version of source code. // 05/02/2011 - J. Ritchie Carroll // Updated for coding consistency. // 05/03/2011 - Mehulbhai P Thakkar // Guid field related changes as well as static functions update. // 05/05/2011 - Mehulbhai P Thakkar // Added NULL value and Guid parameter handling for Save() operation. // 12/20/2012 - Starlynn Danyelle Gilliam // Modified Header. // //****************************************************************************************************** using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel.DataAnnotations; using System.Data; using GSF.Data; using GSF.Identity; namespace GSF.TimeSeries.UI.DataModels { /// /// Represents a record of information as defined in the database. /// public class ApplicationRole : DataModelBase { #region [ Members ] // Fields private Guid m_id; private Guid m_nodeID; private string m_name; private string m_description; private DateTime m_createdOn; private string m_createdBy; private DateTime m_updatedOn; private string m_updatedBy; private Dictionary m_currentGroups; private Dictionary m_possibleGroups; private Dictionary m_currentUsers; private Dictionary m_possibleUsers; #endregion #region [ Properties ] /// /// Gets or sets ID. /// // Field is populated by database via trigger and has no screen interaction, so no validation attributes are applied public Guid ID { get { return m_id; } set { m_id = value; } } /// /// Gets or sets NodeID. /// [Required(ErrorMessage = "Application role node ID is a required field, please select a value.")] public Guid NodeID { get { return m_nodeID; } set { m_nodeID = value; OnPropertyChanged("NodeID"); } } /// /// Gets or sets Name. /// [Required(ErrorMessage = " Application role name is a required field, please provide value.")] [StringLength(200, ErrorMessage = "Application role name cannot exceed 200 characters.")] public string Name { get { return m_name; } set { m_name = value; OnPropertyChanged("Name"); } } /// /// Gets or sets Description. /// // Because of database design, no validation attributes are applied. public string Description { get { return m_description; } set { m_description = value; OnPropertyChanged("Description"); } } /// /// Gets or sets CreatedOn. /// // Field is populated by database via trigger and has no screen interaction, so no validation attributes are applied public DateTime CreatedOn { get { return m_createdOn; } set { m_createdOn = value; } } /// /// Gets or sets CreatedBy. /// // Field is populated by database via trigger and has no screen interaction, so no validation attributes are applied public string CreatedBy { get { return m_createdBy; } set { m_createdBy = value; } } /// /// Gets or sets UpdatedOn. /// // Field is populated by database via trigger and has no screen interaction, so no validation attributes are applied public DateTime UpdatedOn { get { return m_updatedOn; } set { m_updatedOn = value; } } /// /// Gets or sets UpdatedBy. /// // Field is populated by database via trigger and has no screen interaction, so no validation attributes are applied public string UpdatedBy { get { return m_updatedBy; } set { m_updatedBy = value; } } /// /// Gets or sets CurrentRoleGroups. /// public Dictionary CurrentGroups { get { return m_currentGroups; } set { m_currentGroups = value; OnPropertyChanged("CurrentGroups"); } } /// /// Gets or sets PossibleRoleGroups. /// public Dictionary PossibleGroups { get { return m_possibleGroups; } set { m_possibleGroups = value; OnPropertyChanged("PossibleGroups"); } } /// /// Gets or sets CurrentRoleUsers. /// public Dictionary CurrentUsers { get { return m_currentUsers; } set { m_currentUsers = value; OnPropertyChanged("CurrentUsers"); } } /// /// Gets or sets PossibleRoleUsers. /// public Dictionary PossibleUsers { get { return m_possibleUsers; } set { m_possibleUsers = value; OnPropertyChanged("PossibleUsers"); } } #endregion #region [Static] // Static Methods /// /// Loads information as an style list. /// /// to connection to database. /// Collection of . public static ObservableCollection Load(AdoDataConnection database) { bool createdConnection = false; try { createdConnection = CreateConnection(ref database); ObservableCollection applicationRoleList = new ObservableCollection(); string query = database.ParameterizedQueryString("SELECT * FROM ApplicationRole WHERE NodeID = {0} ORDER BY Name", "nodeID"); DataTable applicationRoleTable = database.Connection.RetrieveData(database.AdapterType, query, database.CurrentNodeID()); foreach (DataRow row in applicationRoleTable.Rows) { applicationRoleList.Add(new ApplicationRole() { ID = database.Guid(row, "ID"), //Guid.Parse(row.Field("ID").ToString()), Name = row.Field("Name"), Description = row.Field("Description"), NodeID = Guid.Parse(row.Field("NodeID").ToString()), CreatedOn = row.Field("CreatedOn"), CreatedBy = row.Field("CreatedBy"), UpdatedOn = row.Field("UpdatedOn"), UpdatedBy = row.Field("UpdatedBy"), CurrentUsers = GetCurrentUsers(database, Guid.Parse(row.Field("ID").ToString())), PossibleUsers = GetPossibleUsers(database, Guid.Parse(row.Field("ID").ToString())), CurrentGroups = GetCurrentGroups(database, Guid.Parse(row.Field("ID").ToString())), PossibleGroups = GetPossibleGroups(database, Guid.Parse(row.Field("ID").ToString())) }); } return applicationRoleList; } finally { if (createdConnection && database != null) database.Dispose(); } } /// /// Retrieves collection of s assigned to . /// /// to connection to database. /// ID of the to search for. /// type collection of . public static Dictionary GetCurrentUsers(AdoDataConnection database, Guid roleID) { bool createdConnection = false; try { createdConnection = CreateConnection(ref database); Dictionary currentUsers = new Dictionary(); string query = database.ParameterizedQueryString("SELECT * FROM AppRoleUserAccountDetail WHERE ApplicationRoleID = {0} ORDER BY UserName", "applicationRoleID"); DataTable currentUsersTable = database.Connection.RetrieveData(database.AdapterType, query, database.Guid(roleID)); foreach (DataRow row in currentUsersTable.Rows) currentUsers[database.Guid(row, "UserAccountID")] = UserInfo.SIDToAccountName(row.Field("UserName")); return currentUsers; } finally { if (createdConnection && database != null) database.Dispose(); } } /// /// Retrieves collection of s NOT assigned to . /// /// to connection to database. /// ID of the to search for. /// type collection of . public static Dictionary GetPossibleUsers(AdoDataConnection database, Guid roleID) { bool createdConnection = false; try { createdConnection = CreateConnection(ref database); Dictionary possibleUsers = new Dictionary(); string query = database.ParameterizedQueryString("SELECT * FROM UserAccount WHERE ID NOT IN (SELECT UserAccountID FROM ApplicationRoleUserAccount WHERE ApplicationRoleID = {0}) ORDER BY Name", "applicationRoleID"); DataTable possibleUsersTable = database.Connection.RetrieveData(database.AdapterType, query, database.Guid(roleID)); foreach (DataRow row in possibleUsersTable.Rows) possibleUsers[database.Guid(row, "ID")] = UserInfo.SIDToAccountName(row.Field("Name")); return possibleUsers; } finally { if (createdConnection && database != null) database.Dispose(); } } /// /// Retrieves collection of s assigned to . /// /// to connection to database. /// ID of the to search for. /// type collection of . public static Dictionary GetCurrentGroups(AdoDataConnection database, Guid roleID) { bool createdConnection = false; try { createdConnection = CreateConnection(ref database); Dictionary currentGroups = new Dictionary(); string query = database.ParameterizedQueryString("SELECT * FROM AppRoleSecurityGroupDetail WHERE ApplicationRoleID = {0} ORDER BY SecurityGroupName", "applicationRoleID"); DataTable currentGroupsTable = database.Connection.RetrieveData(database.AdapterType, query, database.Guid(roleID)); foreach (DataRow row in currentGroupsTable.Rows) currentGroups[database.Guid(row, "SecurityGroupID")] = UserInfo.SIDToAccountName(row.Field("SecurityGroupName")); return currentGroups; } finally { if (createdConnection && database != null) database.Dispose(); } } /// /// Retrieves collection of s NOT assigned to . /// /// to connection to database. /// ID of the to search for. /// type collection of . public static Dictionary GetPossibleGroups(AdoDataConnection database, Guid roleID) { bool createdConnection = false; try { createdConnection = CreateConnection(ref database); Dictionary possibleGroups = new Dictionary(); string query = database.ParameterizedQueryString("SELECT * FROM SecurityGroup WHERE ID NOT IN (SELECT SecurityGroupID FROM ApplicationRoleSecurityGroup WHERE ApplicationRoleID = {0}) ORDER BY Name", "applicationRoleID"); DataTable possibleGroupsTable = database.Connection.RetrieveData(database.AdapterType, query, database.Guid(roleID)); foreach (DataRow row in possibleGroupsTable.Rows) possibleGroups[database.Guid(row, "ID")] = UserInfo.SIDToAccountName(row.Field("Name")); return possibleGroups; } finally { if (createdConnection && database != null) database.Dispose(); } } /// /// Adds to . /// /// to connection to database. /// ID of to which s are being added. /// List of IDs to be added. /// string, for display use, indicating success. public static string AddUsers(AdoDataConnection database, Guid roleID, List usersToBeAdded) { bool createdConnection = false; try { createdConnection = CreateConnection(ref database); foreach (Guid id in usersToBeAdded) { string userName = database.Connection.ExecuteScalar(database.ParameterizedQueryString("SELECT Name FROM UserAccount WHERE ID = {0}", "userAccountID"), DefaultTimeout, database.Guid(id)).ToNonNullString(); string roleName = database.Connection.ExecuteScalar(database.ParameterizedQueryString("SELECT Name FROM ApplicationRole WHERE ID = {0}", "applicationRoleID"), DefaultTimeout, database.Guid(roleID)).ToNonNullString(); string query = database.ParameterizedQueryString("INSERT INTO ApplicationRoleUserAccount (ApplicationRoleID, UserAccountID) VALUES ({0}, {1})", "roleID", "userID"); database.Connection.ExecuteNonQuery(query, DefaultTimeout, database.Guid(roleID), database.Guid(id)); CommonFunctions.LogEvent(string.Format("User \"{0}\" added to role \"{1}\" by user \"{2}\".", UserInfo.SIDToAccountName(userName), roleName, CommonFunctions.CurrentUser), 4); } return "User accounts added to role successfully"; } finally { if (createdConnection && database != null) database.Dispose(); } } /// /// Deletes from . /// /// to connection to database. /// ID of from which s are being deleted. /// List of IDs to be deleted. /// string, for display use, indicating success. public static string RemoveUsers(AdoDataConnection database, Guid roleID, List usersToBeDeleted) { bool createdConnection = false; try { createdConnection = CreateConnection(ref database); foreach (Guid id in usersToBeDeleted) { string userName = database.Connection.ExecuteScalar(database.ParameterizedQueryString("SELECT Name FROM UserAccount WHERE ID = {0}", "userAccountID"), DefaultTimeout, database.Guid(id)).ToNonNullString(); string roleName = database.Connection.ExecuteScalar(database.ParameterizedQueryString("SELECT Name FROM ApplicationRole WHERE ID = {0}", "applicationRoleID"), DefaultTimeout, database.Guid(roleID)).ToNonNullString(); string query = database.ParameterizedQueryString("DELETE FROM ApplicationRoleUserAccount WHERE ApplicationRoleID = {0} AND UserAccountID = {1}", "roleID", "userID"); database.Connection.ExecuteNonQuery(query, DefaultTimeout, database.Guid(roleID), database.Guid(id)); CommonFunctions.LogEvent(string.Format("User \"{0}\" removed from role \"{1}\" by user \"{2}\".", UserInfo.SIDToAccountName(userName), roleName, CommonFunctions.CurrentUser), 5); } return "User accounts deleted from role successfully"; } finally { if (createdConnection && database != null) database.Dispose(); } } /// /// Adds to . /// /// to connection to database. /// ID of to which s are being added. /// List of IDs to be added. /// string, for display use, indicating success. public static string AddGroups(AdoDataConnection database, Guid roleID, List groupsToBeAdded) { bool createdConnection = false; try { createdConnection = CreateConnection(ref database); foreach (Guid id in groupsToBeAdded) { string groupName = database.Connection.ExecuteScalar(database.ParameterizedQueryString("SELECT Name FROM SecurityGroup WHERE ID = {0}", "securityGroupID"), DefaultTimeout, database.Guid(id)).ToNonNullString(); string roleName = database.Connection.ExecuteScalar(database.ParameterizedQueryString("SELECT Name FROM ApplicationRole WHERE ID = {0}", "applicationRoleID"), DefaultTimeout, database.Guid(roleID)).ToNonNullString(); string query = database.ParameterizedQueryString("INSERT INTO ApplicationRoleSecurityGroup (ApplicationRoleID, SecurityGroupID) Values ({0}, {1})", "roleID", "groupID"); database.Connection.ExecuteNonQuery(query, DefaultTimeout, database.Guid(roleID), database.Guid(id)); CommonFunctions.LogEvent(string.Format("Group \"{0}\" added to role \"{1}\" by user \"{2}\".", UserInfo.SIDToAccountName(groupName), roleName, CommonFunctions.CurrentUser), 10); } return "Security groups added to role successfully"; } finally { if (createdConnection && database != null) database.Dispose(); } } /// /// Deletes from . /// /// to connection to database. /// ID of from which s are being deleted. /// List of IDs to be deleted. /// string, for display use, indicating success. public static string RemoveGroups(AdoDataConnection database, Guid roleID, List groupsToBeDeleted) { bool createdConnection = false; try { createdConnection = CreateConnection(ref database); foreach (Guid id in groupsToBeDeleted) { string groupName = database.Connection.ExecuteScalar(database.ParameterizedQueryString("SELECT Name FROM SecurityGroup WHERE ID = {0}", "securityGroupID"), DefaultTimeout, database.Guid(id)).ToNonNullString(); string roleName = database.Connection.ExecuteScalar(database.ParameterizedQueryString("SELECT Name FROM ApplicationRole WHERE ID = {0}", "applicationRoleID"), DefaultTimeout, database.Guid(roleID)).ToNonNullString(); string query = database.ParameterizedQueryString("DELETE FROM ApplicationRoleSecurityGroup WHERE ApplicationRoleID = {0} AND SecurityGroupID = {1}", "roleID", "groupID"); database.Connection.ExecuteNonQuery(query, DefaultTimeout, database.Guid(roleID), database.Guid(id)); CommonFunctions.LogEvent(string.Format("Group \"{0}\" removed from role \"{1}\" by user \"{2}\".", UserInfo.SIDToAccountName(groupName), roleName, CommonFunctions.CurrentUser), 11); } return "Security groups deleted from role successfully"; } finally { if (createdConnection && database != null) database.Dispose(); } } /// /// Gets a style list of information. /// /// to connection to database. /// Indicates if selection on UI is optional for this collection. /// containing ID and Name of application roles defined in the database. public static Dictionary GetLookupList(AdoDataConnection database, bool isOptional = false) { bool createdConnection = false; try { createdConnection = CreateConnection(ref database); Dictionary applicationRoleList = new Dictionary(); if (isOptional) applicationRoleList.Add(0, "Select Application Role"); DataTable applicationRoleTable = database.Connection.RetrieveData(database.AdapterType, "SELECT ID, Name FROM ApplicationRole ORDER BY Name"); foreach (DataRow row in applicationRoleTable.Rows) applicationRoleList[row.ConvertField("ID")] = row.Field("Name"); return applicationRoleList; } finally { if (createdConnection && database != null) database.Dispose(); } } /// /// Saves information to database. /// /// to connection to database. /// Information about . /// String, for display use, indicating success. public static string Save(AdoDataConnection database, ApplicationRole applicationRole) { bool createdConnection = false; string query; try { createdConnection = CreateConnection(ref database); if (applicationRole.ID == null || applicationRole.ID == Guid.Empty) { query = database.ParameterizedQueryString("INSERT INTO ApplicationRole (Name, Description, NodeID, UpdatedBy, UpdatedOn, CreatedBy, CreatedOn) Values ({0}, {1}, {2}, {3}, {4}, {5}, {6})", "name", "description", "nodeID", "updatedBy", "updatedBy", "createdBy", "createdOn"); database.Connection.ExecuteNonQuery(query, DefaultTimeout, applicationRole.Name, applicationRole.Description.ToNotNull(), database.CurrentNodeID(), CommonFunctions.CurrentUser, database.UtcNow, CommonFunctions.CurrentUser, database.UtcNow); } else { query = database.ParameterizedQueryString("UPDATE ApplicationRole SET Name = {0}, Description = {1}, NodeID = {2}, UpdatedBy = {3}, UpdatedOn = {4} WHERE ID = {5}", "name", "description", "nodeID", "updatedBy", "updatedOn", "id"); database.Connection.ExecuteNonQuery(query, DefaultTimeout, applicationRole.Name, applicationRole.Description.ToNotNull(), applicationRole.NodeID, CommonFunctions.CurrentUser, database.UtcNow, database.Guid(applicationRole.ID)); } return "Application role information saved successfully"; } finally { if (createdConnection && database != null) database.Dispose(); } } /// /// Deletes specified record from database. /// /// to connection to database. /// ID of the record to be deleted. /// String, for display use, indicating success. public static string Delete(AdoDataConnection database, Guid applicationRoleID) { bool createdConnection = false; try { createdConnection = CreateConnection(ref database); // Setup current user context for any delete triggers CommonFunctions.SetCurrentUserContext(database); database.Connection.ExecuteNonQuery(database.ParameterizedQueryString("DELETE FROM ApplicationRole WHERE ID = {0}", "applicationRoleID"), DefaultTimeout, database.Guid(applicationRoleID)); return "Application role deleted successfully"; } finally { if (createdConnection && database != null) database.Dispose(); } } #endregion } }