public void Execute()
{
using ( var rockContext = new RockContext() )
{
PageViewService pageViewService = new PageViewService( rockContext );
PageViewUserAgentService pageViewUserAgentService = new PageViewUserAgentService( rockContext );
PageViewSessionService pageViewSessionService = new PageViewSessionService( rockContext );
var userAgent = ( this.UserAgent ?? string.Empty ).Trim();
if ( userAgent.Length > 450 )
{
userAgent = userAgent.Substring( 0, 450 ); // trim super long useragents to fit in pageViewUserAgent.UserAgent
}
// get user agent info
var clientType = PageViewUserAgent.GetClientType( userAgent );
Parser uaParser = Parser.GetDefault();
ClientInfo client = uaParser.Parse( userAgent );
var clientOs = client.OS.ToString();
var clientBrowser = client.UserAgent.ToString();
// lookup the pageViewUserAgent, and create it if it doesn't exist
var pageViewUserAgent = pageViewUserAgentService.Queryable().Where( a => a.UserAgent == userAgent ).FirstOrDefault();
if ( pageViewUserAgent == null )
{
pageViewUserAgent = new PageViewUserAgent();
pageViewUserAgent.UserAgent = userAgent;
pageViewUserAgent.ClientType = clientType;
pageViewUserAgent.OperatingSystem = clientOs;
pageViewUserAgent.Browser = clientBrowser;
pageViewUserAgentService.Add( pageViewUserAgent );
rockContext.SaveChanges();
}
else
{
// check if the user agent properties need to be updated
if ( clientType != pageViewUserAgent.ClientType || clientOs != pageViewUserAgent.OperatingSystem || clientBrowser != pageViewUserAgent.Browser )
{
pageViewUserAgent.ClientType = clientType;
pageViewUserAgent.OperatingSystem = clientOs;
pageViewUserAgent.Browser = clientBrowser;
rockContext.SaveChanges();
}
}
// lookup PageViewSession, and create it if it doesn't exist
Guid sessionId = this.SessionId.AsGuid();
int? pageViewSessionId = pageViewSessionService.Queryable().Where( a => a.PageViewUserAgentId == pageViewUserAgent.Id && a.SessionId == sessionId && a.IpAddress == this.IPAddress ).Select( a => (int?)a.Id ).FirstOrDefault();
if ( !pageViewSessionId.HasValue )
{
var pageViewSession = new PageViewSession();
pageViewSession.PageViewUserAgentId = pageViewUserAgent.Id;
pageViewSession.SessionId = sessionId;
pageViewSession.IpAddress = this.IPAddress;
pageViewSessionService.Add( pageViewSession );
rockContext.SaveChanges();
pageViewSessionId = pageViewSession.Id;
}
PageView pageView = new PageView();
pageViewService.Add( pageView );
// obfuscate rock magic token
Regex rgx = new Regex( @"rckipid=([^&]*)" );
string cleanUrl = rgx.Replace( this.Url, "rckipid=XXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
pageView.PageId = this.PageId;
pageView.SiteId = this.SiteId;
pageView.Url = cleanUrl.Left( 500 );
pageView.DateTimeViewed = this.DateViewed;
pageView.PersonAliasId = this.PersonAliasId;
pageView.PageTitle = this.PageTitle.Left( 500 );
pageView.PageViewSessionId = pageViewSessionId.Value;
rockContext.SaveChanges();
}
}