/// <summary>
        /// Gets the audit log data for the specified filter parameters
        /// </summary>
        /// <param name="logType">The type of the log entry (eg. 'Save')</param>
        /// <param name="userName">Name of the user responsible for the entry</param>
        /// <param name="dateFrom">The date to search from</param>
        /// <param name="searchTerm">An optional search term</param>
        /// <param name="dateTo">The date to search up to (inclusive)</param>
        /// <param name="itemsPerPage">How many items per page to retrieve (default = 50)</param>
        /// <param name="nodeId">The optional nodeId to search for</param>
        /// <param name="pageNumber">The page number</param>
        /// <param name="sortColumn">The column name to sort by (default = date)</param>
        /// <param name="sortOrder">The sort order - either ascending or descending (default = ascending)</param>
        /// <returns>A paged list of log data</returns>
        /// <remarks>/Umbraco/Backoffice/AuditLogViewer/ContentLog/GetLogData</remarks>
        public PagedLogEntryResult <LogEntry> GetLogData(string logType = null, string userName = null, DateTime?dateFrom = null, DateTime?dateTo = null, int?nodeId = null, int itemsPerPage = 50, int pageNumber = 1, string sortColumn = "L.Datestamp", string sortOrder = "asc", string searchTerm = null)
        {
            var request = new ContentLogSearchRequest()
            {
                DateFrom     = dateFrom,
                DateTo       = dateTo,
                ItemsPerPage = itemsPerPage,
                LogType      = logType,
                NodeId       = nodeId,
                PageNumber   = pageNumber,
                SearchTerm   = searchTerm,
                SortColumn   = sortColumn,
                SortOrder    = sortOrder,
                UserName     = userName
            };

            var paged = this._logService.SearchLog(request);

            var result = new PagedLogEntryResult <LogEntry>()
            {
                CurrentPage  = paged.CurrentPage,
                ItemsPerPage = paged.ItemsPerPage,
                LogEntries   = paged.Items,
                TotalItems   = paged.TotalItems,
                TotalPages   = paged.TotalPages
            };

            return(result);
        }
        /// <summary>
        /// Searches the Umbraco Log table
        /// </summary>
        /// <param name="request">The search request criteria</param>
        /// <returns>A page of log results</returns>
        public Page <LogEntry> SearchLog(ContentLogSearchRequest request)
        {
            using (var scope = this.scopeProvider.CreateScope(autoComplete: true))
            {
                if (!IsValidOrderByParameter(request.SortColumn))
                {
                    throw new ArgumentOutOfRangeException("The order by value '" + request.SortColumn + "' is not a valid sort parameter.");
                }

                if (!IsValidOrderByDirectionParameter(request.SortOrder))
                {
                    throw new ArgumentOutOfRangeException("The order by value '" + request.SortOrder + "' is not a valid sort order.");
                }

                const string sql = @"SELECT L.Id, N.[text] as Text, CASE WHEN U.userName IS NULL THEN 'SYSTEM' ELSE U.userName END as Username,
                L.Datestamp as DateStamp, L.logHeader, L.logComment, L.nodeId,
                CT.Alias as Alias, N.nodeObjectType, CT.icon as Icon
			    FROM umbracoLog L
			    LEFT JOIN umbracoUser U ON L.userId = U.id
			    LEFT JOIN umbracoNode N ON N.id = L.nodeId
				LEFT JOIN umbracoContent C ON C.nodeId = N.id
			    LEFT JOIN cmsContentType CT ON C.contentTypeId = CT.nodeId
                WHERE 1 = 1";

                var query = scope.SqlContext.Sql(sql);

                if (!string.IsNullOrEmpty(request.LogType))
                {
                    query = query.Append(" AND L.LogHeader = @0", request.LogType);
                }

                if (!string.IsNullOrEmpty(request.UserName))
                {
                    query = query.Append(" AND (CASE When U.userName IS NULL Then 'SYSTEM' ELSE U.userName END) = @0", request.UserName);
                }

                if (request.DateFrom.HasValue)
                {
                    query = query.Append(" AND L.Datestamp >= @0", request.DateFrom.Value);
                }

                if (request.DateTo.HasValue)
                {
                    query = query.Append(" AND L.Datestamp <= @0", request.DateTo.Value.AddDays(1));
                }

                if (!string.IsNullOrEmpty(request.SearchTerm))
                {
                    query = query.Append(" AND (L.logComment LIKE @0 OR N.[text] LIKE @0)", "%" + request.SearchTerm + "%");
                }

                if (request.NodeId.HasValue)
                {
                    query = query.Append(" AND L.NodeId = @0", request.NodeId.Value);
                }

                if (request.SortColumn.InvariantEquals("id"))
                {
                    request.SortColumn = "L.id";
                }

                if (request.SortOrder == "desc")
                {
                    query.OrderByDescending(request.SortColumn);
                }
                else
                {
                    query.OrderBy(request.SortColumn);
                }

                var page = scope.Database.Page <LogEntry>(request.PageNumber, request.ItemsPerPage, query);

                foreach (var node in page.Items.Where(n => n.TypeId.HasValue))
                {
                    node.TypeDesc = GetNodeObjectTypeName(node.TypeId.Value.ToString().ToUpper());
                }

                return(page);
            }
        }