Integração com o Trello e .NET Core

Fala galera, tudo certo com vocês?

Dessa vez vamos fazer uma integração com uma ferramenta que quebra nosso galho todos os dias, o Trello. Nesse post vou mostrar como integrar com a nossa própria conta, acessar nossos boards, cards e finalmente criar um card. E nos próximos vamos ver como fazer a integração utilizando OAuth e integrando com qualquer conta, bora lá?

Como iniciar?

A primeira coisa que temos que fazer, é ter uma conta e estar logado no Trello, você pode fazer isso acessando o site: https://trello.com.
Feito isso, precisamos pegar nossa chave para integração com a API dos caras, podemos fazer isso acessando: https://trello.com/app-key e vamos ver uma tela parecida com essa aqui:
1

Depois que aceitarmos os termos, e clicarmos no botão “Show API Key”, vamos ver a seguinte tela com a nossa chave:
2

Guarde a sua chave que daqui a pouco a gente já usa ela, certo?
E por último, vamos obter um token para acessar as funcionalidades de nossa conta, esse token é quem te autentica no Trello. Para obter o token basta clicar no link conforme a imagem:
3

Após clicar no link, você vai ver essa tela aqui, com a solicitação de autorização, basta clicar em “Permitir”:
4

Depois de clicar no botão, você verá uma tela parecida com essa aqui, onde estará o seu Token:
5

Certo! Agora temos uma chave e um token, que serão necessários para fazer a integração.

E o código?

Agora vamos para a parte legal! Fazer a integração efetivamente.

Depois de criar uma aplicação com .NET Core MVC, compilar e rodar, ela vai ter mais ou menos essa cara aqui:
paginicialnet

Depois de mudar um pouquinho, ela ficou com essa cara aqui, basicamente coloquei uma imagem e um botão:
6

O código dessa View ficou desse jeito, olhem para a funcionalidade do botão “Meu Trello” que vai para a Action “Index” do Controller “Trello”:

@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Integração com o</h1>
</div>
<div class="container">
<div class="row">
<img src="~/images/trello-logo-blue.png" class="img-fluid mx-auto" style="width: 50%; height: 50%"/>
</div>
</div>
<div class="container">
<div class="row">
<a class="btn btn-primary" asp-controller="Trello" asp-action="Index">Meu Trello</a>
</div>
</div>

view raw
HomeIndex.cshtml
hosted with ❤ by GitHub

Agora vejam o que acontece dentro dessa Action:

Primeiramente devemos criar a nossa classe “TrelloController” que herda de “Controller”; um Controller comum de um projeto em MVC.

public class TrelloController : Controller
{
private string _apiKey = Environment.GetEnvironmentVariable("TRELLO_API_KEY");
private string _token = Environment.GetEnvironmentVariable("TRELLO_TOKEN");
private readonly HttpClient _httpClient;
public TrelloController()
{
_httpClient = new HttpClient
{
BaseAddress = new Uri("https://api.trello.com/1/")
};
}
}

view raw
TrelloController.cs
hosted with ❤ by GitHub

Reparem que temos duas variáveis nas linhas 3 e 4: _apiKey e _token, que pegam valores de variáveis de ambiente. Nessas variáveis de ambiente estão os valores que pegamos logo acima no site do Trello. Beleza?

Na linha 6 temos a variável _httpClient que posteriormente vai guardar a instância da classe HttpClient, que vamos utilizar para fazer as requisições HTTP para a API do Trello.

E nas linhas de 7 a 13 temos o construtor da classe “TrelloController” que instancia a classe “HttpClient”, e vejam que no atributo BaseClass tem o valor “https://api.trello.com/1/” que é a base para todas as nossas requisições.

Logo abaixo, vamos implementar agora a Action “Index” que será responsável por buscar itens sobre meu perfil no Trello, vejam:

public class TrelloController : Controller
{
//…continuação
public async Task<IActionResult> Index()
{
var model = await TrelloGetRequest<TrelloUser>("members/me?boards=all&organizations=all&");
return View("Index", model);
}
private async Task<T> TrelloGetRequest<T>(string url)
{
var request = await _httpClient.GetAsync($"{url}key={_apiKey}&token={_token}");
if (!request.IsSuccessStatusCode)
throw new Exception("Deu errado…");
var model = await request.Content.ReadAsAsync<T>();
return model;
}
}

