2020// Generated original version of source code.
2121//
2222//******************************************************************************************************
23+ using GSF . Configuration ;
24+ using GSF . Data ;
25+ using GSF . Data . Model ;
26+ using GSF . Units ;
27+ using GSF . Web . Model ;
28+ using Newtonsoft . Json ;
29+ using Newtonsoft . Json . Linq ;
30+ using openXDA . APIAuthentication ;
31+ using openXDA . Model ;
2332using System ;
2433using System . Collections . Generic ;
2534using System . ComponentModel ;
2635using System . Data ;
36+ using System . EnterpriseServices ;
37+ using System . IO ;
2738using System . Linq ;
2839using System . Net . Http ;
40+ using System . Reflection ;
2941using System . Threading . Tasks ;
3042using System . Web . Http ;
3143using System . Xml . Linq ;
32- using GSF . Configuration ;
33- using GSF . Data ;
34- using GSF . Data . Model ;
35- using GSF . Web . Model ;
36- using Newtonsoft . Json ;
37- using Newtonsoft . Json . Linq ;
38- using openXDA . APIAuthentication ;
39- using openXDA . Model ;
4044using SystemCenter . Notifications . Model ;
4145using ConfigurationLoader = SystemCenter . Notifications . Model . ConfigurationLoader ;
4246
@@ -91,7 +95,7 @@ public IHttpActionResult TestTrigger([FromBody] PostEventFilter content)
9195 if ( content . GroupIDs . Count > 0 )
9296 {
9397 groupFilter = "AND (" ;
94- groupFilter += $ "E.AssetID IN (SELECT AssetID FROM AssetAssetGroup WHERE AssetGroupID IN ({ string . Join ( "," , content . GroupIDs ) } ))";
98+ groupFilter += $ "E.AssetID IN (SELECT AssetID FROM AssetAssetGroup WHERE AssetGroupID IN ({ string . Join ( "," , content . GroupIDs ) } ))";
9599 groupFilter += " OR " ;
96100 groupFilter += $ "E.MeterID IN (SELECT MeterID FROM MeterAssetGroup WHERE AssetGroupID IN ({ string . Join ( "," , content . GroupIDs ) } ))";
97101 groupFilter += ")" ;
@@ -122,15 +126,15 @@ Event E LEFT JOIN
122126 EventType ET ON E.EventTypeID = ET.ID CROSS APPLY
123127 ({ string . Format ( content . TriggerSQL , "E.ID" ) } ) EmailTrigger(Value)
124128 WHERE E.StartTime BETWEEN {{0}} AND {{1}}
125- { ( content . AssetIDs . Count > 0 ? $ " AND E.AssetID IN ({ string . Join ( "," , content . AssetIDs ) } )" : "" ) }
129+ { ( content . AssetIDs . Count > 0 ? $ " AND E.AssetID IN ({ string . Join ( "," , content . AssetIDs ) } )" : "" ) }
126130 { ( content . MeterIDs . Count > 0 ? $ " AND E.MeterID IN ({ string . Join ( "," , content . MeterIDs ) } )" : "" ) }
127131 { ( content . EventTypes . Count > 0 ? $ " AND ET.ID IN ({ string . Join ( "," , content . EventTypes ) } )" : "" ) }
128132 { groupFilter }
129133 ORDER BY StartTime DESC" ;
130134
131135 using ( AdoDataConnection connection = CreateDbConnection ( ) )
132136 return Ok ( connection . RetrieveData ( sql , content . Start , content . End ) ) ;
133-
137+
134138 }
135139 catch ( Exception ex )
136140 {
@@ -176,7 +180,7 @@ WHERE E.ID IN ({string.Format(combineSQL, eventID)})
176180 }
177181
178182 [ HttpGet , Route ( "Test/{eventID:int}/{emailID:int}/{recipient}" ) ]
179- public IHttpActionResult Test ( int eventID , int emailID , string recipient )
183+ public IHttpActionResult Test ( int eventID , int emailID , string recipient )
180184 {
181185 if ( ! PatchAuthCheck ( ) )
182186 return Unauthorized ( ) ;
@@ -231,7 +235,7 @@ void ConfigureRequest(HttpRequestMessage request)
231235
232236 JArray results = JArray . Parse ( responseJSON ) ;
233237
234- for ( int index = 0 ; index < results . Count ( ) ; index ++ )
238+ for ( int index = 0 ; index < results . Count ( ) ; index ++ )
235239 {
236240 XElement data = JsonConvert . DeserializeObject < XElement > ( results [ index ] [ "Data" ] . ToString ( ) ) ;
237241 results [ index ] [ "Data" ] = data ? . ToString ( ) ?? "" ;
@@ -418,5 +422,124 @@ private AdoDataConnection CreateDbConnection()
418422 [ RoutePrefix ( "api/OpenXDA/SentEmail" ) , ViewOnly , AllowSearch ]
419423 public class SentEmailController : ModelController < SentEmail >
420424 {
425+ public class TimelineItem
426+ {
427+ public DateTime Start { get ; set ; }
428+ public DateTime ? End { get ; set ; }
429+ public string Description { get ; set ; }
430+ public int ID { get ; set ; }
431+ }
432+
433+ [ HttpPost , Route ( "Timeline/{SentEmailID:int}" ) ]
434+ public IHttpActionResult SentEmailTimeline ( [ FromBody ] PostData postData , int SentEmailID )
435+ {
436+ List < TimelineItem > timeline = [ ] ;
437+
438+ int id = 0 ;
439+
440+ using ( AdoDataConnection connection = CreateDbConnection ( ) )
441+ {
442+ SentEmail sentEmail = new TableOperations < SentEmail > ( connection ) . QueryRecordWhere ( "ID = {0}" , SentEmailID ) ;
443+
444+ timeline . Add ( new TimelineItem ( )
445+ {
446+ Description = "Email Sent" ,
447+ Start = sentEmail . TimeSent ,
448+ End = null ,
449+ ID = id
450+ } ) ;
451+
452+ id ++ ;
453+
454+ EventSentEmail eventSentEmail = new TableOperations < EventSentEmail > ( connection ) . QueryRecordWhere ( "SentEmailID = {0}" , sentEmail . ID ) ;
455+
456+ if ( eventSentEmail == null )
457+ {
458+ return Ok ( JsonConvert . SerializeObject ( timeline ) ) ;
459+ }
460+
461+ Event eventRecord = new TableOperations < Event > ( connection ) . QueryRecordWhere ( "ID = {0}" , eventSentEmail . EventID ) ;
462+
463+ FileGroup fileGroupRecord = new TableOperations < FileGroup > ( connection ) . QueryRecordWhere ( "ID = {0}" , eventRecord . FileGroupID ) ;
464+
465+ timeline . Add ( new TimelineItem ( )
466+ {
467+ Description = "File Group Data" ,
468+ Start = fileGroupRecord . DataStartTime ,
469+ End = fileGroupRecord . DataEndTime ,
470+ ID = id
471+ } ) ;
472+
473+ id ++ ;
474+
475+ timeline . Add ( new TimelineItem ( )
476+ {
477+ Description = "File Group Processing" ,
478+ Start = fileGroupRecord . ProcessingStartTime ,
479+ End = fileGroupRecord . ProcessingEndTime ,
480+ ID = id
481+ } ) ;
482+
483+ id ++ ;
484+
485+ DataFile [ ] dataFileRecords = new TableOperations < DataFile > ( connection ) . QueryRecordsWhere ( "FileGroupID = {0}" , fileGroupRecord . ID ) . ToArray ( ) ;
486+
487+ foreach ( DataFile dataFile in dataFileRecords )
488+ {
489+ string dataFileName = Path . GetFileName ( dataFile . FilePath ) ;
490+
491+ timeline . Add ( new TimelineItem ( )
492+ {
493+ Description = $ "{ dataFileName } Last Write Time",
494+ Start = dataFile . LastWriteTime ,
495+ End = null ,
496+ ID = id
497+ } ) ;
498+
499+ id ++ ;
500+ }
501+
502+ DataOperationFailure [ ] dataOperationFailureRecords = new TableOperations < DataOperationFailure > ( connection ) . QueryRecordsWhere ( "FileGroupID = {0}" , fileGroupRecord . ID ) . ToArray ( ) ;
503+
504+ foreach ( DataOperationFailure dataOperationFailure in dataOperationFailureRecords )
505+ {
506+ timeline . Add ( new TimelineItem ( )
507+ {
508+ Description = dataOperationFailure . Log ,
509+ Start = dataOperationFailure . TimeOfFailure ,
510+ End = null ,
511+ ID = id
512+ } ) ;
513+
514+ id ++ ;
515+ }
516+
517+ List < TimelineItem > sortedTimeline ;
518+
519+ PropertyInfo orderByProp = typeof ( TimelineItem ) . GetProperty ( postData . OrderBy ) ;
520+ if ( orderByProp == null )
521+ {
522+ orderByProp = typeof ( TimelineItem ) . GetProperty ( "Start" ) ;
523+ }
524+
525+ if ( ! postData . Ascending )
526+ {
527+ sortedTimeline = timeline . OrderBy ( i => orderByProp . GetValue ( i ) ) . ToList ( ) ;
528+ }
529+ else
530+ {
531+ sortedTimeline = timeline . OrderByDescending ( i => orderByProp . GetValue ( i ) ) . ToList ( ) ;
532+ }
533+
534+ return Ok ( JsonConvert . SerializeObject ( sortedTimeline ) ) ;
535+ }
536+ }
537+
538+ private AdoDataConnection CreateDbConnection ( )
539+ {
540+ AdoDataConnection connection = new AdoDataConnection ( Connection ) ;
541+ connection . DefaultTimeout = DataExtensions . DefaultTimeoutDuration ;
542+ return connection ;
543+ }
421544 }
422545}
0 commit comments