Example #1
0
        private async Task <EntityResult <TaskInstance> > AddSingleOccurrence(Data.Model.Task task, Data.Model.Schedule scheduleEntity, int?assetId, int?userId, DateTime date)
        {
            date = date.LessSeconds();
            Context.Entry(task).Reference(t => t.Form).Load();

            var newOccurrence = new Altask.Data.Model.Occurrence()
            {
                AsEarlyAsDate = date,
                Date          = date,
                FormModel     = task.Form.PublishedModel,
                TaskId        = task.Id,
                TimeSpent     = 0,
                ScheduleId    = scheduleEntity.Id,
            };

            var assetEntity = await Context.Assets.FindAsync(assetId);

            if (assetEntity != null)
            {
                newOccurrence.AssetId = assetEntity.Id;
            }

            var userEntity = await Context.Users.FindAsync(userId);

            if (userEntity != null)
            {
                newOccurrence.UserId = userEntity.Id;
            }

            if (assetEntity == null && userEntity == null)
            {
                return(EntityResult <TaskInstance> .Failed(ErrorDescriber.DefaultError("An occurrence must have either and asset or user associated to it.")));
            }

            newOccurrence.Logs.Add(new Data.Model.OccurrenceLog()
            {
                Type = "Created"
            });
            Context.Occurrences.Add(newOccurrence);
            BeforeCreate(newOccurrence, newOccurrence.ToDto());
            var result = await Context.SaveChangesAsync();

            if (result.Succeeded)
            {
                await AfterCreateAsync(newOccurrence, true);

                var instance = TaskInstance.FromSchedule(task, newOccurrence.Date, scheduleEntity).MergeOccurrence(newOccurrence);
                SignalRHub.NotifyOccurrenceCreate(null, instance, newOccurrence.ToDto());
                return(EntityResult <TaskInstance> .Succeded(instance));
            }
            else
            {
                return(EntityResult <TaskInstance> .Failed(result.Errors.ToArray()));
            }
        }
Example #2
0
        /// <summary>
        /// Adds an alert resolution <see cref="Altask.Data.Model.Occurrence"/>.
        /// </summary>
        /// <param name="schedule"></param>
        /// <returns>Returns a <see cref="Altask.Data.EntityResult"/> indicating success or failure.</returns>
        public virtual async Task <ActionResult> AddAlertResolution(AlertResolution model)
        {
            ThrowIfDisposed();

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            model.Date = model.Date.LessSeconds();
            var assetEntity = await Context.Assets.FindAsync(model.AssetId);

            if (assetEntity == null)
            {
                return(BadRequest(ErrorDescriber.DoesNotExist("Asset")));
            }

            var userEntity = await Context.Users.FindAsync(model.UserId);

            if (userEntity == null)
            {
                return(BadRequest(ErrorDescriber.DoesNotExist("User")));
            }

            var assetLogEntity = await Context.AssetLogs.FindAsync(model.AssetLogId);

            if (assetLogEntity == null)
            {
                return(BadRequest(ErrorDescriber.DoesNotExist("Asset Log")));
            }

            var taskTypeEntity = await Context.TaskTypes.FirstOrDefaultAsync(t => t.Name == "Adhoc");

            if (taskTypeEntity == null)
            {
                return(BadRequest(ErrorDescriber.DefaultError("The Adhoc task type does not exist.")));
            }

            var scheduleAssetType = await Context.ScheduleAssetTypes.FirstOrDefaultAsync(sat => sat.Name == "Primary");

            if (scheduleAssetType == null)
            {
                return(BadRequest(ErrorDescriber.DefaultError("The Primary schedule asset type does not exist.")));
            }

            var scheduleUserType = await Context.ScheduleUserTypes.FirstOrDefaultAsync(sut => sut.Name == "Primary");

            if (scheduleUserType == null)
            {
                return(BadRequest(ErrorDescriber.DefaultError("The Primary schedule user type does not exist.")));
            }

            var newTask = Context.Tasks.Add(new Data.Model.Task()
            {
                Active         = true,
                TaskCategoryId = model.TaskCategoryId,
                Description    = model.Description,
                FormId         = model.FormId,
                IdleTimeout    = model.IdleTimeout,
                Name           = model.Name,
                TaskTypeId     = taskTypeEntity.Id
            });

            var newSchedule = new Data.Model.Schedule()
            {
                Active             = true,
                AnyTime            = false,
                AsEarlyAsFrequency = model.AsEarlyAsFrequency,
                AsEarlyAsN         = model.AsEarlyAsN,
                EndsAfter          = 1,
                Frequency          = "One-Time",
                Name     = model.Name,
                StartsOn = model.Date
            };

            newSchedule.Assets.Add(new Data.Model.ScheduleAsset()
            {
                AssetId             = assetEntity.Id,
                ScheduleAssetTypeId = scheduleAssetType.Id
            });

            newSchedule.Users.Add(new Data.Model.ScheduleUser()
            {
                UserId             = userEntity.Id,
                ScheduleUserTypeId = scheduleUserType.Id
            });

            newTask.Schedules.Add(newSchedule);
            Context.Tasks.Add(newTask);
            var result = await Context.SaveChangesAsync();

            if (result.Succeeded)
            {
                SignalRHub.NotifyTaskCreate(ClientId, newTask.ToDto());
                var result0 = await AddSingleOccurrence(newTask, newSchedule, assetEntity.Id, userEntity.Id, model.Date);

                if (result0.Succeeded)
                {
                    var newAssetLogResolution = new AssetLogResolution()
                    {
                        AssetLogId   = assetLogEntity.Id,
                        OccurrenceId = result0.Entity.OccurrenceId,
                        TaskId       = newTask.Id
                    };

                    Context.AssetLogResolutions.Add(newAssetLogResolution);
                    var result1 = await Context.SaveChangesAsync();

                    await Context.Entry(newAssetLogResolution).Reference(alr => alr.Occurrence).LoadAsync();

                    if (result.Succeeded)
                    {
                        SignalRHub.NotifyAssetLogResolutionCreate(ClientId, newAssetLogResolution.ToDto());
                        return(Ok(new { assetLogResolution = newAssetLogResolution.ToDto(), instance = result0.Entity }));
                    }

                    return(BadRequest(result1));
                }

                return(BadRequest(result0.Errors.ToArray()));
            }
            else
            {
                return(BadRequest(result));
            }
        }
