Skip to content

Commit a0696f0

Browse files
committed
feat: add MemberId to the query
1 parent 32060e4 commit a0696f0

File tree

4 files changed

+52
-19
lines changed

4 files changed

+52
-19
lines changed

src/VirtoCommerce.ProfileExperienceApiModule.Data/Authorization/ProfileAuthorizationHandler.cs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using VirtoCommerce.ProfileExperienceApiModule.Data.Aggregates.Organization;
1313
using VirtoCommerce.ProfileExperienceApiModule.Data.Aggregates.Vendor;
1414
using VirtoCommerce.ProfileExperienceApiModule.Data.Commands;
15+
using VirtoCommerce.ProfileExperienceApiModule.Data.Queries;
1516

1617
namespace VirtoCommerce.ProfileExperienceApiModule.Data.Authorization
1718
{
@@ -96,21 +97,12 @@ protected override async Task HandleRequirementAsync(AuthorizationHandlerContext
9697
}
9798
result = allowDelete;
9899
break;
100+
case MemberAddressesQuery addressesQuery when currentContact != null:
101+
result = addressesQuery.MemberId == currentContact.Id; // if member is not set the query handler will work with the currentContact
102+
result = result || await HasSameOrganizationOrCurrentMemberAsync(addressesQuery.MemberId, userManager, currentMember, currentContact);
103+
break;
99104
case MemberCommand memberCommand:
100-
result = memberCommand.MemberId == currentMember?.Id;
101-
if (!result && currentContact != null)
102-
{
103-
var memberId = memberCommand.MemberId;
104-
var member = await _memberService.GetByIdAsync(memberId);
105-
if (member.MemberType.EqualsIgnoreCase("Organization") && currentContact.Organizations.Any(x => x.EqualsIgnoreCase(member.Id)))
106-
{
107-
result = true;
108-
}
109-
else
110-
{
111-
result = await HasSameOrganizationAsync(currentContact, memberId, userManager);
112-
}
113-
}
105+
result = await HasSameOrganizationOrCurrentMemberAsync(memberCommand.MemberId, userManager, currentMember, currentContact);
114106
break;
115107
case UpdateContactCommand updateContactCommand when currentContact != null:
116108
result = updateContactCommand.Id == currentContact.Id;
@@ -189,6 +181,25 @@ private static string GetCurrentUserId(AuthorizationHandlerContext context)
189181
return context.User.GetUserId();
190182
}
191183

184+
private async Task<bool> HasSameOrganizationOrCurrentMemberAsync(string memberId, UserManager<ApplicationUser> userManager, Member currentMember, Contact currentContact)
185+
{
186+
var result = memberId == currentMember?.Id;
187+
if (!result && currentContact != null)
188+
{
189+
var member = await _memberService.GetByIdAsync(memberId);
190+
if (member.MemberType.EqualsIgnoreCase("Organization") && currentContact.Organizations.Any(x => x.EqualsIgnoreCase(member.Id)))
191+
{
192+
result = true;
193+
}
194+
else
195+
{
196+
result = await HasSameOrganizationAsync(currentContact, memberId, userManager);
197+
}
198+
}
199+
200+
return result;
201+
}
202+
192203
private async Task<bool> HasSameOrganizationAsync(Contact currentContact, string contactId, UserManager<ApplicationUser> userManager)
193204
{
194205
if (currentContact is null)

src/VirtoCommerce.ProfileExperienceApiModule.Data/Queries/MemberAddressesQuery.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ public class MemberAddressesQuery : SearchQuery<MemberAddressSearchResult>
1111
{
1212
public string UserId { get; set; }
1313

14+
public string MemberId { get; set; }
15+
1416
public IList<string> CountryCodes { get; set; }
1517

1618
public IList<string> RegionIds { get; set; }
@@ -25,6 +27,7 @@ public override IEnumerable<QueryArgument> GetArguments()
2527
yield return argument;
2628
}
2729

30+
yield return Argument<StringGraphType>(nameof(MemberId));
2831
yield return Argument<ListGraphType<StringGraphType>>(nameof(CountryCodes));
2932
yield return Argument<ListGraphType<StringGraphType>>(nameof(RegionIds));
3033
yield return Argument<ListGraphType<StringGraphType>>(nameof(Cities));
@@ -36,6 +39,7 @@ public override void Map(IResolveFieldContext context)
3639

3740
UserId = context.GetCurrentUserId();
3841

42+
MemberId = context.GetArgument<string>(nameof(MemberId));
3943
CountryCodes = context.GetArgument<List<string>>(nameof(CountryCodes));
4044
RegionIds = context.GetArgument<List<string>>(nameof(RegionIds));
4145
Cities = context.GetArgument<List<string>>(nameof(Cities));
Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
using System.Threading.Tasks;
2+
using GraphQL;
13
using MediatR;
24
using Microsoft.AspNetCore.Authorization;
35
using VirtoCommerce.ProfileExperienceApiModule.Data.Models;
46
using VirtoCommerce.ProfileExperienceApiModule.Data.Schemas;
7+
using VirtoCommerce.ProfileExperienceApiModule.Data.Services;
58
using VirtoCommerce.Xapi.Core.BaseQueries;
69

710
namespace VirtoCommerce.ProfileExperienceApiModule.Data.Queries;
@@ -10,8 +13,17 @@ public class MemberAddressesQueryBuilder : SearchQueryBuilder<MemberAddressesQue
1013
{
1114
protected override string Name => "memberAddresses";
1215

13-
public MemberAddressesQueryBuilder(IMediator mediator, IAuthorizationService authorizationService)
16+
private readonly IProfileAuthorizationService _profileAuthorizationService;
17+
18+
public MemberAddressesQueryBuilder(IMediator mediator, IAuthorizationService authorizationService, IProfileAuthorizationService profileAuthorizationService)
1419
: base(mediator, authorizationService)
1520
{
21+
_profileAuthorizationService = profileAuthorizationService;
22+
}
23+
24+
protected override async Task BeforeMediatorSend(IResolveFieldContext<object> context, MemberAddressesQuery request)
25+
{
26+
await base.BeforeMediatorSend(context, request);
27+
await _profileAuthorizationService.CheckAuthAsync(context, request);
1628
}
1729
}

src/VirtoCommerce.ProfileExperienceApiModule.Data/Queries/MemberAddressesQueryHandler.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,18 @@ public async Task<MemberAddressSearchResult> Handle(MemberAddressesQuery request
2525
{
2626
var result = new MemberAddressSearchResult();
2727

28-
using var userManager = _userManagerFactory();
29-
var user = await userManager.FindByIdAsync(request.UserId);
28+
var memberId = request.MemberId;
3029

31-
if (user != null && !user.MemberId.IsNullOrEmpty())
30+
if (memberId.IsNullOrEmpty())
3231
{
33-
var criteria = GetAddressSearchCriteria(request, user.MemberId);
32+
using var userManager = _userManagerFactory();
33+
var user = await userManager.FindByIdAsync(request.UserId);
34+
memberId = user?.MemberId;
35+
}
36+
37+
if (!memberId.IsNullOrEmpty())
38+
{
39+
var criteria = GetAddressSearchCriteria(request, memberId);
3440
result = await _memberAddressService.SearchMemberAddressesAsync(criteria);
3541
}
3642

0 commit comments

Comments
 (0)