Ejemplo n.º 1
0
        public async Task ProvideData(DetectorDataDto dto)
        {
            await Execute(async() =>
            {
                using (UnitOfWork db = new UnitOfWork())
                {
                    IRepo <DetectorDataEntity> detectorDataRepo             = db.GetRepo <DetectorDataEntity>();
                    IRepo <DetectorFaultEventEntity> detectorFaultEventRepo = db.GetRepo <DetectorFaultEventEntity>();

                    DetectorEntity detector = await db.GetRepo <DetectorEntity>().FirstOrDefault(
                        d => d.id == dto.DetectorId.Value
                        );

                    if (detector == null)
                    {
                        throw new NotFoundException("Detector");
                    }

                    if (detector.PipelineItem == null)
                    {
                        throw new NotFoundException("Pipeline item");
                    }

                    List <DetectorDataEntity> datas = new List <DetectorDataEntity>();

                    foreach (DetectorDataItemDto dataItem in dto.Data)
                    {
                        DetectorDataPrefabEntity dataPrefab = detector.DetectorPrefab.DetectorDataPrefabs.FirstOrDefault(
                            dp => dp.id == dataItem.DetectorDataPrefabId.Value
                            );

                        if (dataPrefab == null)
                        {
                            throw new NotFoundException("Detector data prefab");
                        }

                        DataType dataType = dataPrefab.DataType.name.FromName();
                        DataTypeService.CheckIsDataOfType(dataItem.DataBase64, dataType);

                        DetectorDataEntity dataEntity = new DetectorDataEntity()
                        {
                            detector_id             = detector.id,
                            detector_data_prefab_id = dataPrefab.id,
                            field_data_value_base64 = dataItem.DataBase64,
                            timespan = DateTime.Now
                        };

                        DetectorDataEntity created = await detectorDataRepo.Create(dataEntity);

                        datas.Add(created);
                    }

                    foreach (DetectorFaultPrefabEntity faultPrefab in detector.DetectorFaultPrefabs)
                    {
                        bool isFaultOccured = await FaultConditionParseService.ParseCondition(
                            faultPrefab,
                            datas.ToArray(),
                            detector.DetectorSettingsValues.ToArray(),
                            detector.PipelineItem.PipelineItemSettingsValues.ToArray()
                            );

                        if (isFaultOccured)
                        {
                            if (detector.detector_fault_events.Any(f => f.detector_fault_prefab_id == faultPrefab.id && !f.is_fixed))
                            {
                                continue;
                            }

                            int?assigneeAccountId = detector.DetectorPrefab.company.Members.FirstOrDefault(
                                member => member.Roles.SelectMany(r => r.PipelineItemPermissions)
                                .SelectMany(pip => pip.Detectors).Contains(detector)
                                )?.id;

                            int?reviewerAccountId = detector.DetectorPrefab.company.Members.Where(m => m.id != assigneeAccountId).FirstOrDefault(
                                member => member.Roles.SelectMany(r => r.PipelineItemPermissions)
                                .SelectMany(pip => pip.Detectors).Contains(detector)
                                )?.id;

                            TaskEntity associatedTask = new TaskEntity()
                            {
                                company_id          = detector.DetectorPrefab.company_id,
                                name                = $"Fix a fault \"{faultPrefab.name}\" on pipeline item #{detector.pipeline_item_id} \"{detector.PipelineItem.PipelineItemPrefab.name}\"",
                                assignee_account_id = assigneeAccountId,
                                reviewer_account_id = reviewerAccountId
                            };

                            DetectorFaultEventEntity faultEvent = new DetectorFaultEventEntity()
                            {
                                detector_id = detector.id,
                                detector_fault_prefab_id = faultPrefab.id,
                                timespan       = DateTime.Now,
                                is_fixed       = false,
                                AssociatedTask = associatedTask
                            };

                            await detectorFaultEventRepo.Create(faultEvent);
                        }
                    }

                    await db.Save();
                }
            });
        }
Ejemplo n.º 2
0
 public async Task <HttpResponseMessage> ProvideData([FromBody] DetectorDataDto dto)
 {
     return(await Execute(data => DetectorService.ProvideData(data), dto));
 }