diff options
Diffstat (limited to 'MediaBrowser.Api/Reports/Activities/ReportActivitiesBuilder.cs')
| -rw-r--r-- | MediaBrowser.Api/Reports/Activities/ReportActivitiesBuilder.cs | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/MediaBrowser.Api/Reports/Activities/ReportActivitiesBuilder.cs b/MediaBrowser.Api/Reports/Activities/ReportActivitiesBuilder.cs new file mode 100644 index 000000000..83816c6e3 --- /dev/null +++ b/MediaBrowser.Api/Reports/Activities/ReportActivitiesBuilder.cs @@ -0,0 +1,259 @@ +using MediaBrowser.Model.Activity; +using MediaBrowser.Model.Querying; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MediaBrowser.Controller.Library; +namespace MediaBrowser.Api.Reports +{ + /// <summary> A report activities builder. </summary> + /// <seealso cref="T:MediaBrowser.Api.Reports.ReportBuilderBase"/> + public class ReportActivitiesBuilder : ReportBuilderBase + { + #region [Constructors] + + /// <summary> + /// Initializes a new instance of the MediaBrowser.Api.Reports.ReportActivitiesBuilder class. </summary> + /// <param name="libraryManager"> Manager for library. </param> + /// <param name="userManager"> Manager for user. </param> + public ReportActivitiesBuilder(ILibraryManager libraryManager, IUserManager userManager) + : base(libraryManager) + { + _userManager = userManager; + } + + #endregion + + #region [Private Fields] + + private readonly IUserManager _userManager; ///< Manager for user + + #endregion + + #region [Public Methods] + + /// <summary> Gets a result. </summary> + /// <param name="queryResult"> The query result. </param> + /// <param name="request"> The request. </param> + /// <returns> The result. </returns> + public ReportResult GetResult(QueryResult<ActivityLogEntry> queryResult, IReportsQuery request) + { + ReportDisplayType displayType = ReportHelper.GetReportDisplayType(request.DisplayType); + List<ReportOptions<ActivityLogEntry>> options = this.GetReportOptions<ActivityLogEntry>(request, + () => this.GetDefaultHeaderMetadata(), + (hm) => this.GetOption(hm)).Where(x => this.DisplayTypeVisible(x.Header.DisplayType, displayType)).ToList(); + + var headers = GetHeaders<ActivityLogEntry>(options); + var rows = GetReportRows(queryResult.Items, options); + + ReportResult result = new ReportResult { Headers = headers }; + HeaderMetadata groupBy = ReportHelper.GetHeaderMetadataType(request.GroupBy); + int i = headers.FindIndex(x => x.FieldName == groupBy); + if (groupBy != HeaderMetadata.None && i >= 0) + { + var rowsGroup = rows.SelectMany(x => x.Columns[i].Name.Split(';'), (x, g) => new { Group = g.Trim(), Rows = x }) + .GroupBy(x => x.Group) + .OrderBy(x => x.Key) + .Select(x => new ReportGroup { Name = x.Key, Rows = x.Select(r => r.Rows).ToList() }); + + result.Groups = rowsGroup.ToList(); + result.IsGrouped = true; + } + else + { + result.Rows = rows; + result.IsGrouped = false; + } + + return result; + } + + #endregion + + #region [Protected Internal Methods] + + /// <summary> Gets the headers. </summary> + /// <typeparam name="H"> Type of the header. </typeparam> + /// <param name="request"> The request. </param> + /// <returns> The headers. </returns> + /// <seealso cref="M:MediaBrowser.Api.Reports.ReportBuilderBase.GetHeaders{H}(H)"/> + protected internal override List<ReportHeader> GetHeaders<H>(H request) + { + return this.GetHeaders<ActivityLogEntry>(request, () => this.GetDefaultHeaderMetadata(), (hm) => this.GetOption(hm)); + } + + #endregion + + #region [Private Methods] + + /// <summary> Gets default header metadata. </summary> + /// <returns> The default header metadata. </returns> + private List<HeaderMetadata> GetDefaultHeaderMetadata() + { + return new List<HeaderMetadata> + { + HeaderMetadata.UserPrimaryImage, + HeaderMetadata.Date, + HeaderMetadata.User, + HeaderMetadata.Type, + HeaderMetadata.Severity, + HeaderMetadata.Name, + HeaderMetadata.ShortOverview, + HeaderMetadata.Overview, + //HeaderMetadata.UserId + //HeaderMetadata.Item, + }; + } + + /// <summary> Gets an option. </summary> + /// <param name="header"> The header. </param> + /// <param name="sortField"> The sort field. </param> + /// <returns> The option. </returns> + private ReportOptions<ActivityLogEntry> GetOption(HeaderMetadata header, string sortField = "") + { + HeaderMetadata internalHeader = header; + + ReportOptions<ActivityLogEntry> option = new ReportOptions<ActivityLogEntry>() + { + Header = new ReportHeader + { + HeaderFieldType = ReportFieldType.String, + SortField = sortField, + Type = "", + ItemViewType = ItemViewType.None + } + }; + + switch (header) + { + case HeaderMetadata.Name: + option.Column = (i, r) => i.Name; + option.Header.SortField = ""; + break; + case HeaderMetadata.Overview: + option.Column = (i, r) => i.Overview; + option.Header.SortField = ""; + option.Header.CanGroup = false; + break; + + case HeaderMetadata.ShortOverview: + option.Column = (i, r) => i.ShortOverview; + option.Header.SortField = ""; + option.Header.CanGroup = false; + break; + + case HeaderMetadata.Type: + option.Column = (i, r) => i.Type; + option.Header.SortField = ""; + break; + + case HeaderMetadata.Date: + option.Column = (i, r) => i.Date; + option.Header.SortField = ""; + option.Header.HeaderFieldType = ReportFieldType.DateTime; + option.Header.Type = ""; + break; + + case HeaderMetadata.UserPrimaryImage: + //option.Column = (i, r) => i.UserPrimaryImageTag; + option.Header.DisplayType = ReportDisplayType.Screen; + option.Header.ItemViewType = ItemViewType.UserPrimaryImage; + option.Header.ShowHeaderLabel = false; + internalHeader = HeaderMetadata.User; + option.Header.CanGroup = false; + option.Column = (i, r) => + { + if (!string.IsNullOrEmpty(i.UserId)) + { + MediaBrowser.Controller.Entities.User user = _userManager.GetUserById(i.UserId); + if (user != null) + { + var dto = _userManager.GetUserDto(user); + return dto.PrimaryImageTag; + } + } + return string.Empty; + }; + option.Header.SortField = ""; + break; + case HeaderMetadata.Severity: + option.Column = (i, r) => i.Severity; + option.Header.SortField = ""; + break; + case HeaderMetadata.Item: + option.Column = (i, r) => i.ItemId; + option.Header.SortField = ""; + break; + case HeaderMetadata.User: + option.Column = (i, r) => + { + if (!string.IsNullOrEmpty(i.UserId)) + { + MediaBrowser.Controller.Entities.User user = _userManager.GetUserById(i.UserId); + if (user != null) + return user.Name; + } + return string.Empty; + }; + option.Header.SortField = ""; + break; + case HeaderMetadata.UserId: + option.Column = (i, r) => i.UserId; + option.Header.SortField = ""; + break; + } + + option.Header.Name = GetLocalizedHeader(internalHeader); + option.Header.FieldName = header; + + return option; + } + + /// <summary> Gets report rows. </summary> + /// <param name="items"> The items. </param> + /// <param name="options"> Options for controlling the operation. </param> + /// <returns> The report rows. </returns> + private List<ReportRow> GetReportRows(IEnumerable<ActivityLogEntry> items, List<ReportOptions<ActivityLogEntry>> options) + { + var rows = new List<ReportRow>(); + + foreach (ActivityLogEntry item in items) + { + ReportRow rRow = GetRow(item); + foreach (ReportOptions<ActivityLogEntry> option in options) + { + object itemColumn = option.Column != null ? option.Column(item, rRow) : ""; + object itemId = option.ItemID != null ? option.ItemID(item) : ""; + ReportItem rItem = new ReportItem + { + Name = ReportHelper.ConvertToString(itemColumn, option.Header.HeaderFieldType), + Id = ReportHelper.ConvertToString(itemId, ReportFieldType.Object) + }; + rRow.Columns.Add(rItem); + } + + rows.Add(rRow); + } + + return rows; + } + + /// <summary> Gets a row. </summary> + /// <param name="item"> The item. </param> + /// <returns> The row. </returns> + private ReportRow GetRow(ActivityLogEntry item) + { + ReportRow rRow = new ReportRow + { + Id = item.Id, + UserId = item.UserId + }; + return rRow; + } + + #endregion + + } +} |
