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);
                    }
                }
            }
        }
示例#3
0
        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));
        }
示例#4
0
        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));
        }
示例#5
0
        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));
        }