Repository navigation
Expand file tree
/
Copy pathUpdateUserReferencesCommand.cs
More file actions
101 lines (90 loc) · 3.85 KB
/
Copy pathUpdateUserReferencesCommand.cs
File metadata and controls
101 lines (90 loc) · 3.85 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
91
92
93
94
95
96
97
98
99
100
101
using System.Text.RegularExpressions;
using Raven.Client;
using Raven.Client.Documents.Queries;
using Raven.Yabt.Database.Common.BacklogItem;
using Raven.Yabt.Database.Common.References;
using Raven.Yabt.Database.Infrastructure;
using Raven.Yabt.Database.Models.BacklogItems;
using Raven.Yabt.Database.Models.BacklogItems.Indexes;
using Raven.Yabt.Domain.Common;
using Raven.Yabt.Domain.UserServices.Command;
namespace Raven.Yabt.Domain.BacklogItemServices.Commands
{
internal class UpdateUserReferencesCommand : BaseDbService, IUpdateUserReferencesCommand
{
public UpdateUserReferencesCommand(IAsyncTenantedDocumentSession session): base(session) {}
public void ClearUserId(string userId)
{
if (string.IsNullOrEmpty(userId))
return;
var sanitisedId = GetSanitisedId(userId);
// Form a patch query
var queryString= $@"FROM INDEX '{new BacklogItems_ForList().IndexName}' AS i
WHERE i.{nameof(BacklogItemIndexedForList.ModifiedBy)}_{sanitisedId} != null OR i.{nameof(BacklogItemIndexedForList.AssignedUserId)} == $userId
UPDATE
{{
if (i.{nameof(BacklogItemIndexedForList.Assignee)}.{nameof(UserReference.Id)}.toUpperCase() == $userId) {{
i.{nameof(BacklogItemIndexedForList.Assignee)} = null;
}}
i.{nameof(BacklogItem.Comments)}.forEach(comment => {{
if (comment.{nameof(Comment.Author)}.{nameof(UserReference.Id)}.toUpperCase() == $userId) {{
comment.{nameof(Comment.Author)}.{nameof(UserReference.Id)} = null;
}}
}});
i.{nameof(BacklogItem.ModifiedBy)}.forEach(modif => {{
if (modif.{nameof(BacklogItemHistoryRecord.ActionedBy)}.{nameof(UserReference.Id)}.toUpperCase() == $userId)
modif.{nameof(BacklogItemHistoryRecord.ActionedBy)}.{nameof(UserReference.Id)} = null;
}});
}}";
var query = new IndexQuery
{
Query = queryString,
QueryParameters = new Parameters
{
{ "userId", userId.ToUpper() }
}
};
// Add the patch to a collection
DbSession.AddDeferredPatchQuery(query);
}
public void UpdateReferences(UserReference newUserReference)
{
if (string.IsNullOrEmpty(newUserReference.Id))
return;
var sanitisedId = GetSanitisedId(newUserReference.Id);
// Form a patch query
var queryString = $@"FROM INDEX '{new BacklogItems_ForList().IndexName}' AS i
WHERE i.{nameof(BacklogItemIndexedForList.ModifiedBy)}_{sanitisedId} != null OR i.{nameof(BacklogItemIndexedForList.AssignedUserId)} == $userId
UPDATE
{{
if (i.{nameof(BacklogItemIndexedForList.Assignee)}.{nameof(UserReference.Id)}.toUpperCase() == $userId) {{
i.{nameof(BacklogItemIndexedForList.Assignee)} = $userRef;
}}
i.{nameof(BacklogItem.Comments)}.forEach(comment => {{
if (comment.{nameof(Comment.Author)}.{nameof(UserReference.Id)}.toUpperCase() == $userId) {{
comment.{nameof(Comment.Author)} = $userRef;
}}
}});
i.{nameof(BacklogItem.ModifiedBy)}.forEach(modif => {{
if (modif.{nameof(BacklogItemHistoryRecord.ActionedBy)}.{nameof(UserReference.Id)}.toUpperCase() == $userId)
modif.{nameof(BacklogItemHistoryRecord.ActionedBy)} = $userRef;
}});
}}";
var query = new IndexQuery
{
Query = queryString,
QueryParameters = new Parameters
{
{ "userId", GetSanitisedId(newUserReference.Id).ToUpper() },
{ "userRef", newUserReference },
}
};
// Add the patch to a collection
DbSession.AddDeferredPatchQuery(query);
}
/// <summary>
/// Replace invalid characters with empty strings. Can't pass it as a parameter, as string parameters get wrapped in '\"' when inserted
/// </summary>
private static string GetSanitisedId(string id) => Regex.Replace(id, @"[^\w\.@-]", "");
}
}