示例#1
0
 public static bool IsStateChange(this AdoWebHookMessage message)
 {
     return
         (message.IsWorkItemUpdate() &&
          message?.resource?.fields?.SystemState != null &&
          message?.resource?.fields?.SystemState.oldValue != message?.resource?.fields?.SystemState.newValue);
 }
示例#2
0
        public async Task UpdateClosedState(AdoWebHookMessage message)
        {
            if (!message.IsChangeToClosed())
            {
                return;
            }

            const string reason = "closed state rule";

            logger.LogInformation("Executing {0} for work item {1}", reason, message.WorkItemId());

            var parent = await GetParentWorkItem(message.WorkItemId());

            var allChildren = GetChildrenWorkItems(parent).Select(ac => ac.Result);

            logger.LogTrace("Parent work item {0} has {1} children", parent?.Id, allChildren.Count());

            if (allChildren
                .All(c => c.GetState() == WorkItemState.Closed.ToString() || c.GetState() == WorkItemState.Removed.ToString()))
            {
                logger.LogTrace("Parent work item {0} has all children in Closed or Removed", parent?.Id);
                var targetState =
                    allChildren.Any(c => c.GetState() == WorkItemState.Closed.ToString()) ?
                    WorkItemState.Closed.ToString() :
                    WorkItemState.Removed.ToString();

                await UpdateWorkItemState(parent.Id.GetValueOrDefault(), targetState, reason);
            }
        }
示例#3
0
        private async Task UpdateParentState(
            AdoWebHookMessage message,
            WorkItemState state,
            bool allChildrenMustBeInState  = true,
            WorkItemState?checkSourceState = null,
            bool recursive = false)
        {
            if (!message.IsChangeToState(state))
            {
                return;
            }

            var id = message.WorkItemId();

            while (id > 0)
            {
                string reason = string.Format("{0} state rule", state);
                logger.LogInformation("Executing {0} for work item {1}", reason, id);

                var parent = await GetParentWorkItem(id);

                bool updateParent = true;
                if (parent != null && allChildrenMustBeInState)
                {
                    var allChildren = GetChildrenWorkItems(parent).Select(ac => ac.Result);
                    logger.LogTrace("Parent work item {0} has {1} children", parent?.Id, allChildren.Count());

                    updateParent = allChildren.All(c => c.GetState() == state.ToString());
                }

                logger.LogTrace("Parent work item {0} in state {1}", parent?.Id, parent.GetState());
                if (updateParent && parent != null && (!checkSourceState.HasValue || parent.IsInState(checkSourceState.Value)))
                {
                    await UpdateWorkItemState(parent.Id.GetValueOrDefault(), state.ToString(), reason);
                }

                id = (recursive && parent != null) ? parent.Id.GetValueOrDefault() : 0;
            }
        }
示例#4
0
 public static int WorkItemId(this AdoWebHookMessage message)
 {
     return((message?.resource?.workItemId).GetValueOrDefault());
 }
示例#5
0
 public static bool IsChangeToClosed(this AdoWebHookMessage message)
 {
     return
         (IsChangeToState(message, WorkItemState.Closed) ||
          IsChangeToState(message, WorkItemState.Removed));
 }
示例#6
0
 public static bool IsChangeToActive(this AdoWebHookMessage message)
 {
     return(IsChangeToState(message, WorkItemState.Active));
 }
示例#7
0
 public static bool IsChangeToState(this AdoWebHookMessage message, WorkItemState state)
 {
     return
         (message.IsStateChange() &&
          message?.resource?.fields?.SystemState.newValue == state.ToString());
 }
示例#8
0
 public static bool IsWorkItemUpdate(this AdoWebHookMessage message)
 {
     return(message?.eventType == "workitem.updated");
 }
示例#9
0
 public async Task UpdateResolvedState(AdoWebHookMessage message)
 {
     await UpdateParentState(message, WorkItemState.Resolved);
 }
示例#10
0
 public async Task UpdateActiveState(AdoWebHookMessage message)
 {
     await UpdateParentState(message, WorkItemState.Active, false, WorkItemState.New, true);
 }