Warning
Este programa é fortemente vinculado ao driver do PostgreSQL, então tanto a sincronização quanto as migrações só funcionam para esse banco. Levante um issue para requisitar implementações para outros bancos.
O jsync é um executável que sincroniza os dados de uma imobiliária dentro da Jetimob com um banco de dados self-hosted.
São sincronizados: imóveis, condomínios, banners e corretores. Desses, apenas os imóveis são atualizados de forma incremental (a rota de imóveis é a única que aceita o parâmetro para realizar este filtro), isso é, uma variável é salva localmente com o timestamp da última sincronização e posteriormente utilizada nas requisições para baixar apenas os imóveis modificados após essa data.
Baixe o executável para sua plataforma na página de releases e adicione
ao PATH
.
# baixar o executável
curl -L -o jsync.tar.gz https://github.com/alanwgt/jsync/releases/latest/download/jsync_[version]_[OS]_[ARCH].tar.gz
# descompactar
tar -xvf jsync.tar.gz
# mover para uma pasta do PATH para poder ser acessado globalmente
sudo mv jsync /usr/local/bin
- Baixe o executável e rode ele uma primeira vez para criar o arquivo de configurações em
$HOME/.jsync.yaml
- Modifique o arquivo de configurações conforme a sua necessidade
- Remover as linhas comentadas, modificar o valor de conexão com o banco e adicionar a
webservice_key
é suficiente para a maioria dos casos
- Remover as linhas comentadas, modificar o valor de conexão com o banco e adicionar a
- Execute o SQL de criação das tabelas (ou utilize a migration)
- Execute o programa com os parâmetros:
jsync sync all
para sincronizar todos os dados. Esse comando pode ser posto numa entrada cron para manter o banco atualizado.
Note
Para fins de teste, um banco local pode ser levantado no docker com:docker run --rm -it -e POSTGRES_PASSWORD=xxx --publish 5432:5432 postgres:latest-alpine
. Após a interrupção do processo, todos os dados do container serão removidos.
O uso direto da ferramenta se dá através do comando: jsync sync [recurso]
, onde [recurso]
pode ser uma opção entre:
properties
: imóveiscondominiums
: condomíniosbrokers
: corretoresbanners
: bannersall
: sincroniza todos os recursos
Execute o comando jsync help
para mais informações sobre os comandos e flags disponíveis.
Ao executar o programa pela primeira vez, um arquivo de configurações base será criado por padrão em $HOME/.jsync.yaml
(pode ser sobrescrito utilizando a flag --config
).
Para iniciar, deixe uma opção dentre os dois próximos blocos no seu arquivo:
webservice_key
: chave de integração fornecida pela Jetimob
Note
multi-tenancy: Uma aplicação para múltiplos clientes. Cada cliente é denominado tenant da aplicação.
tenant_column
: nome da coluna de identificação da imobiliária do seu bancotenant_mapping
: vetor de objetos com a estrutura abaixo:identifier
: identificador da imobiliáriawebservice_key
:
Exemplo:
tenant_mapping:
- identifier: xxx
webservice_key: xxx
- identifier: yyy
webservice_key: yyy
# ...
db
:connection_string
: postgres://[usuário]:[senha]@[host]:[porta]/[database]?sslmode=disable
mappings
:banners_table
(optional,default=banners): nome da tabela de bannersbrokers_table
(optional,default=brokers): nome da tabela de corretorescondominiums_table
(optional,default=condominiums): nome da tabela de condomíniosproperties_table
(optional,default=properties): nome da tabela de imóveisbanners
: mapeamento das colunas disponíveis de banners para colunas do banco de dadosbrokers
: mapeamento das colunas disponíveis de corretores para colunas do banco de dadoscondominiums
: mapeamento das colunas disponíveis de condomínios para colunas do banco de dadosproperties
: mapeamento das colunas disponíveis de imóveis para colunas do banco de dados
truncate_all
(bool): remove TODOS os dados da tabela sendo sincronizada. Se forfalse
(default), apenas rows conflitantes serão removidas
Cofigurações de mapemento de um recurso para a tabela do banco de dados são feitas da forma em que a chave de configuração representa o nome do dado e o valor o nome da coluna no banco de dados. Chaves removidas não serão inseridas.
Por exemplo, considere o mapeamento reduzido:
mappings:
brokers_table: corretores
brokers:
avatar: avatar
biografia: biography
cargo: job_position
# ...
No mapeamento acima, quando houver a sincronização dos banners, o jsync
fará o insert: INSERT INTO corretores (avatar, biography, job_position) VALUES (...)
com os valores de cada ítem dos banners.
Note
multi-tenancy: Uma aplicação para múltiplos clientes. Cada cliente é denominado tenant da aplicação.
Numa aplicação multi-tenant com banco de dados também multi-tenant, a aplicação aceita vários clientes que compartilham
o mesmo banco de dados. Cada entrada das tabelas desse banco de dados possui uma coluna que identifica o cliente que detém
propriedade sobre aquela informação. Dessa forma cada cliente verá apenas os seus dados (considerando que a aplicação
faça o filtro nas queries de forma adequada, pois se um where
for esquecido nas queries, um cliente poderá ver
informações que não lhe perctencem).
Isto é, considerando a tabela:
id | code | image |
---|---|---|
1 | XXXX | https://s01.jetimgs.com/trvAWQHuYcArjvEQrh93oEZSAxK0Jz8p2OIdekopXlWDY5-MAAMBV0DPcGX3lxwoOeyVrBgSUbpqY-efLaLw_YZiMIVV0qN3gf2D/1660788979 |
Podemos adicionar uma coluna tenant_id
para identificar o dono daquela informação. Supondo que temos uma tabela chamada
tenants
, adicionando uma FK de tenant_id
para tenants.id
conseguimos vincular uma entrada da tabela a um proprietário
dessa informação. Ficando então:
id | tenant_id | code | image |
---|---|---|---|
1 | 1 | XXXX | https://s01.jetimgs.com/trvAWQHuYcArjvEQrh93oEZSAxK0Jz8p2OIdekopXlWDY5-MAAMBV0DPcGX3lxwoOeyVrBgSUbpqY-efLaLw_YZiMIVV0qN3gf2D/1660788979 |
💡 as migrações criam uma coluna chamada
tenant_id
em todas as tabelas. Essa coluna pode ser desconsiderada ou removida.
Se existirem dúvidas em como construir o banco de dados, utilize este arquivo como base, ou as is para uso em produção.
Para executar as migrations, primeiro, baixe a ferramenta:
Troque as variáveis [OS] e [ARCH] para refletir a arquitetura do computador que executará as migrações. Visite o site para possíveis opções.
curl -L -o migrate https://github.com/golang-migrate/migrate/releases/latest/download/migrate.[OS]-[ARCH].tar.gz
E, finalmente, execute as migrações:
./migrate -source "github://alanwgt/jsync/migrations" -database "postgres://[usuário]:[senha]@[host]:[porta]/[database]?sslmode=disable" up
- Assegure-se que o
go
está instalado e incluso noPATH
global - Instale as dependências:
go mod download
- Execute o programa com
go run main.go [params]
ou crie um executável:go build -o jsync main.go
jsync sincroniza dados na Jetimob com um banco d sincronizador de dados jetimob p sites exclusivos