public async Task <GetAccessibleProjectsResponse> GetAccessibleProjects() { var resp = await(await factory.GetProjectsClientAsync()) .GetAccessibleProjectsAsync(new AcademyCloud.Identity.Protos.Projects.GetAccessibleProjectsRequest { }); var subjects = resp.Projects .Select(x => new AcademyCloud.Expenses.Protos.Interop.Subject { Id = x.Id, Type = AcademyCloud.Expenses.Protos.Common.SubjectType.Project, }); // get pay users var payUsers = await(await factory.GetExpensesInteropClientAsync()) .GetPayUserAsync(new AcademyCloud.Expenses.Protos.Interop.GetPayUserRequest { Subjects = { subjects } }); // get pay user's names var payUserNames = await(await factory.GetIdentityInteropClientAsync()) .GetNamesAsync(new AcademyCloud.Identity.Protos.Interop.GetNamesRequest { Subjects = { payUsers.PayUsers.Values.Select(x => new AcademyCloud.Identity.Protos.Interop.GetNamesRequest.Types.Subject { Id = x, Type = AcademyCloud.Identity.Protos.Interop.GetNamesRequest.Types.SubjectType.User, }) } }); var quotaSubjects = subjects .Concat( resp.Projects .Select(x => x.Admins) .Concat(resp.Projects.Select(x => x.Members)) .SelectMany(x => x) .Select(x => new AcademyCloud.Expenses.Protos.Interop.Subject { Id = x.UserProjectAssignmentId.ToString(), Type = AcademyCloud.Expenses.Protos.Common.SubjectType.UserProjectAssignment } )); // get quotas var quotas = await(await factory.GetExpensesInteropClientAsync()) .GetQuotaAsync(new AcademyCloud.Expenses.Protos.Interop.GetQuotaRequest { Subjects = { quotaSubjects } }); return(new GetAccessibleProjectsResponse() { Projects = resp.Projects.Select(x => new Project() { Id = x.Id, Name = x.Name, Active = true, Admins = x.Admins.Select(x => FromGrpc(x.User)), Members = x.Members.Select(x => FromGrpc(x.User)), PayUser = new Models.Identity.Common.User { Id = payUsers.PayUsers[x.Id], Name = payUserNames.IdNameMap[payUsers.PayUsers[x.Id]], }, Quota = quotas.Quotas[x.Id], UserQuotas = x.Admins.Concat(x.Members).ToDictionary(user => user.User.Id, user => (Resources)quotas.Quotas[user.UserProjectAssignmentId]) }) }); }