-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathSessionMemberRepository.cs
More file actions
90 lines (74 loc) · 3.54 KB
/
SessionMemberRepository.cs
File metadata and controls
90 lines (74 loc) · 3.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
using System.Collections.ObjectModel;
using System.Reactive.Linq;
using ByteSync.Business.SessionMembers;
using ByteSync.Common.Business.Sessions.Cloud;
using ByteSync.Interfaces.Repositories;
using ByteSync.Interfaces.Services.Communications;
using DynamicData;
using DynamicData.Binding;
namespace ByteSync.Repositories;
public class SessionMemberRepository : BaseSourceCacheRepository<SessionMemberInfo, string>, ISessionMemberRepository
{
private readonly IConnectionService _connectionService;
private readonly ReadOnlyObservableCollection<SessionMemberInfo> _sortedSessionMembersList;
private readonly ReadOnlyObservableCollection<SessionMemberInfo> _sortedOtherSessionMembersList;
private readonly ISessionInvalidationCachePolicy<SessionMemberInfo, string> _sessionInvalidationCachePolicy;
public SessionMemberRepository(IConnectionService connectionService,
ISessionInvalidationCachePolicy<SessionMemberInfo, string> sessionInvalidationCachePolicy)
{
_connectionService = connectionService;
SortedSessionMembersObservable
.Bind(out var sortedSessionMembersList)
.Subscribe();
_sortedSessionMembersList = sortedSessionMembersList;
SortedOtherSessionMembersObservable
.Bind(out var sortedOtherSessionMembersList)
.Subscribe();
_sortedOtherSessionMembersList = sortedOtherSessionMembersList;
IsCurrentUserFirstSessionMemberObservable
.Subscribe(value => IsCurrentUserFirstSessionMemberCurrentValue = value);
_sessionInvalidationCachePolicy = sessionInvalidationCachePolicy;
_sessionInvalidationCachePolicy.Initialize(SourceCache, true, false);
}
protected override string KeySelector(SessionMemberInfo sessionMemberInfo) => sessionMemberInfo.ClientInstanceId;
public IEnumerable<SessionMemberInfo> SortedSessionMembers => _sortedSessionMembersList;
public IEnumerable<SessionMemberInfo> SortedOtherSessionMembers => _sortedOtherSessionMembersList;
public SessionMemberInfo GetCurrentSessionMember()
{
return GetElement(_connectionService.ClientInstanceId!)!;
}
public void Remove(SessionMemberInfoDTO sessionMemberInfoDto)
{
Remove(sessionMemberInfoDto.ClientInstanceId);
}
public IObservable<ISortedChangeSet<SessionMemberInfo, string>> SortedSessionMembersObservable
{
get
{
return SourceCache.Connect()
.Sort(SortExpressionComparer<SessionMemberInfo>.Ascending(smi => smi.JoinedSessionOn),
SortOptimisations.ComparesImmutableValuesOnly);
}
}
public IObservable<ISortedChangeSet<SessionMemberInfo, string>> SortedOtherSessionMembersObservable
{
get
{
return SourceCache.Connect()
.Filter(smi => smi.ClientInstanceId != _connectionService.ClientInstanceId!)
.Sort(SortExpressionComparer<SessionMemberInfo>.Ascending(smi => smi.JoinedSessionOn),
SortOptimisations.ComparesImmutableValuesOnly);
}
}
public IObservable<bool> IsCurrentUserFirstSessionMemberObservable
{
get
{
return SortedSessionMembersObservable
.Select(changes => changes.SortedItems.FirstOrDefault())
.Select(firstMember => firstMember.Key == _connectionService.ClientInstanceId!)
.DistinctUntilChanged();
}
}
public bool IsCurrentUserFirstSessionMemberCurrentValue { get; private set; }
}