public async Task <StateSet> GetStateSetAsync(String id, EntityHeader org, EntityHeader user)
        {
            var stateSet = await _stateSetRepo.GetStateSetAsync(id);

            await AuthorizeAsync(stateSet, AuthorizeResult.AuthorizeActions.Read, user, org);

            return(stateSet);
        }
        public async Task <InvokeResult <DeviceWorkflow> > LoadFullDeviceWorkflowAsync(string id, EntityHeader org, EntityHeader user)
        {
            DeviceWorkflow deviceWorkflow = null;

            try
            {
                deviceWorkflow = await _deviceWorkflowRepo.GetDeviceWorkflowAsync(id);
            }
            catch (RecordNotFoundException)
            {
                return(InvokeResult <DeviceWorkflow> .FromErrors(ErrorCodes.CouldNotLoadDeviceWorkflow.ToErrorMessage($"WorkflowId={id}")));
            }

            if (deviceWorkflow.Attributes == null)
            {
                deviceWorkflow.Attributes = new List <Models.Attribute>();
            }
            if (deviceWorkflow.Inputs == null)
            {
                deviceWorkflow.Inputs = new List <WorkflowInput>();
            }

            var result = new InvokeResult <DeviceWorkflow>();

            foreach (var attribute in deviceWorkflow.Attributes)
            {
                if (attribute.AttributeType != null && attribute.AttributeType.Value == ParameterTypes.ValueWithUnit)
                {
                    /* Will catch validation errors later, so just try to load */
                    if (!EntityHeader.IsNullOrEmpty(attribute.UnitSet))
                    {
                        try
                        {
                            attribute.UnitSet.Value = await GetAttributeUnitSetAsync(attribute.UnitSet.Id, org, user);
                        }
                        catch (RecordNotFoundException)
                        {
                            result.Errors.Add(ErrorCodes.CouldNotLoadUnitSet.ToErrorMessage($"AttributeId={attribute.Id},UnitSetId={attribute.UnitSet.Id}"));
                        }
                    }
                }

                if (!EntityHeader.IsNullOrEmpty(attribute.StateSet))
                {
                    try
                    {
                        attribute.StateSet.Value = await GetStateSetAsync(attribute.StateSet.Id, org, user);
                    }
                    catch (RecordNotFoundException)
                    {
                        result.Errors.Add(ErrorCodes.CouldNotLoadStateSet.ToErrorMessage($"AttributeId={attribute.Id},StateSetId={attribute.StateSet.Id}"));
                    }
                }
            }

            foreach (var input in deviceWorkflow.Inputs)
            {
                if (!EntityHeader.IsNullOrEmpty(input.UnitSet))
                {
                    try
                    {
                        input.UnitSet.Value = await GetAttributeUnitSetAsync(input.UnitSet.Id, org, user);
                    }
                    catch (RecordNotFoundException)
                    {
                        result.Errors.Add(ErrorCodes.CouldNotLoadUnitSet.ToErrorMessage($"InputId={input.Id},UnitSetId={input.UnitSet.Id}"));
                    }
                }

                if (!EntityHeader.IsNullOrEmpty(input.StateSet))
                {
                    try
                    {
                        input.StateSet.Value = await GetStateSetAsync(input.StateSet.Id, org, user);
                    }
                    catch (RecordNotFoundException)
                    {
                        result.Errors.Add(ErrorCodes.CouldNotLoadStateSet.ToErrorMessage($"InputId={input.Id},StateSetId={input.StateSet.Id}"));
                    }
                }
            }

            foreach (var inputCommand in deviceWorkflow.InputCommands)
            {
                if (inputCommand.Parameters != null)
                {
                    foreach (var param in inputCommand.Parameters)
                    {
                        if (param.ParameterType.Value == ParameterTypes.State)
                        {
                            param.StateSet.Value = await _stateSetRepo.GetStateSetAsync(param.StateSet.Id);
                        }
                    }
                }
            }

            if (result.Successful)
            {
                return(InvokeResult <DeviceWorkflow> .Create(deviceWorkflow));
            }

            return(result);
        }