From 810e4cb23f37809252e7767a988a68a146aca7bc Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 5 Feb 2020 18:24:10 +0800 Subject: Improve relate filter. --- Timeline/Services/TimelineService.cs | 40 ++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) (limited to 'Timeline/Services/TimelineService.cs') diff --git a/Timeline/Services/TimelineService.cs b/Timeline/Services/TimelineService.cs index 67a57deb..7afc0512 100644 --- a/Timeline/Services/TimelineService.cs +++ b/Timeline/Services/TimelineService.cs @@ -13,6 +13,25 @@ using static Timeline.Resources.Services.TimelineService; namespace Timeline.Services { + public enum TimelineUserRelationshipType + { + Own = 0b1, + Join = 0b10, + Default = Own | Join + } + + public class TimelineUserRelationship + { + public TimelineUserRelationship(TimelineUserRelationshipType type, long userId) + { + Type = type; + UserId = userId; + } + + public TimelineUserRelationshipType Type { get; set; } + public long UserId { get; set; } + } + /// /// This define the common interface of both personal timeline /// and normal timeline. @@ -231,12 +250,12 @@ namespace Timeline.Services /// /// Get all timelines including personal timelines. /// - /// Filter timelines related (own or is a member) to specific user. + /// Filter timelines related (own or is a member) to specific user. /// The list of timelines. /// /// If user with related user id does not exist, empty list will be returned. /// - Task> GetTimelines(long? relatedUserId = null); + Task> GetTimelines(TimelineUserRelationship? relate = null); /// /// Create a timeline. @@ -628,18 +647,27 @@ namespace Timeline.Services } } - public async Task> GetTimelines(long? relatedUserId = null) + public async Task> GetTimelines(TimelineUserRelationship? relate = null) { List entities; - if (relatedUserId == null) + if (relate == null) { entities = await Database.Timelines.Include(t => t.Members).ToListAsync(); } else { - var timelineAsMemberIds = await Database.TimelineMembers.Where(m => m.UserId == relatedUserId).Select(m => m.TimelineId).ToListAsync(); - entities = await Database.Timelines.Where(t => t.OwnerId == relatedUserId || timelineAsMemberIds.Contains(t.Id)).Include(t => t.Members).ToListAsync(); + entities = new List(); + + if ((relate.Type & TimelineUserRelationshipType.Own) != 0) + { + entities.AddRange(await Database.Timelines.Where(t => t.OwnerId == relate.UserId && t.Name != null).Include(t => t.Members).ToListAsync()); + } + + if ((relate.Type & TimelineUserRelationshipType.Join) != 0) + { + entities.AddRange(await Database.TimelineMembers.Where(m => m.UserId == relate.UserId).Include(m => m.Timeline).ThenInclude(t => t.Members).Select(m => m.Timeline).ToListAsync()); + } } var result = new List(); -- cgit v1.2.3