Beispiel #1
0
        public async Task <IActionResult> Create([FromBody] CreateTaskGroupRecordViewModel createTaskGroupRecordViewModel)
        {
            var taskGroup = dMContext.TaskGroups
                            .Include(tg => tg.Group)
                            .Include(tg => tg.Tasks)
                            .SingleOrDefault(tg => tg.Id == createTaskGroupRecordViewModel.TaskGroupId);

            if (taskGroup == null)
            {
                return(NotFoundJson());
            }

            if (!VerifyIsGroupMember(taskGroup.Group.Id))
            {
                return(UnauthorizedJson());
            }

            var taskGroupRecord = new TaskGroupRecord();

            taskGroupRecord.TaskGroup = taskGroup;
            taskGroupRecord.Date      = System.DateTime.UtcNow;

            taskGroupRecordLogic.FillTaskGroupRecord(dMContext, taskGroupRecord, createTaskGroupRecordViewModel);

            await dMContext.PresentGroupMembers.AddRangeAsync(taskGroupRecord.PresentGroupMembers);

            await dMContext.TaskGroupMemberLinks.AddRangeAsync(taskGroupRecord.TaskGroupMemberLinks);

            await dMContext.TaskGroupRecords.AddAsync(taskGroupRecord);

            await dMContext.SaveChangesAsync();

            return(Json(new {
                Succeeded = true,
                TaskGroupRecordId = taskGroupRecord.Id
            }));
        }
        public bool FillTaskGroupRecord(DMContext dMContext, TaskGroupRecord taskGroupRecord, CreateTaskGroupRecordViewModel createTaskGroupRecordViewModel)
        {
            var presentGroupMembers = createTaskGroupRecordViewModel.PresentGroupMembersIds.Select(groupMemberId =>
                                                                                                   dMContext.GroupMembers.SingleOrDefault(gm => gm.Id == groupMemberId)
                                                                                                   );

            var presentGroupMembersList = presentGroupMembers.OrderBy(gm => gm.Score).ToList();

            if (presentGroupMembers.Contains(null))
            {
                return(false);
            }

            taskGroupRecord.PresentGroupMembers = presentGroupMembers.Select(gm => {
                var pgm             = new PresentGroupMember();
                pgm.GroupMember     = gm;
                pgm.TaskGroupRecord = taskGroupRecord;
                return(pgm);
            }).ToHashSet();

            var links = new HashSet <TaskGroupMemberLink>();

            var tasksList = taskGroupRecord.TaskGroup.Tasks.OrderByDescending(t => t.Bounty).ToList();

            while (tasksList.Count() > 0)
            {
                var heaviestTask = tasksList[0];
                tasksList.RemoveAt(0);

                var lowestScoringMember = presentGroupMembersList.FirstOrDefault();
                if (lowestScoringMember == null)
                {
                    presentGroupMembersList = presentGroupMembers.OrderBy(gm => gm.Score + CalculateGainedScore(gm, links)).ToList();
                    lowestScoringMember     = presentGroupMembersList[0];
                }

                presentGroupMembersList.RemoveAt(0);

                var link = new TaskGroupMemberLink();
                link.Task            = heaviestTask;
                link.GroupMember     = lowestScoringMember;
                link.TaskGroupRecord = taskGroupRecord;
                links.Add(link);
            }

            taskGroupRecord.TaskGroupMemberLinks = links;

            return(true);
        }