aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/Reports/Activities/ReportActivitiesBuilder.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api/Reports/Activities/ReportActivitiesBuilder.cs')
-rw-r--r--MediaBrowser.Api/Reports/Activities/ReportActivitiesBuilder.cs259
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
+
+ }
+}