using Step.Model.DatabaseModels; using Step.Model.DTOModels; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Web.Helpers; using static Step.Config.ServerConfig; using static Step.Model.Constants; namespace Step.Database.Controllers { public class UsersController : IDisposable { private DatabaseContext dbCtx; public UsersController() { // Initialize database context dbCtx = new DatabaseContext(); } public void Dispose() { // Clear database context dbCtx.Dispose(); } public DTOUserModel Create(string username, string password, string firstName, string lastName, CultureInfo language) { UserModel user = CreateUserModel(username, password, firstName, lastName, language); // Add to database dbCtx.Users.Add(user); // Commit changes dbCtx.SaveChanges(); using(MachinesUsersController machController = new MachinesUsersController()) { machController.Create(MachineConfig.MachineId, user.UserId, 3); } return GetUserInfo(user.UserId); } public static UserModel CreateUserModel(int id, string username, string password, string firstName, string lastName, CultureInfo language) { // Create a new user model with params return new UserModel() { UserId = id, Username = username, Password = Crypto.HashPassword(password), FirstName = firstName, LastName = lastName, SecurityStamp = Guid.NewGuid().ToString(), Language = language, Email = "", IsLocal = true, CmsConnectUserId = "" }; } public static UserModel CreateUserModel(string username, string password, string firstName, string lastName, CultureInfo language) { return CreateUserModel(0, username, password, firstName, lastName, language); } public bool CreateCMSConnectUser(string username, string password, string firstName, string lastName, CultureInfo language, string email, string connectUserId, bool isAdmin) { var usr = FindByUsername(username); // if user was already imported, activate if(usr != null) { usr.Deleted = false; dbCtx.SaveChanges(); return true; } UserModel user = CreateUserModel(username, password, firstName, lastName, language); user.Email = email; user.IsLocal = false; user.CmsConnectUserId = connectUserId; // Add to database dbCtx.Users.Add(user); // Commit changes dbCtx.SaveChanges(); using (MachinesUsersController machController = new MachinesUsersController()) { var role = ROLE_IDS.CUSTOMER_OPERATOR; if (isAdmin) role = ROLE_IDS.CUSTOMER_ADMIN; machController.Create(MachineConfig.MachineId, user.UserId, (int)role); } return true; } public DTOUserModel GetUserInfo(int userId) { // Find user by Id with Role object included UserModel userDatabaseModel = dbCtx.Users.Where(u => u.UserId == userId).FirstOrDefault(); if (userDatabaseModel == null) return null; DTORoleModel roleModel = null; // Find user role through machineUser table using (MachinesUsersController machinesUsersControler = new MachinesUsersController()) { roleModel = machinesUsersControler.GetUserRoleData(MachineConfig.MachineId, userId); if (roleModel == null) return null; } return new DTOUserModel() // Return DTOUserModel { Id = userDatabaseModel.UserId, Username = userDatabaseModel.Username, FirstName = userDatabaseModel.FirstName, LastName = userDatabaseModel.LastName, Language = userDatabaseModel.Language, Role = roleModel }; } public UserModel FindById(int id) { // Find user by Id with Role object included return dbCtx.Users.Where(u => u.UserId == id).FirstOrDefault(); } public UserModel FindByUsername(string username) { // Find user by Id with Role object included return dbCtx.Users.Where(u => u.Username == username).FirstOrDefault(); } public UserModel FindNotDeletedByUsername(string username) { // Find user by Id with Role object included return dbCtx .Users .Where(u => u.Username == username && !u.Deleted) .FirstOrDefault(); } public UserModel FindByUsernameAndPassword(string username, string password) { // Find if username exists UserModel user = FindByUsername(username); if (user != null) { if (user.Deleted == true) return null; // Check if the passwords match if (Crypto.VerifyHashedPassword(user.Password, password) != true) { return null; } } return user; } public void CreateCmsDefaultUserIfNotExists(int machineId, string username, string password, string name, string lastname, CultureInfo info, ROLE_IDS roleId) { // Find if there is a cms standard user UserModel user = FindByUsername(username); if (user == null) { // If not exist add new user user = dbCtx.Users.Add( CreateUserModel(username, password, name, lastname, info) ); // Commit changes dbCtx.SaveChanges(); } // Add user to local machine users if not exists using (MachinesUsersController machinesUsersController = new MachinesUsersController()) { MachineUserModel machineUser = machinesUsersController.FindByUserId(machineId, user.UserId); if (machineUser == null) machinesUsersController.Create(machineId, user.UserId, (int)roleId); } } public void ChangeUserLanguage(int userId, CultureInfo newLanguage) { UserModel user = FindById(userId); if (user != null) { user.Language = newLanguage; dbCtx.SaveChanges(); } } public List GetMessageUserList() { using (MachinesUsersController machineController = new MachinesUsersController()) { // Find user by Id with Role object included var tmpUser = dbCtx .Users .Where(x => x.Deleted == false) // Get not deleted users .Join( dbCtx.MachinesUsers, u => u.UserId, m => m.UserId, (u, m) => new { Users = u, MachinesUsers = m } ) .Where(x => x.MachinesUsers.Role.Level < MIN_CMS_ROLE) .ToList(); return tmpUser .Select(x => new DTOMessageUserModel() // Return DTOUserModel { Id = x.Users.UserId, FirstName = x.Users.FirstName, LastName = x.Users.LastName, Username = x.Users.Username }) .GroupBy(elem => elem.Id).Select(group => group.First()) .ToList(); } } #region User Manager public List GetUserList() { using (MachinesUsersController machineController = new MachinesUsersController()) { // Find user by Id with Role object included var tmpUser = dbCtx .Users .Where(x => x.Deleted == false) // Get not deleted users .ToList(); return tmpUser .Select(x => new DTOUserModel() // Return DTOUserModel { Id = x.UserId, Username = x.Username, FirstName = x.FirstName, LastName = x.LastName, Language = x.Language, IsLocal = x.IsLocal, Email = x.Email, CmsConnectUserId = x.CmsConnectUserId, Role = machineController.GetUserRoleData(MachineConfig.MachineId, x.UserId) }).Where( x=> x.Role.Level < MIN_CMS_ROLE) .ToList(); } } public List GetCMSConnectUserList() { using (MachinesUsersController machineController = new MachinesUsersController()) { // Find user by Id with Role object included return dbCtx .Users .Where(x => x.IsLocal == false) // Get not deleted users .ToList(); } } public DTOUserModel UpdateUserData(int userId, DTONewUserModel userData) { UserModel user = FindById(userId); if (user != null) { user.FirstName = userData.FirstName; user.LastName = userData.LastName; user.Username = userData.Username; dbCtx.SaveChanges(); } return GetUserInfo(userId); } public DTOUserModel UpdateUserPassword(int userId, DTONewPasswordrModel userData) { UserModel user = FindById(userId); if (user != null) { user.Password = Crypto.HashPassword(userData.newPassword); dbCtx.SaveChanges(); } return GetUserInfo(userId); } public bool isCMSRole(int roleId) { var tmpRole = dbCtx.Roles .ToList() .First(X => X.RoleId == roleId); if (tmpRole == null) return true; else return tmpRole.Level >= MIN_CMS_ROLE; } public DTOUserModel UpdateUserRole(int userId, int roleId) { using (MachinesUsersController machineController = new MachinesUsersController()) { machineController.UpdateUserRole(MachineConfig.MachineId, userId, roleId); } return GetUserInfo(userId); } public void DeleteUser(UserModel user) { user.Deleted = true; dbCtx.SaveChanges(); } #endregion User Manager } }