//using BCryptNet = BCrypt.Net.BCrypt; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Options; using CarParkValidationAPI.Authorization; using CarParkValidationAPI.Entities; using CarParkValidationAPI.Helpers; using CarParkValidationAPI.Models.Users; using CarParkValidationAPI.Models; using CarParkValidationAPI.Datas; using CarParkValidationAPI.Interface; using Microsoft.EntityFrameworkCore; using CommonAD.Models; using CommonAD; namespace CarParkValidationAPI.Repository; public class UserServiceRepository : IUserService { private DataContext _context; private IJwtUtils _jwtUtils; private readonly AppSettings _appSettings; public UserServiceRepository( DataContext context, IJwtUtils jwtUtils, IOptions appSettings) { _context = context; _jwtUtils = jwtUtils; _appSettings = appSettings.Value; } public AuthenticateResponse Authenticate(AuthenticateRequest model) { User myUser = new(); var adminUser = _context.AdminUsers.SingleOrDefault(x => x.StafflinkNo == model.Username); if (adminUser != null) { myUser.Id = adminUser.Id; myUser.Email = adminUser.Email; myUser.FirstName = adminUser.FirstName; myUser.LastName = adminUser.LastName; myUser.Role = adminUser.RoleType; } // validate // if (user == null || !BCryptNet.Verify(model.Password, user.PasswordHash)) // if (adminUser == null || (model.Password != adminUser.PasswordHash)) // throw new System.Exception("Username or password is incorrect"); // authentication successful so generate jwt token var jwtToken = _jwtUtils.GenerateJwtToken(myUser); return new AuthenticateResponse(myUser, jwtToken); } public async Task> LoginApiAD(AuthenticateRequest model) { User myUser = null; AuthenticateResponse retval = null; int statuscode = 0; string webAPIUrl = _appSettings.LoginWebAPI; myUser = new User(); //now check the adminuser table var user = _context.AdminUsers. SingleOrDefault(x => x.StafflinkNo == model.Username && x.Active == true); if (user != null) { myUser.Role = (int) user.RoleType; myUser.Id = user.Id; myUser.ValidationPointId = user.ValidationPointId??0; statuscode = 1; } else //not allow { statuscode = 0; myUser.Role = (int) AdminRole.Normal; } // validate // if (user == null || !BCryptNet.Verify(model.Password, user.PasswordHash)) // authentication successful so generate jwt token var jwtToken = _jwtUtils.GenerateJwtToken(myUser); //statuscode = 1; retval = new AuthenticateResponse(myUser, jwtToken); return new ResultModel() { Data = retval, StatusCode = statuscode }; } public async Task> LoginApiAD_old(AuthenticateRequest model) { User myUser = null; AuthenticateResponse retval = null; int statuscode = 0; string webAPIUrl = _appSettings.LoginWebAPI; var loginInfo = await CommonAD.WebAPIUtil.PostLoginADAsync(webAPIUrl, "CheckCredentials", model.Username, model.Password); if (loginInfo != null && loginInfo.result) { myUser = new User(); myUser.Email = loginInfo.email; myUser.FirstName = loginInfo.firstName; myUser.LastName = loginInfo.lastName; myUser.Username = loginInfo.stafflinkNo; //now check the adminuser table var user = _context.AdminUsers. SingleOrDefault(x => x.StafflinkNo == model.Username && x.Active == true); if (user != null) { myUser.Role = (int) user.RoleType; myUser.Id = user.Id; myUser.ValidationPointId = user.ValidationPointId ?? 0; statuscode = 1; } else //not allow { statuscode = 0; myUser.Role = (int) AdminRole.Normal; } // validate // if (user == null || !BCryptNet.Verify(model.Password, user.PasswordHash)) // authentication successful so generate jwt token var jwtToken = _jwtUtils.GenerateJwtToken(myUser); //statuscode = 1; retval = new AuthenticateResponse(myUser, jwtToken); } return new ResultModel() { Data = retval, StatusCode = statuscode }; } public async Task> LoginAD(AuthenticateRequest model) { User myUser = null; AuthenticateResponse retval = null; int statuscode = 0; ADConfig adConfig = new ADConfig() { LDAPPassword = _appSettings.LDAPPassword, LDAPPath = _appSettings.LDAPPath, LDAPUser = _appSettings.LDAPUser, ADTimeOutStr = _appSettings.ADTimeOut }; myUser = await Task.Run(() => LoginADStaff(adConfig,model.Username, model.Password)); if (!string.IsNullOrEmpty(myUser.Username)) { statuscode = 1; // authentication successful so generate jwt token var jwtToken = _jwtUtils.GenerateJwtToken(myUser); retval = new AuthenticateResponse(myUser, jwtToken); } return new ResultModel() { Data = retval, StatusCode = statuscode }; } public async Task> SearchApiStaff(string staffLinkNo) { User myUser = null; int statuscode = 0; string webAPIUrl = _appSettings.LoginWebAPI; var loginInfo = await CommonAD.WebAPIUtil.SearchStaffAsync(webAPIUrl, "SearchStaff", staffLinkNo); if (loginInfo != null && loginInfo.result) { myUser = new User(); myUser.Email = loginInfo.email; myUser.FirstName = loginInfo.firstName; myUser.LastName = loginInfo.lastName; myUser.Username = loginInfo.stafflinkNo; statuscode = 1; } return new ResultModel() { Data = myUser, StatusCode = statuscode }; // return myUser; } public async Task> SearchADStaff(string staffLinkNo) { int statuscode = 0; ADConfig adConfig = new ADConfig() { LDAPPassword = _appSettings.LDAPPassword, LDAPPath = _appSettings.LDAPPath, LDAPUser = _appSettings.LDAPUser, ADTimeOutStr = _appSettings.ADTimeOut }; User myUser = await Task.Run(() => SearchADStaff(adConfig, staffLinkNo)); if (!string.IsNullOrEmpty(myUser.Username)) statuscode = 1; return new ResultModel() { Data = myUser, StatusCode = statuscode }; } private User SearchADStaff(ADConfig adConfig, string username) { MyADObject myADObj = new(); User user = new() { Username = myADObj.stafflinkNo, Email = myADObj.email, FirstName = myADObj.firstName, LastName = myADObj.lastName }; // myADObj.JobTitle; return user; // return null; } private User LoginADStaff(ADConfig adConfig, string username, string password) { MyADObject myADObj = new(); User user = new() { Username = myADObj.stafflinkNo, Email = myADObj.email, FirstName = myADObj.firstName, LastName = myADObj.lastName }; // myADObj.JobTitle; return user; // return null; } }