Example #3
0
        /// <summary>
        /// Adds a one-time <see cref="Altask.Data.Model.Occurrence"/> based on the <see cref="Altask.Data.Model.Schedule"/>.
        /// </summary>
        /// <param name="schedule"></param>
        /// <returns>Returns a <see cref="Altask.Data.EntityResult"/> indicating success or failure.</returns>
        public virtual async Task <ActionResult> AddOneTime(OneTimeOccurrence model)
        {
            ThrowIfDisposed();

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            model.Date = model.Date.LessSeconds();
            List <Data.Model.User>  userEntities  = new List <Data.Model.User>();
            List <Data.Model.Asset> assetEntities = new List <Data.Model.Asset>();

            if (model.AssetIds != null && model.AssetIds.Count > 0)
            {
                foreach (var assetId in model.AssetIds)
                {
                    var assetEntity = await Context.Assets.FirstOrDefaultAsync(a => a.Id == assetId);

                    if (assetEntity != null)
                    {
                        assetEntities.Add(assetEntity);
                    }
                }
            }

            if (model.UserIds != null && model.UserIds.Count > 0)
            {
                foreach (var userId in model.UserIds)
                {
                    var userEntity = await Context.Users.FirstOrDefaultAsync(u => u.Id == userId);

                    if (userEntity != null)
                    {
                        userEntities.Add(userEntity);
                    }
                }
            }

            if (userEntities.Count == 0 && assetEntities.Count == 0)
            {
                return(BadRequest(ErrorDescriber.DefaultError("At least one valid user or asset must be assigned to the task.")));
            }

            var taskTypeEntity = await Context.TaskTypes.FirstOrDefaultAsync(t => t.Name == "Adhoc");

            if (taskTypeEntity == null)
            {
                return(BadRequest(ErrorDescriber.DefaultError("The Adhoc task type does not exist.")));
            }

            var scheduleAssetType = await Context.ScheduleAssetTypes.FirstOrDefaultAsync(sat => sat.Name == "Primary");

            if (scheduleAssetType == null)
            {
                return(BadRequest(ErrorDescriber.DefaultError("The Primary schedule asset type does not exist.")));
            }

            var scheduleUserType = await Context.ScheduleUserTypes.FirstOrDefaultAsync(sut => sut.Name == "Primary");

            if (scheduleUserType == null)
            {
                return(BadRequest(ErrorDescriber.DefaultError("The Primary schedule user type does not exist.")));
            }

            var newTask = Context.Tasks.Add(new Data.Model.Task()
            {
                Active         = true,
                TaskCategoryId = model.TaskCategoryId,
                Description    = model.Description,
                FormId         = model.FormId,
                IdleTimeout    = model.IdleTimeout,
                Name           = model.Name,
                TaskTypeId     = taskTypeEntity.Id
            });

            var newSchedule = new Data.Model.Schedule()
            {
                Active             = true,
                AnyTime            = false,
                AsEarlyAsFrequency = model.AsEarlyAsFrequency,
                AsEarlyAsN         = model.AsEarlyAsN,
                EndsAfter          = 1,
                Frequency          = "One-Time",
                Name     = model.Name,
                StartsOn = model.Date
            };

            foreach (var asset in assetEntities)
            {
                newSchedule.Assets.Add(new Data.Model.ScheduleAsset()
                {
                    AssetId             = asset.Id,
                    ScheduleAssetTypeId = scheduleAssetType.Id
                });
            }

            foreach (var user in userEntities)
            {
                newSchedule.Users.Add(new Data.Model.ScheduleUser()
                {
                    UserId             = user.Id,
                    ScheduleUserTypeId = scheduleUserType.Id
                });
            }

            newTask.Schedules.Add(newSchedule);
            Context.Tasks.Add(newTask);
            var result = await Context.SaveChangesAsync();

            List <TaskInstance> instances = new List <TaskInstance>();

            if (result.Succeeded)
            {
                if (assetEntities.Count > 0)
                {
                    foreach (var asset in assetEntities)
                    {
                        if (userEntities.Count > 0)
                        {
                            foreach (var user in userEntities)
                            {
                                var result0 = await AddSingleOccurrence(newTask, newSchedule, asset.Id, user.Id, model.Date);

                                if (result0.Succeeded)
                                {
                                    instances.Add(result0.Entity);
                                }
                            }
                        }
                        else
                        {
                            var result0 = await AddSingleOccurrence(newTask, newSchedule, asset.Id, null, model.Date);

                            if (result0.Succeeded)
                            {
                                instances.Add(result0.Entity);
                            }
                        }
                    }
                }
                else if (userEntities.Count > 0)
                {
                    foreach (var user in userEntities)
                    {
                        var result0 = await AddSingleOccurrence(newTask, newSchedule, null, user.Id, model.Date);

                        if (result0.Succeeded)
                        {
                            instances.Add(result0.Entity);
                        }
                    }
                }

                return(Ok(new { instances = instances }));
            }
            else
            {
                return(BadRequest(result));
            }
        }