Skip to content

Commit ed7707d

Browse files
authored
Merge pull request #837 from GridProtectionAlliance/NotificationPagesUpdate
Sent Email Timeline
2 parents 6aa1006 + d8f01eb commit ed7707d

6 files changed

Lines changed: 675 additions & 197 deletions

File tree

Source/Applications/SystemCenterNotification/Controllers/EmailTypeController.cs

Lines changed: 136 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,27 @@
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;
2332
using System;
2433
using System.Collections.Generic;
2534
using System.ComponentModel;
2635
using System.Data;
36+
using System.EnterpriseServices;
37+
using System.IO;
2738
using System.Linq;
2839
using System.Net.Http;
40+
using System.Reflection;
2941
using System.Threading.Tasks;
3042
using System.Web.Http;
3143
using 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;
4044
using SystemCenter.Notifications.Model;
4145
using 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
}

Source/Applications/SystemCenterNotification/NotificationPages.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,10 @@
365365
<ItemGroup>
366366
<Content Include="Scripts\TSX\CommonComponents\TestEmailButton.tsx" />
367367
</ItemGroup>
368+
<ItemGroup>
369+
<TypeScriptCompile Include="Scripts\TSX\EmailTypes\History.tsx" />
370+
<TypeScriptCompile Include="Scripts\TSX\EmailTypes\SentEmailTimeline.tsx" />
371+
</ItemGroup>
368372
<PropertyGroup>
369373
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
370374
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>

0 commit comments

Comments
 (0)