Antes de qualquer coisa, vou falar sobre o método “TrelloGetRequest“, ele basicamente faz uma requisição HTTP GET, para aquela url base do Trello, com mais alguma coisa que receber como parâmetro e por fim concatena a chave de acesso e o token.

No nosso exemplo a url a ser chamada vai ficar assim:

https://api.trello.com/1/members/me?boards=all&organizations=all&key=sua_key&token=seu_token

Esse endpoint vai nos retornar dados sobre o usuário, com todos os seus quadros e organizações.

A classe “TrelloUser” contém os seguintes atributos e métodos:

public class TrelloUser
{
public string Id { get; set; }
public string AvatarUrl { get; set; }
public string FullName { get; set; }
public string Initials { get; set; }
public IEnumerable<TrelloBoard> Boards { get; set; }
public IEnumerable<TrelloOrganization> Organizations { get; set; }
public string GetAvatar(int size)
{
return $"{AvatarUrl}/{size}.png";
}
public IEnumerable<TrelloBoard> GetBoardsByOrganization(string idOrganization)
{
return Boards.Where(x => x.IdOrganization == idOrganization);
}
}

view raw
TrelloUser.cs
hosted with ❤ by GitHub

Como nesse endpoint são retornados todos os quadros em uma única lista, temos o método “GetBoardsByOrganization” para separar os quadros pra cada organização que possuímos.

O método “GetAvatar” retorna a url completa da imagem, que está hospedada na Amazon, e pode ser retornada com alguns tamanhos específicos.

E finalmente, as classes “TrelloBoard” e “TrelloOrganization” que tem o seguinte conteúdo:

//Organização
public class TrelloOrganization
{
public string Id { get; set; }
public string DisplayName { get; set; }
}
//Quadro
public class TrelloBoard
{
public string Id { get; set; }
public string IdOrganization { get; set; }
public string Name { get; set; }
}

Por fim, quando acionamos a ActionIndex“, temos nossa classe preenchida e retornada para a View com os dados do usuário a seguir:

@model TrelloUser
@{
ViewData["Title"] = "Meu Trello";
}
<div class="container">
<div class="row">
<img src="@Model.GetAvatar(170)" class="rounded mx-auto d-block" alt="@Model.FullName">
</div>
<div class="row">
<b>Nome:</b> @Model.FullName
</div>
</div>
<div class="container">
@foreach (var item in Model.Organizations)
{
<div class="row ml-1">
<b>@item.DisplayName</b>
</div>
<div class="row ml-3">
<div class="container">
@foreach (var board in Model.GetBoardsByOrganization(item.Id))
{
<div class="row">
@board.Name <a asp-action="DetalhesBoard" asp-route-id="@board.Id"> (Ver Board)</a>
</div>
}
</div>
</div>
}
</div>

view raw
UserIndex.cshtml
hosted with ❤ by GitHub

A View vai basicamente percorrer os atributos da classe e exibir na tela, que vai ficar mais ou menos assim:

7

Que são as mesmas coisas que vemos no próprio site do Trello (sério?!)

8

Pra não estender muito esse post, vamos parar por aqui, ok?

No próximo vamos aprender como ver detalhes do quadro, com os cards e tudo mais, e também como criar um card via API. 😀

Para saber mais dos endpoints da API do Trello é só acessarmos o site: https://developers.trello.com/v1.0/reference. Lá tem informações sobre requisições, retornos e tudo que precisamos saber para buscar, cadastrar, editar e brincar com todos os itens do Trello, certo?

Belezura pessoal? Espero que seja útil!

Os códigos utilizados estão disponíveis no GitHub: https://github.com/vmussak/NetCoreTrelloIntegration

Por hoje é só isso, qualquer dúvida ou sugestão, estou à disposição! Até mais 😀

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google photo

Está a comentar usando a sua conta Google Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s