-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathGetUsersAtOrganisationUseCase.cs
More file actions
91 lines (80 loc) · 3.06 KB
/
Copy pathGetUsersAtOrganisationUseCase.cs
File metadata and controls
91 lines (80 loc) · 3.06 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
using System.Data;
using System.Linq.Expressions;
using Dfe.SignIn.Base.Framework;
using Dfe.SignIn.Core.Contracts.Organisations;
using Dfe.SignIn.Core.Entities.Organisations;
using Dfe.SignIn.Gateways.EntityFramework;
using Microsoft.EntityFrameworkCore;
namespace Dfe.SignIn.Core.UseCases.Organisations;
/// <summary>
/// Query returns users and their roles for a service and organisation.
/// </summary>
/// <param name="uowOrganisations"></param>
public sealed class GetUsersAtOrganisationUseCase(DbOrganisationsContext uowOrganisations) : Interactor<GetUsersAtOrganisationRequestRaw, GetUsersAtOrganisationResponseRaw>
{
/// <inheritdoc/>
public override async Task<GetUsersAtOrganisationResponseRaw> InvokeAsync(
InteractionContext<GetUsersAtOrganisationRequestRaw> context,
CancellationToken cancellationToken = default)
{
context.ThrowIfHasValidationErrors();
string clientId = context.Request.ClientId;
string externalId = context.Request.ExternalId;
// Try UKPRN first
var results = await this.BuildQuery(clientId, o => o.Ukprn == externalId)
.ToListAsync(cancellationToken);
bool isUkprn = true;
// If no results, fallback to UPIN
if (results.Count == 0) {
isUkprn = false;
results = await this.BuildQuery(clientId, o => o.Upin == externalId)
.ToListAsync(cancellationToken);
}
return new GetUsersAtOrganisationResponseRaw {
IsUkprn = isUkprn,
ExternalId = externalId,
Users = results
};
}
private IQueryable<UserAtOrganisationRaw> BuildQuery(
string clientId,
Expression<Func<OrganisationEntity, bool>> organisationFilter)
{
var organisations = uowOrganisations
.Organisations
.Where(organisationFilter);
return
from us in uowOrganisations.UserServices
join o in organisations
on us.OrganisationId equals o.Id
join u in uowOrganisations.Users
on us.UserId equals u.Sub
join s in uowOrganisations.Services
on us.ServiceId equals s.Id
join usr in uowOrganisations.UserServiceRoles
on new {
oid = us.OrganisationId,
sid = us.ServiceId,
uid = us.UserId
}
equals new {
oid = (Guid?)usr.OrganisationId,
sid = (Guid?)usr.ServiceId,
uid = usr.UserId
}
into usrGroup
from usr in usrGroup.DefaultIfEmpty()
join r in uowOrganisations.Roles
on usr.RoleId equals r.Id
into roleGroup
from r in roleGroup.DefaultIfEmpty()
where s.ClientId == clientId
select new UserAtOrganisationRaw(
u.Sub,
u.Email,
u.FirstName,
u.LastName,
u.Status,
r.Code);
}
}