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])
                })
            });
        }