public static async Task <List <List <string> > > UpdateBagContent(string studentId, List <string> subjectsInTheBag) { var usersTable = CloudTableUtilities.OpenTable(ProjectConsts.UsersTableName); var studentEntity = CloudTableUtilities.getTableEntityAsync <UsersTable>(usersTable, studentId).Result.First(); var subjectsTableName = UsersTableUtilities.GetSubjectsTableNamesForStudent(studentEntity).First(); var subjectsTable = CloudTableUtilities.OpenTable(subjectsTableName); var studentIsInsideTheBagEntity = CloudTableUtilities.getTableEntityAsync <SubjectsTable>(subjectsTable, studentId, IsInsideTheBag).Result.First(); var studentStickersEntity = CloudTableUtilities.getTableEntityAsync <SubjectsTable>(subjectsTable, studentId, Stickers).Result.First(); var subjectsNamesValuesMapping = typeof(SubjectsTable).GetProperties().Where(x => x.Name.Contains(SubjectPropertyPrefix) && x.GetValue(studentStickersEntity, null) != null).ToDictionary(prop => prop.Name, prop => prop.GetValue(studentStickersEntity, null)?.ToString()); foreach (var mapping in subjectsNamesValuesMapping) { if (subjectsInTheBag.Contains(mapping.Value)) { typeof(SubjectsTable).GetProperty(mapping.Key).SetValue(studentIsInsideTheBagEntity, InsideTheBag); } else { typeof(SubjectsTable).GetProperty(mapping.Key).SetValue(studentIsInsideTheBagEntity, NotInsideTheBag); } } await CloudTableUtilities.AddTableEntity(subjectsTable, studentIsInsideTheBagEntity); return(new List <List <string> >() { GetExtraSubjects(subjectsTableName, studentId), GetMissingSubejcts(subjectsTableName, studentId) }); }
public static async Task Run([EventHubTrigger("pack2schoolhub", Connection = "myConnection")] EventData[] events, [SignalR(HubName = "Pack2SchoolSignalR1")] IAsyncCollector <SignalRMessage> signalRMessages, ILogger log) { var exceptions = new List <Exception>(); foreach (EventData eventData in events) { List <string> missingSubjects = null; DataBaseAndScanUpdates dataBaseAndScanUpdates; eventData.SystemProperties.TryGetValue(deviceIdProperty, out var deviceIdObj); string userId = (string)deviceIdObj; string messageBody = Encoding.UTF8.GetString(eventData.Body.Array, eventData.Body.Offset, eventData.Body.Count); log.LogInformation($"C# Event Hub trigger function processed a message: {messageBody}"); JObject obj = JObject.Parse(messageBody); var errorMessage = obj[error]?.ToString(); if (errorMessage != null) { dataBaseAndScanUpdates = new DataBaseAndScanUpdates(errorMessage); } else { var subjects = obj[stickers].Select(x => x.ToString()).ToList(); var subjectsUpdate = await SubjectsTableUtilities.UpdateBagContent(userId, subjects); var extraSubjects = subjectsUpdate[0]; missingSubjects = subjectsUpdate[1]; dataBaseAndScanUpdates = new DataBaseAndScanUpdates(userId, missingSubjects: missingSubjects, extraSubjects: extraSubjects); } await signalRMessages.AddAsync( new SignalRMessage { UserId = userId, Target = ProjectConsts.SignalRTarget, Arguments = new object[] { dataBaseAndScanUpdates } }); var parentsEntities = UsersTableUtilities.GetParentsEntitiesFromChildId(userId); foreach (var parentEntity in parentsEntities) { if (parentEntity.UserEmail != null && dataBaseAndScanUpdates.missingSubjects != null && dataBaseAndScanUpdates.missingSubjects.Count > 0) { await EmailSender.sendEmailAsync(userId, parentEntity.UserEmail, missingSubjects); } } } }
public static async Task <string> SignIn( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestMessage request, [Table("UsersTable")] CloudTable usersTable) { OperationResult operationResult = new OperationResult(); UserRequest userRequest = await Utilities.ExtractContent <UserRequest>(request); TableQuery <UsersTable> query = new TableQuery <UsersTable>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, userRequest.userId)); var usersQueryResult = await usersTable.ExecuteQuerySegmentedAsync(query, null); if (!usersQueryResult.Results.Any()) { operationResult.UpdateFailure(ErrorMessages.userNotExist); } else { var user = usersQueryResult.Results.First(); if (user.UserPassword == userRequest.userPassword) { List <string> Info; switch (user.UserType) { case ProjectConsts.ParentType: Info = user.ChildrenIds.Split(ProjectConsts.delimiter).ToList(); break; case ProjectConsts.TeacherType: Info = UsersTableUtilities.GetSubjectsTableNamesForTeacher(user); break; default: Info = UsersTableUtilities.GetSubjectsTableNamesForStudent(user); break; } operationResult.UpdateData(new { userName = user.RowKey, userType = user.UserType, Info }); } else { operationResult.UpdateFailure(ErrorMessages.wrongPassword); } } return(JsonConvert.SerializeObject(operationResult)); }
public static async Task <string> GetChildSubjectsTableName( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestMessage request, [Table("UsersTable")] CloudTable usersTable) { OperationResult operationResult = new OperationResult(); UserRequest userRequest = await Utilities.ExtractContent <UserRequest>(request); var userChildEntity = CloudTableUtilities.getTableEntityAsync <UsersTable>(usersTable, userRequest.childrenIds.First()).Result.First(); var subjectsTableName = UsersTableUtilities.GetSubjectsTableNamesForStudent(userChildEntity); operationResult.UpdateData(subjectsTableName); return(JsonConvert.SerializeObject(operationResult)); }
public static async Task <string> SignUp( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestMessage request, [Table("UsersTable")] CloudTable usersTable) { OperationResult operationResult = new OperationResult(); string childrenIds = null; UserRequest newUserRequest = await Utilities.ExtractContent <UserRequest>(request); TableQuery <UsersTable> query = new TableQuery <UsersTable>(); TableQuerySegment <UsersTable> usersQueryResult = await usersTable.ExecuteQuerySegmentedAsync(query, null); if (!UsersTableUtilities.ValidateUserNotExist(usersQueryResult, newUserRequest, operationResult)) { return(JsonConvert.SerializeObject(operationResult)); } if (newUserRequest.userType == ProjectConsts.ParentType) { if (newUserRequest.childrenIds == null || newUserRequest.childrenIds.Count == 0) { operationResult.UpdateFailure(ErrorMessages.NoChildIdProvided); return(JsonConvert.SerializeObject(operationResult)); } childrenIds = string.Join(ProjectConsts.delimiter, newUserRequest.childrenIds); if (!UsersTableUtilities.ValidateChildrenIdExist(usersQueryResult, newUserRequest, operationResult)) { return(JsonConvert.SerializeObject(operationResult)); } } if (newUserRequest.userType == ProjectConsts.TeacherType) { newUserRequest.userName = UsersTableUtilities.GetUniqueName(newUserRequest.userName); } if (newUserRequest.userType == ProjectConsts.StudentType) { var tableExist = CloudTableUtilities.TableExist(newUserRequest.teacherUser + newUserRequest.classId); if (!tableExist) { operationResult.UpdateFailure(string.Format(ErrorMessages.subjectTableNotExist)); return(JsonConvert.SerializeObject(operationResult)); } } var newUserEntity = new UsersTable() { UserType = newUserRequest.userType, UserEmail = newUserRequest.userEmail, UserPassword = newUserRequest.userPassword, TeacherName = newUserRequest.teacherUser, ClassId = newUserRequest.classId, ChildrenIds = childrenIds }; await CloudTableUtilities.AddTableEntity(usersTable, newUserEntity, newUserRequest.userId, newUserRequest.userName); if (newUserRequest.userType == ProjectConsts.TeacherType) { operationResult.UpdateData(newUserEntity.RowKey); } if (newUserRequest.userType == ProjectConsts.StudentType) { var deviceConnectionString = await IotDeviceFunctions.AddDeviceAsync(newUserRequest.userId); var subjectsTablesNames = UsersTableUtilities.GetSubjectsTableNamesForStudent(newUserEntity); await SubjectsTableUtilities.AddStuentToClassTableAsync(subjectsTablesNames.First(), newUserRequest, operationResult); operationResult.UpdateData(new { deviceConnectionString, subjectsTablesNames }); } return(JsonConvert.SerializeObject(operationResult)); }