private UntypedReceive GetOwnDepartments(EmployeeMetadata employee)
        {
            void OnMessage(object message)
            {
                switch (message)
                {
                case DepartmentsQuery.Response response:
                    BulkBumpPermissions(
                        response.Departments.Select(x => x.Department.DepartmentId),
                        OwnDepartmentPermissions,
                        this.permissionsForDepartments);

                    this.Become(this.LoadSupervisedDepartmentsPermissions(employee.EmployeeId));

                    break;

                case ReceiveTimeout _:
                    this.ReplyAndStop();
                    break;

                default:
                    this.Unhandled(message);
                    break;
                }
            }

            this.organizationActor.Tell(DepartmentsQuery.Create().WithId(employee.DepartmentId));
            return(OnMessage);
        }
        private UntypedReceive LoadSupervisedDepartmentsPermissions(string employeeId)
        {
            void OnMessage(object message)
            {
                switch (message)
                {
                case DepartmentsQuery.Response r when r.Departments.Count == 0:
                case ReceiveTimeout _:
                    this.ReplyAndStop();
                    break;

                case DepartmentsQuery.Response response:
                    BulkBumpPermissions(
                        response.Departments.Select(x => x.Department.DepartmentId),
                        SupervisedPermissions,
                        this.permissionsForDepartments);

                    this.ReplyAndStop();

                    break;

                default:
                    this.Unhandled(message);
                    break;
                }
            }

            var departmentsQuery = DepartmentsQuery.Create()
                                   .WithHead(employeeId)
                                   .IncludeAllDescendants();

            this.organizationActor.Tell(departmentsQuery);

            return(OnMessage);
        }
        private async Task <DepartmentInfo[]> GetDepartments()
        {
            var departmentsResponse = await this.organizationActor.Ask <DepartmentsQuery.Response>(
                DepartmentsQuery.Create());

            return(departmentsResponse.Departments
                   .Select(d => d.Department)
                   .ToArray());
        }
Esempio n. 4
0
        private async Task <IEnumerable <IActorRef> > GetUserFeeds(EmployeeContainer employee, CancellationToken token)
        {
            var feedsActor          = this.actorFactory.ActorSelection(this.pathsBuilder.Get(WellKnownActorPaths.SharedFeeds));
            var sharedFeedsResponse =
                await feedsActor.Ask <GetFeeds.Response>(new GetFeeds(employee.Metadata.EmployeeId), this.timeoutSettings.Timeout, token);

            var sharedFeeds = sharedFeedsResponse.Feeds.Values;

            var departmentActor = this.actorFactory.ActorSelection(this.pathsBuilder.Get(WellKnownActorPaths.Organization));
            var department      =
                await departmentActor.Ask <DepartmentsQuery.Response>(DepartmentsQuery.Create().WithId(employee.Metadata.DepartmentId));

            var departmentFeeds = department.Departments.Select(x => x.Feed);

            return(sharedFeeds.Union(departmentFeeds));
        }
        private UntypedReceive LoadSupervisedDepartmentsPermissions(string employeeId)
        {
            void OnMessage(object message)
            {
                switch (message)
                {
                case DepartmentsQuery.Response r when r.Departments.Count == 0:
                case ReceiveTimeout _:
                    this.ReplyAndStop();
                    break;

                case DepartmentsQuery.Response response:

                    //setup permissions for directly supervised departments
                    BulkBumpPermissions(response.Departments.Select(x => x.Department.DepartmentId), SupervisedPermissions, this.permissionsForDepartments);

                    var tasks = response
                                .Departments
                                .Select(x => this.organizationActor.Ask <DepartmentsQuery.Response>(DepartmentsQuery.Create().DescendantOf(x.Department.DepartmentId), this.timeout));

                    //setup permissions for branch-like supervised departments
                    Task.WhenAll(tasks).PipeTo(this.Self);
                    break;

                //child departments
                case DepartmentsQuery.Response[] responses:
                    var departmentsIds = responses.SelectMany(r => r.Departments.Select(d => d.Department.DepartmentId));
                    BulkBumpPermissions(departmentsIds, SupervisedPermissions, this.permissionsForDepartments);
                    this.ReplyAndStop();
                    break;

                default:
                    this.Unhandled(message);
                    break;
                }
            }

            this.organizationActor.Tell(DepartmentsQuery.Create().WithHead(employeeId));
            return(OnMessage);
        }
        private UntypedReceive GatherEmployeeInfo(
            EmployeeMetadata approver,
            DependentDepartmentsPendingActions dependentDepartmentsPendingActions)
        {
            this.organization.Tell(
                DepartmentsQuery.Create()
                .WithHead(approver.EmployeeId)
                .IncludeDirectDescendants());

            void OnMessage(object message)
            {
                switch (message)
                {
                case DepartmentsQuery.Response response when response.Departments.Count == 0:
                    this.FinishProcessing();
                    break;

                case DepartmentsQuery.Response response:
                    var ownDepartmentsEmployees = response.Departments
                                                  .Where(d => d.Department.ChiefId == approver.EmployeeId)
                                                  .SelectMany(d => d.Employees);

                    var otherDepartmentsEmployees = response.Departments
                                                    .Where(d => d.Department.ChiefId != approver.EmployeeId)
                                                    .Select(d => new
                    {
                        d.Department.ChiefId,
                        Employees = d.Employees.Where(e =>
                        {
                            if (dependentDepartmentsPendingActions == DependentDepartmentsPendingActions.All)
                            {
                                return(true);
                            }

                            if (dependentDepartmentsPendingActions == DependentDepartmentsPendingActions.HeadsOnly)
                            {
                                return(e.Metadata.EmployeeId == d.Department.ChiefId);
                            }

                            return(false);
                        })
                    })
                                                    .SelectMany(x => x.Employees);

                    var subordinates = ownDepartmentsEmployees
                                       .Union(otherDepartmentsEmployees)
                                       .GroupBy(x => x.Metadata.EmployeeId)
                                       .Select(x => x.First())
                                       .ToList();

                    if (subordinates.Count == 0)
                    {
                        this.FinishProcessing();
                    }

                    this.Become(this.GatherCalendarEvents(subordinates));

                    break;

                default:
                    this.DefaultMessageHandler(message);
                    break;
                }
            }

            return(OnMessage);
        }