internal SigninProgressResponseModel CalculateStudentProgess(int studentId) { using (var db = new SAMEntities()) { //Sign In var eventTypeId = CrossCuttingConcerns.EventLog.EventType.User_Authentication.GetEnumValue(); //Get the current week var currentDateTimeFormatInfo = DateTimeFormatInfo.CurrentInfo; var calendar = currentDateTimeFormatInfo.Calendar; var weekNumber = calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday); //46 var eventSeverityId = (int)CrossCuttingConcerns.EventLog.EventSeverity.Informational; var authenticationEvents = db.EventLogs.Where(x => x.UserId == studentId && x.EventTypeId == eventTypeId && x.EventSeverityId == eventSeverityId).ToList(); //HINT: Check that the number of records is not greater than 5 - try removing duplicates --> student might sign in more than once on the same day. LINQ: Distinct var signedInDates = authenticationEvents.Count(x => calendar.GetWeekOfYear(x.CreateDate, CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday) == weekNumber); const int requiredSigninDayCount = 5; var responseModel = new SigninProgressResponseModel(); responseModel.CreateProgressItem("Days Attended", signedInDates); responseModel.CreateProgressItem("Days Required Attendance", requiredSigninDayCount); return(responseModel); } }
private StudentAccessCardLinkResponse LinkCardToStudent(int userId) { var response = new StudentAccessCardLinkResponse(); var cardId = GetCardId(); using (var data = new SAMEntities()) { //Check if the card exists by joining on the userId and the cardId to make a composite Primary Key var existingAccessCard = data.AccessCards.FirstOrDefault(x => x.CardId == cardId && x.UserId == userId); if (existingAccessCard == null) { //The card is available to be assigned //go get the card var availableCard = data.AccessCards.FirstOrDefault(x => x.CardId == cardId); var currentUser = data.Users.FirstOrDefault(x => x.Id == userId); //Link the card to the user availableCard.UserId = currentUser.Id; try { data.SaveChanges(); response.WasOperationSuccessful = true; response.SetUserId(userId); } catch { response.SetErrorMessage("Errors occured while linking card to the student"); } } } return(response); }
internal List <UserModel> StudentList(string studentid = "") { var students = new List <UserModel>(); using (var db = new SAMEntities()) { var users = db.Users.Where(x => !x.IsAdmin).ToList(); var eventLogs = db.EventLogs.Distinct().ToList(); foreach (var user in users) { var registrationEventLog = eventLogs.FirstOrDefault(x => x.UserId == user.Id && x.EventTypeId == CrossCuttingConcerns.EventLog.EventType.Admin_Register_Student.GetEnumValue()); var signinEventLog = eventLogs.LastOrDefault(x => x.UserId == user.Id && x.EventTypeId == CrossCuttingConcerns.EventLog.EventType.User_Authorisation.GetEnumValue()); students.Add(new UserModel { //Username = user.AccessCards.ToString(), -- this maps to the access cards table FirstName = user.FirstName, LastName = user.LastName, Email = user.Email, CellPhone = user.CellPhone, RegistrationDate = registrationEventLog.CreateDate.ToShortDateString(), SigninDate = signinEventLog == null ? "Not Logged In" : signinEventLog.CreateDate.ToShortDateString(), SigninTime = signinEventLog == null ? "Not Logged In" : signinEventLog.CreateDate.ToShortTimeString(), }); } return(students); } }
public void LogEvent(int userId, EventType eventType, EventSeverity severity) { using (var db = new SAMEntities()) { try { var eventSeverity = severity.ToString(); var eventTypeDescription = eventType.ToString(); var eventTypeId = eventType.GetEnumValue(); var eventLog = new SAM1.EventLog { CreateDate = DateTime.Now, UserId = userId, EventSeverityId = (int)severity, MetaData = metaData, EventTypeId = eventTypeId, }; db.EventLogs.Add(eventLog); db.SaveChanges(); } catch (DbEntityValidationException ex) { var errorMessages = ex.EntityValidationErrors .SelectMany(x => x.ValidationErrors) .Select(x => x.ErrorMessage + " " + x.PropertyName); var fullErrorMessage = string.Join(" => ", errorMessages); var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage); throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors); } } }
//WORKS internal LogonResponseModel AuthenticateUser(LogonUserModel user) { var responseModel = new LogonResponseModel(); //1) Go to the db and get the userId using (var db = new SAMEntities()) { var authenticatedAccessCard = db.AccessCards.FirstOrDefault(x => x.UserId == user.UserId); var authenticatedUser = db.Users.FirstOrDefault(x => x.Id == authenticatedAccessCard.UserId); bool isAuthenticated = false; if (authenticatedAccessCard != null) { //2) Go and check the challenge inputted == the stored challenge in the db isAuthenticated = string.Equals(authenticatedUser.AuthenticationCode, user.ChallengeResponse); responseModel.IsAuthenticated = isAuthenticated; } responseModel.SetAuthenticationUrl(isAuthenticated, authenticatedUser); responseModel.SetUserId(authenticatedUser); if (!isAuthenticated) { responseModel.SetErrorMessage("Invalid username or password"); eventLogger.LogEvent(authenticatedUser.Id, CrossCuttingConcerns.EventLog.EventType.User_Authentication, CrossCuttingConcerns.EventLog.EventSeverity.Error); } else { eventLogger.LogEvent(authenticatedUser.Id, CrossCuttingConcerns.EventLog.EventType.User_Authentication, CrossCuttingConcerns.EventLog.EventSeverity.Informational); } return(responseModel); } }
// GET: Account public ActionResult Index() { using (var db = new SAMEntities()) { return(View(db.Users.ToList())); } }
internal StudentAccessCardModel GetStudentAccessCards() { var reponseModel = new StudentAccessCardModel(); using (var data = new SAMEntities()) { var accessCards = data.AccessCards.ToList(); var accessCardIds = accessCards.Where(x => x.UserId != null).Select(x => x.UserId).ToList(); var dataAvailableStudents = data.Users.Where(x => !accessCardIds.Contains(x.Id)).ToList(); // it will be on - the admin var availableStudents = new List <StudentModel>(); var linkedStudentCards = new List <StudentAccessCard>(); var linkedStudents = data.Users.Where(x => accessCardIds.Contains(x.Id) && !x.IsAdmin).ToList(); foreach (var item in linkedStudents) { var accessCard = accessCards.FirstOrDefault(x => x.UserId != null && x.UserId == item.Id); linkedStudentCards.Add(new StudentAccessCard { Id = accessCard.Id, CardId = accessCard.CardId, LinkDate = accessCard.CreateDate, Student = new StudentModel { Id = item.Id, FirstName = item.FirstName, LastName = item.LastName, Email = item.Email, CellPhone = item.CellPhone, } }); } reponseModel.LinkedStudentAccessCards = linkedStudentCards; foreach (var item in dataAvailableStudents) { availableStudents.Add(new StudentModel { Id = item.Id, FirstName = item.FirstName, LastName = item.LastName, Email = item.Email, CellPhone = item.CellPhone }); } reponseModel.AvailableStudents = availableStudents; } return(reponseModel); }
//WORKS internal string RegisterStudent(UserModel userModel) { //perform businness rule validation // if (success) // write data by calling mmethod in Data Access Layer using (var db = new SAMEntities()) { try { var user = new User { //Username = userModel.Username, FirstName = userModel.FirstName, LastName = userModel.LastName, Email = userModel.Email, CellPhone = userModel.CellPhone, PasswordHash = userModel.Password.GenerateHash(), IsAdmin = userModel.IsAdmin, AuthenticationCode = userModel.AuthenticationCode, RegistrationDate = DateTime.Now.ToUniversalTime(), Address = new Address { Complex = userModel.Address.ComplexNumber, Street = userModel.Address.Street, Suburb = userModel.Address.Suburb, City = userModel.Address.City, PostalCode = Convert.ToInt32(userModel.Address.PostalCode), } }; db.Users.Add(user); db.SaveChanges(); eventLogger.LogEvent(user.Id, CrossCuttingConcerns.EventLog.EventType.Admin_Register_Student, CrossCuttingConcerns.EventLog.EventSeverity.Informational); return($"{userModel.FirstName} {userModel.LastName} Successfully registered"); } catch (DbEntityValidationException ex) { var errorMessages = ex.EntityValidationErrors .SelectMany(x => x.ValidationErrors) .Select(x => x.ErrorMessage + " " + x.PropertyName); var fullErrorMessage = string.Join(" => ", errorMessages); var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage); eventLogger.LogEvent(userModel.AdminUserId, CrossCuttingConcerns.EventLog.EventType.Admin_Register_Student, CrossCuttingConcerns.EventLog.EventSeverity.Error); throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors); } } }
internal StudentModel FindStudent(int studentId) { using (var db = new SAMEntities()) { var dbStudent = db.Users.FirstOrDefault(x => x.Id == studentId && !x.IsAdmin); eventLogger.LogEvent(studentId, CrossCuttingConcerns.EventLog.EventType.User_Find_Student, CrossCuttingConcerns.EventLog.EventSeverity.Informational); return(dbStudent == null ? null : new StudentModel { Id = dbStudent.Id, FirstName = dbStudent.FirstName, CellPhone = dbStudent.CellPhone, LastName = dbStudent.LastName, Email = dbStudent.Email, //Username = dbStudent.Username, }); } }
internal string RegisterStudent(UserModel userModel) { //perform businness rule validation // if (success) // write data by calling mmethod in Data Access Layer using (var db = new SAMEntities()) { try { db.Users.Add(new User { Username = userModel.Username, FirstName = userModel.FirstName, LastName = userModel.LastName, Email = userModel.Email, CellPhone = userModel.CellPhone, PasswordHash = userModel.Password.GenerateHash(), IsAdmin = userModel.IsAdmin, Address = new Address { ComplexNumber = int.Parse(userModel.Address.ComplexNumber), Street = userModel.Address.Street, Suburb = userModel.Address.Suburb, City = userModel.Address.City, PostalCode = userModel.Address.PostalCode } }); db.SaveChanges(); return($"{userModel.FirstName} {userModel.LastName} Successfully registered"); } catch (DbEntityValidationException ex) { var errorMessages = ex.EntityValidationErrors .SelectMany(x => x.ValidationErrors) .Select(x => x.ErrorMessage + " " + x.PropertyName); var fullErrorMessage = string.Join(" => ", errorMessages); var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage); throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors); } } }
// List of students // if (string.IsNullOrEmpty(studentid)) //{ //} //else //{ //} internal List <UserModel> StudentList(string studentid = "") { var modeluser = new List <UserModel>(); using (var db = new SAMEntities()) { var users = db.Users.ToList(); users.ForEach(user => { modeluser.Add(new UserModel { Username = user.Username.ToString(), FirstName = user.FirstName, LastName = user.LastName, Email = user.Email, CellPhone = user.CellPhone, }); }); } return(modeluser); }
//WORKS internal LogonResponseModel AuthoriseAccessCard() { var responseModel = new LogonResponseModel(); // Read Student UID from Card var cardId = GetCardId(); using (var db = new SAMEntities()) { var scannedCard = db.AccessCards.FirstOrDefault(x => x.CardId == cardId && x.CardType == (int)AccessCardTypes.Administrator); if (scannedCard != null) { var authorisedUser = db.Users.FirstOrDefault(u => u.Id == scannedCard.UserId && u.IsAdmin); // Authenticate User if (authorisedUser == null) { responseModel.IsAuthorised = false; responseModel.SetErrorMessage("Invalid combination of card and userId"); eventLogger.LogEvent(scannedCard.CardId, CrossCuttingConcerns.EventLog.EventType.User_Authentication, CrossCuttingConcerns.EventLog.EventSeverity.Error); } else { responseModel.IsAuthorised = true; responseModel.SetUserId(authorisedUser); } responseModel.SetAuthorisationUrl(responseModel.IsAuthorised, authorisedUser); } else { throw new UnauthorizedAccessException("SAM does not recognize your card!"); } } return(responseModel); }
//Individual records/Details //internal UserModel StudentDetail() //{ // var modeluser = new UserModel(); // using (var db = new SAMEntities()) // { // var users = db.Users; // users.(user => // { // modeluser.Add(new UserModel // { // Username = user.Username.ToString(), // FirstName = user.FirstName, // LastName = user.LastName, // Email = user.Email, // CellPhone = user.CellPhone, // }); // }); // } // return modeluser; //} internal LogonResponseModel LogOn(LogonUserModel userModel) { //Step 1 Generate hash for password var responseModel = new LogonResponseModel(); var hash = userModel.Password.GenerateHash(); //Step2 : validate against dbHash using (var db = new SAMEntities()) { var usr = db.Users.FirstOrDefault(u => u.Username == userModel.Username && u.PasswordHash == hash); responseModel.SetRedirectUrl(usr); if (usr == null) { responseModel.SetErrorMessage("Invalid username or password"); } else { responseModel.IsAuthorised = true; responseModel.SetUsername(usr.Username); } return(responseModel); } }