private UserWipOverrideEvent CreateUserWipOverrideEvent(BoardHistoryEvent boardEvent)
        {
            try
            {
                var affectedUser = _board.BoardUsers.FindUser(boardEvent.WipOverrideUser);
                return(new UserWipOverrideEvent(boardEvent.EventDateTime, boardEvent.WipOverrideComment, affectedUser));
            }
            catch (ItemNotFoundException)
            {
                // Might be a recently added user, try refreshing board
                InitBoard();

                try
                {
                    var affectedUser = _board.BoardUsers.FindUser(boardEvent.WipOverrideUser);
                    return(new UserWipOverrideEvent(boardEvent.EventDateTime, boardEvent.WipOverrideComment, affectedUser));
                }
                catch (ItemNotFoundException)
                {
                    throw new ItemNotFoundException(
                              string.Format("Unable to create User Wip Override Event for board [{0}] and user [{1}]", _boardId,
                                            boardEvent.WipOverrideUser));
                }
            }
        }
        private CardUpdateEvent CreateCardUpdateEvent(BoardHistoryEvent boardEvent, IEnumerable <Lane> affectedLanes)
        {
            try
            {
                // Is the card being updated on a taskboard?
                if (!_board.AllLanes().ContainsLane(boardEvent.ToLaneId) && !_includeTaskboards)
                {
                    return(null);
                }

                var originalCard = _board.GetCardById(boardEvent.CardId);

                if (originalCard == null)
                {
                    return(null);
                }

                var updatedCard =
                    affectedLanes.FindContainedCard(boardEvent.ToLaneId, boardEvent.CardId);
                return(new CardUpdateEvent(boardEvent.EventDateTime, originalCard, updatedCard));
            }
            catch (ItemNotFoundException ex)
            {
                throw new ItemNotFoundException(
                          string.Format("Unable to create Card Update Event for board [{0}], card [{1}], and to lane [{2}]. {3}", _boardId,
                                        boardEvent.CardId, boardEvent.ToLaneId, ex.Message));
            }
        }
        private CommentPostedEvent CreateCommentPostedEvent(BoardHistoryEvent boardEvent)
        {
            //since no info in affectedLanes getting card from board
            Card affectedCard = _board.GetCardById(boardEvent.CardId);

            return(new CommentPostedEvent(boardEvent.EventDateTime, affectedCard, boardEvent.CommentText));
        }
        private CardUserAssignmentEvent CreateCardUserAssignmentEvent(BoardHistoryEvent boardEvent,
                                                                      IEnumerable <Lane> affectedLanes)
        {
            // Is the card on a taskboard?
            if (!_includeTaskboards && !_board.AllLanes().ContainsLane(boardEvent.ToLaneId))
            {
                return(null);
            }

            try
            {
                var card         = affectedLanes.FindContainedCard(boardEvent.ToLaneId, boardEvent.CardId);
                var assignedUser = _board.BoardUsers.FindUser(boardEvent.AssignedUserId);
                return(new CardUserAssignmentEvent(boardEvent.EventDateTime, card, assignedUser));
            }
            catch (ItemNotFoundException)
            {
                // Might be a recently added user, try refreshing board
                InitBoard();

                try
                {
                    var card         = affectedLanes.FindContainedCard(boardEvent.ToLaneId, boardEvent.CardId);
                    var assignedUser = _board.BoardUsers.FindUser(boardEvent.AssignedUserId);
                    return(new CardUserAssignmentEvent(boardEvent.EventDateTime, card, assignedUser));
                }
                catch (ItemNotFoundException ex)
                {
                    throw new ItemNotFoundException(
                              string.Format(
                                  "Unable to create Card User Assignment Event for board [{0}], lane [{1}], card [{2}], and user [{3}]. User count: {4}. {5}",
                                  _boardId, boardEvent.ToLaneId, boardEvent.CardId, boardEvent.AssignedUserId, _board.BoardUsers.Count(), ex.Message));
                }
            }
        }
        private static CardBlockedEvent CreateCardBlockedEvent(BoardHistoryEvent boardEvent, IEnumerable <Lane> affectedLanes)
        {
            //Get the effected lanes from the original board
            var card = affectedLanes.FindContainedCard(boardEvent.ToLaneId, boardEvent.CardId);

            return(new CardBlockedEvent(boardEvent.EventDateTime, card, boardEvent.BlockedComment));
        }
        private AttachmentChangedEvent CreateAttachmentEvent(BoardHistoryEvent boardEvent)
        {
            // Is the card on a taskboard?
            if (!_board.AllLanes().ContainsLane(boardEvent.ToLaneId) && !_includeTaskboards)
            {
                return(null);
            }

            var card = _board.AllLanes().FindContainedCard(boardEvent.ToLaneId, boardEvent.CardId);

            return(new AttachmentChangedEvent(boardEvent.EventDateTime, card, boardEvent.FileName, boardEvent.CommentText,
                                              boardEvent.IsFileBeingDeleted));
        }
        private CardDeletedEvent CreateCardDeletedEvent(BoardHistoryEvent boardEvent)
        {
            // Is the card being deleted from a taskboard?
            if (!_includeTaskboards && !_board.AllLanes().ContainsLane(boardEvent.ToLaneId))
            {
                return(null);
            }

            var card = (_board.AllLanes().ContainsLane(boardEvent.ToLaneId))
                                ? _board.AllLanes().FindContainedCard(boardEvent.ToLaneId, boardEvent.CardId)
                                : GetCard(boardEvent.CardId);

            return(new CardDeletedEvent(boardEvent.EventDateTime, card));
        }
 private WipOverrideEvent CreateWipOverrideEvent(BoardHistoryEvent boardEvent, IEnumerable <Lane> affectedLanes)
 {
     try
     {
         Lane affectedLane = affectedLanes.FindLane(boardEvent.WipOverrideLane);
         return(new WipOverrideEvent(boardEvent.EventDateTime, boardEvent.WipOverrideComment, affectedLane));
     }
     catch (ItemNotFoundException ex)
     {
         throw new ItemNotFoundException(
                   string.Format("Unable to create Wip Override Event for board [{0}] and lane [{1}]. {2}", _boardId,
                                 boardEvent.WipOverrideLane, ex.Message));
     }
 }
        private CardMoveEvent CreateCardMoveEvent(BoardHistoryEvent boardEvent, IEnumerable <Lane> affectedLanes)
        {
            try
            {
                // Is the card being moved in or to a taskboard?
                if (!_board.AllLanes().ContainsLane(boardEvent.ToLaneId) && !_includeTaskboards)
                {
                    return(null);
                }

                var fromLaneId = boardEvent.FromLaneId.GetValueOrDefault();
                var toLaneId   = boardEvent.ToLaneId;
                var lanes      = affectedLanes as IList <Lane> ?? affectedLanes.ToList();

                var fromLane = _board.AllLanes().ContainsLane(fromLaneId)
                                        ? _board.AllLanes().FindLane(fromLaneId)
                                        : null;

                Lane     toLane           = null;
                CardView affectedCardView = null;
                if (lanes.ContainsLane(toLaneId))
                {
                    toLane           = lanes.FindLane(toLaneId);
                    affectedCardView = toLane.Cards.FirstOrDefault(aCard => aCard.Id == boardEvent.CardId);
                }
                else if (_board.Archive.ContainsLane(toLaneId))
                {
                    toLane           = _board.Archive.FindLane(toLaneId);
                    affectedCardView = GetCard(boardEvent.CardId).ToCardView();
                }

                // If fromLane or toLane are null, then the card is probably on a taskboard
                if (affectedCardView == null || (toLane == null && !_includeTaskboards))
                {
                    return(null);
                }

                var card = affectedCardView.ToCard();
                return(new CardMoveEvent(boardEvent.EventDateTime, fromLane, toLane, card));
            }
            catch (ItemNotFoundException ex)
            {
                throw new ItemNotFoundException(
                          string.Format(
                              "Unable to create Card Move Event for board [{0}], card [{1}], from lane [{2}] and to lane [{3}]. {4}", _boardId,
                              boardEvent.CardId, boardEvent.FromLaneId.GetValueOrDefault(), boardEvent.ToLaneId, ex.Message));
            }
        }
        private CardAddEvent CreateCardAddEvent(BoardHistoryEvent boardEvent, IEnumerable <Lane> affectedLanes)
        {
            try
            {
                // Is the card being created on a taskboard?
                if (!_board.AllLanes().ContainsLane(boardEvent.ToLaneId) && !_includeTaskboards)
                {
                    return(null);
                }

                var lanes     = affectedLanes as IList <Lane> ?? affectedLanes.ToList();
                var addedCard = lanes.ContainsCard(boardEvent.CardId)
                                        ? lanes.FindContainedCard(boardEvent.ToLaneId, boardEvent.CardId)
                                        : GetCard(boardEvent.CardId);

                return(new CardAddEvent(boardEvent.EventDateTime, addedCard));
            }
            catch (ItemNotFoundException ex)
            {
                throw new ItemNotFoundException(
                          string.Format("Unable to create Card Add Event for board [{0}], card [{1}], and to lane [{2}]. {3}", _boardId,
                                        boardEvent.CardId, boardEvent.ToLaneId, ex.Message));
            }
        }
 private BoardEditedEvent CreateBoardEditedEvent(BoardHistoryEvent boardEvent)
 {
     return(new BoardEditedEvent(boardEvent.EventDateTime, boardEvent.Message));
 }
 private CardMoveFromBoardEvent CreateCardMoveFromBoardEvent(BoardHistoryEvent boardEvent)
 {
     return(new CardMoveFromBoardEvent(boardEvent.EventDateTime, boardEvent.CardId, boardEvent.FromLaneId));
 }