You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
366 lines
12 KiB
C#
366 lines
12 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using Haoliang.Models.User;
|
|
using Haoliang.Data.Repositories;
|
|
|
|
namespace Haoliang.Data.Repositories
|
|
{
|
|
public interface IUserRepository : IRepository<User>
|
|
{
|
|
Task<User> GetByUsernameAsync(string username);
|
|
Task<User> GetByEmailAsync(string email);
|
|
Task<bool> UsernameExistsAsync(string username);
|
|
Task<bool> EmailExistsAsync(string email);
|
|
Task<bool> ValidatePasswordAsync(string username, string password);
|
|
Task<User> AuthenticateAsync(string username, string password);
|
|
Task<IEnumerable<User>> GetByRoleIdAsync(int roleId);
|
|
Task UpdateLastLoginAsync(int userId);
|
|
Task<bool> ChangePasswordAsync(int userId, string oldPassword, string newPassword);
|
|
Task<bool> ResetPasswordAsync(int userId, string newPassword);
|
|
Task<IEnumerable<User>> GetActiveUsersAsync();
|
|
Task<bool> IsUserActiveAsync(string username);
|
|
}
|
|
|
|
public class UserRepository : Repository<User>, IUserRepository
|
|
{
|
|
private readonly CNCDbContext _context;
|
|
|
|
public UserRepository(CNCDbContext context) : base(context)
|
|
{
|
|
_context = context;
|
|
}
|
|
|
|
public async Task<User> GetByUsernameAsync(string username)
|
|
{
|
|
return await _context.Users
|
|
.Include(u => u.Role)
|
|
.FirstOrDefaultAsync(u => u.Username == username);
|
|
}
|
|
|
|
public async Task<User> GetByEmailAsync(string email)
|
|
{
|
|
return await _context.Users
|
|
.Include(u => u.Role)
|
|
.FirstOrDefaultAsync(u => u.Email == email);
|
|
}
|
|
|
|
public async Task<bool> UsernameExistsAsync(string username)
|
|
{
|
|
return await _context.Users
|
|
.AnyAsync(u => u.Username == username);
|
|
}
|
|
|
|
public async Task<bool> EmailExistsAsync(string email)
|
|
{
|
|
return await _context.Users
|
|
.AnyAsync(u => u.Email == email);
|
|
}
|
|
|
|
public async Task<bool> ValidatePasswordAsync(string username, string password)
|
|
{
|
|
var user = await GetByUsernameAsync(username);
|
|
if (user == null || !user.IsActive)
|
|
return false;
|
|
|
|
return VerifyPassword(password, user.PasswordHash);
|
|
}
|
|
|
|
public async Task<User> AuthenticateAsync(string username, string password)
|
|
{
|
|
var user = await GetByUsernameAsync(username);
|
|
if (user == null || !user.IsActive)
|
|
return null;
|
|
|
|
if (VerifyPassword(password, user.PasswordHash))
|
|
{
|
|
await UpdateLastLoginAsync(user.Id);
|
|
return user;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public async Task<IEnumerable<User>> GetByRoleIdAsync(int roleId)
|
|
{
|
|
return await _context.Users
|
|
.Include(u => u.Role)
|
|
.Where(u => u.RoleId == roleId)
|
|
.OrderBy(u => u.Username)
|
|
.ToListAsync();
|
|
}
|
|
|
|
public async Task UpdateLastLoginAsync(int userId)
|
|
{
|
|
var user = await GetByIdAsync(userId);
|
|
if (user != null)
|
|
{
|
|
user.LastLoginTime = DateTime.Now;
|
|
user.UpdatedAt = DateTime.Now;
|
|
|
|
Update(user);
|
|
await SaveAsync();
|
|
}
|
|
}
|
|
|
|
public async Task<bool> ChangePasswordAsync(int userId, string oldPassword, string newPassword)
|
|
{
|
|
var user = await GetByIdAsync(userId);
|
|
if (user == null)
|
|
return false;
|
|
|
|
if (!VerifyPassword(oldPassword, user.PasswordHash))
|
|
return false;
|
|
|
|
user.PasswordHash = HashPassword(newPassword);
|
|
user.UpdatedAt = DateTime.Now;
|
|
|
|
Update(user);
|
|
await SaveAsync();
|
|
return true;
|
|
}
|
|
|
|
public async Task<bool> ResetPasswordAsync(int userId, string newPassword)
|
|
{
|
|
var user = await GetByIdAsync(userId);
|
|
if (user == null)
|
|
return false;
|
|
|
|
user.PasswordHash = HashPassword(newPassword);
|
|
user.UpdatedAt = DateTime.Now;
|
|
|
|
Update(user);
|
|
await SaveAsync();
|
|
return true;
|
|
}
|
|
|
|
public async Task<IEnumerable<User>> GetActiveUsersAsync()
|
|
{
|
|
return await _context.Users
|
|
.Include(u => u.Role)
|
|
.Where(u => u.IsActive)
|
|
.OrderBy(u => u.Username)
|
|
.ToListAsync();
|
|
}
|
|
|
|
public async Task<bool> IsUserActiveAsync(string username)
|
|
{
|
|
var user = await GetByUsernameAsync(username);
|
|
return user != null && user.IsActive;
|
|
}
|
|
|
|
private string HashPassword(string password)
|
|
{
|
|
using (var sha256 = SHA256.Create())
|
|
{
|
|
var bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(password));
|
|
return Convert.ToBase64String(bytes);
|
|
}
|
|
}
|
|
|
|
private bool VerifyPassword(string password, string hash)
|
|
{
|
|
return HashPassword(password) == hash;
|
|
}
|
|
}
|
|
|
|
public interface IRoleRepository : IRepository<Role>
|
|
{
|
|
Task<Role> GetByNameAsync(string roleName);
|
|
Task<bool> RoleNameExistsAsync(string roleName);
|
|
Task<IEnumerable<Permission>> GetRolePermissionsAsync(int roleId);
|
|
Task<bool> AddPermissionToRoleAsync(int roleId, int permissionId);
|
|
Task<bool> RemovePermissionFromRoleAsync(int roleId, int permissionId);
|
|
Task<bool> UserHasPermissionAsync(int userId, string permissionName);
|
|
}
|
|
|
|
public class RoleRepository : Repository<Role>, IRoleRepository
|
|
{
|
|
private readonly CNCDbContext _context;
|
|
|
|
public RoleRepository(CNCDbContext context) : base(context)
|
|
{
|
|
_context = context;
|
|
}
|
|
|
|
public async Task<Role> GetByNameAsync(string roleName)
|
|
{
|
|
return await _context.Roles
|
|
.FirstOrDefaultAsync(r => r.RoleName == roleName);
|
|
}
|
|
|
|
public async Task<bool> RoleNameExistsAsync(string roleName)
|
|
{
|
|
return await _context.Roles
|
|
.AnyAsync(r => r.RoleName == roleName);
|
|
}
|
|
|
|
public async Task<IEnumerable<Permission>> GetRolePermissionsAsync(int roleId)
|
|
{
|
|
var role = await GetByIdAsync(roleId);
|
|
if (role == null)
|
|
return new List<Permission>();
|
|
|
|
var permissionIds = role.Permissions.Select(p => int.Parse(p.Split('_')[0])).ToList();
|
|
return await _context.Permissions
|
|
.Where(p => permissionIds.Contains(p.Id))
|
|
.ToListAsync();
|
|
}
|
|
|
|
public async Task<bool> AddPermissionToRoleAsync(int roleId, int permissionId)
|
|
{
|
|
var role = await GetByIdAsync(roleId);
|
|
if (role == null)
|
|
return false;
|
|
|
|
if (!role.Permissions.Contains(permissionId.ToString()))
|
|
{
|
|
role.Permissions.Add(permissionId.ToString());
|
|
role.UpdatedAt = DateTime.Now;
|
|
|
|
Update(role);
|
|
await SaveAsync();
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public async Task<bool> RemovePermissionFromRoleAsync(int roleId, int permissionId)
|
|
{
|
|
var role = await GetByIdAsync(roleId);
|
|
if (role == null)
|
|
return false;
|
|
|
|
if (role.Permissions.Contains(permissionId.ToString()))
|
|
{
|
|
role.Permissions.Remove(permissionId.ToString());
|
|
role.UpdatedAt = DateTime.Now;
|
|
|
|
Update(role);
|
|
await SaveAsync();
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public async Task<bool> UserHasPermissionAsync(int userId, string permissionName)
|
|
{
|
|
var user = await _context.Users
|
|
.Include(u => u.Role)
|
|
.FirstOrDefaultAsync(u => u.Id == userId);
|
|
|
|
if (user == null || user.Role == null)
|
|
return false;
|
|
|
|
return user.Role.Permissions.Contains(permissionName);
|
|
}
|
|
}
|
|
|
|
public interface IEmployeeRepository : IRepository<Employee>
|
|
{
|
|
Task<Employee> GetByEmployeeCodeAsync(string employeeCode);
|
|
Task<bool> EmployeeCodeExistsAsync(string employeeCode);
|
|
Task<IEnumerable<Employee>> GetByDepartmentAsync(string department);
|
|
Task<IEnumerable<Employee>> GetByPositionAsync(string position);
|
|
Task<Employee> GetAssignedEmployeeAsync(int deviceId);
|
|
Task<bool> AssignDeviceToEmployeeAsync(int employeeId, int deviceId);
|
|
Task<bool> UnassignDeviceFromEmployeeAsync(int employeeId, int deviceId);
|
|
}
|
|
|
|
public class EmployeeRepository : Repository<Employee>, IEmployeeRepository
|
|
{
|
|
private readonly CNCDbContext _context;
|
|
|
|
public EmployeeRepository(CNCDbContext context) : base(context)
|
|
{
|
|
_context = context;
|
|
}
|
|
|
|
public async Task<Employee> GetByEmployeeCodeAsync(string employeeCode)
|
|
{
|
|
return await _context.Employees
|
|
.FirstOrDefaultAsync(e => e.EmployeeCode == employeeCode);
|
|
}
|
|
|
|
public async Task<bool> EmployeeCodeExistsAsync(string employeeCode)
|
|
{
|
|
return await _context.Employees
|
|
.AnyAsync(e => e.EmployeeCode == employeeCode);
|
|
}
|
|
|
|
public async Task<IEnumerable<Employee>> GetByDepartmentAsync(string department)
|
|
{
|
|
return await _context.Employees
|
|
.Where(e => e.Department == department)
|
|
.OrderBy(e => e.Name)
|
|
.ToListAsync();
|
|
}
|
|
|
|
public async Task<IEnumerable<Employee>> GetByPositionAsync(string position)
|
|
{
|
|
return await _context.Employees
|
|
.Where(e => e.Position == position)
|
|
.OrderBy(e => e.Name)
|
|
.ToListAsync();
|
|
}
|
|
|
|
public async Task<Employee> GetAssignedEmployeeAsync(int deviceId)
|
|
{
|
|
var assignment = await _context.DeviceAssignments
|
|
.FirstOrDefaultAsync(da => da.DeviceId == deviceId && da.EndDate == null);
|
|
|
|
if (assignment != null)
|
|
{
|
|
return await GetByIdAsync(assignment.EmployeeId);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public async Task<bool> AssignDeviceToEmployeeAsync(int employeeId, int deviceId)
|
|
{
|
|
var existingAssignment = await _context.DeviceAssignments
|
|
.FirstOrDefaultAsync(da => da.DeviceId == deviceId && da.EndDate == null);
|
|
|
|
if (existingAssignment != null)
|
|
return false;
|
|
|
|
var assignment = new DeviceAssignment
|
|
{
|
|
EmployeeId = employeeId,
|
|
DeviceId = deviceId,
|
|
AssignmentDate = DateTime.Now,
|
|
CreatedAt = DateTime.Now
|
|
};
|
|
|
|
await _context.DeviceAssignments.AddAsync(assignment);
|
|
await SaveAsync();
|
|
return true;
|
|
}
|
|
|
|
public async Task<bool> UnassignDeviceFromEmployeeAsync(int employeeId, int deviceId)
|
|
{
|
|
var assignment = await _context.DeviceAssignments
|
|
.FirstOrDefaultAsync(da =>
|
|
da.EmployeeId == employeeId &&
|
|
da.DeviceId == deviceId &&
|
|
da.EndDate == null);
|
|
|
|
if (assignment != null)
|
|
{
|
|
assignment.EndDate = DateTime.Now;
|
|
_context.DeviceAssignments.Update(assignment);
|
|
await SaveAsync();
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
} |