using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using Dapper; using Fab2ApprovalSystem.Misc; using Fab2ApprovalSystem.Models; namespace Fab2ApprovalSystem.DMO; public class AdminDMO { private readonly IDbConnection db = new SqlConnection(GlobalVars.DB_CONNECTION_STRING); #if !NET8 private static FabApprovalTrainingEntities FabApprovalDB = new FabApprovalTrainingEntities(); #endif public List GetAllSubRoles(string showInactiveRoles = "") { List results = new(); List roles = GetSubRoles(); ParentChildModel child; ParentChildModel parent; foreach (Role r in roles) { parent = new ParentChildModel { id = r.RoleID, parentid = -1, text = r.RoleName, value = r.RoleID.ToString() }; foreach (SubRole sr in r.SubRoles) { if (sr.Inactive) { // hide inactive roles unless parameter says otherwise if (!showInactiveRoles.Equals("true")) continue; } child = new ParentChildModel { id = sr.SubRoleID, parentid = r.RoleID, text = sr.SubRoleCategoryItem + (sr.Inactive ? " (Inactive)" : ""), value = sr.SubRoleID.ToString() }; results.Add(child); } results.Add(parent); }; return results; } public List GetSubRoles() { StringBuilder sql = new(); sql.Append( "SELECT R.RoleID, R.RoleName, SubRoleID, SubRoleCategoryItem, SR.RoleID, SR.Inactive " + "FROM vSubRoles SR " + "INNER JOIN Role R ON R.RoleID = SR.RoleID " + "ORDER BY R.RoleID, SubRoleCategoryItem "); db.Open(); Dictionary lookup = new(); List data = db.Query(sql.ToString(), (parent, child) => { Role role; if (!lookup.TryGetValue(parent.RoleID, out role)) { lookup.Add(parent.RoleID, role = parent); } role.SubRoles.Add(child); return role; }, splitOn: "SubRoleID").Distinct().ToList(); return data; } public List GetUserSubRoles(int userId) { DynamicParameters parameters = new(); parameters.Add("@UserId", userId); List userSubRoleList = db.Query("GetSubRolesByUserId", parameters, commandType: CommandType.StoredProcedure).ToList(); return userSubRoleList; } public IEnumerable GetAllUsersBySubRole(int subRole) { StringBuilder sql = new(); sql.Append("SELECT FirstName + ' ' + LastName AS FullName , LoginID, FirstName, LastName, U.UserID, SubRoleID "); sql.Append("FROM UserSubRole UR "); sql.Append("INNER JOIN Users U ON UR.UserID = U.UserID "); sql.Append("WHERE UR.SubRoleID = " + subRole.ToString() + " "); sql.Append("ORDER BY FirstName"); return db.Query(sql.ToString()).ToList(); } public void AddUserRoles(int subRole, string userids) { string sql; string[] arrayOfUsers = userids.Split(new char[] { '~' }); for (int i = 0; i < arrayOfUsers.Length; i++) { sql = "INSERT INTO UserSubRole (UserID, SubRoleID) VALUES (" + arrayOfUsers[i] + ", " + subRole + " )"; db.Execute(sql); } } public void DeleteUserFromAllTrainingGroups(int userId) { string sql = "DELETE FROM TrainingGroupMembers WHERE UserId = " + userId; db.Open(); db.Execute(sql); return; } public void DeleteUserRoles(int subRole, string userids) { string sql; string[] arrayOfUsers = userids.Split(new char[] { '~' }); for (int i = 0; i < arrayOfUsers.Length; i++) { sql = "DELETE FROM UserSubRole WHERE UserID = " + arrayOfUsers[i] + " AND SubRoleID = " + subRole; db.Execute(sql); } } #if !NET8 public List GetTrainingReportUsers() { List CurrentReportUsers = (from a in FabApprovalDB.TrainingReportUsers select a).ToList(); return CurrentReportUsers; } #endif #if NET8 public List GetTrainingReportUsers() => throw new NotImplementedException(); #endif #if !NET8 public List GetTECNNotificationUsers() { List currentTECNNotificationUsers = (from a in FabApprovalDB.TECNNotificationsUsers select a).ToList(); return currentTECNNotificationUsers; } #endif public void TrainingReportAddUser(int userId) { string sql = "INSERT INTO TrainingReportUsers (UserId) " + "VALUES ('" + userId + "') "; db.Open(); db.Execute(sql); return; } public void TECNExpirationAddUser(int userId) { string sql = "INSERT INTO TECNNotificationsUsers (UserId) " + "VALUES ('" + userId + "') "; db.Open(); db.Execute(sql); return; } public void TrainingReportDeleteUser(int userId) { DynamicParameters parameters = new(); parameters.Add("@UserID", userId); db.Execute("DeleteUserFromTrainingReport", parameters, commandType: CommandType.StoredProcedure); return; } public void TECNExpirationDeleteUser(int userId) { DynamicParameters parameters = new(); parameters.Add("@UserID", userId); db.Execute("DeleteUserFromTECNReport", parameters, commandType: CommandType.StoredProcedure); return; } public List GetTrainingGroups() { #if !NET8 var TrainingGroups = from a in FabApprovalDB.TrainingGroups select a; List GroupsToReturn = TrainingGroups.ToList(); return GroupsToReturn; #endif #if NET8 throw new NotImplementedException(); #endif } #if !NET8 public void AddNewTrainingGroup(string groupName) { TrainingGroup existing = null; // Check to see that the group name doesn't exist. try { existing = (from a in FabApprovalDB.TrainingGroups where a.TrainingGroupName == groupName select a).FirstOrDefault(); } catch { } if (existing == null) { string sql = "INSERT INTO TrainingGroups (TrainingGroupName) " + "VALUES ('" + groupName + "') "; this.db.Open(); this.db.Execute(sql); return; } else { return; } } #endif public void DeleteTrainingGroup(int groupID) { try { string sql = "DELETE FROM TrainingGroups WHERE TrainingGroupID = " + groupID; db.Open(); db.Execute(sql); sql = "DELETE FROM TrainingGroupMembers WHERE TrainingGroupID = " + groupID; db.Execute(sql); return; } catch { } } #if !NET8 public List GetTrainingGroupMembers(int GroupID) { return (from a in FabApprovalDB.TrainingGroupMembers where a.TrainingGroupID == GroupID select a).ToList(); } public void AddUserToGroup(int userId, int groupId) { UserAccountDMO userDB = new UserAccountDMO(); string userFullName = userDB.GetUserByID(userId).FullName; TrainingGroupMember existing = null; existing = (from a in FabApprovalDB.TrainingGroupMembers where a.TrainingGroupID == groupId && a.UserID == userId select a).FirstOrDefault(); if (existing == null) { var parameters = new DynamicParameters(); parameters = new DynamicParameters(); parameters.Add("@GroupID", groupId); parameters.Add("@UserID", userId); parameters.Add("@UserFullName", userFullName); this.db.Execute("AddUserToTrainingGroup", parameters, commandType: CommandType.StoredProcedure); } else { throw new Exception("The user already exists in this training group."); } } #endif public void DeleteFromGroup(int userId, int groupId) { DynamicParameters parameters = new(); parameters.Add("@GroupID", groupId); parameters.Add("@UserID", userId); db.Execute("DeleteUserFromTrainingGroup", parameters, commandType: CommandType.StoredProcedure); return; } public void DeleteUser(UserAccountDMO userDMO, TrainingDMO trainingDMO, LoginModel loginModel) { if (loginModel != null) { userDMO.DeleteUser(loginModel); // Remove open trainings // Get a list of all user assigned trainings. List trainingAssignments = trainingDMO.GetTrainingAssignmentsByUserID(loginModel.UserID); // Go Through that list. foreach (var trainingAssignment in trainingAssignments) { // Delete Any document acknowledgements. trainingDMO.DeleteTrainingDocAck(trainingAssignment.ID); // Delete the training assignment itself trainingDMO.DeleteTrainingAssignment(trainingAssignment.ID); // Check the parent Training task to set to to complete if applicable. if (trainingDMO.CheckTrainingStatus(trainingAssignment.ID)) { int TrainingID = trainingAssignment.TrainingID; // Set Training status to complete trainingDMO.UpdateTrainingStatus(TrainingID); } } // Remove user from any Training Groups DeleteUserFromAllTrainingGroups(loginModel.UserID); // Remove User from training report notifications TrainingReportDeleteUser(loginModel.UserID); // Remove user from TECN Expiration Notifications TECNExpirationDeleteUser(loginModel.UserID); // Get user subroles List userSubRoles = GetUserSubRoles(loginModel.UserID); // Delete user from any subroles foreach (var userSubRole in userSubRoles) { DeleteUserRoles(userSubRole.SubRoleID, loginModel.UserID.ToString()); } } } }