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(); } }); }
public async Task <HttpResponseMessage> ProvideData([FromBody] DetectorDataDto dto) { return(await Execute(data => DetectorService.ProvideData(data), dto)); }