private void Initialize() { ChelloClient client = TrelloClientFactory.Get(); _lists = client.Lists.ForBoard(_boardId).ToDictionary(l => l.Id, l => new ActivityList(l.Id, l.Name)); IEnumerable<CardUpdateAction> updates = client.CardUpdates.ForBoard(_boardId, new { limit = 1000, filter = "createCard,updateCard,moveCardFromBoard,moveCardToBoard,updateBoard,createBoard" }); // HACK: Board closing doesn't come back properly - assume if last activity was a board update it is board closing // may give strange results for some cases if (updates.FirstOrDefault().Type.Equals("updateBoard", StringComparison.OrdinalIgnoreCase)) { BoardClosed = DateTime.Parse(updates.FirstOrDefault().Date); } foreach (var update in updates.Reverse()) { switch (update.Type.ToUpperInvariant()) { case "CREATECARD": _lists.AddCard(update.Data.List.Id, new ActivityCard(update.Data.Card, DateTime.Parse(update.Date))); break; case "UPDATECARD": if (update.Data.ListAfter != null && update.Data.ListBefore != null) { _lists.FinishCard(update.Data.ListBefore.Id, update.Data.Card, DateTime.Parse(update.Date)); _lists.AddCard(update.Data.ListAfter.Id, new ActivityCard(update.Data.Card, DateTime.Parse(update.Date))); } else if (update.Data.Card.Closed) { foreach (string listId in _lists.Keys) { _lists.FinishCard(listId, update.Data.Card, DateTime.Parse(update.Date)); } } break; case "MOVECARDFROMBOARD": foreach (string listId in _lists.Keys) { _lists.FinishCard(listId, update.Data.Card, DateTime.Parse(update.Date)); } break; case "CREATEBOARD": BoardOpened = DateTime.Parse(update.Date); LimitedByApi = false; break; } if (LimitedByApi && updates.Any()) { BoardOpened = DateTime.Parse(updates.LastOrDefault().Date); } if (update.Data.Card != null) { foreach (string listId in _lists.Keys) { _lists.UpdatePoints(listId, update.Data.Card); } } } }