No último RSJS tive a oportunidade de assistir a palestra “Ligthweight APIs with HarvesterJS” do meu ex-professor Diogo Lucas.
Em poucos minutos de palestra eu já consegui identificar várias aplicações que fiz no passado, que poderiam ser totalmente reescritas de uma maneira muito mais simples com o HarvesterJS.
O HarvesterJS é originalmente um fork do projeto FortuneJS, um framework para criar APIs REST baseadas na spec JSONAPI.

O objetivo do Harvester foca em manter uma API fiel à JSONAPI spec, com suporte específico ao MongoDB (além de resolver alguns problemas de escalabilidade).
O projeto está bem ativo e é mantido pelo pessoal da AGCO, uma empresa do ramo da agricultura.

Ok ok, talk is cheap.
O título do post é bem sério. É possível criar uma API REST em 1 minuto com o Harvester.
Supondo que o seu ambiente já tenha Node.js e MongoDB, o resto é super fácil, mesmo.
Digamos que a sua API precisa expor uma entidade “artist”.
Por expor entenda que a API deve disponibilizar métodos CRUD para as aplicações.

// app.js
let harvester = require('harvesterjs');

let app = harvester({
	adapter: 'mongodb',
	connectionString: "localhost:27017/mydatabase"
});

app.resource('artist', {
	name: String,
	description : String,
})
.listen(1337);

Pronto.
Basta levantar a aplicação:

node app.js

E agora existe uma API REST completa funcionando.
O que é possível fazer?
Todas as operações de CRUD via métodos http:

Listar todos artistas

GET 	/artists

Criar um novo artista

POST 	/artists
{
	"name": "Sepultura",
	"description": "Brazilian Metal band"
}

Pegar um artista pelo ID

GET 	/artists/555d0bbb37d40da5abc11a86

Alterar os dados de um artista

PUT 	/artists/555d0bbb37d40da5abc11a86
{
	"name": "Sepultura",
	"description": "Best brazilian Metal band ever"
}

Deletar um artista

DELETE 	/artists/555d0bbb37d40da5abc11a86

Ainda é possível criar relações de maneira bem simples.
Digamos que um artista possui referência à outro artista, no caso, 1 para n.
Podemos alterar o nosso “resource” de maneira que essa relação seja estabelecida:

app.resource('artist', {
	name: String,
	description : String,
	influences : ['artist']
})
.listen(1337);

Com esta simples alteração nossa API passa a suportar relações:

GET  /artists/555d5c701eb2d1d033f3b704/influences

O retorno desta chamada será baseado nas relações previamente armazenadas, ou seja, se a aplicação disse que determinado artista possui 2 influências, um array de 2 artistas será retornado.

Conclusão

Este foi um post introdutório com objetivo de mostrar como é fácil criar APIs REST com o Harvester.
Além da facilidade, o código necessário para escrever APIs fica muito fácil de manutenir e evoluir.
Eu mesmo reescrevi uma aplicação que tinha certamente mais de 1500 linhas em pouco mais de 10 linhas com o Harvester.

É isso pessoal, para maiores informações sobre o Harvester, vasculhem o Github do projeto (ainda está com pouca documentação, mas em breve eles devem resolver esse problema).