Files
DP44/DataPRO/Users/UserCollection.cs

571 lines
25 KiB
C#
Raw Permalink Normal View History

2026-04-17 14:55:32 -04:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using DTS.Common.Classes;
using DTS.Common.Interface.Tags;
using DTS.Common.Storage;
using DTS.Common.Utilities.Logging;
using DTS.Slice.Users.UserSettings;
// ReSharper disable once CheckNamespace
namespace DTS.Slice.Users
{
public class UserCollection : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected bool SetProperty<T>(ref T storage, T value, string propertyName = null)
{
if (Equals(storage, value)) return false;
storage = value;
OnPropertyChanged(propertyName);
return true;
}
protected void OnPropertyChanged(string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private static readonly object MyLock = new object();
private static UserCollection _userList;
public static UserCollection UsersList
{
get
{
lock (MyLock)
{
return _userList ?? (_userList = new UserCollection());
}
}
}
private UserCollection() { }
public static Dictionary<int, List<int>> GetUserToTagIdLookup()
{
var lookup = new Dictionary<int, List<int>>();
var hr = DbOperations.TagAssignmentsGet(TagTypes.User, out var records);
if (0 == hr && null != records && records.Any())
{
foreach (var record in records)
{
if (!lookup.ContainsKey(record.ObjectID))
{
lookup.Add(record.ObjectID, new List<int>());
}
lookup[record.ObjectID].Add(record.TagID);
}
}
return lookup;
}
public static User[] GetAllUsers(IUIItems[] allItems, int? uid = null)
{
lock (MyLock)
{
//keyed by user and then uiitem id
var permissionLookup = new Dictionary<int, Dictionary<long, UIItemHelper>>();
var tagsLookup = GetUserToTagIdLookup();
try
{
using (var cmd = DbOperations.GetSQLCommand(true))
{
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = DbOperationsEnum.StoredProcedure.sp_UserUIItemSettingsGet.ToString();
#region params
cmd.Parameters.Add(new SqlParameter("@UserId", SqlDbType.Int) { Value = uid });
#endregion params
using (var ds = DbOperations.Connection.QueryDataSet(cmd))
{
if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
foreach (DataRow dr in ds.Tables[0].Rows)
{
var userId = Convert.ToInt32(dr["UserID"]);
var uiItemId = Convert.ToInt64(dr["UIItemID"]);
var permission = Convert.ToInt16(dr["Permission"]);
var visible = Convert.ToBoolean(dr["Visible"]);
var uiItemName = Convert.ToString(dr["NAME"]);
var helper = new UIItemHelper(uiItemId, permission, visible, uiItemName);
if (!permissionLookup.ContainsKey(userId))
{
permissionLookup.Add(userId, new Dictionary<long, UIItemHelper>());
}
permissionLookup[userId][uiItemId] = helper;
}
}
}
}
finally
{
cmd.Connection.Dispose();
}
}
}
catch (Exception ex)
{
APILogger.Log(ex);
}
var users = new List<User>();
try
{
using (var cmd = DbOperations.GetSQLCommand(true))
{
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = DbOperationsEnum.StoredProcedure.sp_UsersGet.ToString();
#region params
cmd.Parameters.Add(new SqlParameter("@UserId", SqlDbType.Int) { Value = uid });
#endregion params
using (var ds = DbOperations.Connection.QueryDataSet(cmd))
{
if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
foreach (DataRow dr in ds.Tables[0].Rows)
{
try
{
users.Add(new User(dr, allItems, permissionLookup, tagsLookup));
}
catch (Exception ex)
{
APILogger.Log("Failed to read user", ex);
}
}
}
}
}
finally
{
cmd.Connection.Dispose();
}
}
}
catch (Exception ex)
{
APILogger.Log("problem getting user", ex);
}
// uid is null when we are requesting all users. This function is dual purpose and can be used to request
// a single user by passing a uid
if (null != uid) return users.ToArray();
var roles = Enum.GetValues(typeof(User.DefaultRoles)).Cast<User.DefaultRoles>().ToArray();
foreach (var role in roles)
{
var user = User.CreateDefault(role, allItems);
var bFound = users.Exists(u => u.UserName == user.UserName);
if (!bFound)
{
UsersList.Commit(user, user.UserName, allItems);
}
}
//Now add the users that are not the default for a role
var nonDefaultUser = User.CreateNonDefaultPowerUser(User.DefaultAeroUsername, allItems);
var nonDefaultUserFound = users.Exists(u => u.UserName == nonDefaultUser.UserName);
if (!nonDefaultUserFound)
{
UsersList.Commit(nonDefaultUser, nonDefaultUser.UserName, allItems);
}
nonDefaultUser = User.CreateNonDefaultPowerUser(User.DefaultCrashUsername, allItems);
nonDefaultUserFound = users.Exists(u => u.UserName == nonDefaultUser.UserName);
if (!nonDefaultUserFound)
{
UsersList.Commit(nonDefaultUser, nonDefaultUser.UserName, allItems);
}
nonDefaultUser = User.CreateNonDefaultPowerUser(User.DefaultTSRAIRUsername, allItems);
nonDefaultUserFound = users.Exists(u => u.UserName == nonDefaultUser.UserName);
if (!nonDefaultUserFound)
{
UsersList.Commit(nonDefaultUser, nonDefaultUser.UserName, allItems);
}
return users.ToArray();
}
}
public static User GetUser(int uid, IUIItems[] items)
{
var users = GetAllUsers(items, uid);
var enumerable = users ?? users.ToArray();
return !enumerable.Any() ? null : enumerable[0];
}
public static User GetUser(string username, IUIItems[] items)
{
try
{
using (var cmd = DbOperations.GetSQLCommand(true))
{
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = DbOperationsEnum.StoredProcedure.sp_UsersGetId.ToString();
#region params
cmd.Parameters.Add(new SqlParameter("@UserName", SqlDbType.NVarChar, 50) { Value = username });
var newIdParam =
new SqlParameter("@UserId", SqlDbType.Int) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(newIdParam);
#endregion params
cmd.ExecuteNonQuery();
if (DBNull.Value.Equals(newIdParam.Value))
{
return null;
}
var id = int.Parse(newIdParam.Value.ToString());
return id != 0 ? GetUser(id, items) : null;
}
finally
{
cmd.Connection.Dispose();
}
}
}
catch (Exception ex)
{
APILogger.Log(ex);
}
return null;
}
public void Commit(User user, string username, IUIItems[] items)
{
try
{
using (var cmd = DbOperations.GetSQLCommand(true))
{
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = DbOperationsEnum.StoredProcedure.sp_UsersUpdateInsert.ToString();
#region params
//cmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.NVarChar, 50) { Value = user.Id });
cmd.Parameters.Add(
new SqlParameter("@UserName", SqlDbType.NVarChar, 50) { Value = user.UserName });
cmd.Parameters.Add(
new SqlParameter("@DisplayName", SqlDbType.NVarChar, 50) { Value = user.Name });
cmd.Parameters.Add(
new SqlParameter("@Password", SqlDbType.NVarChar, 2048) { Value = user.GetPasswordHash() });
cmd.Parameters.Add(new SqlParameter("@Role", SqlDbType.SmallInt) { Value = user.Role });
cmd.Parameters.Add(
new SqlParameter("@LastModified", SqlDbType.DateTime) { Value = DateTime.Now });
cmd.Parameters.Add(
new SqlParameter("@LastModifiedBy", SqlDbType.NVarChar, 50) { Value = username });
cmd.Parameters.Add(new SqlParameter("@LocalOnly", SqlDbType.Bit) { Value = user.LocalOnly });
var newIdParam =
new SqlParameter("@new_id", SqlDbType.Int) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(newIdParam);
var errorNumberParam =
new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(errorNumberParam);
var errorMessageParam =
new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250)
{
Direction = ParameterDirection.Output
};
cmd.Parameters.Add(errorMessageParam);
#endregion params
cmd.ExecuteNonQuery();
if (int.Parse(errorNumberParam.Value.ToString()) != 0)
{
//errorMessageParam.Value
}
var id = int.Parse(newIdParam.Value.ToString());
user.Id = id == 0 ? user.Id : id;
}
finally
{
cmd.Connection.Dispose();
}
}
}
catch (Exception ex)
{
APILogger.Log(ex);
}
var settings = TestSetupDefaults.GetUserSettings(user.Id);
var properties = settings.GetType().GetProperties();
Defaults.CreateOrUpdateUserSettingProperties(user.Id, properties);
InsertPermissionsAndVisibility(user, items);
InsertTags(user);
OnPropertyChanged("AllUsers");
}
/// <summary>
/// associates tags to a user
/// </summary>
/// <param name="user"></param>
private static void InsertTags(User user)
{
_ = DbOperations.TagAssignmentsDelete(user.TagType, user.Id);
if (!user.TagIDs.Any()) return;
foreach (var tag in user.TagIDs)
{
using (var cmd = DbOperations.GetSQLCommand(true))
{
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = DbOperationsEnum.StoredProcedure.sp_TagAssignmentsInsert.ToString();
#region params
cmd.Parameters.Add(new SqlParameter("@ObjectID", SqlDbType.Int) { Value = user.Id });
cmd.Parameters.Add(new SqlParameter("@ObjectType", SqlDbType.SmallInt) { Value = user.TagType });
cmd.Parameters.Add(new SqlParameter("@TagID", SqlDbType.Int) { Value = tag });
var errorNumberParam =
new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(errorNumberParam);
var errorMessageParam =
new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250)
{
Direction = ParameterDirection.Output
};
cmd.Parameters.Add(errorMessageParam);
#endregion params
cmd.ExecuteNonQuery();
if (int.Parse(errorNumberParam.Value.ToString()) != 0)
{
//errorMessageParam.Value
}
}
finally
{
cmd.Connection.Dispose();
}
}
}
}
public void Delete(User user)
{
lock (MyLock)
{
using (var cmd = DbOperations.GetSQLCommand(true))
{
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = DbOperationsEnum.StoredProcedure.sp_UsersDelete.ToString();
#region params
if (user.IsADefaultUser)
{
cmd.Parameters.Add(new SqlParameter("@UserId", SqlDbType.Int) { Value = user.Id });
}
cmd.Parameters.Add(
new SqlParameter("@UserName", SqlDbType.NVarChar, 50) { Value = user.UserName });
var errorNumberParam =
new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(errorNumberParam);
var errorMessageParam =
new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250)
{
Direction = ParameterDirection.Output
};
cmd.Parameters.Add(errorMessageParam);
#endregion params
cmd.ExecuteNonQuery();
if (int.Parse(errorNumberParam.Value.ToString()) != 0)
{
//errorMessageParam.Value
}
}
finally
{
cmd.Connection.Dispose();
}
}
OnPropertyChanged("AllUsers");
}
}
public void Delete(User[] users)
{
foreach (var user in users)
{
Delete(user);
}
}
private static void InsertPermissionsAndVisibility(User user, IReadOnlyList<IUIItems> items)
{
try
{
//all our UIItems should already be in the db, so we just have to associate them now...
//but first, I guess just remove any existing associations.
using (var cmd = DbOperations.GetSQLCommand(true))
{
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = DbOperationsEnum.StoredProcedure.sp_UserUIItemSettingsDelete.ToString();
#region params
cmd.Parameters.Add(new SqlParameter("@UserID", SqlDbType.NVarChar, 50) { Value = user.Id });
var errorNumberParam =
new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(errorNumberParam);
var errorMessageParam =
new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250)
{
Direction = ParameterDirection.Output
};
cmd.Parameters.Add(errorMessageParam);
#endregion params
cmd.ExecuteNonQuery();
if (int.Parse(errorNumberParam.Value.ToString()) != 0)
{
//errorMessageParam.Value
}
}
finally
{
cmd.Connection.Dispose();
}
}
//now to insert them ... there could be a lot so we have to put them into a bunches
foreach (var item in items)
{
using (var cmd = DbOperations.GetSQLCommand(true))
{
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = DbOperationsEnum.StoredProcedure.sp_UserUIItemSettingsInsert.ToString();
#region params
cmd.Parameters.Add(new SqlParameter("@UserID", SqlDbType.Int) { Value = user.Id });
var uiItemId = item.GetID();
var userPermission = user.GetPermission(item);
var isShow = user.IsShowTabFlagSet(item);
cmd.Parameters.Add(new SqlParameter("@UIItemID", SqlDbType.Int) { Value = uiItemId });
cmd.Parameters.Add(
new SqlParameter("@Permission", SqlDbType.SmallInt) { Value = userPermission });
cmd.Parameters.Add(new SqlParameter("@Visible", SqlDbType.SmallInt) { Value = isShow });
var errorNumberParam =
new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(errorNumberParam);
var errorMessageParam =
new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250)
{
Direction = ParameterDirection.Output
};
cmd.Parameters.Add(errorMessageParam);
#endregion params
cmd.ExecuteNonQuery();
if (int.Parse(errorNumberParam.Value.ToString()) != 0)
{
//errorMessageParam.Value
}
}
finally
{
cmd.Connection.Dispose();
}
}
}
}
catch (Exception ex)
{
APILogger.Log(ex);
}
}
//private static void UpdateAll(User user, string username)
//{
// try
// {
// using (var cmd = DbOperations.GetSQLCommand(true))
// {
// try
// {
// cmd.CommandType = CommandType.StoredProcedure;
// cmd.CommandText = DbOperationsEnum.StoredProcedure.sp_UserUpdate.ToString();
// #region params
// cmd.Parameters.Add(new SqlParameter("@UserName", SqlDbType.NVarChar, 50) {Value = user.Name});
// cmd.Parameters.Add(
// new SqlParameter("@DisplayName", SqlDbType.NVarChar, 50) {Value = user.Name});
// cmd.Parameters.Add(
// new SqlParameter("@Password", SqlDbType.NVarChar, 2048) {Value = user.GetPasswordHash()});
// cmd.Parameters.Add(new SqlParameter("@Role", SqlDbType.SmallInt) {Value = user.Role});
// cmd.Parameters.Add(
// new SqlParameter("@LastModified", SqlDbType.DateTime) {Value = DateTime.Now});
// cmd.Parameters.Add(
// new SqlParameter("@LastModifiedBy", SqlDbType.NVarChar, 50) {Value = username});
// cmd.Parameters.Add(new SqlParameter("@LocalOnly", SqlDbType.Bit) {Value = user.LocalOnly});
// var errorNumberParam =
// new SqlParameter("@errorNumber", SqlDbType.Int) {Direction = ParameterDirection.Output};
// cmd.Parameters.Add(errorNumberParam);
// var errorMessageParam =
// new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250)
// {
// Direction = ParameterDirection.Output
// };
// cmd.Parameters.Add(errorMessageParam);
// #endregion params
// cmd.ExecuteNonQuery();
// if (int.Parse(errorNumberParam.Value.ToString()) != 0)
// {
// //errorMessageParam.Value
// }
// }
// finally
// {
// cmd.Connection.Dispose();
// }
// }
// }
// catch (Exception ex)
// {
// APILogger.Log("Failed to update user", user.UserName, ex);
// throw;// TODO: handle exception properly
// }
//}
}
}