init
This commit is contained in:
570
DataPRO/Users/UserCollection.cs
Normal file
570
DataPRO/Users/UserCollection.cs
Normal file
@@ -0,0 +1,570 @@
|
||||
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
|
||||
// }
|
||||
//}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user