void CheckSyncGroup(IReadWritableGroupEntity groupEntity) { List <IReadWritableProcessState> processes = _stateManager.GetSubmittedGroupProcesses(groupEntity.Id) .ToList(); //.GetPendingGroupProcess(groupEntity.Id).ToList(); bool hasAnomaly = false; if (!_runningGroups.TryGetValue(groupEntity.Id, out var @group)) { @group = new SubmittedGroup(groupEntity, processes); _runningGroups.TryAdd(groupEntity.Id, @group); hasAnomaly = true; } //todo update _runningGroups and check completed/incomplete processes and tasks var processRunning = processes.Where(p => p.IsExecuting()).ToList(); foreach (var running in processRunning) { var countPendingTasksForProcess = _stateManager.CountPendingTasksForProcess(running.Id); if (countPendingTasksForProcess == 0) { CheckProcessIdle(running.Id, running.GroupId, true); hasAnomaly = true; } } if (hasAnomaly) { CheckGroupHealth(@group, false); } }
public async Task <ActionResult> DeleteConfirmed(int id) { SubmittedGroup submittedGroup = await db.SubmittedGroups.FindAsync(id); db.SubmittedGroups.Remove(submittedGroup); await db.SaveChangesAsync(); return(RedirectToAction("Index")); }
public async Task <ActionResult> Edit([Bind(Include = "Id,GroupID,Approved,Denied,groupOwner,groupEvent")] SubmittedGroup submittedGroup) { if (ModelState.IsValid) { db.Entry(submittedGroup).State = EntityState.Modified; await db.SaveChangesAsync(); return(RedirectToAction("Index")); } return(View(submittedGroup)); }
public async Task <ActionResult> Create([Bind(Include = "Id,GroupID,Approved,Denied,groupOwner,groupEvent")] SubmittedGroup submittedGroup) { if (ModelState.IsValid) { db.SubmittedGroups.Add(submittedGroup); await db.SaveChangesAsync(); return(RedirectToAction("Index")); } return(View(submittedGroup)); }
// GET: SubmittedGroups/Edit/5 public async Task <ActionResult> Edit(int?id) { if (id == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } SubmittedGroup submittedGroup = await db.SubmittedGroups.FindAsync(id); if (submittedGroup == null) { return(HttpNotFound()); } return(View(submittedGroup)); }
public async Task <ActionResult> Approve(int?id) { if (id == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } SubmittedGroup submittedGroup = await db.SubmittedGroups.FindAsync(id); if (submittedGroup == null) { return(HttpNotFound()); } //find the group to approve int? groupIdFind = db.Groups.Where(x => x.Id == submittedGroup.GroupID).SingleOrDefault()?.Id; Group foundGroup = await db.Groups.FindAsync(groupIdFind); ViewBag.chosenGroup = foundGroup; return(View(submittedGroup)); }
public ProcessGroupRemovedMessage(SubmittedGroup @group, object sender) { Group = @group; Sender = sender; }
public async Task <ActionResult> SubmitGroup([Bind(Include = "Id,groupName,groupSize,groupOwner,member1,member2,member3,member4,submitted,groupDescription,groupEvent,eventId")] Group subGroup) { if (ModelState.IsValid) { //Sending messages to the inbox of users in the relevent fields to say that the group has been submitted if (subGroup.groupOwner != null) { var message = new Message { User = subGroup.groupOwner, Message1 = "Hi " + subGroup.groupOwner + ", " + "Your group " + subGroup.groupName + " for event " + subGroup.groupEvent + " has been submitted for approval", Seen = false, Subject = "Group submitted", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } if (subGroup.member1 != null) { var message = new Message { User = subGroup.member1, Message1 = "Hi " + subGroup.groupOwner + ", " + "Your group " + subGroup.groupName + " for event " + subGroup.groupEvent + " has been submitted for approval", Seen = false, Subject = "Group submitted", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } if (subGroup.member2 != null) { var message = new Message { User = subGroup.member2, Message1 = "Hi " + subGroup.groupOwner + ", " + "Your group " + subGroup.groupName + " for event " + subGroup.groupEvent + " has been submitted for approval", Seen = false, Subject = "Group submitted", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } if (subGroup.member3 != null) { var message = new Message { User = subGroup.member3, Message1 = "Hi " + subGroup.groupOwner + ", " + "Your group " + subGroup.groupName + " for event " + subGroup.groupEvent + " has been submitted for approval", Seen = false, Subject = "Group submitted", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } if (subGroup.member4 != null) { var message = new Message { User = subGroup.member4, Message1 = "Hi " + subGroup.groupOwner + ", " + "Your group " + subGroup.groupName + " for event " + subGroup.groupEvent + " has been submitted for approval", Seen = false, Subject = "Group submitted", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } //create submitted group to enter to table var submitted = new SubmittedGroup { GroupID = subGroup.Id, groupOwner = subGroup.groupOwner, groupEvent = subGroup.groupEvent, eventId = subGroup.eventId }; subGroup.submitted = true; db.Entry(subGroup).State = EntityState.Modified; db.SubmittedGroups.Add(submitted); await db.SaveChangesAsync(); return(RedirectToAction("Index")); } return(View(subGroup)); }
public async Task <ActionResult> Deny([Bind(Include = "Id,GroupID,Approved,Denied,groupOwner,groupEvent,eventId")] SubmittedGroup groupSubmitted) { if (ModelState.IsValid) { //find event and group int?eventIdFind = db.Events.Where(x => x.Id == groupSubmitted.eventId).SingleOrDefault()?.Id; Event foundEvent = await db.Events.FindAsync(eventIdFind); int?groupIdFind = db.Groups.Where(x => x.Id == groupSubmitted.GroupID).SingleOrDefault()?.Id; Group foundGroup = await db.Groups.FindAsync(groupIdFind); //message users that group has been denied if (foundGroup.groupOwner != null) { var message = new Message { User = foundGroup.groupOwner, Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been denied.", Seen = false, Subject = "Group denied", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } if (foundGroup.member1 != null) { var message = new Message { User = foundGroup.member1, Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been denied", Seen = false, Subject = "Group denied", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } if (foundGroup.member2 != null) { var message = new Message { User = foundGroup.member2, Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been denied.", Seen = false, Subject = "Group denied", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } if (foundGroup.member3 != null) { var message = new Message { User = foundGroup.member3, Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been denied", Seen = false, Subject = "Group denied", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } if (foundGroup.member4 != null) { var message = new Message { User = foundGroup.member4, Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been denied", Seen = false, Subject = "Group denied", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } groupSubmitted.Denied = true; db.Entry(groupSubmitted).State = EntityState.Modified; await db.SaveChangesAsync(); return(RedirectToAction("Index")); } return(View(groupSubmitted)); }
public async Task <ActionResult> Approve([Bind(Include = "Id,GroupID,Approved,Denied,groupOwner,groupEvent,eventId")] SubmittedGroup groupSubmitted) { if (ModelState.IsValid) { //find the event the group is attending int?eventIdFind = db.Events.Where(x => x.Id == groupSubmitted.eventId).SingleOrDefault()?.Id; Event foundEvent = await db.Events.FindAsync(eventIdFind); //find the group int?groupIdFind = db.Groups.Where(x => x.Id == groupSubmitted.GroupID).SingleOrDefault()?.Id; Group foundGroup = await db.Groups.FindAsync(groupIdFind); int available = foundEvent.Tickets_available; int deduction = 0; //count tickets to decuct from event total and message the members of the group that the group has been approved if (foundGroup.groupOwner != null) { var message = new Message { User = foundGroup.groupOwner, Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been approved", Seen = false, Subject = "Group approved", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); deduction = deduction + 1; } if (foundGroup.member1 != null) { var message = new Message { User = foundGroup.member1, Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been approved", Seen = false, Subject = "Group approved", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); deduction = deduction + 1; } if (foundGroup.member2 != null) { var message = new Message { User = foundGroup.member2, Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been approved", Seen = false, Subject = "Group approved", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); deduction = deduction + 1; } if (foundGroup.member3 != null) { var message = new Message { User = foundGroup.member3, Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been approved", Seen = false, Subject = "Group approved", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); deduction = deduction + 1; } if (foundGroup.member4 != null) { var message = new Message { User = foundGroup.member4, Message1 = "Hi " + foundGroup.groupOwner + ", " + "Your group " + foundGroup.groupName + " for event " + foundGroup.groupEvent + " has been approved", Seen = false, Subject = "Group approved", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); deduction = deduction + 1; } //deduct tickets and modify group to approved foundEvent.Tickets_available = available - deduction; groupSubmitted.Approved = true; db.Entry(groupSubmitted).State = EntityState.Modified; db.Entry(foundEvent).State = EntityState.Modified; await db.SaveChangesAsync(); int remainingCheck = foundEvent.Tickets_available; //if the remaining tickets for the event is less than 5 if (remainingCheck <= 5) { //get groups var eventGroups = from g in db.Groups where g.eventId == foundEvent.Id select g.Id; //find groups for the event foreach (var grp in eventGroups) { int?findGroupToCheck = db.Groups.Where(x => x.Id == groupSubmitted.GroupID).SingleOrDefault()?.Id; Group groupFound = await db.Groups.FindAsync(findGroupToCheck); //check if group size is more than the available tickets and purge the group and message members that the group has been denied if (groupFound.groupSize > remainingCheck) { var purgedGroup = new SubmittedGroup { GroupID = groupFound.Id, Approved = false, Denied = true, groupOwner = foundGroup.groupOwner, groupEvent = foundGroup.groupEvent, eventId = foundGroup.eventId }; groupFound.submitted = true; db.SubmittedGroups.Add(purgedGroup); db.Entry(groupFound).State = EntityState.Modified; } if (groupFound.groupOwner != null) { var message = new Message { User = groupFound.groupOwner, Message1 = "Hi " + groupFound.groupOwner + ", " + "Your group " + groupFound.groupName + " for event " + groupFound.groupEvent + " has been closed due to there not being enough tickets to provide to a group of your selected size.", Seen = false, Subject = "Group too large", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } if (groupFound.member1 != null) { var message = new Message { User = groupFound.member1, Message1 = "Hi " + groupFound.groupOwner + ", " + "Your group " + groupFound.groupName + " for event " + groupFound.groupEvent + " has been closed due to there not being enough tickets to provide to a group of your selected size.", Seen = false, Subject = "Group too large", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } if (groupFound.member2 != null) { var message = new Message { User = groupFound.member2, Message1 = "Hi " + groupFound.groupOwner + ", " + "Your group " + groupFound.groupName + " for event " + groupFound.groupEvent + " has been closed due to there not being enough tickets to provide to a group of your selected size.", Seen = false, Subject = "Group too large", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } if (groupFound.member3 != null) { var message = new Message { User = groupFound.member3, Message1 = "Hi " + groupFound.groupOwner + ", " + "Your group " + groupFound.groupName + " for event " + groupFound.groupEvent + " has been closed due to there not being enough tickets to provide to a group of your selected size.", Seen = false, Subject = "Group too large", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } if (groupFound.member4 != null) { var message = new Message { User = groupFound.member4, Message1 = "Hi " + groupFound.groupOwner + ", " + "Your group " + groupFound.groupName + " for event " + groupFound.groupEvent + " has been closed due to there not being enough tickets to provide to a group of your selected size.", Seen = false, Subject = "Group too large", From = "Admin", Time = DateTime.Now }; db.Messages.Add(message); } } } await db.SaveChangesAsync(); return(RedirectToAction("Index")); } return(View(groupSubmitted)); }
private void CheckGroupHealth(SubmittedGroup groupDetails, bool refresh = true) { if (refresh) { groupDetails.Refresh(_stateManager); } if (groupDetails.GroupEntity.IsFinished) { _runningGroups.TryRemove(groupDetails.GroupEntity.Id, out groupDetails); _eventAggregator.Broadcast(new ProcessGroupRemovedMessage(groupDetails, this)); } else { //if (!groupDetails.GroupEntity.IsGenerated) //{ // HandleNewGroup(groupDetails.GroupEntity.Id); // return; //} //any process running right now var groupProcesses = groupDetails.ProcessEntities;// _stateManager.GetConfiguredGroupProcessKeys(groupDetails.GroupEntity.Id).ToList(); if (groupProcesses.Any(p => p.IsExecuting())) { Logger.Trace($"Group id {groupDetails.GroupEntity.Id} is running"); return; } if (groupProcesses.Any(p => p.IsStopped)) { Logger.Trace($"Group id {groupDetails.GroupEntity.Id} is stopped"); groupDetails.GroupEntity.MarkGroupStatus(CompletionStatus.Stopped, ResultStatus.Error, "Execution stopped. Process stopped", _stateManager); _eventAggregator.Broadcast(new ProcessGroupRemovedMessage(groupDetails, this)); return; } //have any process not yet started //var processNotGeneratedYet = groupProcesses.Where(p => p.IsVolumeGenerated == false).ToList(); //if (processNotGeneratedYet.Count != 0) //{ // SubmitVolumeRequest(processNotGeneratedYet, groupDetails.GroupEntity); //} var processesNotStartedYet = groupProcesses.Where(p => (p.IsVolumeGenerated == false || p.StartTime.HasValue == false) && p.Status.Id == CompletionStatus.Pending.Id && p.IsStopped == false).ToList();// && processNotGeneratedYet.Exists(g=>g.Id==p.Id)==false).ToList(); if (processesNotStartedYet.Count == 0) { //group processes completed i.e. no process executing and no to start ResultStatus status; CompletionStatus completionStatus = CompletionStatus.Finished; if (groupProcesses.Any(p => p.IsStopped)) { status = ResultStatus.Empty; completionStatus = CompletionStatus.Stopped; } else { status = groupProcesses.Any(p => ResultStatus.Error.Id == p.Status.Id) ? ResultStatus.Error : ResultStatus.Success; } groupDetails.GroupEntity.MarkGroupStatus(completionStatus, status, "Execution end", _stateManager); //todo cleanup group _eventAggregator.Broadcast(new ProcessGroupRemovedMessage(groupDetails, this)); } else { var process2Start = new List <IReadWritableProcessState>(); var rootProcess = groupProcesses.Where(p => p.ParentId == null).ToList(); TraverseInComplete(rootProcess, process2Start, groupProcesses); if (process2Start.Any()) { SubmitVolumeRequest(process2Start, groupDetails.GroupEntity); } else { groupDetails.GroupEntity.MarkGroupStatus(CompletionStatus.Stopped, ResultStatus.Invalid, "Execution faulted. No process found", _stateManager); _eventAggregator.Broadcast(new ProcessGroupRemovedMessage(groupDetails, this)); } } } }